分享源码 查找布局视口在模型的位置并显示
本帖最后由 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)
)
【附件】
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)
)
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:49 编辑
23410997 发表于 2025-10-30 20:34
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。
想了下,如果非要实现的话,还是有机会的
1. 在模型里找到这堆图元的外框范围
2. 获取布局所有视口在模型的范围
3. 判断,如果范围有重叠,就跳转到布局的视口
楼下的哥们说的一样,可能存在多视口看1个对象的问题,需要再加判断跳转
有的视口行,有的不行,我没看出来哪里的问题,这个就不行
我以前是双击进视口画个大圆,再进MODEL里看位置。。代码也是一种思路,感谢分享! konoko 发表于 2025-10-30 17:44
我以前是双击进视口画个大圆,再进MODEL里看位置。。代码也是一种思路,感谢分享!
嗯。一个意思,我之前是进视口画个构造线,再进模型里,选中线,看中点在哪,:lol wungqiao3 发表于 2025-10-30 17:59
不太清楚,我对比了obj的属性,发现Target个值跟正常的视口值不一样,正常的是'(0 0 0),而你的是Target...
视口支持相对坐标系,也就是视口坐标系. 你有种再说一遍 发表于 2025-10-30 18:15
视口支持相对坐标系,也就是视口坐标系.
感谢指点,就是搞不懂这些相对坐标跟坐标系转,不过按你的意思,我加了段视口目标点的坐标位移,就正常了
(mapcar '(lambda (a b)(+ a b)) p tarp)
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。 23410997 发表于 2025-10-30 20:34
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。
这个应该不行,模型里一个对象可能在多个视口里。
建议选择之前先判断是否在布局空间,如果不是自动切换到布局。
页:
[1]
2