[请教]对多个文字对象旋转,不改变文字的位置
本程序对多个文字对象旋转,为了不改变文字的大体位置,就改变文字的旋转基点,即增加justify的MC点。我是先捕捉文字1的10组码,然后以此text命令采用MC,然后删除文字1,然后把新生成的文字从其组码10移动到11。大体思路是这样,有不足的地方请各位帮忙。
另外我想用另一种思路:采用改变图元,替换。可是没办法替换掉11组码。所以就不会了,请指教。
(defun c:rt ()
(setvar "cmdecho" 0)
(prompt "选择文字")
(setq sse (ssget '((0 . "text"))))
(setq ssl (sslength sse))
(setq ro (getangle "\n请输入角度:"))
(command "_.undo" "be")
(setq ro (* 180 (/ ro pi)))
(setq ii 0)
(while (< ii ssl)
(setq ename (ssname sse ii))
(setq e1 (entget ename)
pt1 (cdr (assoc 10 e1))
old_72 (assoc 72 e1)
old_73 (assoc 73 e1)
txt (cdr (assoc 1 e1))
txt_la (cdr (assoc 8 e1))
txt_h (cdr (assoc 40 e1))
txt_ro_r (cdr (assoc 50 e1))
txt_ro (* 180 (/ txt_ro_r pi))
)
(command "erase" ename "")
(command "_text" "j" "mc" pt1 txt_h txt_ro txt)
(setq e2 (entlast)
ent_e2 (entget e2)
pt10 (cdr (assoc 10 ent_e2))
pt11 (cdr (assoc 11 ent_e2))
)
(command "move" e2 "" pt10 pt11)
(setq pt11 (cdr (assoc 11 (entget e2))))
(command "rotate" e2 "" pt11 ro)
(command "_.change" e2 "" "p" "la" txt_la "")
(ssadd e2 sse)
(setq ii (1+ ii))
)
(command "_.select" sse "")
(command "_.undo" "e")
(setvar "cmdecho" 1)
(princ)
) 谢谢分享 谢谢分享 ,很好用 不错的帖子 應和這個差不多吧. 我也沒做的很好. 望大家一起完善吧
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=11867 看看这个吧,找到文字的中心,绕这个中心旋转,文字就不会离开原来的位置了
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8565 Mr. meflying 介绍的的程序对MTEXT不完全适应。因为文本框的后两个夹点可以在文本末尾的前面也可以在后面。程序中的文字中点是对四个夹点求的,而不是根据文字的长度求的。
能否不用VLA之类求到中点呢?
另外版主能否对那个推荐程序加解释呢?我对VLA类一窍不通。呵呵,多谢了。
我想了一个思路不知道行不行,首先根据文本的高度计算其一个字的宽度与字间距,然后可以用strlen计算文本的长度,然后可以得到距离组码10的相对距离。 既然你对VL不懂,那这个程序解释就比较麻烦了,你还是先学学吧。
另你的思路,我觉得也不是太好,因为有一些特殊符号,还有字体,你取出来的是一大串字符串,还得去格式才行
可以将文字打散,取得中心后再恢复,不知可否 能否不用VL类的函数,来获取TEXT(不是MTEXT)的中点呢?
因为我发现text实际上有个无形的矩形文本框的。 textbox函数,但对MTEXT无效 这个程序利用TEXT的文本框找中点,可是结果不对,请帮看看,谢谢
(defun c:rt ()
(setvar "cmdecho" 0)
(prompt "选择文字") ;不适用于MTEXT.
(setq sse (ssget '((0 . "text"))))
(setq ssl (sslength sse))
(setq ro (getangle "\n请输入角度:"))
(command "_.undo" "be")
(setq ro (* 180 (/ ro pi)))
(command "_.ucs" "")
(setq ii 0)
(while (< ii ssl)
(setq ename (ssname sse ii))
(setq e1 (entget ename)
txt_box (textbox e1)
PT_box_LL (car txt_box)
PT_box_ur (cadr txt_box)
pt_ang (angle PT_box_LL PT_box_ur)
pt_dis (distance PT_box_LL PT_box_ur)
pt1 (cdr (assoc 10 e1))
)
(setq pt_mid (polar pt1 pt_ang pt_dis))
(command "rotate" ename "" pt_mid ro)
(setq ii (1+ ii))
)
(command "_.ucs" "p")
(command "_.select" sse "")
(command "_.undo" "e")
(setvar "cmdecho" 1)
(princ)
) dist应该是(distance...)除以2,因为你是要中间的点啊
pt_dis (distance PT_box_LL PT_box_ur)
改为
pt_dis (/ (distance PT_box_LL PT_box_ur) 2) 终于达到我要的结果了,多谢MEFLYING !与大家分享。不用VL类函数。
不足之处请大家指教,谢谢!
;;by xialei
;;2003.11.12
(defun c:rt ()
(setvar "cmdecho" 0)
(prompt "选择文字") ;不适用于MTEXT.
(setq sse (ssget '((0 . "text"))))
(setq ssl (sslength sse))
(setq ro (getangle "\n请输入角度:"))
(command "_.undo" "be")
(setq ro (* 180 (/ ro pi)))
(command "_.ucs" "")
(setq ii 0)
(while (< ii ssl)
(setq ename (ssname sse ii))
(setq e1 (entget ename)
pt10 (cdr (assoc 10 e1))
txt_ang (cdr (assoc 50 e1))
txt_box (textbox e1)
PT_box_LL (car txt_box)
PT_box_ur (cadr txt_box)
pt_dist (distance PT_box_LL PT_box_ur)
txt_ang2(angle PT_box_LL PT_box_ur)
pt_ang (+ txt_ang txt_ang2)
pt_mid (polar pt10 pt_ang (/ pt_dist 2))
)
(command "rotate" ename "" pt_mid ro)
(setq ii (1+ ii))
)
(command "_.ucs" "p")
(command "_.select" sse "")
(command "_.undo" "e")
(setvar "cmdecho" 1)
(princ)
)
页:
[1]
2