图纸空间直接选择视口内位于模型空间的图元,视口外的不会选择.
主要应用:结合CHSPACE 可以将模型空间图元移动到图纸空间,
实现图框内容的空间统一便于迁移或者其他需求









网友答: 虽然但是 用不上

网友答: 有用的
比如在布局中
entsel点击一个文字搜寻相同文字
如果目标文字处于模型
那么点击这个动作就得不到想要的目标

所以我的程序中
如果点击为空
会再判断鼠标坐标是否位于某个视口范围内
若是则转换坐标到模型
在模型中再执行一次nentselp



网友答: 谢谢分享!

网友答: 本帖最后由 caoyin 于 2025-9-1 10:12 编辑

  1. ;;; 我用更简单的代码实现你的前期功能,既然选择集已经选中,后期功能完全可以随机调用诸如移动、删除等命令
  2. (defun C:TT (/ X C D P1 P2 SS)
  3.   (cond ((= (getvar 'TILEMODE) 1)
  4.          (princ "\n先切换到布局。")
  5.         )
  6.         ((/= (getvar 'CVPORT) 1)
  7.          (princ "\n先切换到图纸空间。")
  8.         )
  9.         ((not (setq X (entsel "\n选择视口: ")))
  10.          (princ "\n没选择任何对象。")
  11.         )
  12.         ((/= (cdr (assoc 0 (setq X  (entget (car X))))) "VIEWPORT")
  13.          (princ "\n所选对象不是视口。")
  14.         )
  15.         (T
  16.          (setq C  (cdr (assoc 10 X))
  17.                D  (list (/ (cdr (assoc 40 X)) 2.0) (/ (cdr (assoc 41 X)) 2.0))
  18.                P1 (mapcar '- C D)
  19.                P2 (mapcar '+ C D)
  20.          )
  21.          (command "_.MSPACE")
  22.          (setvar 'CVPORT (cdr (assoc 69 X)))
  23.          (if (setq SS (ssget "_C" (trans (trans P1 3 2) 2 1) (trans (trans P2 3 2) 2 1)))
  24.            (sssetfirst nil SS)
  25.          )
  26.         )
  27.   )
  28.   (princ)
  29. )




网友答:
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就解决问题了,以下是修改后的代码:

  1. (defun C:TT (/ X C D P1 P2 SS)
  2.   (cond ((= (getvar 'TILEMODE) 1)
  3.          (princ "\n先切换到布局。")
  4.         )
  5.         ((/= (getvar 'CVPORT) 1)
  6.          (princ "\n先切换到图纸空间。")
  7.         )
  8.         ((not (setq X (ssget ":S" '((0 . "VIEWPORT")))))
  9.          (princ "\n没选择任何有效对象。")
  10.         )
  11.         ((= (cdr (assoc 0 (setq X (entget (ssname X 0))))) "VIEWPORT")
  12.          (setq C  (cdr (assoc 10 X))
  13.                D  (list (/ (cdr (assoc 40 X)) 2.0) (/ (cdr (assoc 41 X)) 2.0))
  14.                P1 (mapcar '- C D)
  15.                P2 (mapcar '+ C D)
  16.          )
  17.          (command "_.MSPACE")
  18.          (setvar 'CVPORT (cdr (assoc 69 X)))
  19.          (if (setq SS (ssget "_C" (trans (trans P1 3 2) 2 1) (trans (trans P2 3 2) 2 1)))
  20.            (sssetfirst nil SS)
  21.          )
  22.         )
  23.   )
  24.   (princ)
  25. )


网友答: 用不上但是,知道写的很好。。。

网友答: 本帖最后由 alexmai 于 2025-10-17 21:46 编辑

视口内容迁移我是反过来,把图纸空间元素组成临时“块”,
结合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" "")
)
  • 上一篇:用视口去刷指北针可能吗
  • 下一篇:没有了