Batchplot 3.2.2 菜单图片

程序思路就是利用ActiveX对像模型提供的方法和属性。
目前的问题:设置条目的图标和快捷键(比如Ctrl+Shift+P)不知如何实现。

源代码:

AddBplotMenu.lsp
;; 删除菜单
(defun C:RemoveBplotMenu (/ MenuBar n i MenuItem Menu tag)
  (setq MenuBar (vla-get-menubar (vlax-get-acad-object)))
  ;; 找菜单“文件(&F)” "&File" tag: ID_MnFile
  (setq n (vla-get-count MenuBar))
  (setq i (1- n))
  (while (and (>= i 0)                  ; 没有超过上限
              (/= "ID_MnFile" (vla-get-tagstring (setq menuitem (vla-item MenuBar i)))) ; 找到"文件"菜单条
         )
    (setq i (1- i))
  )
  (if (< i 0)
    (setq i 0)
  )                                     ; 如果没有文件菜单, 取第一条菜单
  (setq menu (vla-item MenuBar i))
  ;;遍历文件菜单 删除原来的批量打印条目
  (setq n (vla-get-count menu))
  (setq i (1- n))
  (while (> i 0)
    (setq menuitem (vla-item menu i))
    (setq tag (vla-get-tagstring menuitem))
    (if (member tag '("ID_mnuBatchPlot" "ID_mnuBatchPlot2" "ID_mnuBatchPlotPopup"))
      (vla-delete menuitem)
    )
    (setq i (1- i))
  )
  (princ)
)
;; 添加菜单
(defun C:AddBplotMenu (/ MenuBar menu menuitem bplotPopupMenu bplotmenuitem cap tag tmp i n)
  (C:RemoveBplotMenu)
  (setq MenuBar (vla-get-menubar (vlax-get-acad-object)))
  ;; 找到菜单“文件(&F)” "&File" tag: ID_MnFile
  (setq n (vla-get-count MenuBar))
  (setq i (1- n))
  (while (and (>= i 0)                  ; 没有超过上限
              (/= "ID_MnFile" (vla-get-tagstring (setq menuitem (vla-item MenuBar i)))) ; 找到"文件"菜单条
         )
    (setq i (1- i))
  )
  (if (< i 0)                           ; 如果没有文件菜单, 取第一条菜单
    (setq i 0)
  )
  (setq menu (vla-item MenuBar i))
  ;; 找到打印菜单项, 设置当前插入位置
  (setq i 0)
  (setq n (vla-get-count menu))
  (while (and (< i n)                   ; 没有超过上限
              (/= "ID_Print" (vla-get-tagstring (setq menuitem (vla-item menu i)))) ; 找到"打印"菜单条
         )
    (setq i (1+ i))
  )
  (if (= i n)                           ; 如果没有找到"打印"菜单条, 插在倒数第二条.
    (setq i (- n 2))
  )
  ;; 在当前插入位置的下面一条添加批量打印条目
  (setq bplotmenuitem
         (vla-addmenuitem
           menu
           (setq i (1+ i))
           "批量打印(&B)..."
           "\003\003_BatchPlot "
         )
  )
  (vla-put-label bplotmenuitem "$(if,$(eq,$(getvar,blockeditor),1),~)批量打印(&B)...")
  (vla-put-tagstring bplotmenuitem "ID_mnuBatchPlot")
  (vla-put-helpstring bplotmenuitem "批量打印、批量生成布局、批量分图实用工具程序")
  ;; 再在下面创建下级批量打印实用工具子菜单
  (setq bplotPopupMenu (vla-addsubmenu menu (1+ i) "批量打印实用工具(&L)"))
                                        ; (vla-put-tagstring bplotPopupMenu "ID_mnuBatchPlotPopup") ;不知道为什么不行.
  ;; 下面这段代码设置批量打印实用工具子菜单的Tag
  (setq n (vla-get-count menu))
  (setq i (1- n))
  (while (> i 0)
    (setq menuitem (vla-item menu i))
    (setq cap (vla-get-caption menuitem))
    (if (= "批量打印实用工具(&L)" cap)
      (vla-put-tagstring menuitem "ID_mnuBatchPlotPopup")
    )
    (setq i (1- i))
  )
  (setq i 0)
 
  ;; 下面是子菜单条目
  (setq tmp
         (vla-addmenuitem
           bplotPopupMenu
           (setq i (1+ i))
           "批量打印(&C)..."
           "\003\003_bp_doPlot "
         )
  )
  (vla-put-label tmp "$(if,$(eq,$(getvar,blockeditor),1),~)批量打印(&C)...")
  (vla-put-helpstring tmp "批量打印图纸,直接发送到物理打印机或虚拟打印机")
  (setq tmp
         (vla-addmenuitem
           bplotPopupMenu
           (setq i (1+ i))
           "批量生成布局(&L)..."
           "\003\003_bp_doLayout "
         )
  )
  (vla-put-label tmp "$(if,$(eq,$(getvar,blockeditor),1),~)批量生成布局(&L)...")
  (vla-put-helpstring tmp "批量按当前的打印设置生成布局,每个图框一个布局")
  (setq tmp
         (vla-addmenuitem
           bplotPopupMenu
           (setq i (1+ i))
           "批量生成PLT文件(&)..."
           "\003\003_bp_doPlotFile "
         )
  )
  (vla-put-label tmp "$(if,$(eq,$(getvar,blockeditor),1),~)批量生成PLT文件(&)...")
  (vla-put-helpstring tmp "批量生成PLT打印文件供机房绘图仪服务器统一打印")
  (setq tmp
         (vla-addmenuitem
           bplotPopupMenu
           (setq i (1+ i))
           "批量切分图纸(&W)..."
           "\003\003_bp_doWblock "
         )
  )
  (vla-put-label tmp "$(if,$(eq,$(getvar,blockeditor),1),~)批量切分图纸(&W)...")
  (vla-put-helpstring tmp "自动根据图框切分图纸,每个图框一个DWG文件,供归档用")
  (setq tmp
         (vla-addmenuitem
           bplotPopupMenu
           (setq i (1+ i))
           "打印现有布局(&A)..."
           "\003\003_bp_doPlotLayout "
         )
  )
  (vla-put-label tmp "$(if,$(eq,$(getvar,blockeditor),1),~)打印现有布局(&A)...")
  (vla-put-helpstring tmp "按现有的布局显示顺序批量打印现有的布局空间")
  (vla-AddSeparator
    bplotPopupMenu
    (setq i (1+ i))
  )
  (setq tmp (vla-addmenuitem
              bplotPopupMenu
              (setq i (1+ i))
              "清除批量打印数据(&D)"
              "\003\003_DeleteBPlotData "
            )
  )

  (vla-AddSeparator
    bplotPopupMenu
    (setq i (1+ i))
  )
  (vla-addmenuitem
    bplotPopupMenu
    (setq i (1+ i))
    "捐助作者支持开发(&D)"
    "\003\003_Browser (findfile \"donate.htm\") "
  )
  (vla-addmenuitem
    bplotPopupMenu
    (setq i (1+ i))
    "访问软件主页(&M)"
    "\003\003_Browser http://fresco.yo2.cn/archives/92111 "
  )
  (vla-addmenuitem
    bplotPopupMenu
    (setq i (1+ i))
    "批量打印帮助(&H)"
    "\003\003_Browser (findfile \"bp_help.htm\") "
  )
 
  (princ)
)
;; 加载批量打印菜单
(C:AddBplotMenu)
(princ)