;;;=========================================== ;;; 程序名称:综合云线标注工具 ;;; 鸣谢:湘潭国际院罗晓勇、周志锦、陈逸君和广大工作者 ;;; 燕非堂改编 QQ:353955675,感谢结构菜虫 ;;; 命令名称:ZC11 ;;; 功能:绘制云线并标注意见,支持多种图层选择 ;;; 非打印图层:勾选后引线和文字放在非打印图层,颜色6 ;;;=========================================== ;;; ★ 全局变量 - 使用 defvar 确保只初始化一次 (if (not *zcc11-layer-choice*) (setq *zcc11-layer-choice* "layer1")) (if (not *zcc11-use-custom*) (setq *zcc11-use-custom* "0")) (if (not *zcc11-use-nonprint*) (setq *zcc11-use-nonprint* "0")) (if (not *zcc11-justify*) (setq *zcc11-justify* "TL")) (if (not *zcc11-custom-color*) (setq *zcc11-custom-color* 7)) ;;; 别名 (setq *last-layer-choice* *zcc11-layer-choice*) (setq *last-use-custom* *zcc11-use-custom*) (setq *last-use-nonprint* *zcc11-use-nonprint*) (setq *last-justify* *zcc11-justify*) (setq *custom-color-val* *zcc11-custom-color*) ;;; ★★★ 全局活动标记 - 用于错误恢复 ★★★ (setq *draw-cloud-active* nil) ;;; ★★★ 全局错误处理函数 ★★★ (defun *error* (msg) (princ (strcat "\n错误: " msg)) ;; 如果 draw_cloud 正在运行,尝试恢复系统变量 (if *draw-cloud-active* (progn (safe-setvar "clayer" (vl-catch-all-apply 'getvar (list "clayer"))) (safe-setvar "blipmode" 0) (safe-setvar "cmdecho" 1) (safe-setvar "osmode" 0) (safe-setvar "LWDISPLAY" 1) (safe-setvar "textstyle" "Standard") (setq *draw-cloud-active* nil) ) ) (princ) ) ;;; 创建字体样式 (defun create_text_style () (if (= (tblobjname "STYLE" "CJW") nil) (progn (setq ELIST (list (cons 0 "STYLE") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbTextStyleTableRecord") (cons 2 "CJW") (cons 70 0) (cons 40 0.0) (cons 41 0.7) (cons 50 0.0) (cons 71 0) (cons 42 300.0) (cons 3 "tssdeng.shx") ) ) (setq ELIST (append ELIST (list (cons 4 "hztxt.shx"))) ) (entmake ELIST) ) ) (setvar "textstyle" "CJW") ) ;;; 获取当前日期字符串 (defun get_today_date () (setq year (rtos (getvar "cdate") 2 0)) (setq year (substr year 1 4)) (setq month (substr (rtos (getvar "cdate") 2 2) 5 2)) (setq day (substr (rtos (getvar "cdate") 2 2) 7 2)) (strcat year "年" month "月" day "日") ) ;;; 通用函数:检查并创建图层(可打印) (defun ly_mak_gen (l_color l_name /) (if (= (tblobjname "LAYER" l_name) nil) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 l_name) (cons 62 l_color) (cons 6 "CONTINUOUS") (cons 70 0) (cons 290 1) )) ) l_name ) ;;; 创建非打印图层 (defun ly_mak_nonprint (l_color l_name /) (if (= (tblobjname "LAYER" l_name) nil) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 l_name) (cons 62 l_color) (cons 6 "CONTINUOUS") (cons 70 0) (cons 290 0) )) ) l_name ) ;;; ★★★ 安全恢复系统变量的辅助函数 ★★★ (defun safe-setvar (var value /) (if (and value (not (eq value ""))) (progn (vl-catch-all-apply 'setvar (list var value)) ) ) ) ;;; 核心绘图函数 (defun draw_cloud ( layer_name layer_color text_justify use_nonprint / pt1 pt2 pt3 textt text_ent pline_ent cloud_ent rect_ent orig_clayer orig_blip orig_cmd orig_osnap orig_lwdisplay orig_textstyle) ;; 保存原始设置 - 使用 try-catch 确保安全 (setq orig_clayer (vl-catch-all-apply 'getvar (list "clayer"))) (setq orig_blip (vl-catch-all-apply 'getvar (list "blipmode"))) (setq orig_cmd (vl-catch-all-apply 'getvar (list "cmdecho"))) (setq orig_osnap (vl-catch-all-apply 'getvar (list "osmode"))) (setq orig_lwdisplay (vl-catch-all-apply 'getvar (list "LWDISPLAY"))) (setq orig_textstyle (vl-catch-all-apply 'getvar (list "textstyle"))) ;; ★★★ 设置活动标记,以便错误处理函数能够恢复 ★★★ (setq *draw-cloud-active* t) ;; 设置系统变量 - 使用 try-catch 确保安全 (vl-catch-all-apply 'setvar (list "LWDISPLAY" 1)) (vl-catch-all-apply 'setvar (list "blipmode" 0)) (vl-catch-all-apply 'setvar (list "cmdecho" 0)) (vl-catch-all-apply 'setvar (list "osmode" 3)) (vl-catch-all-apply 'setvar (list "plinewid" 100)) (vl-catch-all-apply 'setvar (list "textstyle" "CJW")) ;; 创建主图层(用于矩形和云线) (ly_mak_gen layer_color layer_name) (command "layer" "m" layer_name "") (command "layer" "c" layer_color layer_name "") ;; 如果勾选非打印,创建非打印图层(用于引线和文字) (if (= use_nonprint "1") (progn (ly_mak_nonprint 6 "S—HK非打印层moban意见修改") (command "layer" "m" "S—HK非打印层moban意见修改" "") (command "layer" "c" 6 "S—HK非打印层moban意见修改" "") (command "layer" "p" "n" "S—HK非打印层moban意见修改" "") ) ) (princ (strcat "\n主图层: " layer_name "(颜色: " (itoa layer_color) ")")) (if (= use_nonprint "1") (princ "\n非打印图层: S—HK非打印层moban意见修改(颜色: 6)用于引线和文字") ) ;; 使用 vl-catch-all-apply 包装可能出错的用户交互部分 (vl-catch-all-apply '(lambda () ;; 获取用户输入 (setq pt1 (getpoint "\n请指定第一个角点(起点): ")) (if pt1 (progn (setq pt2 (getcorner pt1 "\n请指定对角点(终点): ")) (if pt2 (progn ;; ===== 在主图层绘制矩形和云线 ===== (command "layer" "s" layer_name "") (command "_.rectang" pt1 pt2 "") (setq rect_ent (entlast)) (command "_.revcloud" "s" "n" "a" "300" "300" "o" rect_ent "y") (setq cloud_ent (entlast)) ;; 给云线赋予主图层的颜色 (command "chprop" cloud_ent "" "c" layer_color "") ;; 获取文字标注点 (setq pt3 (getpoint pt2 "\n请指定文字标注点: ")) (if pt3 (progn ;; ===== 判断是否勾选非打印 ===== (if (= use_nonprint "1") (progn ;; ★ 勾选:切换到非打印图层,引线和文字颜色为6 (command "layer" "s" "S—HK非打印层moban意见修改" "") ;; 绘制引线 (command "pline" pt2 "W" "0.05" "0.05" pt3 "") (setq pline_ent (entlast)) (command "chprop" pline_ent "" "c" 6 "") ;; 获取意见文字 (princ "\n请输入您的意见(直接按回车自动添加今日日期): ") (setq textt (getstring)) (if (= textt "") (setq textt (get_today_date)) ) ;; 标注文字 (if (= text_justify "TL") (COMMAND "_TEXT" "J" "TL" PT3 "600" "0" TEXTT) (COMMAND "_TEXT" "J" "ML" PT3 "600" "0" TEXTT) ) (setq text_ent (entlast)) (command "chprop" text_ent "" "c" 6 "") (princ "\n 引线和文字在非打印图层(颜色: 6)") ) (progn ;; ★ 不勾选:在主图层绘制引线和文字,颜色为主图层颜色 ;; 绘制引线 (command "pline" pt2 "W" "0.05" "0.05" pt3 "") (setq pline_ent (entlast)) (command "chprop" pline_ent "" "c" layer_color "") ;; 获取意见文字 (princ "\n请输入您的意见(直接按回车自动添加今日日期): ") (setq textt (getstring)) (if (= textt "") (setq textt (get_today_date)) ) ;; 标注文字 (if (= text_justify "TL") (COMMAND "_TEXT" "J" "TL" PT3 "600" "0" TEXTT) (COMMAND "_TEXT" "J" "ML" PT3 "600" "0" TEXTT) ) (setq text_ent (entlast)) (command "chprop" text_ent "" "c" layer_color "") (princ (strcat "\n 引线和文字在主图层(颜色: " (itoa layer_color) ")") ) ) ) (princ (strcat "\n? 云线标注完成!")) (princ (strcat "\n 主图层: " layer_name "(颜色: " (itoa layer_color) ")")) (princ (strcat "\n 意见: " textt)) ) (princ "\n? 未指定文字标注点,已取消。") ) ) (princ "\n? 未指定对角点,已取消。") ) ) (princ "\n? 未指定起点,已取消。") ) ) ) ;_结束 vl-catch-all-apply ;; ★★★ 恢复原始设置(安全版本)★★★ (safe-setvar "clayer" orig_clayer) (safe-setvar "blipmode" orig_blip) (safe-setvar "cmdecho" orig_cmd) (safe-setvar "osmode" orig_osnap) (safe-setvar "LWDISPLAY" orig_lwdisplay) (safe-setvar "textstyle" orig_textstyle) ;; ★★★ 清除活动标记 ★★★ (setq *draw-cloud-active* nil) (princ) ) ;;; DCL对话框定义 (defun show_dcl (/ dcl_id dcl_file dcl_fp dcl_result) ;; 创建临时DCL文件 (setq dcl_file (vl-filename-mktemp "zcc11.dcl")) (setq dcl_fp (open dcl_file "w")) (write-line "zcc11_dialog : dialog { label = \"云线标注工具 ZC11 (燕非堂改编 QQ:353955675,感谢结构菜虫),子命令Zc1,ZC12,ZC13,ZC15,\"; : boxed_radio_column { label = \"请选择主图层(矩形和云线)\"; key = \"layer_choice\"; : radio_button { label = \"S—HKmoban修改图层(颜色: 11)\"; key = \"layer1\"; } : radio_button { label = \"S—HK垂直标注修改图层(颜色: 12)\"; key = \"layer2\"; } : radio_button { label = \"S—HK垂直标注和修改moban图层(颜色: 13)\"; key = \"layer3\"; } : radio_button { label = \"S—HK非打印层moban意见修改图层(颜色: 40)\"; key = \"layer4\"; } } : boxed_column { label = \"文字对齐方式\"; : row { : radio_button { label = \"左上(TL)\"; key = \"align_tl\"; } : radio_button { label = \"中左(ML)\"; key = \"align_ml\"; } } } : boxed_column { label = \"自定义颜色设置\"; : toggle { label = \"使用自定义颜色(打勾后可选择颜色)\"; key = \"use_custom_color\"; } : row { : edit_box { label = \"颜色索引(1-255):\"; key = \"custom_color\"; edit_width = 10; enabled = false; } : button { label = \"选择颜色...\"; key = \"pick_color\"; width = 12; enabled = false; } } : text { label = \"提示:点击「选择颜色」按钮可在色卡中选择\"; fixed_width = true; } } : boxed_column { label = \"非打印图层设置\"; : toggle { label = \"勾选后,引线和意见放在非打印图层(颜色6)\"; key = \"use_nonprint\"; } : text { label = \"提示:引线和文字将放在「S—HK非打印层moban意见修改」\"; fixed_width = true; } } spacer_1; : row { : button { label = \"确定\"; key = \"accept\"; is_default = true; width = 12; } : button { label = \"取消\"; key = \"cancel\"; is_cancel = true; width = 12; } } }" dcl_fp ) (close dcl_fp) ;; 加载对话框 (setq dcl_id (load_dialog dcl_file)) (if (< dcl_id 0) (progn (princ "\n无法加载对话框!") (exit) ) ) ;; 显示对话框 (if (not (new_dialog "zcc11_dialog" dcl_id)) (progn (princ "\n无法显示对话框!") (exit) ) ) ;; ===== ★ 从全局变量恢复上次设置 ===== ;; ★★★ 修复:正确恢复 radio_button 状态并设置焦点 ★★★ ;; 先将所有按钮置0 (set_tile "layer1" "0") (set_tile "layer2" "0") (set_tile "layer3" "0") (set_tile "layer4" "0") ;; 设置选中的为1,并设置焦点 (cond ((= *last-layer-choice* "layer1") (set_tile "layer1" "1") (mode_tile "layer1" 2)) ; 2 = 设置焦点 ((= *last-layer-choice* "layer2") (set_tile "layer2" "1") (mode_tile "layer2" 2)) ((= *last-layer-choice* "layer3") (set_tile "layer3" "1") (mode_tile "layer3" 2)) ((= *last-layer-choice* "layer4") (set_tile "layer4" "1") (mode_tile "layer4" 2)) (t (set_tile "layer1" "1") (mode_tile "layer1" 2)) ) ;; 恢复文字对齐,并设置焦点 (set_tile "align_tl" "0") (set_tile "align_ml" "0") (if (= *last-justify* "TL") (progn (set_tile "align_tl" "1") (mode_tile "align_tl" 2)) (progn (set_tile "align_ml" "1") (mode_tile "align_ml" 2)) ) ;; 恢复自定义颜色值 (set_tile "custom_color" (itoa *custom-color-val*)) ;; 恢复自定义颜色勾选状态 (if (= *last-use-custom* "1") (progn (set_tile "use_custom_color" "1") (mode_tile "custom_color" 0) (mode_tile "pick_color" 0) ) (progn (set_tile "use_custom_color" "0") (mode_tile "custom_color" 1) (mode_tile "pick_color" 1) ) ) ;; 恢复非打印图层勾选状态 (set_tile "use_nonprint" *last-use-nonprint*) ;; ===== 动作响应:更新全局变量 ===== (action_tile "layer1" "(progn (setq *last-layer-choice* \"layer1\") (setq *zcc11-layer-choice* \"layer1\") )" ) (action_tile "layer2" "(progn (setq *last-layer-choice* \"layer2\") (setq *zcc11-layer-choice* \"layer2\") )" ) (action_tile "layer3" "(progn (setq *last-layer-choice* \"layer3\") (setq *zcc11-layer-choice* \"layer3\") )" ) (action_tile "layer4" "(progn (setq *last-layer-choice* \"layer4\") (setq *zcc11-layer-choice* \"layer4\") )" ) (action_tile "align_tl" "(progn (setq *last-justify* \"TL\") (setq *zcc11-justify* \"TL\") )" ) (action_tile "align_ml" "(progn (setq *last-justify* \"ML\") (setq *zcc11-justify* \"ML\") )" ) (action_tile "use_custom_color" "(if (= $value \"1\") (progn (mode_tile \"custom_color\" 0) (mode_tile \"pick_color\" 0) (setq *last-use-custom* \"1\") (setq *zcc11-use-custom* \"1\") ) (progn (mode_tile \"custom_color\" 1) (mode_tile \"pick_color\" 1) (setq *last-use-custom* \"0\") (setq *zcc11-use-custom* \"0\") ) )" ) (action_tile "custom_color" "(progn (setq *custom-color-val* (atoi $value)) (setq *zcc11-custom-color* *custom-color-val*) )" ) (action_tile "pick_color" "(progn (if (= *custom-color-val* 0) (setq *custom-color-val* 7)) (setq temp_color (acad_colordlg *custom-color-val* t)) (if temp_color (progn (setq *custom-color-val* temp_color) (setq *zcc11-custom-color* temp_color) (set_tile \"custom_color\" (itoa *custom-color-val*)) ) ) )" ) (action_tile "use_nonprint" "(progn (setq *last-use-nonprint* $value) (setq *zcc11-use-nonprint* $value) )" ) (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq dcl_result (start_dialog)) (unload_dialog dcl_id) (vl-file-delete dcl_file) (= dcl_result 1) ) ;;; 主程序入口 (defun c:ZC11 (/ dcl_ok layer_name layer_color text_justify use_nonprint) (create_text_style) (setq dcl_ok (show_dcl)) (if dcl_ok (progn (cond ((= *last-layer-choice* "layer1") (setq layer_name "S—HKmoban修改") (setq layer_color 11)) ((= *last-layer-choice* "layer2") (setq layer_name "S—HK垂直标注修改") (setq layer_color 12)) ((= *last-layer-choice* "layer3") (setq layer_name "S—HK垂直标注和修改moban") (setq layer_color 13)) ((= *last-layer-choice* "layer4") (setq layer_name "S—HK非打印层moban意见修改") (setq layer_color 40)) (t (setq layer_name "S—HKmoban修改") (setq layer_color 11)) ) (if (= *last-use-custom* "1") (setq layer_color *custom-color-val*) ) (setq text_justify *last-justify*) (setq use_nonprint *last-use-nonprint*) (princ "\n========================================") (princ (strcat "\n【最终传递给 draw_cloud】")) (princ (strcat "\n图层: " layer_name)) (princ (strcat "\n颜色: " (itoa layer_color))) (princ (strcat "\n对齐: " text_justify)) (princ (strcat "\n非打印: " use_nonprint)) (princ "\n========================================") (draw_cloud layer_name layer_color text_justify use_nonprint) ) (princ "\n? 用户取消操作。") ) (princ) ) ;;; 兼容旧命令 (defun c:zc1 () (draw_cloud "S—HKmoban修改" 11 "TL" "0") (princ)) (defun c:zc12 () (draw_cloud "S—HK垂直标注修改" 12 "ML" "0") (princ)) (defun c:zc13 () (draw_cloud "S—HK垂直标注和修改moban" 13 "TL" "0") (princ)) (defun c:zc15 () (draw_cloud "S—HK非打印层moban意见修改" 40 "TL" "0") (princ)) (princ "\n=========================================") (princ "\n综合云线标注工具已加载!") (princ "\n命令名称: ZC11 - 打开图形界面进行云线标注") (princ "\n兼容命令: ZC1, ZC12, ZC13, ZC15") (princ "\n=========================================") (prin1)