yanshengjiang 发表于 2025-10-9 20:16:14

工具面板切换标签不闪屏

本帖最后由 yanshengjiang 于 2025-10-9 23:58 编辑

看见有人求助,并且发了源码,用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-9 21:32:35

如果用普通的button,切换分组时因为按钮上文本内容要变,就需要关闭DCL再重新打开以实现更新,所以会闪一下,改用image_button就可以硬写文字更新,不用闪

yanshengjiang 发表于 2025-10-10 00:30:55

本帖最后由 yanshengjiang 于 2025-10-10 00:34 编辑

随便修改。

kozmosovia 发表于 2025-10-10 22:02:25

本帖最后由 kozmosovia 于 2025-10-10 22:06 编辑

sachindkini 发表于 2025-10-10 20:59
how to vector image can you shareimage 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



kozmosovia 发表于 2025-10-10 16:07:09

cghdy 发表于 2025-10-10 09:18
text、edit_box也不闪吧

那个不闪也没有用,text无法定义动作函数,无法实现点取执行命令;edit_box是文本输入框,结果点取它后不是编辑文字而是关闭对话框执行个命令,从使用习惯上,怪怪的。

429014673 发表于 2025-10-9 20:18:25

这个不闪屏的好

qifeifei 发表于 2025-10-9 20:39:08

好厉害 下载研究看看

树櫴希德 发表于 2025-10-9 21:22:09

弱弱的问一下 什么闪屏?

yaokui25 发表于 2025-10-9 21:29:42

类似这种快捷键的设置可以有吗?

kozmosovia 发表于 2025-10-9 21:43:31

yaokui25 发表于 2025-10-9 21:29
类似这种快捷键的设置可以有吗?

不需要切换界面,可以直接定义快捷键,如果要切换界面还支持快捷键,那就只有闪一下的方式。

tigcat 发表于 2025-10-9 21:43:31

楼主很给力!

yanshengjiang 发表于 2025-10-9 21:51:35

yaokui25 发表于 2025-10-9 21:29
类似这种快捷键的设置可以有吗?

不知道呢你这是普通dcl吗好屌
页: [1] 2 3 4
查看完整版本: 工具面板切换标签不闪屏