试一试
右键快捷菜单
一:菜单分类和实现方法
● 分类 :默认菜单和对象菜单
● Autodesk.AutoCAD.ApplicationServices.Application 支持两种 ContextMenu 扩展:DefaultContextMenu 和 ObjectContextMenu。
● DefaultContextMenu:当前上下文环境没有选中任何 Entity 情况下的快捷菜单。
● ObjectContextMenu:当前上下文环境选中指定类型 Entity 情况下的快捷菜单。如下图:
● 实现方法:cui/vlsp/com/c#
二:添加默认菜单
● netapi :添加的菜单为分级菜单,不能在根菜单下直接添加
Type type=Typeof(Entity);
ContextMenuExtension cmExt = new();
cmExt.Title = type.Name;
if (cmds.Length != 0)
{
cmds.Act(t =>
{
var m1 = new AcWin.MenuItem(t.Value.CmdName);
m1.Click += MenuItem_OnClick;
cmExt.MenuItems.Add(m1);
});
var rx = RXObject.GetClass(type);
cmExt.Popup += contextMenu_Popup;
AcadApp.AddDefaultContextMenuExtension( cmExt);
}
效果:
● com :添加的右键邮件菜单为根菜单,可删除
com添加邮件默认菜单
var acad = AcadApp.AcadApplication as AcadApplication;
// 取 ACAD 组的“默认右键菜单”(英文版叫 "Default Menu" 或 "Shortcut Menus"->"Default")
// 不同版本/语言名字略有差异,常见访问方式如下:
AcadPopupMenu defaultMenu = null;
var s1 = acad.MenuGroups.Item(0);
// 方式1:遍历找到“默认菜单”
foreach (AcadPopupMenu m in acad.MenuGroups.Item(0).Menus)
{
if (m.Name.Contains("默认") || m.Name.Contains("Default"))
{
defaultMenu = m; break;
}
}
if (defaultMenu == null) return;
// 直接在根层加分隔线/菜单项(宏里最后留空格,相当于回车)
//defaultMenu.AddSeparator(defaultMenu.Count);
//defaultMenu.AddMenuItem(defaultMenu.Count, "和尚777", "^C^C_LINE ");
//defaultMenu.AddMenuItem(defaultMenu.Count, "青蛙666", "^C^C_LINE ");
defaultMenu.AddSeparator(0);
defaultMenu.AddMenuItem(0, "和尚777", "LINE ");
defaultMenu.AddMenuItem(0, "青蛙666", "LINE ");
效果:
● VLisp: 用 Visual LISP 的 ActiveX/COM 接口(vlax/vla-* 系列函数)去操作 AutoCAD 的菜单集合,把项插到 默认右键菜单 里。
● 代码及效果
三:对指定对象类型添加右键菜单
● netapi:既可以在根菜单下直接添加,也能多级嵌套菜单
ContextMenuExtension cmExt = new();
cmExt.Title = type.Name;
if (cmds.Length != 0)
{
if (type != typeof(Entity))
cmExt.MenuItems.Add(new AcWin.MenuItem(""));
cmds.Act(t =>
{
var m1 = new AcWin.MenuItem(t.Value.CmdName);
//MenuItems可以嵌套多级
//m1.MenuItems.Add();
m1.Click += MenuItem_OnClick;
cmExt.MenuItems.Add(m1);
});
//
var rx = RXObject.GetClass(type);
cmExt.Popup += contextMenu_Popup;
AcadApp.AddObjectContextMenuExtension(rx, cmExt);
}
● 注意: netapi里cmExt.MenuItems.Add(new AcWin.MenuItem(""));就是分隔符
浙公网安备 33010602011771号