最近在网上,看到一个获取WCS下最小包容框的函数,甚是高兴。因为给我一点希望。。
我最近遇到一个瓶颈,采用insert语句,插入其他dwg文件(如附图1.dwg)时,想让附图1.dwg内所有对象最小包容框左下角作为insert插入点。
试了很多方法,最后打算采用如下思路,
1.insert 附图1.dwg ,不采用分解,直接用块;
2.炸开块,然后选取所有 块内对象
3.采用ucsbox获取,上述对象的最小包容框的四个点坐标。
....
可每次运行到下面时候就出现错误。“错误: Automation 错误。 空范围”,实在不懂为啥。。求指教。 - (DEFUN C:xxx ()
- (setq pt1 (getpoint "请选择基点:\n"))
- (command "-insert" "附图1.dwg" pt1 1 1 0 ^C )
- (setq sek (entlast)) ;;;获得图形中最后那个主图元名﹐并存入sel。
- (command ".explode" sek ) ; 打散图块
- (setq sel (ssget "p")) ; 获取打散图块图元选择集
- (setq num (sslength sel))
- (princ num) ;到这也能执行
- (setq see (ucsbox sel))
- )
ucsbox是网友的。我单独测试过。可用。 - (defun ucsbox (SS / XDIR ORG CP ANG N OBJ LL UR pl UL LR)
- (setq xdir (getvar 'ucsxdir)
- org (getvar 'ucsorg)
- cp (vlax-3d-point '(0.0 0.0 0.0))
- ang (atan (cadr xdir) (car xdir))
- )
- (repeat (setq n (sslength ss))
- (setq
- obj (vlax-ename->vla-object (ssname ss (setq n (1- n))))
- )
- (vla-rotate obj cp (- ang))
- (vla-update obj)
- (vla-GetBoundingBox obj 'll 'ur) ;_ 计算包围盒
- (setq ll (vlax-safearray->list ll) ;_ 坐下角点
- ur (vlax-safearray->list ur) ;_ 右上角点
- )
- ;;_ 还原对象位置
- (vla-rotate obj cp ang)
- (setq pl (cons ll pl)
- pl (cons ur pl)
- )
- )
- (setq ll (apply 'mapcar (cons 'min pl)) ;_ 左下角点
- ur (apply 'mapcar (cons 'max pl)) ;_ 右上角点
- ul (list (car ll) (cadr ur) (caddr ll)) ;_ 左上角点
- lr (list (car ur) (cadr ll) (caddr ll)) ;_ 右下角点
- )
- ;;返回UCS方向的WCS坐标
- (mapcar '(lambda (x) (mapcar '- (trans x 1 0) org))
- (list ll ul ur lr)
- )
- )
|