- 积分
- 5321
- 明经币
- 个
- 注册时间
- 2022-9-23
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2025-5-23 15:41:03
|
显示全部楼层
(defun c:hot (/ *error* filename fn start count step point_1 px_1 py_1 s e pts)
(vl-load-com)
;; 错误处理
(defun *error* (msg)
(if fn (close fn))
(if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
(princ (strcat "\n错误: " msg)))
(princ))
;; 用户输入起始桩号和步长
(setq start (getint "\n请输入起始桩号 <0>: "))
(if (not start) (setq start 0))
(setq step (getint "\n请输入桩号步长 <20>: "))
(if (not step) (setq step 20))
;; 初始化
(setvar "dimzin" 0)
(setvar "dimdec" 3)
(setq filename (getfiled "选择输出文件" "d:/断面线数据.txt" "txt" 33))
(if (not filename) (setq filename "d:/断面线数据.txt"))
(setq fn (open filename "w") ; 覆盖模式写入
count start) ; 桩号计数器
;; 主循环
(while t
(princ (strcat "\n当前桩号: " (itoa count)))
;; 1. 选择基准中心位置
(if (not (setq point_1 (getpoint "\n选择断面基准中心位置 (ESC结束): ")))
(exit)
)
(setq px_1 (car point_1)
py_1 (cadr point_1))
;; 2. 选择多段线
(while
(progn
(setq s (ssget ":S" '((0 . "POLYLINE,LWPOLYLINE"))))
(cond
((not s) (princ "\n未选择对象!") T)
((/= (sslength s) 1) (princ "\n只能选择一条多段线!") T)
(T nil)
)
)
)
(setq e (ssname s 0))
;; 3. 提取多段线顶点
(setq pts (get-polyline-points e))
;; 4. 写入数据 (桩号, 平距, 高差)
(foreach pt pts
(write-line
(strcat (itoa count) ","
(rtos (- (car pt) px_1) 2 3) "," ; 平距 = X - 基准X
(rtos (- (cadr pt) py_1) 2 3)) ; 高差 = Y - 基准Y (高程为0)
fn)
)
;; 桩号递增
(setq count (+ count step))
)
(close fn)
(princ (strcat "\n导出完成! 文件保存至: " filename))
(princ))
;; 辅助函数:获取多段线所有顶点坐标
(defun get-polyline-points (e / pts param pt)
(setq pts '())
(if (vlax-curve-isplanar e)
(progn
(setq param 0)
(while (<= param (vlax-curve-getendparam e))
(setq pt (vlax-curve-getpointatparam e param))
(if (or (null pts) (not (equal pt (car pts) 1e-3)))
(setq pts (cons pt pts))
)
(setq param (1+ param))
)
(reverse pts)
)
(progn
(princ "\n警告: 多段线非平面,可能产生错误数据!")
nil
)
)
) |
|