请问怎么用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)
这个问题可大可小啊.
大就是性能考虑,要构建各种树,不过四叉树就好了...
小就是暴力选择... 这种P&ID图的测点,使用属性块,方便提取信息、统计数量。 设计信息的组织很重要,否则都是这种用分散的文字去表示实际需要关联的内容,最后还想用程序来获取,哪有这种好事?
页:
[1]