文字绕自身中点反转 支持UCS
本帖最后由 林霄云 于 2014-1-5 17:46 编辑文字绕自身中点反转 支持UCS —— textbox函数的应用实例
思路:
文字绕自身中点反转,关键是取中点。
思路一:可以利用通用函数get-textbox(关于取文本四个角点的通用函数(get-textbox)的解析与测试源码http://bbs.mjtd.com/forum.php?mo ... 910&fromuid=7303580
)取文本框四个角点,然后利用inters(注意转换到UCS下)取其中点。
思路二:利用向量计算,直接取中点。
本文为重点解释textbox函数的作用,按第二思路给出源码,如下RTT(RotaTe text)(defun C:RTT ( / ag ang-self ang en ent pt0-ll pt0-m pt0-tr pt-ins pt-list x y ) ;文字反转RotaTe Text
;;;(setq oldosmode (getvar "osmode"))
;;;(setvar "osmode" 0)
(princ "\n选择需要反转的文字:");提示不需要进入循环
(while (setq en (car (entsel)))
(setq ent (entget en))
(setq pt-ins (cdr (assoc 10 ent)));第一对齐点(在 OCS 中)插入点(非UCS)
(setq ang (cdr (assoc 50 ent))) ;a 文字旋转角度 弧度(WCS)
(setq pt-list (textbox ent)) ;取文本虚拟框
(setq pt0-ll (car pt-list)) ;取左下点
(setq pt0-tr (cadr pt-list)) ;取右上点
(setq te-tr (mapcar '(lambda (x y) (+ x y)) pt0-ll pt0-tr)) ;取对应原点的右上点。
(setq ang-self (atan (cadr te-tr) (car te-tr)));取转角,基点为原点。 self-ang花了作者一晚上的时间,因为polar中的角度是从坐标轴开始的。需要加自身转角。
(setq pt-tr (mapcar '(lambda (x y) (+ x y)) te-tr pt-ins));取对应插入点的右上点
;相对pt-ins,将中点旋转角度ang
(setq dis (* 0.5 (distance pt-ins pt-tr))) ;取长度
(setq pt0-m (polar pt-ins (+ ang-self ang) dis))
;;;(command "point" pt0-m)
(setq ag "180")
(vla-rotate
(vlax-ename->vla-object en)
(vlax-3d-point pt0-m)
(angtof ag)
)
);while 加入循环
;;;(setvar "osmode" oldosmode) ;取消捕捉,当使用command命令时。
(princ)
);defun
(princ "\nRTT 文字反转命令加载成功\nDesigned by 林霄云 2014年1月4日")
(princ)
结论:此代码经过测试,在UCS下也可以,在文中解释其原因。Rotate text 常用于解决镜像问题。当加入块内文字识别操作时,能有更广泛的应用。 指令: _-view 输入选项 [?/删除(D)/正投影(O)/还原(R)/储存(S)/设定(E)/视窗(W)]: _swiso 正在重生模型。
指令: _ucs
目前的 UCS 名称:*世界*
指定 UCS 的原点或 [面(F)/具名(NA)/物件(OB)/前一个(P)/视图(V)/世界(W)/X/Y/Z/Z 轴(ZA)] <世界>: _v
在以上的條件下測試程序沒成功! 有意思,有一定使用价值。 有时候经常用,但是明经上有的源码貌似不支持ucs,支持楼主 用trans吧,你的代码可以简化很多 自贡黄明儒 发表于 2014-1-6 10:46 static/image/common/back.gif
用trans吧,你的代码可以简化很多
哈哈!!学习了一个新函数!!多谢多谢了!! 有意思 看看 能框选的话,那就更好了。 只能点选,能框选就完美了
页:
[1]