明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4540|回复: 15

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

  [复制链接]
发表于 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 | 显示全部楼层
谢谢分享      
发表于 2021-11-2 09:42:21 | 显示全部楼层
谢谢分享   ,很好用
发表于 2021-11-2 09:43:24 | 显示全部楼层
不错的帖子
发表于 2003-11-11 19:39:00 | 显示全部楼层
應和這個差不多吧. 我也沒做的很好. 望大家一起完善吧
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=11867
发表于 2003-11-11 19:57:00 | 显示全部楼层
看看这个吧,找到文字的中心,绕这个中心旋转,文字就不会离开原来的位置了
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=8565
 楼主| 发表于 2003-11-12 18:17:00 | 显示全部楼层
Mr. meflying 介绍的的程序对MTEXT不完全适应。因为文本框的后两个夹点可以在文本末尾的前面也可以在后面。程序中的文字中点是对四个夹点求的,而不是根据文字的长度求的。
能否不用VLA之类求到中点呢?
另外版主能否对那个推荐程序加解释呢?我对VLA类一窍不通。呵呵,多谢了。
我想了一个思路不知道行不行,首先根据文本的高度计算其一个字的宽度与字间距,然后可以用strlen计算文本的长度,然后可以得到距离组码10的相对距离。
发表于 2003-11-12 18:26:00 | 显示全部楼层
既然你对VL不懂,那这个程序解释就比较麻烦了,你还是先学学吧。
另你的思路,我觉得也不是太好,因为有一些特殊符号,还有字体,你取出来的是一大串字符串,还得去格式才行
可以将文字打散,取得中心后再恢复,不知可否
 楼主| 发表于 2003-11-12 19:17:00 | 显示全部楼层
能否不用VL类的函数,来获取TEXT(不是MTEXT)的中点呢?
因为我发现text实际上有个无形的矩形文本框的。
发表于 2003-11-12 19:19:00 | 显示全部楼层
textbox函数,但对MTEXT无效
 楼主| 发表于 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)
)
发表于 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)
 楼主| 发表于 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)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-16 12:47 , Processed in 0.223497 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表