clh521 发表于 2016-2-24 08:27:10

GRREAD在UCS坐标系下不行,如何解决?

本帖最后由 clh521 于 2016-2-24 08:36 编辑

这个源码,在世界坐标系是可以的,在用户坐标系就不行了,如何解决?
源码如下:
结合grread entdelentmake实现动态创建TEXT的代码如下:
(DEFUN ddtxt (txt height / el run n)
(DEFUN      mktxt (txt height pt)
(entmake (LIST
            '(0 . "TEXT")
            (CONS 10 pt)
            (CONS 40 height)
            (CONS 1 txt)
            (CONS 7 (GETVAR "TEXTSTYLE"))
             )

)
)
(SETQ run T)
(WHILE      (AND run (SETQ n (GRREAD T 1)))
(COND      ((= 5 (CAR n));;;移动鼠标
       (AND el (ENTDEL el))
         (mktxt txt height (CADR n))
         (SETQ el (ENTLAST))
      )
      ((= 3 (CAR n));;;点击左键
         (AND el (ENTDEL el))
         (mktxt txt height (CADR n))
         (SETQ run nil)
      )
)
)
)

(defun c:tt()
(ddtxt (getstring "\n文字内容:") (/ (getvar "viewsize")10))
)

ivde 发表于 2016-2-24 09:40:57

(CONS 10 (trans pt 1 0))

clh521 发表于 2016-2-24 10:46:37

ivde 发表于 2016-2-24 09:40 static/image/common/back.gif
(CONS 10 (trans pt 1 0))

还是不行呢?
(DEFUN ddtxt (txt height / el run n)
(DEFUN      mktxt (txt height pt)
(entmake (LIST
            '(0 . "TEXT")
            (CONS 10 (trans pt 1 0));;这里已经改了,还是不行
            (CONS 40 height)
            (CONS 1 txt)
            (CONS 7 (GETVAR "TEXTSTYLE"))
             )

)
)
(SETQ run T)
(WHILE      (AND run (SETQ n (GRREAD T 1)))
(COND      ((= 5 (CAR n));;;移动鼠标
         (AND el (ENTDEL el))
         (mktxt txt height (CADR n))
         (SETQ el (ENTLAST))
      )
      ((= 3 (CAR n));;;点击左键
         (AND el (ENTDEL el))
         (mktxt txt height (CADR n))
         (SETQ run nil)
      )
)
)
)

(defun c:t5()
(ddtxt (getstring "\n文字内容:") (/ (getvar "viewsize")10))
)

liu_kunlun 发表于 2016-2-24 16:50:12

问题在mktxt函数,它生成的文字在WCS,不在UCS,而grread返回的点为UCS。
如要mktxt函数生成的文字在UCS,需要将各种参数(点、角度等)都转换到UCS决定的OCS(该OCS的z轴与UCS的z轴平行,x和y轴不一定与UCS的xy轴平行,原点在WCS原点),并要用到210组码决定z轴向量。

kozmosovia 发表于 2016-2-24 17:33:53

建议:
1)不要不停地删除文字又重建文字,只建立一个,然后修改(entmake创建时文字在WCS)
2)建议坐标点转换到世界坐标,直接使用ActiveX修改文字

clh521 发表于 2016-2-24 21:47:37

kozmosovia 发表于 2016-2-24 17:33 static/image/common/back.gif
建议:
1)不要不停地删除文字又重建文字,只建立一个,然后修改(entmake创建时文字在WCS)
2)建议坐标 ...

那段源码是在网上搜到的,想依葫芦画瓢用在我的程序上,没想到在UCS坐标系下不行,怎么改?

kozmosovia 发表于 2016-2-25 10:44:40

(DEFUN ddtxt (txt height / N POS RUN VLO)
(if (entmake (LIST
               '(0 . "TEXT")
               (list 10 0. 0. 0.)
               (CONS 40 height)
               (CONS 1 txt)
               (CONS 7 (GETVAR "TEXTSTYLE"))
             )
      )
    (setq vlo (vlax-ename->vla-object (entlast)))
)
(SETQ run T)
(WHILE (AND vlo run (SETQ n (GRREAD T 1)))
    (if        (member (car n) '(5 3))
      (setq pos        (vlax-3d-point (trans (cadr n) 1 0))
          pos        (vla-put-insertionpoint vlo pos)
          run        (= (car n) 5)
      )
    )
)
)
(defun c:tt ()
(ddtxt (getstring "\n文字内容:") (/ (getvar "viewsize") 10))
)

clh521 发表于 2016-2-25 16:00:45

kozmosovia 发表于 2016-2-25 10:44 static/image/common/back.gif
(DEFUN ddtxt (txt height / N POS RUN VLO)
(if (entmake (LIST
               '(0 . "TEXT")


测试了下,程序运行后得不到正确的结果啊

liu_kunlun 发表于 2016-2-25 16:32:43

本帖最后由 liu_kunlun 于 2016-2-25 16:43 编辑

试一下这个:
(DEFUN      mktxt (txt height pt / vz)
(setq vz (trans '(0. 0. 1.) 1 0))
(entmake (LIST
            '(0 . "TEXT")
            (CONS 10 (trans pt 1 vz))
            (CONS 40 height)
            (CONS 1 txt)
            (CONS 7 (GETVAR "TEXTSTYLE"))
            (cons 50 (angle '(0. 0. 0.) (trans '(1. 0. 0.) 1 vz t)))
            (cons 210 vz)
         )

)
)

clh521 发表于 2016-2-26 08:20:11

liu_kunlun 发表于 2016-2-25 16:32 static/image/common/back.gif
试一下这个:
(DEFUN      mktxt (txt height pt / vz)
(setq vz (trans '(0. 0. 1.) 1 0))


早上一上班就试了一下,得到了正确的结果,谢谢,其他好多的entmake在用户坐标系下生成图元的程序都可以参照你这个函数了
页: [1]
查看完整版本: GRREAD在UCS坐标系下不行,如何解决?