欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

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
)

 

posted @ 2022-06-24 17:29  david96007  阅读(329)  评论(0)    收藏  举报