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 Filestring 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 incs.MenuGroup.DoubleClickActions){// 这里要注意,如果是英文版CAD,请使用英文名称。具体对象名称可在CAD自定义面板内查询if (dca.Name.Equals("三维实体")){blockDoubleClickAction = dca;break;}}if (blockDoubleClickAction != null){// Change the double click macro to call our commandblockDoubleClickAction.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 dialogApplication.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 calleded.SetImpliedSelection(ids);// call "bedit" commandactiveDoc.SendStringToExecute("_BEDIT ",false,false,false);}}}}
这里的BLL.ComTools.GetH3DType是我自己的方法。在制作三维实体时我标记了三维实体的类型并写入到三维实体的XDATA内。该方法就是从该实体内取出XDATA。来获取实体类型。通过验证实体类型来区分是打开CAD自带的属性窗体,还是执行我们自定义的方法。