3stone 发表于 2003-11-11 18:34:00

[请教]对多个文字对象旋转,不改变文字的位置

本程序对多个文字对象旋转,为了不改变文字的大体位置,就改变文字的旋转基点,即增加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)
)

不语勿语 发表于 2018-5-28 23:38:24

谢谢分享      

天宇飞翔12 发表于 2021-11-2 09:42:21

谢谢分享   ,很好用

依然小小鸟 发表于 2021-11-2 09:43:24

不错的帖子

BDYCAD 发表于 2003-11-11 19:39:00

應和這個差不多吧. 我也沒做的很好. 望大家一起完善吧
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=11867

meflying 发表于 2003-11-11 19:57:00

看看这个吧,找到文字的中心,绕这个中心旋转,文字就不会离开原来的位置了
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8565

3stone 发表于 2003-11-12 18:17:00

Mr. meflying 介绍的的程序对MTEXT不完全适应。因为文本框的后两个夹点可以在文本末尾的前面也可以在后面。程序中的文字中点是对四个夹点求的,而不是根据文字的长度求的。
能否不用VLA之类求到中点呢?
另外版主能否对那个推荐程序加解释呢?我对VLA类一窍不通。呵呵,多谢了。
我想了一个思路不知道行不行,首先根据文本的高度计算其一个字的宽度与字间距,然后可以用strlen计算文本的长度,然后可以得到距离组码10的相对距离。

meflying 发表于 2003-11-12 18:26:00

既然你对VL不懂,那这个程序解释就比较麻烦了,你还是先学学吧。
另你的思路,我觉得也不是太好,因为有一些特殊符号,还有字体,你取出来的是一大串字符串,还得去格式才行
可以将文字打散,取得中心后再恢复,不知可否

3stone 发表于 2003-11-12 19:17:00

能否不用VL类的函数,来获取TEXT(不是MTEXT)的中点呢?
因为我发现text实际上有个无形的矩形文本框的。

meflying 发表于 2003-11-12 19:19:00

textbox函数,但对MTEXT无效

3stone 发表于 2003-11-12 20:49:00

这个程序利用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)
)

meflying 发表于 2003-11-13 08:35:00

dist应该是(distance...)除以2,因为你是要中间的点啊
pt_dis    (distance PT_box_LL PT_box_ur)
改为
pt_dis    (/ (distance PT_box_LL PT_box_ur) 2)

3stone 发表于 2003-11-13 08:39:00

终于达到我要的结果了,多谢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
查看完整版本: [请教]对多个文字对象旋转,不改变文字的位置