明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 212|回复: 7

[提问] 请高手帮忙一下,让这个创建文字支持ucs

[复制链接]
发表于 2021-1-25 07:32 | 显示全部楼层 |阅读模式
这个通用的建立文字的程序在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 113  115))
        (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< a  90度>"))
                        ((= n 65) (COMMAND "ROTATE" SSet "" p1 90)(PRINC "\r< A  90度>"))
                       
                        ((= 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)
)

发表于 2021-1-25 10:49 | 显示全部楼层
个人觉的为了个文字的旋转角度,专门去写这么个东西,似乎没什么实际意义?
对于角度,直接两点确定最简单了(还有PolarTracking辅助),再就是写在右键菜单选项中,都是些特定且数量有限的角度值而已。
发表于 2021-1-25 10:55 | 显示全部楼层
关于编码风格,一般还是建议函数名称,调用的命令名称这些,统一为小写字符。只有字符串内的特定的系统变量名称使用全大写字符。变量命名,优先匈牙利与驼峰。
发表于 2021-1-25 13:29 | 显示全部楼层
  1. (entmake (list '(0 . "text")
  2.                  (cons 1 str)
  3.                  (cons 7 "standard")
  4.                  (cons 10 (trans p1 1 0))
  5.                  (cons 40 300)
  6.                  (cons 41 0.7)
  7.            )
  8.   )
发表于 2021-1-25 14:03 | 显示全部楼层
  1. (defun c:tt ()
  2.   (kswb "de25")
  3. )
  4. (defun kswb (str / cmd loop sset keylist n step        basepoint0 basepoint1 basepoint2)
  5.   (defun abc (ang)
  6.     (command "rotate" sset "" p1 ang)
  7.   )
  8.   (princ (strcat "\n单行文字绘图  " str ":"))
  9.   (while (not (setq p1 (getpoint "\n请指定文字旋转的基点: ")))
  10.   )
  11.   (entmake (list '(0 . "text")
  12.                  (cons 1 str)
  13.                  (cons 7 "standard")
  14.                  (cons 10 (trans p1 1 0))
  15.                  (cons 40 300)
  16.                  (cons 41 0.7)
  17.            )
  18.   )
  19.   (setq sset (entlast))
  20.   (princ
  21.     "\n\t按键旋转角度:q(45)/e(-45)/a(90)/d(-90)/s(180)/其他任意键退出"
  22.   )
  23.   (terpri)
  24.   (setq keylist '(65 68 69 81 83 97 100 101 113 115))
  25.   (while (and (/= (setq n (cadr (grread))) 13)
  26.               (member n keylist)
  27.          )
  28.     (cond ((= n 113) (abc 45))
  29.           ((= n 81) (abc 45))
  30.           ((= n 101) (abc -45))
  31.           ((= n 69) (abc -45))
  32.           ((= n 115) (abc 180))
  33.           ((= n 83) (abc 180))
  34.           ((= n 97) (abc 90))
  35.           ((= n 65) (abc 90))
  36.           ((= n 100) (abc -90))
  37.           ((= n 68) (abc -90))
  38.     )
  39.   )
  40.   (princ)
  41. )
 楼主| 发表于 2021-1-25 17:03 | 显示全部楼层

谢谢院长,测试有效,感激哈!
发表于 2021-1-26 20:08 | 显示全部楼层
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空间:赶紧开空调吧!
  --------------------------------------------
  总结:不管气温高低、衣服多少,把空调开起来

 楼主| 发表于 2021-1-31 10:50 | 显示全部楼层
caoyin 发表于 2021-1-26 20:08
1.第一步,弄清楚创建的对象需要的点是什么坐标系。比如LINE,需要WCS点;LWPOLYLINE则需要OCS点,TEXT跟LW ...

这介绍真是详细啊,好多不懂得现在都有点清晰了,谢谢caoyin大哥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2021-3-3 23:14 , Processed in 0.130163 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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