Civil 3d 要素线高程缩放
QQ群中有群友提出一个问题:
要素线高程批量缩放10倍,能实现吗?
我的回答是:能!
怎么实现呢?
内部功能貌似不行,
只能自己写代码了。
为了方便使用,
我lisp来实现,
优势:
不用编译,
各版本通用,
不用为升级发愁。
代码分享在此,
有需要的朋友可以下载存为lsp文件,
使用ap命令加载后,
输入命令flscale后选择要素线,
即可将要素线高程放大10倍。
2026年1月26日14:56:53
在使用的过程中发现当存在交叉的要素线时,
之前的程序会造成交叉点的高程被放大多次,
从而出现错误,
使用ai将之前的代码进行了修改,
完善了交点数据的处理,
并且增加了放大倍数的输入。
(defun c:Flscale (/ ss n i fl pnts pCount j pointIdx allPointsData scaleFactor inputStr pData x y origZ newP ) ; ========== 1. 交互获取用户输入的放大倍数 ========== (initget 6) ; 禁止空输入、零输入和负数输入 (setq inputStr (getreal "\n请输入高程放大倍数 (默认10): ")) ; 判断用户输入,无输入则使用默认值10 (setq scaleFactor (if inputStr inputStr 10.0 ) ) (princ (strcat "\n已选择高程放大倍数: " (rtos scaleFactor 2 2)) ) ; 显示选择的倍数 (princ "\n选择要素线: ") (setq ss (ssget '((0 . "AECC_FEATURE_LINE")))) (if ss (progn ; ========== 2. 批量备份所有点的原始高程 ========== (setq allPointsData '()) ; 存储格式:((要素线对象 点索引 X Y 原始高程) ...) (setq n (sslength ss) i 0 ) (while (< i n) (setq fl (vlax-ename->vla-object (ssname ss i))) (setq pnts (vlax-safearray->list (vlax-variant-value (vlax-invoke-method fl 'GetPoints 3) ) ) ) (setq pCount (length pnts) j 0 pointIdx 0 ) (while (< j pCount) ; 备份每个点的原始信息(避免关联修改后获取错误值) (setq allPointsData (append allPointsData (list (list fl pointIdx (nth j pnts) (nth (+ j 1) pnts) (nth (+ j 2) pnts) ) ) ) ) (setq j (+ 3 j) pointIdx (1+ pointIdx) ) ) (setq i (1+ i)) ) ; ========== 3. 基于备份数据修改高程(使用自定义倍数) ========== (foreach pData allPointsData (setq fl (nth 0 pData) pointIdx (nth 1 pData) x (nth 2 pData) y (nth 3 pData) origZ (nth 4 pData) ) ; 使用用户输入的倍数缩放原始高程,只缩放一次 (setq newP (vlax-3d-point (list x y (* scaleFactor origZ)))) (vlax-invoke-method fl 'SetPointElevation newP) ) (princ (strcat "\n要素线高程缩放完成!所有点高程已放大 " (rtos scaleFactor 2 2) " 倍。" ) ) ) (princ "\n未选择任何要素线,操作取消。") ) (princ) ; 静默退出,避免输出nil )

浙公网安备 33010602011771号