本帖最后由 wungqiao3 于 2025-10-30 16:48 编辑
【应用场景】
在布局里有很多视口,找到这个视口在模型里的位置
这段码说明了在布局里的坐标转换到模型里
以前不明白怎么用,其实就是要激活当前视口,通过trans把布局里的坐标转换到视口坐标,再转换到世界坐标系
直接上码吧,如果对你有用可以赏个明经币

【附件】
网友答:
修正了视口内目标点位移的问题,你可以再试下
当然,你可以修正视口内的目标点为0,也可以忽略它保持位移

网友答:
不太清楚,我对比了obj的属性,发现Target个值跟正常的视口值不一样,正常的是'(0 0 0),而你的是Target = (135108.0 34511.5 -6.89434),所以我试着把这个视口的值改回'(0 0 0)时,它就正常了
Target=视口的目标点,不太懂什么意思
你也可以试下用下面这段代码修改Target的值

网友答: 本帖最后由 wungqiao3 于 2025-10-31 17:49 编辑
想了下,如果非要实现的话,还是有机会的
1. 在模型里找到这堆图元的外框范围
2. 获取布局所有视口在模型的范围
3. 判断,如果范围有重叠,就跳转到布局的视口
楼下的哥们说的一样,可能存在多视口看1个对象的问题,需要再加判断跳转
网友答: 有的视口行,有的不行,我没看出来哪里的问题,这个就不行
网友答: 我以前是双击进视口画个大圆,再进MODEL里看位置。。代码也是一种思路,感谢分享!网友答:
嗯。一个意思,我之前是进视口画个构造线,再进模型里,选中线,看中点在哪,
网友答:
视口支持相对坐标系,也就是视口坐标系.网友答:
感谢指点,就是搞不懂这些相对坐标跟坐标系转,不过按你的意思,我加了段视口目标点的坐标位移,就正常了

网友答: 感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。网友答:
这个应该不行,模型里一个对象可能在多个视口里。
建议选择之前先判断是否在布局空间,如果不是自动切换到布局。
【应用场景】
在布局里有很多视口,找到这个视口在模型里的位置
这段码说明了在布局里的坐标转换到模型里
以前不明白怎么用,其实就是要激活当前视口,通过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里看位置。。代码也是一种思路,感谢分享!
嗯。一个意思,我之前是进视口画个构造线,再进模型里,选中线,看中点在哪,
网友答:
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
感谢分享,能否加个在模型里选择图元自动跳至视口呢!感觉原理一样的,我不懂啊,说的不对不要上火。
这个应该不行,模型里一个对象可能在多个视口里。
建议选择之前先判断是否在布局空间,如果不是自动切换到布局。