MxCAD COM入门

本文介绍了如何在C#环境下利用梦想CAD提供的COM接口进行图形操作。通过生成的AxInterop.MxDrawXLib.dll和Interop.MxDrawXLib.dll,可以创建和控制MxDraw控件,以及操作图形对象。示例代码展示了创建和修改线条,以及注册和实现自定义命令的过程。

梦想CAD是专业的CAD插件(控件),不需安装AutoCAD即可运行。
在C#和VB中使用MxCAD的COM接口很方便,使用aximp命令或者在工具栏里面添加MxDraw com组件后,会生成AxInterop.MxDrawXLib.dll和Interop.MxDrawXLib.dll,前者主要是创建MxDraw控件,控制它的界面,响应它的事件。后者主要提供MxDraw数据库接口,操作图形对象。
下面使用代码:

        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            this.axMxDrawX1 = new AxMxDrawXLib.AxMxDrawX();
            ((System.ComponentModel.ISupportInitialize)(this.axMxDrawX1)).BeginInit();
            this.SuspendLayout();
            // 
            // axMxDrawX1
            // 
            this.axMxDrawX1.Enabled = true;
            this.axMxDrawX1.Location = new System.Drawing.Point(12, 2);
            this.axMxDrawX1.Name = "axMxDrawX1";
            this.axMxDrawX1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMxDrawX1.OcxState")));
            this.axMxDrawX1.Size = new System.Drawing.Size(776, 436);
            this.axMxDrawX1.TabIndex = 0;
            this.axMxDrawX1.ImplementCommandEvent += new AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEventHandler(this.axMxDrawX1_ImplementCommandEvent);
            this.axMxDrawX1.InitComplete += new System.EventHandler(this.OnInitComplete);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.axMxDrawX1);
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.axMxDrawX1)).EndInit();
            this.ResumeLayout(false);
        }
        
        private void OnInitComplete(object sender, EventArgs e)
        {
        	// create line
            long id = this.axMxDrawX1.DrawLine(0, 0, 10, 10);
            // modify line
            var db = this.axMxDrawX1.GetDatabase() as MxDrawXLib.MxDrawDatabase;
            var obj = db.ObjectIdToObject(id);
            var ent = obj as MxDrawXLib.MxDrawEntity;
            ent.colorIndex = MxDrawXLib.MCAD_COLOR.mcRed;
            // register command "myLine"
            axMxDrawX1.RegistUserCustomCommand("myLine", 55);
        }

        private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
        {
            //实例化控件工具集合
            var mxUtility = new MxDrawXLib.MxDrawUtilityClass();
            // implement command 55, that is, "myLine"
            if (e.iCommandId == 55)
            {
                //点取第一点 
                var point = mxUtility.GetPoint(null, "点取第一点:");
                if (point == null)
                {
                    MessageBox.Show("用户取消...");
                    return;
                }
                //点取第二点
                var point2 = mxUtility.GetPoint(point, "点取第二点:");
                if (point2 == null)
                {
                    MessageBox.Show("用户取消...");
                    return;
                }
                //调用绘制直线函数
                axMxDrawX1.DrawLine(point.x, point.y, point2.x, point2.y);
            }
        }
<think>嗯,用户问的是关于mxcad中的createMxCad完成监听的介绍。首先,我需要明确用户的问题。他们可能是在使用mxcad这个库,遇到了需要监听初始化完成的情况,或者想了解如何正确使用这个监听方法。 接下来,我需要回忆或查找mxcad的相关文档。记得在mxcad中,创建CAD实例通常是一个异步过程,可能需要加载资源或初始化一些模块。所以,当用户调用createMxCad后,可能需要知道什么时候完成,才能进行后续操作,比如加载图纸、操作CAD对象等。 这时候,监听createMxCad完成的方法就显得重要了。可能的实现方式有两种:一种是返回Promise,另一种是通过事件监听。需要确认mxcad的具体API设计。比如,如果createMxCad返回一个Promise,那么用户可以使用.then()或者async/await来处理完成后的逻辑。另一种可能是,实例创建完成后会触发一个特定的事件,用户可以通过on方法监听这个事件。 然后,我需要考虑示例代码的正确性。假设createMxCad返回Promise,那么示例应该展示如何用.then()处理。如果是事件监听,可能需要访问MxCad实例的事件 emitter。例如: // Promise方式 createMxCad(config).then((cad) => { // 初始化完成后的操作 }); // 或者事件方式 const cad = new MxCad(config); cad.on('initialized', () => { // 初始化完成 }); 另外,需要注意可能的错误处理,比如在Promise中使用.catch,或者在事件中监听error事件。 用户可能需要知道为什么需要监听完成,比如在初始化未完成时操作CAD可能会导致错误。这时候,正确的监听方法能确保代码在正确的时机执行。 还要考虑用户是否可能混淆其他监听事件,比如图纸加载完成和CAD实例初始化完成是不同的。需要明确说明这里是针对createMxCad的完成,即实例初始化完毕。 最后,总结使用场景和注意事项,帮助用户正确应用这一功能。比如,确保在回调中执行后续操作,避免异步问题,或者处理可能的初始化失败情况。</think>在 `mxcad` 中,`createMxCad` 通常用于创建 CAD 实例,而 **监听其完成** 可以通过以下两种常见方式实现: --- ### 1. **Promise 监听方式** 如果 `createMxCad` 返回一个 **Promise 对象**,可直接通过 `.then()` 或 `async/await` 监听初始化完成: ```typescript // 使用 Promise.then() createMxCad(config).then((cadInstance) => { console.log("CAD 实例初始化完成"); // 在此执行后续操作,例如加载图纸、绑定事件等 }); // 或使用 async/await async function initCad() { const cad = await createMxCad(config); console.log("CAD 实例已就绪"); cad.loadDrawing("path/to/drawing.dwg"); } ``` --- ### 2. **事件监听方式** 如果 `MxCad` 实例在初始化完成后会触发特定事件(如 `"initialized"`),可通过事件监听实现: ```typescript const cad = createMxCad(config); cad.on("initialized", () => { console.log("CAD 初始化完成"); // 安全执行依赖初始化的操作 }); ``` --- ### 关键场景说明 - **资源加载**:CAD 初始化可能涉及 WebAssembly、字体等异步资源加载,需确保完成后再操作。 - **错误处理**:建议添加 `.catch()` 或监听 `"error"` 事件: ```typescript createMxCad(config) .then((cad) => { /* 成功逻辑 */ }) .catch((err) => { console.error("初始化失败:", err); }); ``` --- ### 注意事项 - **时序依赖**:所有依赖 CAD 实例的操作(如绘图、选择对象)必须在初始化完成后调用。 - **框架集成**:在 Vue/React 中,建议在生命周期钩子(如 `mounted`/`useEffect`)中初始化。 如果需要更具体的代码示例或问题场景,可以进一步补充说明! 🚀
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值