;;; ================================================================== ;;; 原始图层修改函数 ;;; ================================================================== (defun li-xjtc (layer-name color linetype lineweight / ss current-layer) (setvar "cmdecho" 0) ;; 创建图层(若不存在) (if (not (tblsearch "layer" layer-name)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) (cons 2 layer-name) (cons 62 color) (cons 6 (if (tblsearch "ltype" linetype) linetype "Continuous")) (cons 370 (fix (* lineweight 100))) ) ) ) ;; 选择对象并修改 (setq ss (ssget)) (if ss (progn (setq current-layer (getvar "clayer")) (command "_.chprop" ss "" "la" layer-name "c" "bylayer" "lt" "bylayer" "") (setvar "clayer" current-layer) (princ (strcat "\n已将 " (itoa (sslength ss)) " 个对象移至图层: " layer-name)) ) (progn (prompt (strcat "\n未选择任何实体,当前图层切换至: " layer-name)) (setvar "clayer" layer-name) ) ) (princ) ) ;;; ================================================================== ;;; 配置管理 ;;; ================================================================== (defun *default-config-list* () (list '("WW1" "把物体改到 免漆 图层" "免漆" 74 "Continuous" 0.00) '("WW2" "把物体改到 油漆 图层" "油漆" 12 "Continuous" 0.00) '("FF1" "把物体改到 岔色1 图层" "岔色1" 4 "Continuous" 0.00) '("FF2" "把物体改到 岔色2 图层" "岔色2" 140 "Continuous" 0.00) '("FF3" "把物体改到 岔色3 图层" "岔色3" 11 "Continuous" 0.00) '("FF4" "把物体改到 岔色4 图层" "岔色4" 103 "Continuous" 0.00) '("FF5" "把物体改到 岔色5 图层" "岔色5" 241 "Continuous" 0.00) '("SS1" "把物体改到 墙体 图层" "墙体" 34 "Continuous" 0.00) '("SS2" "把物体改到 金属 图层" "金属" 43 "Continuous" 0.00) '("SS3" "把物体改到 灯带 图层" "灯带" 6 "LED_LINE" 0.00) '("SS4" "把物体改到 石材 图层" "石材" 31 "Continuous" 0.00) '("SS5" "把物体改到 皮革 图层" "皮革" 114 "Continuous" 0.00) '("SS6" "把物体改到 玻璃 图层" "玻璃" 5 "Continuous" 0.00) '("SS7" "把物体改到 辅助 图层" "辅助" 251 "Continuous" 0.00) '("SS8" "把物体改到 虚线 图层" "虚线" 251 "ACAD_ISO03W100" 0.00) '("SS9" "把物体改到 孔位 图层" "孔位" 222 "ACAD_ISO03W100" 0.00) ) ) ;; 全局配置变量 (setq *cmd-config-list* nil) ;; 配置文件路径 (defun *get-config-file* () (strcat (getvar "ROAMABLEROOTPREFIX") "LayerCmdConfig.ini") ) ;; 保存配置到文件 (defun save-config-to-file (config-list / file line) (setq file (open (*get-config-file*) "w")) (if file (progn (foreach item config-list (setq line (strcat (nth 0 item) "," (nth 1 item) "," (nth 2 item) "," (itoa (nth 3 item)) "," (nth 4 item) "," (rtos (nth 5 item) 2 4))) (write-line line file) ) (close file) T ) nil ) ) ;; 从文件加载配置 (defun load-config-from-file (/ file line config-list lst) (if (findfile (*get-config-file*)) (progn (setq file (open (*get-config-file*) "r")) (setq config-list nil) (while (setq line (read-line file)) (setq lst (parse-csv-line line)) (if (>= (length lst) 6) (setq config-list (cons (list (nth 0 lst) (nth 1 lst) (nth 2 lst) (atoi (nth 3 lst)) (nth 4 lst) (atof (nth 5 lst))) config-list)) ) ) (close file) (if config-list (reverse config-list) (*default-config-list*)) ) (*default-config-list*) ) ) ;; 解析CSV行 (defun parse-csv-line (line / pos result) (setq result nil) (while (setq pos (vl-string-search "," line)) (setq result (cons (substr line 1 pos) result)) (setq line (substr line (+ pos 2))) ) (setq result (cons line result)) (reverse result) ) ;; 重新生成命令 (defun regenerate-commands (config-list / cmd-name) (foreach item config-list (setq cmd-name (strcat "C:" (nth 0 item))) (eval (list 'defun (read cmd-name) '(/) (list 'li-xjtc (nth 2 item) (nth 3 item) (nth 4 item) (nth 5 item)) '(princ) ) ) ) (princ (strcat "\n已生成 " (itoa (length config-list)) " 个命令。")) ) ;; 初始化配置 (defun init-layer-config () (setq *cmd-config-list* (load-config-from-file)) (regenerate-commands *cmd-config-list*) ) ;; 更新单个配置项 (defun update-config-item (index new-item) (if (and index (>= index 0) (< index (length *cmd-config-list*))) (progn (setq *cmd-config-list* (subst new-item (nth index *cmd-config-list*) *cmd-config-list*)) T ) nil ) ) ;; 添加新配置项 (defun add-config-item (cmd-name prompt layer color linetype lweight) (if (and cmd-name (not (assoc cmd-name *cmd-config-list*))) (progn (setq *cmd-config-list* (append *cmd-config-list* (list (list cmd-name prompt layer color linetype lweight)))) T ) nil ) ) ;; 删除配置项 (defun remove-config-item (index) (if (and index (>= index 0) (< index (length *cmd-config-list*))) (progn (setq *cmd-config-list* (vl-remove (nth index *cmd-config-list*) *cmd-config-list*)) T ) nil ) ) ;;; ================================================================== ;;; DCL 对话框界面 ;;; ================================================================== (defun show-layer-config-dlg (/ dcl_id dcl_file temp_file) (setq temp_file (vl-filename-mktemp "layerconfig.dcl")) (setq dcl_file (open temp_file "w")) (write-line "layerconfig : dialog { label = \"图层命令配置管理\"; : column { : list_box { key = \"lst_commands\"; label = \"命令列表\"; height = 18; width = 40; multiple_select = false; fixed_width_font = true; } : boxed_row { label = \"编辑选中命令\"; : column { : edit_box { key = \"ed_cmd\"; label = \"快捷键 (命令名):\"; edit_width = 20; } : edit_box { key = \"ed_prompt\"; label = \"提示文字:\"; edit_width = 40; } : edit_box { key = \"ed_layer\"; label = \"图层名称:\"; edit_width = 30; } : edit_box { key = \"ed_color\"; label = \"颜色号 (0-256):\"; edit_width = 10; } : edit_box { key = \"ed_ltype\"; label = \"线型名称:\"; edit_width = 25; } : edit_box { key = \"ed_lweight\"; label = \"线宽 (mm):\"; edit_width = 10; } } } : row { : button { key = \"btn_update\"; label = \"更新当前\"; width = 12; } : button { key = \"btn_add\"; label = \"新增命令\"; width = 12; } : button { key = \"btn_del\"; label = \"删除命令\"; width = 12; } } : row { : button { key = \"btn_save\"; label = \"保存配置并生效\"; is_default = true; width = 18; } : button { key = \"btn_cancel\"; label = \"取消关闭\"; is_cancel = true; width = 12; } } } }" dcl_file ) (close dcl_file) (setq dcl_id (load_dialog temp_file)) (if (not (new_dialog "layerconfig" dcl_id)) (progn (princ "\n无法加载DCL对话框!") (vl-file-delete temp_file) nil ) (progn (fill-list-box) (action_tile "lst_commands" "(on-list-select $value)") (action_tile "btn_update" "(on-update-item)") (action_tile "btn_add" "(on-add-item)") (action_tile "btn_del" "(on-delete-item)") (action_tile "btn_save" "(on-save-and-exit)") (action_tile "btn_cancel" "(done_dialog 0)") (mode_tile "lst_commands" 2) (if (> (length *cmd-config-list*) 0) (on-list-select "0")) (start_dialog) (unload_dialog dcl_id) (vl-file-delete temp_file) ) ) ) (defun fill-list-box () (start_list "lst_commands") (foreach item *cmd-config-list* (add_list (strcat (nth 0 item) " -> " (nth 2 item) " (颜色:" (itoa (nth 3 item)) ")")) ) (end_list) ) (defun on-list-select (val) (setq idx (atoi val)) (if (and idx (>= idx 0) (< idx (length *cmd-config-list*))) (progn (setq cur-item (nth idx *cmd-config-list*)) (set_tile "ed_cmd" (nth 0 cur-item)) (set_tile "ed_prompt" (nth 1 cur-item)) (set_tile "ed_layer" (nth 2 cur-item)) (set_tile "ed_color" (itoa (nth 3 cur-item))) (set_tile "ed_ltype" (nth 4 cur-item)) (set_tile "ed_lweight" (rtos (nth 5 cur-item) 2 4)) ) ) ) (defun on-update-item () (setq sel (get_tile "lst_commands")) (if (and sel (setq sel-idx (atoi sel)) (>= sel-idx 0) (< sel-idx (length *cmd-config-list*))) (progn (setq new-cmd (get_tile "ed_cmd")) (setq new-prompt (get_tile "ed_prompt")) (setq new-layer (get_tile "ed_layer")) (setq new-color (atoi (get_tile "ed_color"))) (setq new-ltype (get_tile "ed_ltype")) (setq new-lw (atof (get_tile "ed_lweight"))) (if (or (= new-cmd "") (= new-layer "") (< new-color 0) (> new-color 256) (< new-lw 0)) (princ "\n输入错误:命令名/图层名不能为空,颜色0-256,线宽>=0") (progn (update-config-item sel-idx (list new-cmd new-prompt new-layer new-color new-ltype new-lw)) (fill-list-box) (set_tile "lst_commands" (itoa sel-idx)) (on-list-select (itoa sel-idx)) (princ "\n已更新当前项(尚未保存到文件)") ) ) ) (princ "\n请先在列表中选择一项") ) ) (defun on-add-item () (setq new-cmd (get_tile "ed_cmd")) (setq new-prompt (get_tile "ed_prompt")) (setq new-layer (get_tile "ed_layer")) (setq new-color (atoi (get_tile "ed_color"))) (setq new-ltype (get_tile "ed_ltype")) (setq new-lw (atof (get_tile "ed_lweight"))) (if (or (= new-cmd "") (= new-layer "") (< new-color 0) (> new-color 256) (< new-lw 0)) (princ "\n输入错误:命令名/图层名不能为空,颜色0-256,线宽>=0") (progn (if (add-config-item new-cmd new-prompt new-layer new-color new-ltype new-lw) (progn (fill-list-box) (set_tile "lst_commands" (itoa (1- (length *cmd-config-list*)))) (on-list-select (itoa (1- (length *cmd-config-list*)))) (princ "\n新增命令成功(尚未保存到文件)") ) (princ "\n命令名已存在,请换一个") ) ) ) ) (defun on-delete-item () (setq sel (get_tile "lst_commands")) (if (and sel (setq sel-idx (atoi sel)) (>= sel-idx 0) (< sel-idx (length *cmd-config-list*))) (progn (if (remove-config-item sel-idx) (progn (fill-list-box) (if (> (length *cmd-config-list*) 0) (progn (set_tile "lst_commands" "0") (on-list-select "0") ) (progn (set_tile "ed_cmd" "") (set_tile "ed_prompt" "") (set_tile "ed_layer" "") (set_tile "ed_color" "") (set_tile "ed_ltype" "") (set_tile "ed_lweight" "") ) ) (princ "\n已删除命令(尚未保存到文件)") ) ) ) (princ "\n请选择要删除的命令") ) ) (defun on-save-and-exit () (if (save-config-to-file *cmd-config-list*) (progn (regenerate-commands *cmd-config-list*) (princ "\n配置已保存,所有命令已更新。") (done_dialog 1) ) (princ "\n配置文件保存失败,请检查权限!") ) ) ;;; ================================================================== ;;; 入口函数 ;;; ================================================================== (defun C:LAYERCFG () (init-layer-config) (show-layer-config-dlg) (princ) ) ;;; ================================================================== ;;; 初始化 ;;; ================================================================== (init-layer-config) (princ "\n图层命令配置工具已加载。") (princ "\n使用命令 LAYERCFG 打开配置面板。") (princ)