试一试

右键快捷菜单

一:菜单分类和实现方法
● 分类 :默认菜单和对象菜单
● 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(""));就是分隔符

posted @ 2025-10-17 19:37  小菜鸟^0^  阅读(16)  评论(0)    收藏  举报