明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1946|回复: 23

[提问] 如何让当前视口中心和四个角点显示特定字符(高飞鸟版主能有空指导更好)

[复制链接]
发表于 2021-12-12 13:01 | 显示全部楼层 |阅读模式
50明经币
本帖最后由 夏生生 于 2021-12-17 09:35 编辑

这是一个坐标变换的问题,为了方便表述,我用了“如何让当前视口中心和四个角点显示特定字符”为标题。如下图效果:

当grread函数工作时,无论在何等UCS(包括xy顺时针旋转)、plan与UCS配合、视图(3DORBIT)的情况下,在当前视口中心和四个角点显示固定像素大小的特定字符。效果与DCL相似,DCL无论你的坐标系统是什么样的,它始终在屏幕上以固定的大小、固定的位置显示。这里就涉及到坐标变换的问题,我仔细研究了高飞鸟版主的帖子,对于点、线的UCS、WCS、DCS转换,相对还是比较好处理,直接换算点,然后赋值即可。但是涉及到文字、块等有ECS概念的图元的时候我就不会了。恳请各位不吝赐教,谢谢。
下述代码无法处理3DORBIT的情况

  1. (defun c:temp (/   CEN     D2W       GR1       GR2
  2.          H   LOOP     OBJL       PT         SC
  3.          SCR   STR     WB       WH         xty-make-text@w
  4.          xty-put-dxf     xty-put-dxfl
  5.         )
  6.   (setq  loop t
  7.   pt   '(0 0 0)
  8.   str  "特定字符"
  9.   objl (list (xty-make-text@w str 0 0 pt pt 1 1 0 "standard")
  10.        (xty-make-text@w str 0 0 pt pt 1 1 0 "standard")
  11.        (xty-make-text@w str 0 0 pt pt 1 1 0 "standard")
  12.        (xty-make-text@w str 0 0 pt pt 1 1 0 "standard")
  13.        (xty-make-text@w str 0 0 pt pt 1 1 0 "standard")
  14.        ) ;_画五个临时文字
  15.   objl (mapcar 'vlax-ename->vla-object objl)
  16.   )
  17.   (while loop
  18.     (setq gr1 (grread t 15 1)
  19.     gr2 (cadr gr1)
  20.     gr1 (car gr1)
  21.     cen (trans (getvar "VIEWCTR") 1 2)
  22.     wh  (getvar "VIEWSIZE")
  23.     scr (getvar "SCREENSIZE")
  24.     sc  (/ wh (cadr scr))
  25.     wb  (* 0.5 (* sc (car scr)))
  26.     wh  (* 0.5 wh)
  27.     h   (* 30 sc)
  28.     d2w (append
  29.     (mapcar  'append
  30.       (mapcar
  31.         (function (lambda (v) (trans v 0 2 t)))
  32.         '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  33.       )
  34.       (mapcar 'list (trans '(0 0 0) 2 0))
  35.     )
  36.     '((0. 0. 0. 1.))
  37.         ) ;_DCS->wcs转换矩阵
  38.     )
  39.     (xty-put-dxfl
  40.       (vlax-vla-object->ename (car objl))
  41.       '(40 72 73 10 11)
  42.       (list h
  43.       0
  44.       0
  45.       (mapcar '- cen (list wb wh))
  46.       (mapcar '- cen (list wb wh))
  47.       )
  48.     )
  49.     (xty-put-dxfl
  50.       (vlax-vla-object->ename (cadr objl))
  51.       '(40 72 73 10 11)
  52.       (list h
  53.       2
  54.       0
  55.       (mapcar '+ cen (list wb (- wh)))
  56.       (mapcar '+ cen (list wb (- wh)))
  57.       )
  58.     )
  59.     (xty-put-dxfl
  60.       (vlax-vla-object->ename (caddr objl))
  61.       '(40 72 73 10 11)
  62.       (list h
  63.       2
  64.       3
  65.       (mapcar '+ cen (list wb wh))
  66.       (mapcar '+ cen (list wb wh))
  67.       )
  68.     )
  69.     (xty-put-dxfl
  70.       (vlax-vla-object->ename (cadddr objl))
  71.       '(40 72 73 10 11)
  72.       (list h
  73.       0
  74.       3
  75.       (mapcar '+ cen (list (- wb) wh))
  76.       (mapcar '+ cen (list (- wb) wh))
  77.       )
  78.     )
  79.     (xty-put-dxfl
  80.       (vlax-vla-object->ename (last objl))
  81.       '(40 72 73 10 11)
  82.       (list h 1 2 cen cen)
  83.     )
  84.     (foreach n objl (vla-TransformBy n (vlax-tMatrix d2w)))
  85.     (cond ((= 3 gr1)
  86.      (setq loop nil)
  87.      (foreach n objl (vla-delete n))
  88.     )
  89.     )
  90.   )
  91.   (defun xty-make-text@w (tt t72 t73 t10 t11 th tw t50 tst /)
  92.     (entmakex (list '(0 . "text")
  93.         '(100 . "AcDbEntity")
  94.         '(100 . "AcDbText")
  95.         (cons 10 t10)
  96.         (cons 1 tt)
  97.         (cons 40 th)
  98.         (cons 41 tw)
  99.         (cons 7 tst)
  100.         (cons 72 t72)
  101.         (cons 11 t11)
  102.         (cons 50 t50)
  103.         (cons 73 t73)
  104.         )
  105.     )
  106.   )
  107.   (defun xty-put-dxf (en code ch / ent)
  108.     (setq ent (entget en))
  109.     (if  (xty-get-dxf code en)
  110.       (entmod (subst (cons code ch) (assoc code ent) ent))
  111.       (entmod (append ent (list (cons code ch))))
  112.     )
  113.     (entupd en)
  114.   )
  115.   (defun xty-put-dxfl (en code-l ch-l / ent)
  116.     (setq ent (entget en))
  117.     (foreach n
  118.          code-l
  119.       (if (xty-get-dxf n en)
  120.   (setq ent (subst (cons n (car ch-l)) (assoc n ent) ent))
  121.   (setq ent (append ent (list (cons n (car ch-l)))))
  122.       )
  123.       (setq ch-l (cdr ch-l))
  124.     )
  125.     (entmod ent)
  126.     (entupd en)
  127.   )
  128. )


附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

自己暂时解决,通过文字的ecs,可能是计算精度的问题,坐标值过小或过大会出现意想不到的情况 悬赏再放段时间吧,看哪位大佬能给与指导,谢谢。
发表于 2021-12-12 13:01 | 显示全部楼层
本帖最后由 x_s_s_1 于 2021-12-17 10:03 编辑

自己暂时解决,通过文字的ecs,可能是计算精度的问题,坐标值过小或过大会出现意想不到的情况
悬赏再放段时间吧,看哪位大佬能给与指导,谢谢。

  1. (defun c:temp (/   CEN     D2W       GR1       GR2
  2.          H   LOOP     OBJL       PT         SC
  3.          SCR   STR     WB       WH         temp
  4.         )
  5.   (setq  loop t
  6.   pt   '(0 0 0)
  7.   str  "特定字符"
  8.   objl (list (xty-make-textw str 0 0 pt pt 1 1 0 "standard")
  9.        (xty-make-textw str 0 0 pt pt 1 1 0 "standard")
  10.        (xty-make-textw str 0 0 pt pt 1 1 0 "standard")
  11.        (xty-make-textw str 0 0 pt pt 1 1 0 "standard")
  12.        (xty-make-textw str 0 0 pt pt 1 1 0 "standard")
  13.        ) ;_画五个临时文字
  14.   temp (car objl)
  15.   objl (mapcar 'vlax-ename->vla-object objl)
  16.   )
  17.   (while loop
  18.     (setq gr1 (grread t 15 1)
  19.     gr2 (cadr gr1)
  20.     gr1 (car gr1)
  21.     cen (trans (getvar "VIEWCTR") 1 2)
  22.     wh  (getvar "VIEWSIZE")
  23.     scr (getvar "SCREENSIZE")
  24.     sc  (/ wh (cadr scr))
  25.     wb  (* 0.5 (* sc (car scr)))
  26.     wh  (* 0.5 wh)
  27.     h   (* 30 sc)
  28.     d2w (append
  29.     (mapcar  'append
  30.       (mapcar
  31.         (function (lambda (v) (trans v temp 2 t)))
  32.         '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
  33.       )
  34.       (mapcar 'list (trans '(0 0 0) 2 temp))
  35.     )
  36.     '((0. 0. 0. 1.))
  37.         ) ;_DCS->wcs转换矩阵
  38.     )
  39.     (xty-put-dxfl
  40.       (vlax-vla-object->ename (car objl))
  41.       '(40 72 73 10 11)
  42.       (list h
  43.       0
  44.       0
  45.       (mapcar '- cen (list wb wh))
  46.       (mapcar '- cen (list wb wh))
  47.       )
  48.     )
  49.     (xty-put-dxfl
  50.       (vlax-vla-object->ename (cadr objl))
  51.       '(40 72 73 10 11)
  52.       (list h
  53.       2
  54.       0
  55.       (mapcar '+ cen (list wb (- wh)))
  56.       (mapcar '+ cen (list wb (- wh)))
  57.       )
  58.     )
  59.     (xty-put-dxfl
  60.       (vlax-vla-object->ename (caddr objl))
  61.       '(40 72 73 10 11)
  62.       (list h
  63.       2
  64.       3
  65.       (mapcar '+ cen (list wb wh))
  66.       (mapcar '+ cen (list wb wh))
  67.       )
  68.     )
  69.     (xty-put-dxfl
  70.       (vlax-vla-object->ename (cadddr objl))
  71.       '(40 72 73 10 11)
  72.       (list h
  73.       0
  74.       3
  75.       (mapcar '+ cen (list (- wb) wh))
  76.       (mapcar '+ cen (list (- wb) wh))
  77.       )
  78.     )
  79.     (xty-put-dxfl
  80.       (vlax-vla-object->ename (last objl))
  81.       '(40 72 73 10 11)
  82.       (list h 1 2 cen cen)
  83.     )
  84.     (foreach n objl (vla-TransformBy n (vlax-tMatrix d2w)))
  85.     (cond ((= 3 gr1)
  86.      (setq loop nil)
  87.      (foreach n objl (vla-delete n))
  88.     )
  89.     )
  90.   )
  91.   (defun xty-make-textw (tt t72 t73 t10 t11 th tw t50 tst /)
  92.     (entmakex (list '(0 . "text")
  93.         '(100 . "AcDbEntity")
  94.         '(100 . "AcDbText")
  95.         (cons 10 t10)
  96.         (cons 1 tt)
  97.         (cons 40 th)
  98.         (cons 41 tw)
  99.         (cons 7 tst)
  100.         (cons 72 t72)
  101.         (cons 11 t11)
  102.         (cons 50 t50)
  103.         (cons 73 t73)
  104.         )
  105.     )
  106.   )
  107.   (defun xty-put-dxf (en code ch / ent)
  108.     (setq ent (entget en))
  109.     (if  (xty-get-dxf code en)
  110.       (entmod (subst (cons code ch) (assoc code ent) ent))
  111.       (entmod (append ent (list (cons code ch))))
  112.     )
  113.     (entupd en)
  114.   )
  115.   (defun xty-put-dxfl (en code-l ch-l / ent)
  116.     (setq ent (entget en))
  117.     (foreach n
  118.          code-l
  119.       (if (xty-get-dxf n en)
  120.   (setq ent (subst (cons n (car ch-l)) (assoc n ent) ent))
  121.   (setq ent (append ent (list (cons n (car ch-l)))))
  122.       )
  123.       (setq ch-l (cdr ch-l))
  124.     )
  125.     (entmod ent)
  126.     (entupd en)
  127.   )
  128. )



回复

使用道具 举报

发表于 2021-12-13 11:27 | 显示全部楼层
grread函数下不是很懂   但是在任意视图 包括旋转后的三维视图状态 下  只要改为视图ucs   在屏幕四角和中心显示固定大小的文字应该是可以实现的     

评分

参与人数 1明经币 +1 收起 理由
夏生生 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-12-13 11:37 | 显示全部楼层
本帖最后由 夏生生 于 2021-12-13 11:39 编辑
guosheyang 发表于 2021-12-13 11:27
grread函数下不是很懂   但是在任意视图 包括旋转后的三维视图状态 下  只要改为视图ucs   在屏幕四角和中 ...

这个还是比较简单,不过经您提醒,我的思路好像还是进入了误区,我再捋捋思路,谢谢
  1. ;;;=============================================
  2. ;;;      通用函数  获取当前视口中视图的外包框
  3. ;;;参数: mode-------输出方式
  4. ;;;返回值:UCS下
  5. ;;;mode=0(屏幕中心DCS 每像素图形高(UCS左下 UCS右上))
  6. ;;;mode=1(屏幕中心DCS 每像素图形高 UCS左下开始逆时针点表)
  7. (defun xty-get-vbox (mode / cen h screen b lst)
  8.   (setq        cen     (getvar "VIEWCTR");_当前视口中视图的中心(UCS)
  9.         h      (getvar "VIEWSIZE") ;_当前视口中显示的视图的高度
  10.         screen (getvar "SCREENSIZE") ;_当前视口大小(以像素为单位)
  11.         b      (/ (* h (car screen)) (cadr screen));_当前视口中显示的视图的宽度
  12.         lst    (xty-G-pt->4pt (trans cen 1 2) b h 0);_当前视口中显示的视图的dcs坐标
  13.   )
  14.   (if (= 0 mode)
  15.     (setq lst (list (car lst) (caddr lst)))
  16.     lst
  17.   )
  18.   (list        cen
  19.         (/ h (cadr screen))
  20.         (mapcar (function (lambda (x) (trans x 2 1))) lst)
  21.   )
  22. )
回复

使用道具 举报

发表于 2021-12-13 11:40 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTE3MTcyfGVkOGJiYTQzMjE0MDYxMzdlMThjMDA2N2ZiNTdiMmExfDE3MTUxMDU5MDU%3D&request=yes&_f=.gif    可以实现这样的效果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2021-12-13 11:45 | 显示全部楼层
guosheyang 发表于 2021-12-13 11:40
http://bbs.mjtd.com/forum.php?mod=attachment&aid=MTE3MTcyfGVkOGJiYTQzMjE0MDYxMzdlMThjMDA2N2ZiNTdiMmExfDE3MTUxMDU5MDU%3D&request=yes&_f=.gif    可以实现这样的效果

难点在旋转视图的时候,字符不动,而且您建立一个xy顺时针的ucs试试
回复

使用道具 举报

发表于 2021-12-13 11:51 | 显示全部楼层
哦 是指的文字一直显示在四角哈   那种效果不清楚
回复

使用道具 举报

发表于 2021-12-13 12:19 | 显示全部楼层
本帖最后由 guosheyang 于 2021-12-13 12:20 编辑

   你是想要 这个控件标题文字 这种   一直显示在那儿哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2021-12-13 16:30 来自手机 | 显示全部楼层
guosheyang 发表于 2021-12-13 12:19
你是想要 这个控件标题文字 这种   一直显示在那儿哈

差不多是这个意思
回复

使用道具 举报

发表于 2021-12-14 18:50 | 显示全部楼层
夏生生 发表于 2021-12-13 16:30
差不多是这个意思

是這種效果嗎?

滑鼠拖曳 文字都在 視口中心和四個角
滑鼠滾輪 可放大縮小字 同時 文字都在 視口中心和四個角

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

您缩放的时候,好像文字显示大小变了  发表于 2021-12-14 20:37

评分

参与人数 1明经币 +1 收起 理由
夏生生 + 1 赞一个!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 02:18 , Processed in 0.186343 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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