图纸空间直接选择视口内位于模型空间的图元,视口外的不会选择.
主要应用:结合CHSPACE 可以将模型空间图元移动到图纸空间,
实现图框内容的空间统一便于迁移或者其他需求
网友答: 虽然但是 用不上网友答: 有用的
比如在布局中
entsel点击一个文字搜寻相同文字
如果目标文字处于模型
那么点击这个动作就得不到想要的目标
所以我的程序中
如果点击为空
会再判断鼠标坐标是否位于某个视口范围内
若是则转换坐标到模型
在模型中再执行一次nentselp
网友答: 谢谢分享!网友答: 本帖最后由 caoyin 于 2025-9-1 10:12 编辑

- ;;; 我用更简单的代码实现你的前期功能,既然选择集已经选中,后期功能完全可以随机调用诸如移动、删除等命令
- (defun C:TT (/ X C D P1 P2 SS)
- (cond ((= (getvar 'TILEMODE) 1)
- (princ "\n先切换到布局。")
- )
- ((/= (getvar 'CVPORT) 1)
- (princ "\n先切换到图纸空间。")
- )
- ((not (setq X (entsel "\n选择视口: ")))
- (princ "\n没选择任何对象。")
- )
- ((/= (cdr (assoc 0 (setq X (entget (car X))))) "VIEWPORT")
- (princ "\n所选对象不是视口。")
- )
- (T
- (setq C (cdr (assoc 10 X))
- D (list (/ (cdr (assoc 40 X)) 2.0) (/ (cdr (assoc 41 X)) 2.0))
- P1 (mapcar '- C D)
- P2 (mapcar '+ C D)
- )
- (command "_.MSPACE")
- (setvar 'CVPORT (cdr (assoc 69 X)))
- (if (setq SS (ssget "_C" (trans (trans P1 3 2) 2 1) (trans (trans P2 3 2) 2 1)))
- (sssetfirst nil SS)
- )
- )
- )
- (princ)
- )
网友答:
caoyin 发表于 2025-9-1 09:55
感谢大佬分享网友答:
caoyin 发表于 2025-9-1 09:55
有一个问题,那就是如果是被用多段线等图形裁剪过的视口会被提示不是视口。网友答: 本帖最后由 caoyin 于 2025-9-3 00:35 编辑
lxl304712346 发表于 2025-9-2 17:25
有一个问题,那就是如果是被用多段线等图形裁剪过的视口会被提示不是视口。
裁切过的视口,视口是附着在裁切边界上的,也就是说两个对象重合在一起了,用ssget替换entsel就解决问题了,以下是修改后的代码:

- (defun C:TT (/ X C D P1 P2 SS)
- (cond ((= (getvar 'TILEMODE) 1)
- (princ "\n先切换到布局。")
- )
- ((/= (getvar 'CVPORT) 1)
- (princ "\n先切换到图纸空间。")
- )
- ((not (setq X (ssget ":S" '((0 . "VIEWPORT")))))
- (princ "\n没选择任何有效对象。")
- )
- ((= (cdr (assoc 0 (setq X (entget (ssname X 0))))) "VIEWPORT")
- (setq C (cdr (assoc 10 X))
- D (list (/ (cdr (assoc 40 X)) 2.0) (/ (cdr (assoc 41 X)) 2.0))
- P1 (mapcar '- C D)
- P2 (mapcar '+ C D)
- )
- (command "_.MSPACE")
- (setvar 'CVPORT (cdr (assoc 69 X)))
- (if (setq SS (ssget "_C" (trans (trans P1 3 2) 2 1) (trans (trans P2 3 2) 2 1)))
- (sssetfirst nil SS)
- )
- )
- )
- (princ)
- )
视口内容迁移我是反过来,把图纸空间元素组成临时“块”,
结合CHSPACE放到模型内,模型空间随便移动或copy,最后把“块”CHSPACE回到图纸空间,
尤其对不同文件复制超级省时方便。
分享一个自用的lsp
;;视口平移(模型空间用)
(defun c:mv2p(/ ) ;先计存储两点坐标
(setq pt1 (getpoint"选第一个点"))
(initget (+ 32 128))
(setq Pt2 (getpoint Pt1 "\n指定下一点:"))
(vlax-ldata-put "gg_data1" "pt11" pt1) ;储存两点坐标
(vlax-ldata-put "gg_data2" "pt22" pt2)
(princ)
)
;;图纸空间视口内用
(defun c:mvra(/ )
(command "mview" "l" "off" "all" "")
(setq pt1 (vlax-ldata-get "gg_data1" "pt11")) ;提取两点坐标
(setq pt2 (vlax-ldata-get "gg_data2" "pt22"))
(setq gg_angle (angle pt1 pt2)) ;计算两点与x轴夹角
(setq gg_lenght (distance pt1 pt2)) ;计算两点距离
(setq pt (list 0 0))
(setq pta (polar pt (+ gg_angle pi) gg_lenght))
(command "pan" pt pta)
(command "mview" "l" "on" "all" "")
)
;;图纸空间视口内用
(defun c:mvrb(/ )
(command "mview" "l" "off" "all" "")
(setq pt1 (vlax-ldata-get "gg_data1" "pt11")) ;提取两点坐标
(setq pt2 (vlax-ldata-get "gg_data2" "pt22"))
(setq gg_angle (angle pt1 pt2)) ;计算两点与x轴夹角
(setq gg_lenght (distance pt1 pt2)) ;计算两点距离
(setq pt (list 0 0))
(setq pta (polar pt gg_angle gg_lenght))
(command "pan" pt pta)
(command "mview" "l" "on" "all" "")
)