本帖最后由 yanshengjiang 于 2025-10-9 23:58 编辑
看见有人求助,并且发了源码,用deepseek改了改,应该是他要的结果吧.
工具面板切换标签不闪屏.
求助帖是:http://bbs.mjtd.com/thread-192702-1-1.html
晚11点更新,记住上次打开的标签,和位置。文件和代码一样的。土豪请。
下面是GIF和源码:
网友答:
如果用普通的button,切换分组时因为按钮上文本内容要变,就需要关闭DCL再重新打开以实现更新,所以会闪一下,改用image_button就可以硬写文字更新,不用闪网友答:
本帖最后由 yanshengjiang 于 2025-10-10 00:34 编辑
随便修改。网友答: 本帖最后由 kozmosovia 于 2025-10-10 22:06 编辑
Can use Lee-mac's GrtextDialog to draw English text on DCL
https://lee-mac.com/grtext.html
Chinese characters can be built on-fly, such as ButtonTextMenu:
http://bbs.mjtd.com/thread-192920-1-1.html
网友答:
那个不闪也没有用,text无法定义动作函数,无法实现点取执行命令;edit_box是文本输入框,结果点取它后不是编辑文字而是关闭对话框执行个命令,从使用习惯上,怪怪的。网友答: 这个不闪屏的好网友答: 好厉害 下载研究看看网友答: 弱弱的问一下 什么闪屏?网友答: 类似这种快捷键的设置可以有吗?网友答:
不需要切换界面,可以直接定义快捷键,如果要切换界面还支持快捷键,那就只有闪一下的方式。网友答: 楼主很给力!网友答:
不知道呢 你这是普通dcl吗 好屌
看见有人求助,并且发了源码,用deepseek改了改,应该是他要的结果吧.
工具面板切换标签不闪屏.
求助帖是:http://bbs.mjtd.com/thread-192702-1-1.html
晚11点更新,记住上次打开的标签,和位置。文件和代码一样的。土豪请。
下面是GIF和源码:

- (vl-load-com)
- ;; 全局变量,用于记忆上次使用的工具组
- (setq *toolbox-last-group* nil)
- ;; +++ 新增:全局变量,用于记忆上次对话框的位置 +++
- (setq *screenpoint* nil)
- (defun c:TB (/ *dcl-file* *dcl-id* current-group dcl-result)
- (vl-load-com)
-
- ;; 设置当前组:优先使用全局变量中的值,否则默认为"A"
- (setq current-group (cond (*toolbox-last-group*) ("A")))
- ;; 错误处理函数
- (defun *error* (msg)
- (if (and *dcl-id* (new_dialog "toolbox" *dcl-id*))
- (done_dialog)
- )
- (if *dcl-file* (vl-file-delete *dcl-file*))
- (princ (strcat "\n工具箱错误: " msg))
- )
- ;; 完整工具数据库 (A-J共10组,每组最多50个工具)
- (setq *tool-database*
- '(("A" "绘图工具"
- (("直线" "LINE") ("圆" "CIRCLE") ("圆弧" "ARC") ("多段线" "PLINE") ("样条曲线" "SPLINE")
- ("矩形" "RECTANG") ("多边形" "POLYGON") ("椭圆" "ELLIPSE") ("点" "POINT") ("填充图案" "HATCH")
- ("构造线" "XLINE") ("射线" "RAY") ("云线" "REVCLOUD") ("区域" "REGION") ("边界" "BOUNDARY")
- ("面域" "REGION") ("三维面" "3DFACE") ("长方体" "BOX") ("球体" "SPHERE") ("圆柱体" "CYLINDER")
- ("圆锥体" "CONE") ("楔体" "WEDGE") ("圆环" "TORUS") ("拉伸" "EXTRUDE") ("旋转" "REVOLVE")
- ("扫描" "SWEEP") ("放样" "LOFT") ("并集" "UNION") ("差集" "SUBTRACT") ("交集" "INTERSECT")
- ("移动" "MOVE") ("复制" "COPY") ("旋转" "ROTATE") ("缩放" "SCALE") ("镜像" "MIRROR")
- ("阵列" "ARRAY") ("偏移" "OFFSET") ("修剪" "TRIM") ("延伸" "EXTEND") ("打断" "BREAK")
- ("倒角" "CHAMFER") ("圆角" "FILLET") ("分解" "EXPLODE") ("对齐" "ALIGN") ("合并" "JOIN")
- ("拉长" "LENGTHEN") ("编辑多段线" "PEDIT") ("编辑样条线" "SPLINEDIT") ("编辑填充" "HATCHEDIT") ("编辑文字" "TEXTEDIT")))
-
- ("B" "修改工具"
- (("删除" "ERASE") ("复制" "COPY") ("镜像" "MIRROR") ("偏移" "OFFSET") ("阵列" "ARRAY")
- ("移动" "MOVE") ("旋转" "ROTATE") ("缩放" "SCALE") ("拉伸" "STRETCH") ("修剪" "TRIM")
- ("延伸" "EXTEND") ("打断" "BREAK") ("倒角" "CHAMFER") ("圆角" "FILLET") ("分解" "EXPLODE")
- ("对齐" "ALIGN") ("合并" "JOIN") ("拉长" "LENGTHEN") ("编辑多段线" "PEDIT") ("编辑样条线" "SPLINEDIT")
- ("编辑填充" "HATCHEDIT") ("编辑文字" "TEXTEDIT") ("编辑属性" "EATTEDIT") ("编辑块" "BEDIT") ("编辑参照" "REFEDIT")))
-
- ("C" "标注工具"
- (("线性标注" "DIMLINEAR") ("对齐标注" "DIMALIGNED") ("半径标注" "DIMRADIUS") ("直径标注" "DIMDIAMETER") ("角度标注" "DIMANGULAR")
- ("弧长标注" "DIMARC") ("坐标标注" "DIMORDINATE") ("快速标注" "QDIM") ("基线标注" "DIMBASELINE") ("连续标注" "DIMCONTINUE")))
-
- ("D" "图层工具"
- (("图层管理" "LAYER") ("图层状态" "LAYERSTATE") ("图层隔离" "LAYISO") ("取消隔离" "LAYUNISO") ("图层冻结" "LAYFRZ")
- ("图层解冻" "LAYTHW") ("图层锁定" "LAYLCK") ("图层解锁" "LAYULK") ("图层删除" "LAYDEL") ("图层合并" "LAYMRG")))
-
- ("E" "块工具"
- (("创建块" "BLOCK") ("插入块" "INSERT") ("编辑块" "BEDIT") ("块编辑器" "BEDIT") ("属性定义" "ATTDEF")
- ("编辑属性" "EATTEDIT") ("块属性管理" "BATTMAN") ("重定义块" "REFEDIT") ("块替换" "BLOCKREPLACE") ("块统计" "BCOUNT")))
-
- ("F" "参照工具"
- (("外部参照" "XREF") ("图像附着" "IMAGEATTACH") ("PDF附着" "PDFATTACH") ("DGN附着" "DGNATTACH") ("DWF附着" "DWFATTACH")
- ("参照编辑" "REFEDIT") ("参照裁剪" "XCLIP") ("参照绑定" "XBIND") ("参照卸载" "XREFUNLOAD") ("参照重载" "XREFRELOAD")))
-
- ("G" "三维工具"
- (("长方体" "BOX") ("球体" "SPHERE") ("圆柱体" "CYLINDER") ("圆锥体" "CONE") ("楔体" "WEDGE")
- ("圆环" "TORUS") ("拉伸" "EXTRUDE") ("旋转" "REVOLVE") ("扫描" "SWEEP") ("放样" "LOFT")))
-
- ("H" "渲染工具"
- (("材质浏览器" "MATBROWSEROPEN") ("材质编辑器" "MATEDITOROPEN") ("贴图" "MATERIALMAP") ("光源" "LIGHT") ("阳光特性" "SUNPROPERTIES")
- ("渲染" "RENDER") ("渲染环境" "RENDERENVIRONMENT") ("渲染输出" "RENDEROUTPUT") ("高级渲染设置" "RPREF") ("渲染窗口" "RENDERWIN")))
-
- ("I" "查询工具"
- (("距离" "DIST") ("半径" "MEASUREGEOM") ("角度" "MEASUREGEOM") ("面积" "AREA") ("体积" "MEASUREGEOM")
- ("质量特性" "MASSPROP") ("列表" "LIST") ("点坐标" "ID") ("时间" "TIME") ("状态" "STATUS")))
-
- ("J" "自定义工具"
- (("选项" "OPTIONS") ("自定义界面" "CUI") ("键盘快捷键" "CUI") ("鼠标手势" "CUI") ("工具栏" "CUI")
- ("菜单" "CUI") ("面板" "CUI") ("工作空间" "WSCURRENT") ("脚本" "SCRIPT") ("LISP加载" "APPLOAD")))
- ))
- ;; 创建DCL文件并加载对话框
- (setq *dcl-file* (vl-filename-mktemp "TB_final.dcl"))
- (create-toolbox-dcl *dcl-file*)
- (setq *dcl-id* (load_dialog *dcl-file*))
-
- ;; +++ 关键修改:初始化对话框时,传入记忆的位置参数 dialog-position +++
- (if (not (new_dialog "toolbox" *dcl-id* "" (cond ( *screenpoint* ) ( '(-1 -1) ))))
- (progn
- (vl-file-delete *dcl-file*)
- (princ "\n无法创建对话框")
- (exit)
- )
- )
-
- ;; 初始化界面
- (init-toolbox-dialog current-group)
-
- ;; 主循环
- (setq dcl-result (start_dialog))
-
- ;; 保存当前组到全局变量(记忆功能)
- (setq *toolbox-last-group* current-group)
-
- ;; 清理资源
- (unload_dialog *dcl-id*)
- (vl-file-delete *dcl-file*)
-
- (princ)
- )
- (defun create-toolbox-dcl (fname / tmp n)
- (setq tmp (open fname "w"))
-
- (write-line "toolbox : dialog {" tmp)
- (write-line " label = \"★工具箱★\";" tmp)
- (write-line " spacer; initial_focus = \"groupA\";" tmp)
- (write-line " : row {" tmp)
-
- ;; 左侧分类区域 - 显示文字
- (write-line " : boxed_column {" tmp)
- (write-line " label = \"工具分类\"; width = 15; fixed_width = true;" tmp)
- (write-line " : column {" tmp)
- (foreach g *tool-database*
- (write-line
- (strcat " : button { key = \"group" (car g) "\"; label = \"" (cadr g) "\"; fixed_width = true; width = 16; height = 2; }")
- tmp
- )
- )
- (write-line " }" tmp)
- (write-line " }" tmp)
-
- ;; 右侧工具区域
- (write-line " : boxed_column {" tmp)
- (write-line " label = \"工具列表\"; key = \"toolgroup\";" tmp)
- (write-line " : row {" tmp)
-
- (setq n 1)
- (repeat 5
- (write-line " : column { fixed_width = true; alignment = centered;" tmp)
- (repeat 10
- (write-line
- (strcat " : image_button { key = \"tool" (itoa n) "\"; width = 16; height = 2; fixed_width = true; }")
- tmp
- )
- (setq n (1+ n)))
- (write-line " }" tmp))
- (write-line " }" tmp)
- (write-line " }" tmp)
- (write-line " }" tmp)
-
- ;; 修改:只保留取消按钮
- (write-line " spacer;" tmp)
- (write-line " : row { alignment = right;" tmp)
- (write-line ":image { key=\"yan_image\";width=31.4;height=2.5;fixed_width=true;fixed_height=true;}" tmp)
- (write-line " : button { key = \"cancel\"; label = \"取消\"; is_cancel = true; fixed_width = true; width = 10; }" tmp)
- (write-line " }" tmp)
- (write-line "}" tmp)
- (close tmp)
- )
- (defun init-toolbox-dialog (group-code)
- ;; 设置分类按钮 - 显示文字
- (foreach group *tool-database*
- (setq key (strcat "group" (car group)))
- (setq label (cadr group))
-
- ;; 设置按钮颜色
- (if (eq (car group) group-code)
- (progn
- (mode_tile key 2) ; 当前组高亮显示
- (set_tile key label)
- )
- (progn
- (mode_tile key 0) ; 其他组正常显示
- (set_tile key label)
- )
- )
-
- (action_tile key
- (strcat
- "(progn "
- "(setq current-group \"" (car group) "\") " ; 更新当前组变量
- "(update-tool-group \"" (car group) "\") "
- ")"
- )
- )
- )
-
- ;; 初始化工具按钮
- (update-tool-group group-code)
-
- ;; 设置底部按钮 - 只保留取消按钮
- (action_tile "cancel" "(setq *screenpoint* (done_dialog 0))");为记住上次位置的改动2/2
- )
- (defun update-tool-group (group-code / group tools n tool-pair tool-name)
- (setq group (assoc group-code *tool-database*))
- (setq tools (caddr group))
-
- ;; 更新标题
- (set_tile "toolgroup" (strcat (cadr group) " (" group-code ")"))
-
- ;; 更新所有工具按钮
- (foreach n (number-list 1 50)
- (setq key (strcat "tool" (itoa n)))
- (setq tool-pair (if (< (1- n) (length tools)) (nth (1- n) tools) nil))
- (setq tool-name (if tool-pair (car tool-pair) ""))
-
- ;; 设置图像按钮背景和文字
- (start_image key)
- (if tool-pair
- (fill_image 0 0 (dimx_tile key) (dimy_tile key) 123) ; 有工具:蓝色背景
- (fill_image 0 0 (dimx_tile key) (dimy_tile key) 8) ; 无工具:灰色背景
- )
- (end_image)
- (set_tile key tool-name) ; 设置按钮文字
-
- ;; 启用或禁用按钮
- (if tool-pair
- (mode_tile key 0) ; 启用
- (mode_tile key 1) ; 禁用
- )
-
- ;; 设置按钮动作 - 执行命令后关闭对话框
- (yanshengjiangimage)
- (action_tile key
- (if tool-pair
- (strcat
- "(progn "
- "(execute-tool-command \"" group-code "\" " (itoa n) ") "
- "(done_dialog 2)" ; 执行命令后关闭对话框
- ")"
- )
- "" ; 空动作
- )
- )
- )
-
- ;; 更新分类按钮高亮
- (foreach group *tool-database*
- (setq key (strcat "group" (car group)))
- (setq label (cadr group))
-
- (if (eq (car group) group-code)
- (progn
- (mode_tile key 2) ; 当前组高亮显示
- (set_tile key label)
- )
- (progn
- (mode_tile key 0) ; 其他组正常显示
- (set_tile key label)
- )
- )
- )
-
- (setq current-group group-code)
- )
- (defun execute-tool-command (group-code btn-num / cmd acad doc result)
- (if (setq cmd (get-tool-command group-code btn-num))
- (progn
- (princ (strcat "\n执行命令: " cmd))
-
- ;; 使用更安全的命令执行方式,避免ARX异常
- (if (safe-execute-command cmd)
- (princ "\n命令执行成功")
- (alert "命令执行失败,请检查命令是否存在")
- )
- )
- (alert "无效命令")
- )
- )
- ;; 安全执行命令函数,避免ARX异常
- (defun safe-execute-command (cmd / acad doc result)
- (setq acad (vlax-get-acad-object))
- (setq doc (vla-get-ActiveDocument acad))
-
- ;; 使用错误处理避免ARX异常
- (setq result (vl-catch-all-apply 'vla-SendCommand (list doc (strcat cmd "\n"))))
-
- (if (vl-catch-all-error-p result)
- (progn
- (princ (strcat "\n命令执行错误: " (vl-catch-all-error-message result)))
- nil ; 返回nil表示执行失败
- )
- T ; 返回T表示执行成功
- )
- )
- (defun get-tool-command (group-code btn-num / group tools tool-pair)
- (if (and (setq group (assoc group-code *tool-database*))
- (setq tools (caddr group))
- (< (1- btn-num) (length tools)))
- (cadr (nth (1- btn-num) tools)) ; 获取命令字符串
- nil
- )
- )
- (defun number-list (start end)
- (if (> start end)
- nil
- (cons start (number-list (1+ start) end))
- )
- )
- (princ "\n工具箱命令 TB 已加载,输入 TB 启动")
- (princ)
- (defun yanshengjiangimage()
- ;; 初始化图像控件
- (start_image "yan_image")
- ;; 调整画布尺寸以适应11个字母
- (fill_image 0 0 188 30 9) ; 宽度增加到88像素
- ;; 绘制简洁边框
- (vector_image 5 5 183 5 5) ; 上边框 (蓝色)
- (vector_image 183 5 183 25 5) ; 右边框 (蓝色)
- (vector_image 183 25 5 25 5) ; 下边框 (蓝色)
- (vector_image 5 25 5 5 5) ; 左边框 (蓝色)
- ;; ===== 绘制YANSHENGJIANG =====
- ;; 每个字母间隔7像素,使用三层绘制效果
- ;; Y (x=10)
- (vector_image 12 7 17 13 4) ; 阴影
- (vector_image 22 7 17 13 4)
- (vector_image 17 13 17 20 4)
- (vector_image 13 8 18 14 1) ; 加粗
- (vector_image 23 8 18 14 1)
- (vector_image 18 14 18 21 1)
- (vector_image 12 7 17 13 1) ; 原始
- (vector_image 22 7 17 13 1)
- (vector_image 17 13 17 20 1)
- ;; A (x=24)
- (vector_image 25 20 30 7 4)
- (vector_image 30 7 35 20 4)
- (vector_image 27 13 33 13 4)
- (vector_image 26 21 31 8 1)
- (vector_image 31 8 36 21 1)
- (vector_image 28 14 34 14 1)
- (vector_image 25 20 30 7 1)
- (vector_image 30 7 35 20 1)
- (vector_image 27 13 33 13 1)
- ;; N (x=38)
- (vector_image 38 20 38 7 4)
- (vector_image 38 7 48 20 4)
- (vector_image 48 20 48 7 4)
- (vector_image 39 21 39 8 1)
- (vector_image 39 8 49 21 1)
- (vector_image 49 21 49 8 1)
- (vector_image 38 20 38 7 1)
- (vector_image 38 7 48 20 1)
- (vector_image 48 20 48 7 1)
- ;; S (x=52)
- (vector_image 52 7 62 7 4)
- (vector_image 52 7 52 13 4)
- (vector_image 52 13 62 13 4)
- (vector_image 62 13 62 20 4)
- (vector_image 52 20 62 20 4)
- (vector_image 53 8 63 8 1)
- (vector_image 53 8 53 14 1)
- (vector_image 53 14 63 14 1)
- (vector_image 63 14 63 21 1)
- (vector_image 53 21 63 21 1)
- (vector_image 52 7 62 7 1)
- (vector_image 52 7 52 13 1)
- (vector_image 52 13 62 13 1)
- (vector_image 62 13 62 20 1)
- (vector_image 52 20 62 20 1)
- ;; H (x=66)
- (vector_image 66 7 66 20 4)
- (vector_image 66 13 76 13 4)
- (vector_image 76 7 76 20 4)
- (vector_image 67 8 67 21 1)
- (vector_image 67 14 77 14 1)
- (vector_image 77 8 77 21 1)
- (vector_image 66 7 66 20 1)
- (vector_image 66 13 76 13 1)
- (vector_image 76 7 76 20 1)
- ;; E (x=80)
- (vector_image 80 7 90 7 4)
- (vector_image 80 7 80 20 4)
- (vector_image 80 13 87 13 4)
- (vector_image 80 20 90 20 4)
- (vector_image 81 8 91 8 1)
- (vector_image 81 8 81 21 1)
- (vector_image 81 14 88 14 1)
- (vector_image 81 21 91 21 1)
- (vector_image 80 7 90 7 1)
- (vector_image 80 7 80 20 1)
- (vector_image 80 13 87 13 1)
- (vector_image 80 20 90 20 1)
- ;; N (x=94)
- (vector_image 94 20 94 7 4)
- (vector_image 94 7 104 20 4)
- (vector_image 104 20 104 7 4)
- (vector_image 95 21 95 8 1)
- (vector_image 95 8 105 21 1)
- (vector_image 105 21 105 8 1)
- (vector_image 94 20 94 7 1)
- (vector_image 94 7 104 20 1)
- (vector_image 104 20 104 7 1)
- ;; G (x=108)
- (vector_image 108 7 118 7 4)
- (vector_image 108 7 108 20 4)
- (vector_image 108 20 118 20 4)
- (vector_image 118 20 118 13 4)
- (vector_image 113 13 118 13 4)
- (vector_image 109 8 119 8 1)
- (vector_image 109 8 109 21 1)
- (vector_image 109 21 119 21 1)
- (vector_image 119 21 119 14 1)
- (vector_image 114 14 119 14 1)
- (vector_image 108 7 118 7 1)
- (vector_image 108 7 108 20 1)
- (vector_image 108 20 118 20 1)
- (vector_image 118 20 118 13 1)
- (vector_image 113 13 118 13 1)
- ;; J (x=122)
- (vector_image 122 7 132 7 4)
- (vector_image 132 7 132 17 4)
- (vector_image 122 20 132 17 4)
- (vector_image 119 20 122 20 4)
- (vector_image 123 8 133 8 1)
- (vector_image 133 8 133 18 1)
- (vector_image 123 21 133 18 1)
- (vector_image 120 21 123 21 1)
- (vector_image 122 7 132 7 1)
- (vector_image 132 7 132 17 1)
- (vector_image 122 20 132 17 1)
- (vector_image 119 20 122 20 1)
- ;; I (x=136)
- (vector_image 136 7 136 20 4)
- (vector_image 137 8 137 21 1)
- (vector_image 136 7 136 20 1)
- ;; A (x=140)
- (vector_image 140 20 145 7 4)
- (vector_image 145 7 150 20 4)
- (vector_image 142 13 148 13 4)
- (vector_image 141 21 146 8 1)
- (vector_image 146 8 151 21 1)
- (vector_image 143 14 149 14 1)
- (vector_image 140 20 145 7 1)
- (vector_image 145 7 150 20 1)
- (vector_image 142 13 148 13 1)
- ;; N (x=154)
- (vector_image 154 20 154 7 4)
- (vector_image 154 7 164 20 4)
- (vector_image 164 20 164 7 4)
- (vector_image 155 21 155 8 1)
- (vector_image 155 8 165 21 1)
- (vector_image 165 21 165 8 1)
- (vector_image 154 20 154 7 1)
- (vector_image 154 7 164 20 1)
- (vector_image 164 20 164 7 1)
- ;; G (x=168)
- (vector_image 168 7 178 7 4)
- (vector_image 168 7 168 20 4)
- (vector_image 168 20 178 20 4)
- (vector_image 178 20 178 13 4)
- (vector_image 173 13 178 13 4)
- (vector_image 169 8 179 8 1)
- (vector_image 169 8 169 21 1)
- (vector_image 169 21 179 21 1)
- (vector_image 179 21 179 14 1)
- (vector_image 174 14 179 14 1)
- (vector_image 168 7 178 7 1)
- (vector_image 168 7 168 20 1)
- (vector_image 168 20 178 20 1)
- (vector_image 178 20 178 13 1)
- (vector_image 173 13 178 13 1)
- (end_image)
- )
随便修改。网友答: 本帖最后由 kozmosovia 于 2025-10-10 22:06 编辑
sachindkini 发表于 2025-10-10 20:59
how to vector image can you share image to vector lsp
Can use Lee-mac's GrtextDialog to draw English text on DCL
https://lee-mac.com/grtext.html
Chinese characters can be built on-fly, such as ButtonTextMenu:
http://bbs.mjtd.com/thread-192920-1-1.html
网友答:
cghdy 发表于 2025-10-10 09:18
text、edit_box也不闪吧
那个不闪也没有用,text无法定义动作函数,无法实现点取执行命令;edit_box是文本输入框,结果点取它后不是编辑文字而是关闭对话框执行个命令,从使用习惯上,怪怪的。网友答: 这个不闪屏的好网友答: 好厉害 下载研究看看网友答: 弱弱的问一下 什么闪屏?网友答: 类似这种快捷键的设置可以有吗?网友答:
yaokui25 发表于 2025-10-9 21:29
类似这种快捷键的设置可以有吗?
不需要切换界面,可以直接定义快捷键,如果要切换界面还支持快捷键,那就只有闪一下的方式。网友答: 楼主很给力!网友答:
yaokui25 发表于 2025-10-9 21:29
类似这种快捷键的设置可以有吗?
不知道呢 你这是普通dcl吗 好屌