如何将图纸空间的物体转换到模型空间
在CAD中有个命令,CHSPACE,这个命令能将图纸空间中的物体转换到模型空间中,且保持正确的变换。那么如何不用命令来完成呢?
这里我提供了一个lisp程序,可以实现将图纸空间中的全部物体转换到模型空间中。
用户可以根据这个程序修改,把所需转换的物体过滤,转换到模型空间中。或者将模型空间的物体转换到图纸空间中。
要注意,图纸空间可能存在多个布局。
下面是核心代码:
;;;-------------------------------------------------------------
;;; 参数:layout --布局对象, toErase 是否删除原对象
;;; 功能:将布局空间中的物体转换到模型空间中
;;; 返回:已经被转换的对象列表
;;;-------------------------------------------------------------
(defun HFB:PS2MS (layout toErase / mat COPIES OBJS ORG SPACE)
(vla-put-activelayout (LM:acdoc) layout)
(vla-zoomall (LM:acad))
(if (setq org (trans '(0 0 0) 3 2)) ;如果布局中没有活动视窗,则返回为nil
(setq mat (list (trans '(1 0 0) 3 2 T)
(trans '(0 1 0) 3 2 T)
(trans '(0 0 1) 3 2 T)
)
mat (mapcar (function (lambda (x y) (append x (list y)))) mat org)
mat (append mat '((0. 0. 0. 1.)))
mat (vlax-tmatrix mat)
)
)
(setq space (vla-get-block layout)) ;通过布局获得空间名称
(setq objs nil)
(vlax-for n space
(if(/= (vla-get-objectname n) "AcDbViewport") ;排除视口对象
(setq objs (cons n objs))
)
)
;;通过copyobjects方式把物体拷贝到模型空间中
(setq copies (vlax-invoke (LM:acdoc) 'copyobjects objs (LM:mspace)))
(if mat
(foreach obj copies
(vla-transformby obj mat)
)
)
(if toErase
(mapcar 'vla-erase objs)
)
copies
)
源程序在此。
下面为效果演示:
你有种再说一遍 发表于 2025-4-13 20:51
进入视口内用la,你就可以看见"视口冻结",
你如果不在视口内进行冻结,那么就是全局冻结.
模型里面冻结我知道,现在是要布局里面的,比如模型里面有1和2两个图层,我要在一个布局1里面看到1图层,另外一个布局2里面看到2图层,这样可以实现吗 跑了一下午 发表于 2025-4-14 09:43
模型里面冻结我知道,现在是要布局里面的,比如模型里面有1和2两个图层,我要在一个布局1里面看到1图层, ...
你要在布局里面进入视口1,再对图层进行当前视口冻结,这个时候,视口2还是能看见这个图层的。
布局转模型,最大的挑战是图块,块中块,填充。布局某个视口只显示图块或填充的一部分(有部分是不在视口范围,比如巨大的地下室,每个塔楼是个块,室外填充是一个巨大填充区域),acad2008~cad2026都没有成功过,我一直在测试,都很失望,高飞鸟的没有测试过,估计都很失望。 谢谢高飞老师的分享。 感谢高大师分享代码! 感谢高飞鸟大师分享优秀代码。 谢谢高飞鸟老师的分享 其实我就是很好奇,为什么有时候模型里面有很多东西,布局里面只有单一的一样,然后一个布局显示一个,这个是怎么做到的 谢谢高大师分享 跑了一下午 发表于 2025-4-12 21:09
其实我就是很好奇,为什么有时候模型里面有很多东西,布局里面只有单一的一样,然后一个布局显示一个,这个 ...
视口图层冻结 谢谢分享:handshake 谢谢分享