1.需求
将杂乱无章的单行文字对象水平对齐,即X坐标相同,Y、Z坐标不变。其中,文字的对正方式方式限于左对正、居中对正、右对正。
2.思路
通过修改文字对象DXF组码中有关文字对正方式及定位点的内容实现预期目的。
- 与文字水平对正有关的组码是72:0=左对正(默认值),1=居中对正,2=右对正。
- 与文字定位坐标有关的组码有两个:10=第一对齐点,11=第二对齐点。
- 组码72的值为0(左对正)时,第一对齐点有效,第二对齐点无意义;组码72的值非0(非左对正)时,第二对齐点有效,第一对齐点的值将根据第二对齐点和文字字符串的长度计算得到。
3.流程图
4.代码
(defun c:spdq
(/
i
ssText
ssNameI
entI
alignKw
alignCur
alignNew
ptCur
ptNewX
ptNew
)
(setvar "cmdecho" 0)
(setvar "osmode" 0)
;;;建立单行文字选择集(ssText)
(if
(not (setq ssText (ssget (list (cons 0 "text")))))
(exit)
)
;;;指定点位,设置对齐位置的横坐标(ptNewX)
(if
(not (setq ptNewX (getpoint "\n指定一点,用于确定对齐位置的横坐标:")))
(exit)
)
(setq ptNewX (car ptNewX))
;;;设置文字的对正方式(alignNew)
(initget 1 "L M R")
(if
(not (setq alignKw (getkword "\n左对正[L]/居中对正[M]/右对正[R]:")))
(exit)
)
(setq alignKw
(cond
((= alignKw "L") 0)
((= alignkw "M") 1)
((= alignKw "R") 2)
)
)
;;;建立循环,逐一处理单行文字
(setq i 0)
(repeat (sslength ssText)
(setq ssNameI (ssname ssText i))
(setq entI (entget ssNameI))
;;;获取当前对正方式(alignCur)
(setq alignCur (assoc 72 entI))
(setq alignCur (cdr alignCur))
;;;如果当前为“左对正”,取第一对齐点;如果当前非“左对齐”,取第二对齐点
(setq ptCur
(cond
((= alignCur 0) (assoc 10 entI))
((/= alignCur 0) (assoc 11 entI))
)
)
;;;与ptNewX组成新定位点(ptNew)
(setq ptNew (cdr ptCur))
(setq ptNew (cdr ptNew))
(setq ptNew (cons ptNewX ptNew))
;;;更新对正方式
(setq alignNew (cons 72 alignKw))
(setq entI (subst alignNew (cons 72 alignCur) entI))
(entmod entI)
(entupd ssnameI)
;;;更新对齐点坐标
(if
(= alignKw 0)
(progn
(setq ptCur (assoc 10 entI))
(setq ptNew (cons 10 ptNew))
(setq entI (subst ptNew ptCur entI))
(entmod entI)
(entupd ssNameI)
)
)
(if
(/= alignKw 0)
(progn
(setq ptCur (assoc 11 entI))
(setq ptNew (cons 11 ptNew))
(setq entI (subst ptNew ptCur entI))
(entmod entI)
(entupd ssNameI)
)
)
(setq i (+ i 1))
)
(setvar "cmdecho" 1)
)