xyp1964 发表于 2025-12-3 12:15:18

依然小小鸟 发表于 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)
    )
)
)

gzxl 发表于 2025-12-3 14:22:17

一年多的时间,楼主要是自动去学 lisp,早就解决了,提取文本(单行、多行)、文本的ascii、cass的gc200(表达Z值,其实也不需要gc200的,毕竟块参照,运行速度慢),这些论坛都有 lisp 源码。
不去学也行,花点小费用,总会有 lisp 者低价解决的。

16699988885 发表于 前天 16:03

这个简单识别文字位置坐标信息导出,然后展点高程点就可以

16699988885 发表于 前天 16:04

(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值属性
你可以参考

edsion24 发表于 昨天 08:11

留个记号
                                       
页: 1 2 3 [4]
查看完整版本: 如何将文字转化为高程点?