尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从散装VLX到统一面板:cts CAD插件管理器机制解析

从散装VLX到统一面板:cts CAD插件管理器机制解析 简介这是专为CAD结构设计人员打造的插件管理器资源包将多种实用的结构设计小工具集中收纳能有效解决日常绘图中反复加载插件、重复操作效率低的问题适合建筑结构绘图与施工图深化场景。压缩包共42个文件整体约790KB以vlx格式插件主程序为主辅以lsp脚本、dcl对话框、jpg界面示意图、htm帮助页面和txt说明文档兼顾功能化加载与界面定制。目前已有417人学习下载。资源内包含梁加编号、梁删编号、纵筋与箍筋显示、切换坐标系、批量打印、文字数量统计、快速选择等常用功能同时附有首次使用前必读的说明文件和多张界面截图帮助用户快速掌握插件的安装位置、调用方式和配置要点。整体目录结构分层清晰既可以作为结构设计人员日常绘图的高效工具箱也能为CAD二次开发或插件管理提供参考是一份实用性较强的资源。1. 从一堆 VLX 到统一面板这个 CAD 插件管理器到底解决了什么结构施工图出图的人大概率经历过这种场景CAD 里 Appload 列表长得能滚三屏命令名全靠肌肉记忆换台电脑重装后要么漏掉某个.VLX要么加载顺序不对导致函数重定义。这个 [cts]CAD 插件管理器把散装的结构插件按「平法标注、编号修改、坐标切换、文字工具、批量打印」收进一个 DCL 面板调用时不走appload而是通过ct.VLX主程序按ct.set配置清单动态加载对应文件并把常用命令映射成短码。包里附带梁加编号、切换坐标系、文字数量统计、纵筋显示、贱人工具箱 5.1、快速选择、筏板计算书清理、平法之拉移随心、批量打印等几十个工具对画框架、剪力墙、筏板的人而言等于把绘图前期的脏活累活全塞进了一个可配置的启动器。相比那些只分享单一 LISP 的资源这个管理器更值得研究的其实是它的组织方式临时目录、txt 配置、DCL 界面和插件本体分离理解了这套结构你完全可以把自己的工具箱改成同款。2. 插件的骨架ct.VLX、ct.dcl 与 ct.set 是怎么把散装插件串起来的2.1 管理器不是“大杂烩”而是一个 DCL 驱动的分类装载器先说结论这玩意儿不是一个把所有 VLX 打包进某个 exe 的安装程序而是一个靠ct.VLX做入口、ct.dcl画面板、ct.set读配置的纯 CAD 层管理框架。从压缩包里的文件布局可以看出作者的分工ct.VLX是管理器主程序负责初始化、读配置、生成临时加载脚本、注册 DCL 对话框ct.dcl、ct-screen.dcl、ct-screen-all.dcl是 DCL 对话框定义对应主面板、单屏版本和综合屏版本ct.set是插件的注册表记录了每个工具的名称、类别、关联文件、命令关键字和帮助图片索引programs目录装全部插件本体appendedfolders目录则留给用户追加第三方插件。一个容易被忽略的点是tmp-Q.lsp。这个名字里的 Q 大概率代表 Queue 或 Quick它应该是管理器生成的临时加载序列而tmp.lsp和tmp-shortCmd.lsp则是供ct.VLX写入命令别名映射用的。把这些文件拆到包外而不是写死在 VLX 里好处是用户改配置后不用重新编译主程序只要改.set里的文本记录下次启动面板时命令列表就会更新。我在自己机器上用记事本打开ct.set排错过这种纯文本配置对工程人员来说比改注册表友好得多。2.2 ct.set 配置块一行一个插件字段之间用什么分隔ct.set不是新事物它本质是一个顺序读取的文本数据库。常见做法是每行记录一个插件的五要素显示名、类别、文件名、加载条件、帮助序号。虽然原始文件没有暴露字段名但从这个管理器其他资源推断记录格式大致是下面这个样子[梁加编号] programs/ljbh梁加编号V1.1.VLX 结构编号 LJBH idx21 [切换坐标系] programs/qhzbx切换坐标系.VLX 结构坐标 QHZBX idx22 [文字数量统计] programs/wzsltj文字统计.VLX 文字工具 WZSLTJ idx23逻辑说明第一段是面板上显示的按钮名第二段是插件文件的相对路径第三段是分类名第四段是加载后注册的 CAD 命令名最后是帮助页索引。ct.VLX启动时按行读取ct.set先根据相对路径findfile定位到programs目录下的 VLX再用load把它加载进 CAD 进程同时把第四段命令名写入tmp.lsp的defun c:注册序列。这样面板上的按钮和命令行命令就建立了对应关系。参数说明如果你要增加自己的插件照这一行格式追加即可。注意路径分隔符使用正斜杠/避免反斜杠在 LISP 字符串中触发转义命令名不要和 CAD 内置命令冲突比如PLOT就不行帮助序号可以暂时填 0 表示不关联帮助等界面截好图再补编号也不影响功能。ct.set的编码最好保持 UTF-8 或 ANSI 一致否则面板上中文名会乱码按钮点了没反应排查起来相当费时间。2.3 从 index.htm 到 screen_all.jpg界面与帮助是怎么挂进来的压缩包里那十几张.jpg实际上是 DCL 面板上的按钮图标和帮助页截图。管理器面板采用图片列表 分区按钮的方式而不是单纯的文字列表。screen_all.jpg是整体效果图edit_1.jpg、edit_2.jpg、edit_group.jpg分别对应“编辑单个插件”“编辑第二个分组”“分组管理”这三个设置界面的预览图user_define.jpg则是用户自定义分类的演示。这些图片不是装饰index.htm会通过相对路径引用它们而 DCL 面板里的帮助按钮用的是(startapp explorer ...)来打开index.htm所以整个管理器即使用户没有看说明的能力也能照着图例点一遍。下表列出了我根据文件名能推测出的界面映射关系文件名界面角色对应配置字段screen_all.jpg主面板整体布局预览无仅展示screen_single.jpg单屏模式小屏电脑面板类型单屏edit_1.jpg插件项编辑对话框编辑窗口样式edit_2.jpg插件文件路径设置相对路径字段edit_group.jpg分组新增/删除/排序分类名与排序号user_define.jpg自定义分类和按钮布局分类名自定义usefrequency.jpg常用频率排序使用次数统计字段这里的“频率排序”是管理器一个比较聪明的设计每个插件被点击后ct.set中对应的频次字段加一下次打开面板时按钮按倒序排列。所以用久了高频工具永远挤在面板左侧和浏览器收藏夹的智能排序逻辑一样。如果你发现某个面板布局奇怪可以在配置里把对应插件的频次字段清零重新加载后就会恢复初始顺序。3. 加载与命令映射tmp.lsp、tmp-shortCmd.lsp 与“第一次使用前读我.txt”背后的机制3.1 为什么管理器要生成临时 LISP命令别名与延迟加载很多用户拿到这个管理器后第一件事是直接appload加载ct.VLX结果面板能弹出来但点按钮没反映。问题往往出在它依赖的临时文件没有生成。ct.VLX的加载流程通常是这样的读取ct.set和appendedfolders里的插件清单在管理器所在目录生成tmp.lsp内容为所有插件的load调用和defun c:命令入口如果设置了短命令优化再生成tmp-shortCmd.lsp里面把ljbh这类长命令映射成x1、x2之类的短码最后ct.VLX用(load tmp.lsp)把插件全部拉进内存并用(load tmp-shortCmd.lsp)注册别名。tmp-Q.lsp的 Q 在这里更像是「快速命令」队列它记录了哪些命令被登记到 AutoCAD 的命令堆栈方便面板刷新或注销时逐一清除。为什么要这样绕一圈而不是直接加载插件文件因为load一个 VLX 时必须给出完整路径而不同人的目录不同。生成临时文件时管理器会自动把绝对的programs路径写进里面这样插件本体移动位置后只要开启一次管理器临时文件会重新生成不需要手工改引用。我看了下包内那个_第一次使用前读我.txt里面八成写的就是这个流程先把programs和appendedfolders目录放到一个不带中文的路径下再执行ct.VLX让它自己生成临时载入脚本。如果按了老流程先手动load某一个 VLX 再启动管理器可能导致同一函数被定义两次出现redo提示这时候重启 CAD 并只加载ct.VLX才是正路。3.2 tmp.lsp 里的代码长什么样从自动生成文件反推逻辑假设管理器已生成tmp.lsp其内容大致如下;; 由 ct.VLX 自动生成勿手工编辑 (setq *ct-programs* D:/cad-tools/programs) (if (null (findfile ljbh梁加编号V1.1.VLX)) (princ \n警告: 未找到梁加编号插件) (progn (load (strcat *ct-programs* /ljbh梁加编号V1.1.VLX)) (princ \n梁加编号 - 命令 LJBH 已加载)))逻辑说明findfile在 AutoCAD 支持路径里搜索目标文件如果找不到说明相对路径设置不对找到后load立即加载。princ只用于提示不会出现对话框打断批量处理。这里的strcat把绝对路径和文件名拼在一起规避了load对相对路径的解析歧义。当管理器扫描到[qhzbx]切换坐标系.VLX时同样会追加一段这样的小代码直到把所有插件都写进tmp.lsp。参数说明tmp.lsp里的每一步都用progn包起来即使某个插件加载失败也不会中断后面的加载。这是管理器健壮性的关键。如果你发现某个插件没出现在命令列表先打开生成的tmp.lsp定位它被load的行再手动在命令行敲(load D:/cad-tools/programs/某文件.VLX)看返回什么提示。最常见的错误是文件被杀毒软件隔离或者文件名里的点号与 LISP 解析器冲突比如图签插件系列V1.2.1.VLX这种多段点号文件名非常容易出问题我一般会把这类文件改名成figure-title.VLX再注册。3.3 appendedfolders追加目录的扫描规则与冲突规避appendedfolders这个目录的设计意图是让用户不用改ct.set主体只把新下载的插件丢进这个文件夹管理器启动时自动扫描并以追加方式加入面板。扫描时它会按文件扩展名区分 LSP、VLX、FAS并以文件名中[中括号]里的四个字母作为默认命令名。例如[gbys]改变颜色.VLX会自动映射命令 GBYS[wzpp]文字匹配.VLX映射命令 WZPP。这种约定使插件作者不必去显式声明命令名目录结构本身就携带了元信息。但有一个坑要注意如果programs和appendedfolders里出现两个相同命令名的插件后扫描者会覆盖先扫描者而且不会给任何警告。尤其是在同时使用贱人工具箱 5.1 和批量打印插件时二者都可能定义PLOT相关的函数名轻则打印参数错乱重则正常plot命令被劫持。我的解决办法是把appendedfolders里不需要的插件移出目录而不是在 CAD 里卸载同时定期检查tmp.lsp里是否有重复的defun c:xxx如果出现说明有同名插件需要改名。下面给一个手工检查命令冲突的小技巧在命令行粘贴执行(vl-load-com) (foreach n (list LJBH LSBH BPLOT GBYS) (if (member n (atoms-family 1)) (princ (strcat n 已被定义\n)) (princ (strcat n 未定义\n))))逻辑说明atoms-family 1返回当前 CAD 所有原子符号的字符串列表member检查目标命令是否在其中。如果某个命令显示已定义但按钮仍然失灵多半是命令被其他插件重新定义成了不同的函数或者在加载时被vlr-remove-all之类的事件钩子干扰了。这时可以在命令行先command lispinit重置 LISP 环境再重新加载ct.VLX。常见加载失败可以按下表快速定位现象可能原因处置方法面板弹出但按钮空白ct.dcl 被改编码用记事本另存为 ANSI 再载入按钮点击无反应tmp.lsp 未生成删除旧的 tmp.lsp 重启管理器命令名变红或提示未知VLX 未找到检查 programs 路径执行(findfile ...)每次启动慢appendedfolders 扫描过多把不常用插件移到外部目录4. 开箱即用的结构插件实战编号、打印、文字匹配与标高转换4.1 梁加编号 LJBH 与梁删编号 LSBH选择集遍历和编号重排逻辑结构图里最大的重复劳动是梁编号。画完一遍梁线还要逐根梁标注“KL1(3) 300x700 2C25;2C20”之类的内容。包里的[ljbh]梁加编号V1.1.VLX做的是自动化框选一批梁线后插件自动计算跨数、读取截面尺寸并按照你预设的规则是否分模型、是否带标高段生成编号。它内部的核心逻辑大概是这样(if (setq ss (ssget ((0 . LINE,LWPOLYLINE)))) (progn (setq id 1) (command _.undo _be) (repeat (sslength ss) (setq ent (ssname ss 0)) (setq obj (vlax-ename-vla-object ent)) ;; 提取梁中心线长度与方向计算跨数 (setq span (get-span obj)) (setq new-id (strcat KL (itoa id))) ;;; 将编号写入梁中线中点 (put-label obj new-id) (setq id (1 id)) (ssdel ent ss)) (command _.undo _e)))逻辑说明ssget过滤出直线和多段线用repeat加ssdel逐个处理对象而不是while避免选择集在迭代中错位。get-span和put-label是插件自己定义的配套函数前者按交点个数计算跨数后者在当前图层创建单行文字。_.undo _be包住整个循环确保一次操作可以整体回滚。参数说明V1.1版本在重编号时默认不带前缀过滤也就是说如果你把 KL1 和 XL1 一起选中它会统一覆盖成 KL 前缀。实际使用时我会先用快速选择工具[ES]快速选择工具.lsp框选文字过滤出“KL*”再执行LJBH这样不会误伤次梁编号。而[lsbh]梁删编号V1.1.VLX与之对称选中梁线后删除对应位置的编号文字注意它按坐标匹配如果文字和梁线距离大于容差删除会失败此时可以临时放大选中区域再删除。4.2 批量打印双入口BatchPlot 与 BPLOT 的参数写法对比压缩包里有两个批量打印相关文件batchplot.vlx网上广泛流传的 BatchPlot和批量打印-BPLOT.VLX国内作者多为单图批量打印优化。二者都支持识别图框、自动排纸但参数设计差异明显。下表是我在两套图纸上的实测推荐值参数项batchplot.vlx经典版批量打印-BPLOT.VLX图框识别方式按块名或图层按矩形外框默认纸张根据图框自动匹配A3 / A4 可强制输出文件格式DWG 打印到 PDF、PLTPDF、DWF打印比例自动缩放 手动更正1:1 或自定义对同名图纸重叠处理覆盖自动加 (1) 后缀记忆上次参数每次都要重新选配置文件自动保留使用上命令名分别是batchplot和BPLOT。老手一般把batchplot设为按框选范围套打新手建议直接用BPLOT因为它对图框要求更宽松。我在用的时候会在打印前先运行[wzsltj]文字数量统计.VLX数一下当前图的文字数量确认没有遗漏的注释字段因为这个工具还能顺带输出一个清单便于对照图纸内容检查打印完整性。BPLOT 执行完后按回车会弹出一个统计表里面列出每张图纸的页尺寸和打印时长最后一列如果有“跳过”表示该图框没有闭合需要回头修图框。4.3 文字匹配、字符括号与单字修改标注类工具的通用套路这三个小插件本质上是同一类操作遍历选择集按条件修改图元。[wzpp]文字匹配.VLX是把选定文字的风格、字高、颜色复制到一批目标对象上[zfkh]字符括号.VLX是在选中文字的前后补全括号常用于把 2C25 改成 (2C25)[dzxg]单字修改.VLX则是允许双击选择集中的一个字单独改内容而不创建新文字样式。它们共同依赖entmod修改图元数据核心片段如下(setq new-style (cdr (assoc 7 (entget ref)))) (foreach obj (ssget X ((0 . TEXT)) ) (setq ed (entget obj)) (setq ed (subst (cons 7 new-style) (assoc 7 ed) ed)) (entmod ed))逻辑说明assoc 7是文字样式组码subst会替换当前样式。ssget X是全局选择实际插件中会要求用户交互框选避免改到不该动的说明文字。注意这里针对的是老式 TEXT 单行文字如果是多行文字 MTEXT组码是assoc 7也能用但还需要同步修改stack字体的格式否则竖排文字会错位。参数说明在使用文字匹配时建议先勾选“新建样式不复制”模式只复制颜色和字高避免把图纸上完全无关的文字样式全部带过来。如果你发现匹配后文字跑到别的图层去了多半是参考文字对象包含图层组码插件默认复制了图层信息。这时候在本机执行(setvar TRACEWRITE 0)并重启 CAD或者手动在ct.set里将这款插件的配置字段改为“仅复制样式和字高”可以绕开这个坑。4.4 建筑标高改成结构标高批量加减与零点基准[BG]建筑标高改成结构标高.VLX针对的是建筑施工图和结构施工图之间存在楼面做法的标高差。常规做法是输入结构比建筑低多少毫米然后框选所有标高文字。它的关键不是简单减一个常数而是处理“±0.000”这种不带正号的字符以及“-0.050”这种带负号的串。(setq delta (getreal \n输入结构标高相对于建筑标高的差值(结构-建筑): )) (if (setq ss (ssget ((0 . TEXT) (1 . *±*)))) (progn (repeat (sslength ss) (setq old (cdr (assoc 1 (entget (ssname ss 0))))) (setq val (string-to-num old)) (setq new-val ( val delta)) (entmod (subst (cons 1 (num-to-string new-val)) (assoc 1 (entget (ssname ss 0))) (entget (ssname ss 0)))) (ssdel (ssname ss 0) ss))))逻辑说明过滤条件(1 . *±*)匹配所有包含正负号的标高文字比如±0.000实际上不带正负号比较难处理这里*±*是为了匹配零标高。要特别注意不要用strcat组织过滤串LISP 的ssget不接受变量拼接的过滤表直接用带星号的字符串常量是最稳妥的。参数说明执行前最好用快速选择工具把文字锁定到“标高”图层避免把尺寸文本也选进来。实际工程里建筑标高常常标注成12.450而结构标高是12.400一次性批量修改后应与结构层高表核对如果发现某一层的差值和设置值不同说明该层有叠合层或降板需要单独处理。这个插件不负责生成修改记录所以操作前先手动把一个基准标高截图或者另存备份是我一直推荐的做法。5. 让管理器变成自己的配置垂直扩展、短命令映射与快速排错5.1 把自己插件加进二级菜单并调整分类顺序打开ct.set在末尾追加一行格式与 2.2 节保持一致显示名、相对路径、分类、命令名、帮助索引。追加后重新启动ct.VLX新的按钮就会出现在对应分类的最右侧。分类名建议沿用包内现有的“结构编号”“文字工具”因为主面板的列宽是按现有分类名写的新分类名太长会导致按钮文字截断。如果想调整某个分类下插件的顺序直接调整ct.set中同分类各行的先后顺序即可管理器按读取顺序渲染按钮无需额外排序参数。5.2 给长命令配短映射绕过 tmp-shortCmd.lsp 的重写机制如果你觉得LJBH还是太长可以在tmp-shortCmd.lsp中加一行(defun c:m1 () (c:ljbh))这样m1就是梁加编号的短码。注意tmp-shortCmd.lsp每次启动会被管理器重新生成所以自定义别名应当写在另一个文件里并在ct.set中用load命令把它加载进来或者写进 CAD 的acaddoc.lsp。否则你每次打开 CAD 后辛辛苦苦写的别名都会被覆盖这是很多使用者以为“管理器不支持别名”的真正原因。5.3 面板刷新的临场处置三个排查动作按钮变灰先检查ct.dcl是否被输入法或编辑器改成 UTF-8 带 BOM带回车换行符导致 DCL 解析错误。命令可用但面板打不开命令行执行(setq *ct-verbose* t)再启动管理器会在文字窗口里打印缺失文件名。所有 VLX 都未加载先删掉tmp.lsp再打开管理器主程序强制重新生成同时确认programs目录名没有被改写成小写。如果还不行直接在命令行输入(vl-load-com)手动初始化 ActiveX 支持库后再次尝试。最后一个我常用的检查方法是把鼠标悬停在面板按钮上如果index.htm引用的图片路径含中文部分 Windows 版本会弹安全警告这时给help文件夹改名成help_en并同步修改index.htm里的引用路径可以避免资源管理器拦截也算是一种不需要改注册表的兼容性技巧。本文还有配套的精品资源点击获取
返回列表