wxynotes 发表于 2025-11-14 17:37:35

提取桩坐标及编号

按编号顺序提取桩(圆)的编号和坐标


;;; ======================================================================
;;; 定义一个新命令: SortTextExport
;;; 功能:
;;; 1. 让用户选择单行文字 (TEXT)
;;; 2. 根据数值大小 (从小到大) 排序
;;; 3. 将排序后的 "字符串,Y坐标,X坐标" 输出到桌面
;;;
;;; v2.0 更新:
;;;   - 坐标 (X, Y) 优先使用 DXF 11 (对齐点)
;;;   - 如果 DXF 11 不存在 (如默认左对齐), 则使用 DXF 10 (插入点)
;;; ======================================================================

(defun c:SortTextExport ( / ss i ent edata text-val ins-pt align-pt pt-to-use num-val x-coord y-coord text-list sorted-list desktop-path outfile-path f item line)

(princ "\n--- 文本排序导出工具 (使用对齐点) ---")

;; 1. 让用户框选选择单行文字 (DBText 在 LISP/DXF 中称为 "TEXT")
(prompt "\n请框选要排序的单行文字(DBText): ")
(setq ss (ssget '((0 . "TEXT"))))

(if ss
    (progn
      (setq i 0)
      (setq text-list '()) ; 初始化一个空列表来存储数据
      
      ;; 遍历选择集
      (while (< i (sslength ss))
      (setq ent (ssname ss i))
      (setq edata (entget ent))
      
      ;; 提取数据
      (setq text-val (cdr (assoc 1 edata))); 文本字符串 (DXF code 1)
      
      ;; --- 坐标提取逻辑 (已更新) ---
      (setq ins-pt (cdr (assoc 10 edata))) ; 插入点 (DXF code 10)
      (setq align-pt (cdr (assoc 11 edata))) ; 对齐点 (DXF code 11), 如果存在
      
      ;; 将文本字符串转换为数值
      (setq num-val (atof text-val))
      
      ;; 确定要使用的坐标
      ;; 如果 DXF code 11 (对齐点) 存在, 则使用它
      ;; 否则, 使用 DXF code 10 (插入点)
      (if align-pt
          (setq pt-to-use align-pt)
          (setq pt-to-use ins-pt)
      )

      (setq x-coord (car pt-to-use))
      (setq y-coord (cadr pt-to-use))
      ;; --- 更新结束 ---

      ;; 将数据存储在一个列表中,格式为: (数值 字符串 Y X)
      (setq text-list (cons (list num-val text-val y-coord x-coord) text-list))
      
      (setq i (1+ i))
      ) ; end while
      
      (if (not (null text-list))
      (progn
          ;; 2. 根据单行文字的数值大小排序 (从小到大)
          (setq sorted-list
            (vl-sort text-list
            (function (lambda (a b) (< (car a) (car b))))
            )
          )
         
          ;; 3. 将排序后的单行文字的...输出到桌面
         
          ;; 找到桌面路径 (适用于 Windows)
          (if (setq desktop-path (strcat (getenv "USERPROFILE") "\\Desktop"))
            (progn
            (setq outfile-path (strcat desktop-path "\\SortedTextData.csv"))
            
            ;; 尝试打开文件进行写入
            (if (setq f (open outfile-path "w"))
                (progn
                  ;; 写入数据
                  (foreach item sorted-list
                  ;; item 是 (数值 字符串 Y X)
                  (setq line (strcat
                                 (cadr item)    ; 字符串
                                 ","
                                 (rtos (caddr item) 2 8) ; Y坐标 (rtos 转换为字符串, 2=小数, 8=精度)
                                 ","
                                 (rtos (cadddr item) 2 8) ; X坐标
                               ))
                  (write-line line f)
                  )
                  (close f)
                  (alert (strcat "数据已成功导出到: \n" outfile-path))
                )
                (alert (strcat "错误: 无法写入文件! \n" outfile-path "\n请检查权限。"))
            )
            )
            (alert "错误: 无法找到桌面路径。")
          )
      )
      (prompt "\n未在所选对象中找到有效的文本。")
      )
    )
    (prompt "\n未选择任何对象。")
)

(princ) ; 退出时不在命令行显示 nil
)

(princ "\n已加载 SortTextExport命令 (v2.0),请输入SortTextExport运行。")
(princ)

liufii 发表于 2025-11-15 09:17:11

多谢分享!

nzdog 发表于 2025-11-15 19:03:39

感谢分享,试用了一下没反应不知道为什么

jkop 发表于 2025-11-16 12:32:07

感谢分享,试用程序,没反应 +1 ,求解。

香远益清 发表于 2025-11-19 12:10:06


只是提取文字插入点的坐标,与桩圆心坐标没有关系。

nzdog 发表于 2025-11-22 20:16:19

感谢分享,支持楼主
页: [1]
查看完整版本: 提取桩坐标及编号