求完善LISP提取每个圆圈或者方框内的文字然后把文字合并起来
如图所示,要把每个圆圈或者方框内的上下文字合并起来。比如说中间的文字要提取出PDG-832A和SF-3606。
网上AI找了些代码,但都写得不全或者运行错误。
(defun c:MergeTextsInCircles ()
;; 询问用户是否要选择特定的圆
(princ "\nDo you want to select specific circles (Y/N)? : ")
(setq userChoice (getkword))
;; 如果用户没有输入或输入了'N'或'n',则自动选择所有圆
(if (or (not userChoice) (equal userChoice "N" "n"))
(setq circles (ssget '((0 . "CIRCLE"))))
(setq circles (ssget '((0 . "CIRCLE")) '_ "Select circles: "))
)
;; 选择所有文本或MTEXT对象
(setq texts (ssget "X" '((0 . "TEXT,MTEXT"))))
;; 检查是否选择了圆和文本
(if (or (not circles) (not texts))
(progn
(princ "\nNo circles or text objects found.")
(exit)
)
)
;; 遍历每个圆
(setq i 0)
(repeat (sslength circles)
(setq circleEnt (ssname circles i))
(setq circleData (entget circleEnt))
(setq circleCenter (cdr (assoc 10 circleData)))
(setq circleRadius (cdr (assoc 40 circleData)))
;; 检查圆内的文本
(setq textsInCircle nil)
(setq j 0)
(repeat (sslength texts)
(setq textEnt (ssname texts j))
(setq textData (entget textEnt))
(setq textPos (cdr (assoc 10 textData)))
(setq textContent (cdr (assoc 1 textData)))
;; 如果文本在圆内
(if (point-in-circle textPos circleCenter circleRadius)
(setq textsInCircle (cons (list textEnt textContent textPos) textsInCircle))
)
(setq j (1+ j))
)
;; 如果圆内有文本,则合并文本
(if textsInCircle
(progn
(setq firstText (car textsInCircle))
(setq firstTextEnt (car firstText))
(setq firstTextContent (cadr firstText))
;; 合并文本内容
(foreach text (cdr textsInCircle)
(setq textEnt (car text))
(setq textContent (cadr text))
(if (not (wcmatch (strcase firstTextContent) (strcase textContent)))
(setq firstTextContent (strcat firstTextContent "\n" textContent))
)
(entdel textEnt) ; 删除合并后的文本对象
)
;; 更新第一个文本对象的内容
(setq firstTextData (entget firstTextEnt))
(setq firstTextData (subst (cons 1 firstTextContent) (assoc 1 firstTextData) firstTextData))
(entmod firstTextData)
(princ (strcat "\nUpdated circle with merged text: "))
(princ firstTextContent)
)
)
(setq i (1+ i))
)
(princ "\nText merge complete.")
(princ)
)
(defun point-in-circle (pt center radius)
(setq dx (- (car pt) (car center)))
(setq dy (- (cadr pt) (cadr center)))
(<= (+ (* dx dx) (* dy dy)) (* radius radius))
)
(princ "\nType 'MergeTextsInCircles' to run the script.")
(princ)
页:
[1]