wungqiao3 发表于 2025-10-30 16:42:25

分享源码 查找布局视口在模型的位置并显示

本帖最后由 wungqiao3 于 2025-10-30 16:48 编辑


【应用场景】
在布局里有很多视口,找到这个视口在模型里的位置
这段码说明了在布局里的坐标转换到模型里
以前不明白怎么用,其实就是要激活当前视口,通过trans把布局里的坐标转换到视口坐标,再转换到世界坐标系

直接上码吧,如果对你有用可以赏个明经币

(defun C:TT (/ doc pts pv s)
(vl-load-com)
(if (and
      (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
      (setq s (ssget ":S" '((0 . "VIEWPORT"))))
      (setq pv (vlax-ename->vla-object (ssname s 0)))
      (not (vla-put-MSpace doc :vlax-true))
      (not (vla-put-ActivePViewport doc pv))
      (not (vla-put-MSpace doc :vlax-false))
      )
    (progn
      (vla-getboundingbox pv 'minp 'maxp)
      (setq pts (mapcar 'vlax-safearray->list (list minp maxp)))
      (setq pts (mapcar '(lambda (x) (trans (trans x 3 2) 2 1)) pts))
      (vla-put-ActiveSpace doc 1)
      (vl-cmdf "ZOOM" "W" (car pts) (cadr pts))
    )
)
(vlax-release-object doc)
(princ)
)

【附件】



wungqiao3 发表于 2025-10-30 18:45:22

yangyangyixia 发表于 2025-10-30 17:00
有的视口行,有的不行,我没看出来哪里的问题,这个就不行
修正了视口内目标点位移的问题,你可以再试下
当然,你可以修正视口内的目标点为0,也可以忽略它保持位移


(defun C:TT (/ doc pts pv s tarp)
(vl-load-com)
(if (and
      (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
      (setq s (ssget ":S" '((0 . "VIEWPORT"))))
      (setq pv (vlax-ename->vla-object (ssname s 0)))
      (not (vla-put-MSpace doc :vlax-true))
      (not (vla-put-ActivePViewport doc pv))
      (not (vla-put-MSpace doc :vlax-false))
      (setq tarp (vlax-safearray->list (vlax-variant-value (vla-get-Target pv))))
      )
    (progn
      (vla-getboundingbox pv 'minp 'maxp)
      (setq pts (mapcar 'vlax-safearray->list (list minp maxp)))
      (setq pts (mapcar '(lambda (x / p)
                           (setq p (trans x 3 2))
                           (setq p (trans p 2 0))
                           (mapcar '(lambda (a b)(+ a b)) p tarp)
                         )
                  pts
                )
      )      
      (vla-put-ActiveSpace doc 1)
      (vl-cmdf "ZOOM" "W" (car pts) (cadr pts))
    )
)
(vlax-release-object doc)
(princ)
)

wungqiao3 发表于 2025-10-30 17:59:55

yangyangyixia 发表于 2025-10-30 17:00
有的视口行,有的不行,我没看出来哪里的问题,这个就不行
不太清楚,我对比了obj的属性,发现Target个值跟正常的视口值不一样,正常的是'(0 0 0),而你的是Target = (135108.0 34511.5 -6.89434),所以我试着把这个视口的值改回'(0 0 0)时,它就正常了
Target=视口的目标点,不太懂什么意思
你也可以试下用下面这段代码修改Target的值
(vla-put-Target (vlax-ename->vla-object (car (entsel ))) (vlax-3D-point '(0 0 0)))


wungqiao3 发表于 2025-10-31 17:42:54

本帖最后由 wungqiao3 于 2025-10-31 17:49 编辑

23410997 发表于 2025-10-30 20:34
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。
想了下,如果非要实现的话,还是有机会的
1. 在模型里找到这堆图元的外框范围

2. 获取布局所有视口在模型的范围
3. 判断,如果范围有重叠,就跳转到布局的视口

楼下的哥们说的一样,可能存在多视口看1个对象的问题,需要再加判断跳转


yangyangyixia 发表于 2025-10-30 17:00:22

有的视口行,有的不行,我没看出来哪里的问题,这个就不行

konoko 发表于 2025-10-30 17:44:20

我以前是双击进视口画个大圆,再进MODEL里看位置。。代码也是一种思路,感谢分享!

wungqiao3 发表于 2025-10-30 18:07:39

konoko 发表于 2025-10-30 17:44
我以前是双击进视口画个大圆,再进MODEL里看位置。。代码也是一种思路,感谢分享!

嗯。一个意思,我之前是进视口画个构造线,再进模型里,选中线,看中点在哪,:lol

你有种再说一遍 发表于 2025-10-30 18:15:51

wungqiao3 发表于 2025-10-30 17:59
不太清楚,我对比了obj的属性,发现Target个值跟正常的视口值不一样,正常的是'(0 0 0),而你的是Target...

视口支持相对坐标系,也就是视口坐标系.

wungqiao3 发表于 2025-10-30 18:42:07

你有种再说一遍 发表于 2025-10-30 18:15
视口支持相对坐标系,也就是视口坐标系.
感谢指点,就是搞不懂这些相对坐标跟坐标系转,不过按你的意思,我加了段视口目标点的坐标位移,就正常了
(mapcar '(lambda (a b)(+ a b)) p tarp)

23410997 发表于 2025-10-30 20:34:56

感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。

yangyangyixia 发表于 2025-10-30 21:27:04

23410997 发表于 2025-10-30 20:34
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。

这个应该不行,模型里一个对象可能在多个视口里。
建议选择之前先判断是否在布局空间,如果不是自动切换到布局。
页: [1] 2
查看完整版本: 分享源码 查找布局视口在模型的位置并显示