请高手帮忙一下,让这个创建文字支持ucs
这个通用的建立文字的程序在ucs下老跑,请高手不吝赐教。(defun c:t2 () (kuaisuwenzi1 "De25"))
(DEFUN kuaisuwenzi1 (str / cmd loop SSet KeyList n step BasePoint0 BasePoint1 BasePoint2)
(princ(strcat"\n单行文字绘图" str":"))
(SETQ cmd (GETVAR "CMDECHO"))
(SETVAR "CMDECHO" 0)
(while (not (setq p1 (getpoint "\n请指定文字旋转的基点:"))))
;估计是加在这里
(entmake (list '(0 . "TEXT") (cons 1 str) (cons 7 "standard") (cons 10 p1) (cons 40 300)(cons 41 0.7)))
(SETQ SSet (entlast))
(PRINC "\n\t按键旋转《Q键 45度》《E键 -45度》《A键 90度》《S键 180度》 《D键 -90度》其他任意键退出")
(TERPRI)
(SETQ KeyList '(65 68 69 81 83 97 100 101 113115))
(WHILE (and(/= (SETQ n (CADR (GRREAD))) 13)
(MEMBER n KeyList))
(COND
((= n 113)(COMMAND "ROTATE" SSet "" p1 45)(PRINC "\r< q 45度 >"))
((= n 81)(COMMAND "ROTATE" SSet "" p1 45)(PRINC "\r< Q 45度 >"))
((= n 101)(COMMAND "ROTATE" SSet "" p1 -45)(PRINC "\r< e -45度 >"))
((= n 69)(COMMAND "ROTATE" SSet "" p1 -45)(PRINC "\r< E-45度 >"))
((= n 115)(COMMAND "ROTATE" SSet "" p1 180)(PRINC "\r< s 180度 >"))
((= n 83)(COMMAND "ROTATE" SSet "" p1 180)(PRINC "\r< S 180度 >"))
((= n 97) (COMMAND "ROTATE" SSet "" p1 90)(PRINC "\r< a90度>"))
((= n 65) (COMMAND "ROTATE" SSet "" p1 90)(PRINC "\r< A90度>"))
((= n 100)(COMMAND "ROTATE" SSet "" p1 -90)(PRINC "\r< d -90度>"))
((= n 68)(COMMAND "ROTATE" SSet "" p1 -90)(PRINC "\r< D -90度>"))
)
);WHILE
(PRINC "已经退出")
(SETVAR "CMDECHO" cmd)
(PRINC)
)
个人觉的为了个文字的旋转角度,专门去写这么个东西,似乎没什么实际意义?
对于角度,直接两点确定最简单了(还有PolarTracking辅助),再就是写在右键菜单选项中,都是些特定且数量有限的角度值而已。 关于编码风格,一般还是建议函数名称,调用的命令名称这些,统一为小写字符。只有字符串内的特定的系统变量名称使用全大写字符。变量命名,优先匈牙利与驼峰。 (entmake (list '(0 . "text")
(cons 1 str)
(cons 7 "standard")
(cons 10 (trans p1 1 0))
(cons 40 300)
(cons 41 0.7)
)
) (defun c:tt ()
(kswb "de25")
)
(defun kswb (str / cmd loop sset keylist n step basepoint0 basepoint1 basepoint2)
(defun abc (ang)
(command "rotate" sset "" p1 ang)
)
(princ (strcat "\n单行文字绘图" str ":"))
(while (not (setq p1 (getpoint "\n请指定文字旋转的基点: ")))
)
(entmake (list '(0 . "text")
(cons 1 str)
(cons 7 "standard")
(cons 10 (trans p1 1 0))
(cons 40 300)
(cons 41 0.7)
)
)
(setq sset (entlast))
(princ
"\n\t按键旋转角度:q(45)/e(-45)/a(90)/d(-90)/s(180)/其他任意键退出"
)
(terpri)
(setq keylist '(65 68 69 81 83 97 100 101 113 115))
(while (and (/= (setq n (cadr (grread))) 13)
(member n keylist)
)
(cond ((= n 113) (abc 45))
((= n 81) (abc 45))
((= n 101) (abc -45))
((= n 69) (abc -45))
((= n 115) (abc 180))
((= n 83) (abc 180))
((= n 97) (abc 90))
((= n 65) (abc 90))
((= n 100) (abc -90))
((= n 68) (abc -90))
)
)
(princ)
) xyp1964 发表于 2021-1-25 14:03
谢谢院长,测试有效,感激哈! 1.第一步,弄清楚创建的对象需要的点是什么坐标系。比如LINE,需要WCS点;LWPOLYLINE则需要OCS点,TEXT跟LWPOLYLINE一样也需要OCS点。
2.第二步,弄清楚将要输入的点是什么坐标系。比如 getpoint 得到的是UCS点,vlax-curve系列函数得到的是WCS点。
3.第三步,把将要输入的点坐标系转换成创建所需要的坐标系
4.在 entmake 中加入 210 组码 (用 vla-add* 创建的则需要设置一下该对象的NORMAL属性,该属性就相当于210组码)
--------------------------------------------------------
弄清楚以上步骤,创建对象思路就清晰了,下面是TEXT、和LINE的举例:
(defun C:TT1 (/ P1 NOR)
(if (and (setq p1 (getpoint "\n指定直线起点: "));;获取UCS点
(setq p2 (getpoint P1 "\n指定直线终点: "));;获取UCS点
)
(progn
(setq NOR (trans '(0 0 1) 1 0 T);;获取当前UCS坐标系的向量
P1(trans P1 1 0);;直线对象需要WCS点
P2(trans P2 1 0);;直线对象需要WCS点
)
(entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 P2)(cons 210 NOR)));;输入WCS点,并设置210组码
)
)
)
(defun C:TT2 (/ P1 NOR)
(if (setq p1 (getpoint "\n指定文字位置: "));;获取UCS点
(progn
(setq NOR (trans '(0 0 1) 1 0 T);;获取当前UCS坐标系的向量
P1(trans P1 1 NOR);;文字需要OCS点
)
(entmake (list '(0 . "TEXT") '(1 . "De25") (cons 7 "standard") (cons 10 p1) (cons 40 300)(cons 41 0.7)(cons 210 NOR)));;输入OCS点,并设置210组码
)
)
)
-------------------------------------------------------------
下面,打个不恰当的比方,用于理解坐标系、和坐标系点和Normal:
-------------------------------------------------------------
·绘图环境的坐标系系统-----是气温
WCS,温度适中,体感舒适
UCS,温度不确定
·不同坐标系类型的点-------是衣服
WCS点,标准保暖套件:恒温外套
OCS点,非标保暖套件:穿没穿,或穿多少不确定。
·Normal(即210组码)--------是空调
--------------------------------------------
(WCS点)对象在WCS空间:那叫一个舒适
(WCS点)对象在UCS空间:冷热都不怕,咱有恒温外套
(OCS点)对象在WCS空间:还好天气不错,不热不冷
(OCS点)对象在UCS空间:赶紧开空调吧!
--------------------------------------------
总结:不管气温高低、衣服多少,把空调开起来
caoyin 发表于 2021-1-26 20:08
1.第一步,弄清楚创建的对象需要的点是什么坐标系。比如LINE,需要WCS点;LWPOLYLINE则需要OCS点,TEXT跟LW ...
这介绍真是详细啊,好多不懂得现在都有点清晰了,谢谢caoyin大哥 caoyin 发表于 2021-1-26 20:08
1.第一步,弄清楚创建的对象需要的点是什么坐标系。比如LINE,需要WCS点;LWPOLYLINE则需要OCS点,TEXT跟LW ...
收藏研究一下
页:
[1]