本帖最后由 林霄云 于 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 常用于解决镜像问题。当加入块内文字识别操作时,能有更广泛的应用。 |