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自带的属性窗体,还是执行我们自定义的方法。