依然小小鸟 发表于 2025-12-1 20:38
至今没解决
(defun xyp-Text2Gcd (s1 del-tnil / ar tx)
(defun dxf (code elist) (cdr (assoc code elist)))
"xyp-Text2Gcd 数字文本转高程点 (xyp-Text2Gcd s1数字文本 del-tnil原文本删除)"
(if (and (=(xyp-DXF 0 s1)"TEXT")
(setq tx (xyp-DXF 1 s1))
(distof tx)
)
(progn
(setq ar (getvar 'ATTREQ))
(setvar 'ATTREQ 1)
(command "-insert" "gc200" (xyp-DXF 10 s1) "" "" "" tx)
(if del-tnil
(entdel s1)
)
(setvar 'ATTREQ ar)
(entlast)
)
)
)
一年多的时间,楼主要是自动去学 lisp,早就解决了,提取文本(单行、多行)、文本的ascii、cass的gc200(表达Z值,其实也不需要gc200的,毕竟块参照,运行速度慢),这些论坛都有 lisp 源码。
不去学也行,花点小费用,总会有 lisp 者低价解决的。
这个简单识别文字位置坐标信息导出,然后展点高程点就可以
(defun c:ExportHDataToTXTH (/ ss layerName filePath blkRef atts H_values xCoord yCoord file insPt counter totalBlocks)
(vl-load-com)
;; 用户交互输入
(setq layerName (getstring "\n请输入要处理的图层名称: "))
(setq filePath (getfiled "选择保存位置" "" "txt" 1))
(if (and layerName filePath)
(progn
;; 创建或打开文件
(setq file (open filePath "w"))
(setq counter 1) ; 初始化点号计数器
;; 选择指定图层的块参照
(if (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 8 layerName))))
(progn
(setq totalBlocks (sslength ss)) ; 获取总块数
(princ (strcat "\n共找到 " (itoa totalBlocks) " 个块,开始处理..."))
(vlax-for blkRef (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
;; 进度提示(每处理10个块输出一次)
(if (= (rem counter 10) 0)
(princ (strcat "\n已处理 " (itoa counter) "/" (itoa totalBlocks) " 个块 (" (itoa (fix (* (/ counter totalBlocks) 100))) "%)"))
)
;; 获取插入点坐标
(setq insPt (vlax-get blkRef 'InsertionPoint))
(setq xCoord (rtos (car insPt) 2 3)) ; 强制保留3位小数
(setq yCoord (rtos (cadr insPt) 2 3))
;; 获取所有H属性值(按遍历顺序存储)
(setq atts (vlax-invoke blkRef 'GetAttributes))
(setq H_values '())
(foreach att atts
(if (= (vla-get-TagString att) "H")
(setq H_values (append H_values (list (vla-get-TextString att))))
) ; if闭合
) ; foreach闭合
;; 合并H值生成Z坐标并写入文件
(cond
((>= (length H_values) 2)
(setq zCoord (strcat (nth 0 H_values) "." (nth 1 H_values)))
(write-line (strcat (itoa counter) ",," xCoord "," yCoord "," zCoord) file)
)
((= (length H_values) 1)
(write-line (strcat (itoa counter) ",," xCoord "," yCoord ",N/A") file)
)
(t
(princ (strcat "\n警告: 块 " (vla-get-Name blkRef) " 缺少有效H属性"))
)
) ; cond闭合
(setq counter (1+ counter)) ; 计数器递增
) ; vlax-for闭合
(vla-delete (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object))))
) ; progn闭合
(princ "\n未找到符合条件的块参照。")
) ; if闭合
(close file)
(princ (strcat "\n处理完成!数据已保存至: " filePath))
) ; progn闭合
(princ "\n操作已取消。")
) ; if闭合
(princ)
)
;; 加载提示
(princ "\n输入命令 ExportHDataToTXTH 运行程序。")
(princ)这个是提取块的 也是没有z值属性
你可以参考
留个记号