CAD 双击实体事件

CAD本身为我们提供的双击事件的设置。工具-工作空间-自定义...打开用户自定界面

窗体内找到双击动作。在双击动作下我们可以看到CAD自带的所有实体

例如我们在双击三维实体时自定义一个事件。那么我们就选中三维实体-快捷特性。在右侧特性里编辑宏内容。以下是系统彼带的宏$M=$(if,$(and,$(>,$(getvar,blockeditlock),0)),^C^C_properties,^C^C_bedit)

在些我们只需要将最后的bedit替换成,我们自定义的命令即可。例如:我的命令为"aaa",将宏修改为$M=$(if,$(and,$(>,$(getvar,blockeditlock),0)),^C^C_properties,^C^C_aaa)保存确定后。当我们在CAD内双击三维实体后CAD自动执行命令aaa。这样我们可以通过此方法来注册CAD双击事件。

1. 修改操作实体的双击动作宏

2. 注册一个新的命令做为事件

以下源代码来源于https://adndevblog.typepad.com/autocad/2012/12/customizing-double-click-on-block-reference.html

在插件初始化函数内加入注册事件(修改双击动作宏)
 

public class Connect : IExtensionApplication    
{        
    public void Initialize()        
    {        
        // 修改双击动作宏
        RegeditDoubleClickEvent();        
    }
}

        /// <summary>
        /// 注册双击事件
        /// </summary>
        public static void RegeditDoubleClickEvent()
        {
            Autodesk.AutoCAD.ApplicationServices.Document activeDoc
            = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Autodesk.AutoCAD.EditorInput.Editor ed = activeDoc.Editor;

            // Retrieve the location of, and open the ACAD Main CUI File
            string mainCuiFile =
                    (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("MENUNAME");
            mainCuiFile += ".cuix";
            Autodesk.AutoCAD.Customization.CustomizationSection cs = new Autodesk.AutoCAD.Customization.CustomizationSection(mainCuiFile);

            Autodesk.AutoCAD.Customization.DoubleClickAction blockDoubleClickAction = null;
            foreach (Autodesk.AutoCAD.Customization.DoubleClickAction dca in
                                        cs.MenuGroup.DoubleClickActions)
            {
                // 这里要注意,如果是英文版CAD,请使用英文名称。具体对象名称可在CAD自定义面板内查询
                if (dca.Name.Equals("三维实体"))
                {
                    blockDoubleClickAction = dca;
                    break;
                }
            }

            if (blockDoubleClickAction != null)
            {
                // Change the double click macro to call our command
                blockDoubleClickAction.DoubleClickCmd.MenuMacroReference.macro.Command
                    = "$M=$(if,$(and,$(>,$(getvar,blockeditlock),0)),^C^C_properties,^C^C_aaa)";

                // Save our changes 
                if (cs.IsModified)
                    cs.Save();
            }
        }

注册命令aaa

/// <summary>
        /// 三维实体双击命令
        /// </summary>
        [CommandMethod("aaa", CommandFlags.UsePickSet)]
        static public void MyBeditCommand()
        {
            Document activeDoc
                = Application.DocumentManager.MdiActiveDocument;
            Editor ed = activeDoc.Editor;

            PromptSelectionResult result = ed.GetSelection();

            if (result.Status == PromptStatus.OK)
            {
                SelectionSet ss = result.Value;
                foreach (SelectedObject so in ss)
                {
                    bool isMyBlockRef = false;

                    Database db = activeDoc.Database;
                    using (Transaction tr
                            = db.TransactionManager.StartTransaction())
                    {
                        if (BLL.ComTools.GetH3DType(so.ObjectId) == Model.EnumH3DEntityType.Slot)
                            isMyBlockRef = true;

                        //Entity ent
                        //    = tr.GetObject(
                        //                    so.ObjectId,
                        //                    OpenMode.ForRead
                        //                  ) as Entity;

                         Lets check for XData to identify if we need 
                         to show our dialog
                        //if (ent.GetXDataForApplication(RegAppName) != null)
                        //{
                        //    isMyBlockRef = true;
                        //}
                        tr.Commit();
                    }

                    if (isMyBlockRef)
                    {
                        // Custom action such as showing our form.
                        // Just as a demo we use the alert dialog
                        Application.ShowAlertDialog
                            ("Custom action such as showing our form.");
                    }
                    else
                    {
                        // Let AutoCAD do the block edit.

                        ObjectId[] ids = ss.GetObjectIds();

                        // Set the implied selection to what it was 
                        // before our command was called
                        ed.SetImpliedSelection(ids);

                        // call "bedit" command
                        activeDoc.SendStringToExecute
                                        (
                                            "_BEDIT ",
                                            false,
                                            false,
                                            false
                                        );
                    }
                }
            }
        }

这里的BLL.ComTools.GetH3DType是我自己的方法。在制作三维实体时我标记了三维实体的类型并写入到三维实体的XDATA内。该方法就是从该实体内取出XDATA。来获取实体类型。通过验证实体类型来区分是打开CAD自带的属性窗体,还是执行我们自定义的方法。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值