在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
- )
源程序在此。
下面为效果演示:
|