- UID
- 118401
- 积分
- 2156
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-3-28
- 最后登录
- 1970-1-1
|
发表于 2013-4-27 22:44:57
|
显示全部楼层
本帖最后由 Highflybird 于 2013-4-27 22:50 编辑
下面为我的函数。部分用到的函数请参见:用LISP论矩阵
[pcode=lisp,true];;;-----------------------------------------------------------;;
;;; To simulate the command: "align" ;;
;;; Command:Align3d ;;
;;; Use in some cases: command can't be applied or you don't ;;
;;; want to use them; or improve the efficiency,etc.and here ;;
;;; are some useful functions,e.g. "Mat:Get3PMatrix";Or even ;;
;;; you can customize "align" command. ;;
;;; Author: Highflybird, Date:2012-8-6. ;;
;;; All copyrights reserved. ;;
;;;-----------------------------------------------------------;;
(defun C:Align3d (/ sel sP1 sP2 sP3 dP1 dP2 dP3 sclp scl
mat0 mat1 mat2 mat i ent obj app doc)
;;input
(setq sel (ssget))
(initget 9)
(setq sP1 (getpoint "\nSpecify first source point:"))
(initget 9)
(setq dP1 (getpoint "\nSpecify first destination point:"))
(initget 9)
(setq sP2 (getpoint "\nSpecify second source point:"))
(initget 9)
(setq dP2 (getpoint "\nSpecify second destination point:"))
(initget 8)
(setq sP3 (getpoint "\nSpecify third source point or <continue>:"))
(initget 9)
(if (null sP3)
(setq sP3 (Mat:Rotate90 sP2 sP1)
dP3 (Mat:Rotate90 dP2 dP1)
)
(setq dP3 (getpoint "\nSpecify third destination point:"))
)
(foreach x '(sP1 sP2 sP3 dP1 dP2 dP3)
(set x (trans (eval x) 1 0))
)
(initget "Yes No")
(setq sclp (getkword "\nScale objects based on alignment points? [Yes/No] <N>:"))
;;Get the transformation matrix
(setq mat1 (Mat:3PMatrix sP1 sP2 sP3 nil))
(setq mat2 (Mat:3PMatrix dP1 dP2 dP3 T))
(if (= "Yes" sclp)
(setq scl (/ (distance dP1 dP2) (distance sP2 sP1))
mat0 (list (list scl 0 0 0)(list 0 scl 0 0) (list 0 0 scl 0) '(0 0 0 1))
mat (Mat:mxm mat2 (Mat:mxm mat0 mat1))
)
(setq mat (Mat:mxm mat2 mat1))
)
;;Apply the transformation.
(setq app (vlax-get-acad-object))
(setq doc (vla-get-ActiveDocument app))
(vla-StartUndoMark doc)
(setq i 0)
(if sel
(repeat (sslength sel)
(setq ent (ssname sel i))
(setq obj (vlax-ename->vla-object ent))
(vla-transformby obj (vlax-tmatrix mat))
(setq i (1+ i))
)
)
(vla-EndUndoMark doc)
(vlax-release-object doc)
(vlax-release-object app)
(princ)
)
;;;-----------------------------------------------------------;;
;;; Mat:Rotate90 Rotate a point 90 degree by a basepoint ;;
;;;-----------------------------------------------------------;;
(defun Mat:Rotate90 (Pt BasePt / a)
(setq a (+ (/ pi 2) (angle BasePt Pt)))
(polar BasePt a (distance pt basePt))
)
(prompt "Command is: Align3d")
(princ)
[/pcode]
其中最主要的代码如下:
此处变换是3d的,意味着能适用UCS,只需要把前面输入的点换到WCS即可。
[pcode=lisp,true] (setq mat1 (Mat:3PMatrix sP1 sP2 sP3 nil))
(setq mat2 (Mat:3PMatrix dP1 dP2 dP3 T))
(if (= "Yes" sclp)
(setq scl (/ (distance dP1 dP2) (distance sP2 sP1))
mat0 (list (list scl 0 0 0)(list 0 scl 0 0) (list 0 0 scl 0) '(0 0 0 1))
mat (Mat:mxm mat2 (Mat:mxm mat0 mat1))
)
(setq mat (Mat:mxm mat2 mat1))
)[/pcode]
|
|