本帖最后由 highflybir 于 2013-1-11 00:29 编辑
再来举一个例子:
3D 的环形阵列。
选择物体,然后对物体集进行3d环形阵列。
很类似命令:3darray.
经过测试,比3darray快了很多,而且不出错。
- ;;;3d环形阵列测试
- (defun c:PAT(/ ss N P1 P2 ActDoc ObjLst) ;c:PolarArrayTest
- (setq ss (ssget))
- (initget 7)
- (setq N (getInt "\n数量:"))
- (initget 9)
- (setq P1 (getpoint "\n中心点:"))
- (initget 9)
- (setq p2 (getpoint P1 "\n另一点:"))
- (if ss
- (progn
- (setq ActDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
- (vla-StartUndoMark ActDoc)
- (setq Ojblst (Ent:Ents->Objs ss))
- (Mat:3dPolarArray ojblst N (+ pi pi) T (trans p1 1 0) (trans p2 1 0))
- (vla-EndUndoMark ActDoc)
- (vlax-release-object ActDoc)
- (princ)
- )
- )
- )
- ;;;-----------------------------------------------------------;;
- ;;; 三维环形阵列 ;;
- ;;; 输入:Objlst -- 物体集 ;;
- ;;; Number -- 要阵列的个数(包含自身在内) ;;
- ;;; FillAngle -- 旋转角度 ;;
- ;;; IsCCW -- 是否逆时针 ;;
- ;;; P1 -- 阵列中心点 ;;
- ;;; P2 -- 阵列轴线的另一点 ;;
- ;;; 输出:阵列的物体列表 ;;
- ;;;-----------------------------------------------------------;;
- (defun Mat:3dPolarArray (Objlst Number FillAngle IsCCW P1 P2 / lst1 lst2 ANG MAT NEW)
- (if IsCCW
- (setq FillAngle (float FillAngle))
- (setq FillAngle (- FillAngle (+ pi pi)))
- )
- (setq ang (/ FillAngle (1- Number)))
- (setq mat (MAT:RotateBy2P P1 P2 ang))
- (setq mat (vlax-tmatrix mat))
- (repeat (1- Number)
- (setq lst1 nil)
- (foreach obj ObjLst
- (setq new (vla-copy obj))
- (vla-transformby new mat)
- (setq lst1 (cons new lst1))
- )
- (setq objLst (reverse lst1))
- (setq lst2 (cons objLst lst2))
- )
- (reverse lst2)
- )
- ;;;-----------------------------------------------------------;;
- ;;;获取物体Objects ;;
- ;;;-----------------------------------------------------------;;
- (defun Ent:Ents->Objs (sel / i e o l)
- (setq i (sslength sel))
- (repeat i
- (setq e (ssname sel (setq i (1- i))))
- (setq o (vlax-ename->vla-object e))
- (setq l (cons o l))
- )
- )
|