本帖最后由 dcl1214 于 2025-10-7 13:01 编辑

  1. (defun $chuang-jian-you-jian-cai-dan$
  2.               (data-all    xsng?       lst
  3.                /    $addmenuitem$
  4.                $get-menu-name$       a
  5.                a-car    a-cdr       b
  6.                c    count       d
  7.                d2    data-all-tmp
  8.                item    label       labels-all
  9.                labels-loc mainItem   menu
  10.                menu-obj    menu-obj-up
  11.                old    pos       submenu
  12.                tag    typ       typ-old
  13.                yj    yj-mr
  14.               )
  15.           ;右键菜单
  16.           ;data-all 所有的右键菜单
  17.           ;xsng? 显示data-all中哪一个?
  18.   (defun $get-menu-name$ (a labs / b lab)
  19.     (while (setq b (car a))
  20.       (cond
  21.   ((= (type (car b)) 'str)
  22.    (setq lab (car b))
  23.    (setq labs (cons lab labs))
  24.   )
  25.   ((= (type (car b)) 'list)
  26.    (if (setq lab (cdr (assoc "label" b)))
  27.      (setq labs (cons lab labs))
  28.    )
  29.   )
  30.       )
  31.       (setq a (cdr a))
  32.     )
  33.     labs
  34.   )
  35.   (defun $addmenuitem$ (obj a / caption label macro obj-new)
  36.     (setq label (cdr (assoc "label" a)))
  37.     (setq macro (cdr (assoc "macro" a)))
  38.     (setq caption (cdr (assoc "caption" a)))
  39.     (setq obj-new (vl-catch-all-apply
  40.         'vla-addmenuitem
  41.         (list obj POS label macro)
  42.       )
  43.     )
  44.     (if  (vl-catch-all-error-p obj-new)
  45.       (setq obj-new nil)
  46.     )
  47.     obj-new        ;返回
  48.   )
  49.   (if (= (strcase (getvar 'product)) "ZWCAD")
  50.     (progn
  51.       (setq yj-mr
  52.        (vl-catch-all-apply
  53.          'vla-item
  54.          (list
  55.      (vla-get-menus
  56.        (vl-catch-all-apply
  57.          'vla-item
  58.          (list (vla-get-MenuGroups (vlax-get-acad-object))
  59.          "ZWCAD"
  60.          )
  61.        )
  62.      )
  63.      "默认模式的上下文菜单";如果希望在选中图元后再鼠标右键显示菜单可以改为"编辑模式的上下文菜单"
  64.          )
  65.        )
  66.       )
  67.     )
  68.     (progn
  69.       (setq yj-mr
  70.        (vl-catch-all-apply
  71.          'vla-item
  72.          (list
  73.      (vla-get-menus
  74.        (vl-catch-all-apply
  75.          'vla-item
  76.          (list (vla-get-MenuGroups (vlax-get-acad-object))
  77.          "ACAD"
  78.          )
  79.        )
  80.      )
  81.      "默认菜单";如果希望在选中图元后再鼠标右键显示菜单可以改为"编辑菜单"
  82.          )
  83.        )
  84.       )
  85.     )
  86.   )
  87.   (setq labels-all nil)
  88.   (setq data-all-tmp (mapcar 'cdr data-all))
  89.   (while (setq a (car data-all-tmp))
  90.     (setq labels-all ($get-menu-name$ a labels-all))
  91.     (setq data-all-tmp (cdr data-all-tmp))
  92.   )          ;所有的label标识抓出来(不会玩递归,先这样写吧)
  93.   (setq labels-loc nil)
  94.   (setq d (cdr (assoc xsng? data-all)))  ;需要显示的给抓出来  
  95.   (setq labels-loc ($get-menu-name$ d labels-loc))
  96.           ;本次需要显示的菜单labels抓出来
  97.   (setq typ-old nil)
  98.   (vlax-for item yj-mr
  99.     (setq label (vla-get-label item))
  100.     (setq tag (vla-get-tagstring item))
  101.     (setq typ (vla-get-type item))
  102.     (cond ((and  (vl-position label labels-loc)
  103.     (not vlisp-compile)  ;vlide界面没打开(用户状态,不是开发者模式)
  104.      )
  105.      t
  106.     )
  107.     ((vl-position label labels-all)
  108.      (vl-catch-all-apply 'vla-delete (list item))
  109.     )
  110.     (t
  111.      (if
  112.        (and typ-old (= typ-old typ 1))
  113.         (vl-catch-all-apply 'vla-delete (list item))
  114.      )
  115.     )
  116.     )
  117.     (setq typ-old typ)
  118.   )
  119.   (SETQ COUNT (VLA-GET-COUNT YJ-mr))
  120.   (SETQ POS COUNT)
  121.   (setq pos 1)        ;强制从第二个开始,注释这一句,可以从最后一个开始
  122.   (if (= (vla-get-type (vla-item YJ-mr pos)) 0)
  123.     (vla-AddSeparator YJ-mr (setq pos (1+ pos)))
  124.   )          ;前面一个菜单不是分割线就加一个分割线  
  125.   (setq menu-obj-up nil)
  126.   (while (setq a (car d))
  127.     (SETQ A-CAR (car a))
  128.     (SETQ A-CDR (cdr a))
  129.     (SETQ POS (1+ POS))
  130.     (cond
  131.       ((= (type A-CAR) 'str)
  132.        (cond ((and (setq old (cdr (assoc A-CAR menu-obj-up)))
  133.        (setq SubMenu (vl-catch-all-apply
  134.            'vla-AddSubMenu
  135.            (list old 0 A-CAR)
  136.          )
  137.        )
  138.         )        ;如果找到了历史的记录就在该记录下面创建一个子级菜单
  139.         t
  140.        )
  141.        ((setq SubMenu (vl-catch-all-apply
  142.             'vla-AddSubMenu
  143.             (list YJ-mr pos A-CAR)
  144.           )
  145.         )        ;直接创建一级菜单
  146.         t
  147.        )
  148.        )
  149.        (setq d2 nil)
  150.        (while (setq b (car a-cdr))
  151.    (cond
  152.      ((= (type (car b)) 'str)
  153.       (setq d (append d (list b)))
  154.       (setq menu-obj-up (cons (cons (car b) SubMenu) menu-obj-up))
  155.           ;将上级菜单对应的obj对象添加到记录里面,便于while二次查找
  156.      )
  157.      ((= (type (car b)) 'list)
  158.       (setq d2 (cons b d2))
  159.      )
  160.    )
  161.    (setq a-cdr (cdr a-cdr))
  162.        )        ;不会玩递归,先这样写吧
  163.        (setq d2 (reverse d2))
  164.        (while (setq c (car d2))
  165.    ($addmenuitem$ SubMenu c)
  166.    (setq d2 (cdr d2))
  167.        )
  168.           ;循环创建菜单
  169.       )
  170.       ((= (type A-CAR) 'list)
  171.        (setq menu-obj ($addmenuitem$ yj-mr a))
  172.       )
  173.     )
  174.     (setq d (cdr d))
  175.   )
  176.   (if (= (vla-get-type (vla-item YJ-mr (setq pos (1+ pos)))) 0)
  177.     (vla-AddSeparator YJ-mr pos)
  178.   )          ;后面菜单不是分割线就加一个分割线
  179.   (princ)
  180. )
  181. (defun $you-jian-cai-dan-test$ ()
  182.   (list
  183.     "右键菜单测试"
  184.     (list
  185.       "绘图"
  186.       (list
  187.   (cons "label" "画直线")
  188.   (cons
  189.     "macro"
  190.     "line "
  191.   )
  192.       )
  193.       (list
  194.   (cons "label" "画圆")
  195.   (cons
  196.     "macro"
  197.     "CIRCLE "
  198.   )
  199.       )
  200.     )
  201.     (list
  202.       "修改2"
  203.       (list
  204.   (cons "label" "修改颜色")
  205.   (cons
  206.     "macro"
  207.     "(vl-cmdf \"change\" (car(entsel)) \"\" \"P\" \"C\" 2 \"\") "
  208.   )
  209.       )
  210.       (list
  211.   (cons "label" "修改图层")
  212.   (cons
  213.     "macro"
  214.     "(vl-cmdf \"change\" (car(entsel)) \"\" \"P\" \"LA\" \"0\" \"\") "
  215.   )
  216.       )
  217.       (list
  218.   "修改2子级"
  219.   (list
  220.     (cons "label" "修改颜色")
  221.     (cons
  222.       "macro"
  223.       "(vl-cmdf \"change\" (car(entsel)) \"\" \"P\" \"C\" 2 \"\") "
  224.     )
  225.   )
  226.   (list
  227.     (cons "label" "修改图层")
  228.     (cons
  229.       "macro"
  230.       "(vl-cmdf \"change\" (car(entsel)) \"\" \"P\" \"LA\" \"0\" \"\") "
  231.     )
  232.   )
  233.       )
  234.     )
  235.   )
  236. )
  237. (SETQ DATA (LIST ($you-jian-cai-dan-test$)))
  238. ($chuang-jian-you-jian-cai-dan$ DATA "右键菜单测试" nil)



网友答: 为执行个简单的command整这么复杂,完全没有必要。单独定义个小lsp就行了。使用再高频,一个自定义lsp也可以两个字母的命令搞定一个特定功能,鼠标右键,还是要点一下,拖动找需要执行的命令,再点一下,操作便利上并没有提高。

网友答:
429014673 发表于 2025-10-7 00:38
Error: 类型不正确 - #
中望2026出错

应该是你文本格式没对,要改成ansi。我在2026测试可以。

网友答: 先收藏,用到的时候再按需要修改

网友答: Error: 类型不正确 - #<%catch-all-apply-error%>
中望2026出错

网友答: 收藏了 谢谢大神

网友答: 不管了 先收藏啊

网友答: thanks for sharing.................

网友答: 感谢杜总的分享!

网友答: 最好是 图标 也可以添加 上去
  • 上一篇:(求助)批量对单个或多个CAD对象扩展数据的读
  • 下一篇:没有了