qqask 发表于 2024-6-13 19:53:17

请问怎么用LISP提取每个圆圈或者方框内的文字然后把文字合并起来?

本帖最后由 qqask 于 2024-6-13 19:54 编辑

如图所示,要把每个圆圈或者方框内的上下文字合并起来。

比如说中间的文字要提取出PDG-832A和SF-3606。
网上AI找了些代码,但都写得不全或者运行错误。



(defun c:MergeTextInCircles (/ ss i ename txtpos txt txtlist mergedtxt)
; 初始化变量
(setq txtlist nil)
(setq mergedtxt "")

; 选择包含文字的圆
(setq ss (ssget "S=C;X;"))
if ss
    ; 遍历选择集中的每个圆
    (repeat (sslength ss)
      (setq i (ssname ss (setq i (1+ i))))
      (setq circEnt (entget i))
      (if circEnt
      (progn
          ; 获取圆的中心点
          (setq circCtr (cdr (assoc 10 circEnt)))
          ; 查找圆内的所有文字对象
          (mapcar
            '(lambda (ename)
            (setq txtEnt (entget ename))
            (if txtEnt
                (progn
                  ; 获取文字位置和内容
                  (setq txtpos (cdr (assoc 10 txtEnt)))
                  (setq txt (cdr (assoc 1 txtEnt)))

                  ; 这里需要添加逻辑来确保文字在圆内
                  ; ...

                  ; 将文字内容添加到列表
                  (setq txtlist (cons txt txtlist))
                )
            )
            )
            ; 这里应该是获取圆内所有文字对象的命令或函数
            ; 例如使用空间搜索或其他方法
            )
          )
      )
      )
    )
    ; 合并文字
    (foreach txt txtlist
      (setq mergedtxt (strcat mergedtxt txt "\P")) ; 假设"\P"在AutoCAD中用作换行符
    )
    ; 假设我们在第一个圆的中心创建合并的文字对象
    (if txtlist
      (command "_.text" (car circCtr) "" mergedtxt)
    )
)
(princ)
)

; 加载LISP程序并运行命令
(load "pmerge_text_in_circles")
(princ "\nLISP程序已加载。输入 'MergeTextInCircles' 来运行。")
(princ)

你有种再说一遍 发表于 2024-6-13 22:42:33

这个问题可大可小啊.
大就是性能考虑,要构建各种树,不过四叉树就好了...
小就是暴力选择...

marcoyuwen 发表于 2024-6-14 16:32:15

这种P&ID图的测点,使用属性块,方便提取信息、统计数量。

e2002 发表于 2024-6-14 16:55:36

设计信息的组织很重要,否则都是这种用分散的文字去表示实际需要关联的内容,最后还想用程序来获取,哪有这种好事?
页: [1]
查看完整版本: 请问怎么用LISP提取每个圆圈或者方框内的文字然后把文字合并起来?