AutoCAD中实现多个单行文字水平对齐(利用LISP)

AutoCAD中实现多个单行文字水平对齐(利用LISP)

1.需求

将杂乱无章的单行文字对象水平对齐,即X坐标相同,Y、Z坐标不变。其中,文字的对正方式方式限于左对正、居中对正、右对正。

对齐前

图1 对齐前

在这里插入图片描述

图2 对齐后

2.思路

通过修改文字对象DXF组码中有关文字对正方式及定位点的内容实现预期目的。

  • 与文字水平对正有关的组码是72:0=左对正(默认值),1=居中对正,2=右对正。
  • 与文字定位坐标有关的组码有两个:10=第一对齐点,11=第二对齐点。
  • 组码72的值为0(左对正)时,第一对齐点有效,第二对齐点无意义;组码72的值非0(非左对正)时,第二对齐点有效,第一对齐点的值将根据第二对齐点和文字字符串的长度计算得到。

在这里插入图片描述

图3 对正方式为“左对齐”时

在这里插入图片描述

图4 对正方式为“右对齐”时

3.流程图

Created with Raphaël 2.3.0 开始 建立单行文字选择集(ssText) 指定点位,设置对齐位置的横坐标(ptNewX) 设置文字的对正方式(alignNew) 循环1开始:逐一处理单行文字 获取当前对正方式(alignCur) “左对正”? 获得当前文字第一对齐点Y、Z坐标 与ptNewX组成新定位点(ptNew) 更新文字对正方式 “左对齐”? 设置第一对齐点为ptNew 循环1结束 结束 设置第二对齐点为ptNew 获得当前文字第二对齐点Y、Z坐标 yes no yes no

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)
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测绘客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值