明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 48124|回复: 114

[经验] lisp创建自定义工具栏

    [复制链接]
发表于 2012-4-6 21:12 | 显示全部楼层 |阅读模式
本帖最后由 langjs 于 2020-4-30 10:33 编辑

初衷:我们在加载某个lisp程序时,如果同时为该程序自动生成个自定义工具栏使用起来就方便了。
实现:在加载lisp时,自动执行一段程序,创建一个mnu文件,写入工具栏内容,然后加载。
例子:

;;;; 自动创建"动态轴测图"工具栏子程序(defun create_toolbar ( / file x)
  (setvar "cmdecho" 0)
  (vl-load-com)
  (if (not (menugroup "TEMPTOOLBAR"))  ; 判断cad是否加载temptoolbar工具栏
    (progn                               ; 如果没加载,则自动执行下面程序
      (alert "\n程序自动创建\"TEMPTOOLBAR\"工具栏,请稍后")
      (setq file (open "TEMPTOOLBAR.mnu" "W")) ; 在cad搜索目录创建一个菜单mnu文件,写状态打开
      (foreach x '("***MENUGROUP=TEMPTOOLBAR\n\n***TOOLBARS\n**TEMPTOOLBAR" ; 下面定义工具栏内容,
                                       ; 第一行是工具栏名称为“动态轴测图”
                                       ; 剩下四行对应四个工具栏图标,可以自行仿照格式增减。
                                       ; 自定义图标有点麻烦,最好采用cad自带图标,系统自定义的图标很多,
                                       ; 在“工具”-“自定义”-“界面”-“工具栏”——点开五角星。
                                       ; 右侧图像类似RCDATA_16_OSNEN为图标名称,选择一个可以填在下面格式,
                                       ; 下面^C^C后面跟着的是lisp程序名,意思是双击图标要执行的程序。
         "ID_ZCT001   [_Toolbar(\"动态轴测图\", _Floating, _Hide, 10, 340, 1)]"
         "ID_ZCT011   [_Button(\"轴测图直线\", \"RCDATA_16_OSNEND\", \"RCDATA_16_OSNEND\")]^C^Czline"
         "ID_ZCT012   [_Button(\"轴测图标注\", \"RCDATA_16_DIMOBL\", \"RCDATA_16_DIMOBL\")]^C^Czdim"
         "ID_ZCT013   [_Button(\"轴测图文字\", \"RCDATA_16_TEXEDI\", \"RCDATA_16_TEXEDI\")]^C^Cztext"
         "ID_ZCT014   [_Button(\"轴测图更改\", \"RCDATA_16_DIMOVE\", \"RCDATA_16_DIMOVE\")]^C^Czch"
        )
        (princ (strcat x "\n") file)   ; 将定义工具栏内容写入mnu文件

      )
      (close file)                       ; 关闭mnu文件
      (command "menuload" "TEMPTOOLBAR.mnu") ; 加载temptoolbar工具栏
    )
  )
  (command "TOOLBAR" "动态轴测图" "S") ; 显示工具栏
  (princ)
)
(create_toolbar)
;;; 本句的作用是加载本lisp就自动执行create_toolbar子程序






;;; 以下部分是正常的程序
(defun c:zline ()
  (alert "\n\"轴测图直线\"暂未开源")
  (princ)
)
(defun c:zdim ()
  (alert "\n\"轴测图标注\"源码在明经论坛")
  (princ)
)
(defun c:ztext ()
  (alert "\n\"轴测图文字\"暂未开源")
  (princ)
)
(defun c:zch ()
  (alert "\n\"轴测图更改\"暂未开源")
  (princ)
)





例子2:
;;; ================================================================
;;; 功能:自动为.isp命令创建一个命令的按钮子函数
;;; 使用: 在.isp文件最后最下方写入一句 (createtoolbar name sym bmp )
;;;       其中:name为命令中文名称,sym为执行的命令,bmp为图标,最好采用
;;;       系统图标,自定义图标需拷贝到支持目录,为*.bmp格式.
;;; 样例createtoolbar "轴测图直线" "zline" "rcdata_16_osnend")
;;;      (createtoolbar "轴测图直线" "zline" "zline.bmp")
;;; 作者:langjs                                   日期:2012年4月1日
;;; ================================================================
(defun createtoolbar (name sym bmp / file x)
  (setvar "cmdecho" 0)
  (vl-load-com)
  (if (menugroup "TEMPTOOLBAR") (command "menuunload" "TEMPTOOLBAR"))
  (alert "\n程序将自动创建\"临时工具栏\",请稍后")
  (setq file (open "TEMPTOOLBAR.mnu" "W"))
  (foreach x (list "***MENUGROUP=TEMPTOOLBAR\n\n***TOOLBARS\n**TEMPTOOLBAR"
     "ID_TEMP001   [_Toolbar(\"临时工具栏\", _Floating, _Hide, 10, 340, 1)]"
    (strcat "ID_TEMP011   [_Button(\"" name "\", \"" bmp "\", \"" bmp "\")]^C^C" sym)
      )
    (princ (strcat x "\n") file)
  )
  (close file)
  (command "menuload" "TEMPTOOLBAR.mnu")
  (command "TOOLBAR" "临时工具栏" "S")
  (princ)
)
(createtoolbar "轴测图直线" "zline" "RCDATA_16_OSNEND")

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

楼主,用你这个方法,生成的cui,mnu文件都放在了“我的文档”,文件有些乱,能否设置自定义路径,将cui,mun文件放到自己希望的文件夹去?  发表于 2013-12-17 08:45
赞  发表于 2013-2-26 22:58

评分

参与人数 5明经币 +5 收起 理由
张和平 + 1 赞一个!
004 + 1 很给力!
zyhandw + 1 试验成功!太赞了,强烈支持!!
669423907 + 1 很给力!
仲文玉 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2012-4-16 21:47 | 显示全部楼层
changyiran 发表于 2012-4-16 20:29
这个路径貌似不好取得,其实如果能取得cad下面的backup的路径也是很好的,可惜我不会取得。能不能指教下? ...

(defun getlsppath (/ lsppath)        ; 读取运行程序路径并加到cad支持路径_by:wzh,如果运行的是vlx,要把程序里边的lsp改为vlx
    (setq lsppath (vl-registry-read "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\lsp"
                                    (substr (vl-registry-read "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\lsp"
                                                              "MRUList"
                                            ) 1 1
                                    )
                  )
    )
    (setenv "ACAD" (strcat (getenv "ACAD") ";" (vl-filename-directory lsppath)))
    lsppath
  )
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-13 09:21 | 显示全部楼层
;;; ================================================================
;;; 功能:自动为.isp命令创建一个命令的按钮子函数
;;; 使用: 在.isp文件最后最下方写入一句 (createtoolbar name sym bmp )
;;;       其中:name为命令中文名称,sym为执行的命令,bmp为图标,最好采用
;;;       系统图标,自定义图标需拷贝到支持目录,为*.bmp格式.
;;; 样例createtoolbar "轴测图直线" "zline" "rcdata_16_osnend")
;;;      (createtoolbar "轴测图直线" "zline" "zline.bmp")
;;; 作者:langjs                                   日期:2012年4月1日
;;; ================================================================
(defun createtoolbar (name sym bmp / file x)
  (setvar "cmdecho" 0)
  (vl-load-com)
  (if (menugroup "TEMPTOOLBAR") (command "menuunload" "TEMPTOOLBAR"))
  (alert "\n程序将自动创建\"临时工具栏\",请稍后")
  (setq file (open "TEMPTOOLBAR.mnu" "W"))
  (foreach x (list "***MENUGROUP=TEMPTOOLBAR\n\n***TOOLBARS\n**TEMPTOOLBAR"
     "ID_TEMP001   [_Toolbar(\"临时工具栏\", _Floating, _Hide, 10, 340, 1)]"
    (strcat "ID_TEMP011   [_Button(\"" name "\", \"" bmp "\", \"" bmp "\")]^C^C" sym)
      )
    (princ (strcat x "\n") file)
  )
  (close file)
  (command "menuload" "TEMPTOOLBAR.mnu")
  (command "TOOLBAR" "临时工具栏" "S")
  (princ)
)
(createtoolbar "轴测图直线" "zline" "RCDATA_16_OSNEND"  )
;(createtoolbar "红色" "tt" "co1.bmp"  )

不能创建多个按钮,有方法吗?
发表于 2023-3-18 18:53 | 显示全部楼层
langjs 发表于 2012-4-16 21:47
(defun getlsppath (/ lsppath)        ; 读取运行程序路径并加到cad支持路径_by:wzh,如果运行的是vlx, ...

楼主你好,生成的cui,mnu文件怎么放到自己指定的位置而不在文档里面,谢谢
发表于 2012-4-6 22:27 | 显示全部楼层
  (progn                           ; 如果没加载,则自动执行下面程序
      (alert "\n程序自动创建\"动态轴测图\"工具栏,请稍后")
我被执行这段,ACAD2010的

点评

第一次加载是这样的  发表于 2012-4-6 23:12
发表于 2012-4-6 23:34 | 显示全部楼层
这个好啊,谢谢楼主分享。慢慢看。
发表于 2012-4-7 06:59 来自手机 | 显示全部楼层
先占个位子
发表于 2012-4-7 08:23 | 显示全部楼层
这个例子太好了,下来好好学学,谢谢楼主!!
发表于 2012-4-7 10:34 | 显示全部楼层
是好方法,
发表于 2012-4-7 12:48 | 显示全部楼层
好期待
发表于 2012-4-7 20:36 | 显示全部楼层
功夫佬 发表于 2012-4-6 22:27
(progn                           ; 如果没加载,则自动执行下面程序
      (alert "\n程序自动创建\"动 ...

看到你回后,再次去试一下,真的可以啦了,太感谢你给我有成功的喜悦感~~
发表于 2012-4-9 00:47 | 显示全部楼层
dddddddddddddddddddddd
发表于 2012-4-9 09:00 | 显示全部楼层
我一直相学这个啊..谢谢!我慢慢看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 04:39 , Processed in 0.288182 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表