;;;-----------------------------------------------------------;;
;;; To simulate the command: "align" ;;
;;; Command:Align-3d ;;
;;; 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:Align
-3d
( / sel sP1 sP2 sP3 dP1 dP2 dP3 sclp scl
mat0 mat1 mat2 mat i ent obj app doc
Mat:norm Mat:vxs Mat:unit Mat:v*v Mat:v^v Mat:trp Mat:mxv Mat:mxm Mat:Rotate90 Mat:Get3PMatrix )
;;;-----------------------------------------------------------;;
;;; Vector Norm - Lee Mac ;;
;;; Args: v - vector in R^n ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Vector x Scalar - Lee Mac ;;
;;; Args: v - vector in R^n, s - real scalar ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Unit Vector - Lee Mac ;;
;;; Args: v - vector in R^n ;;
;;;-----------------------------------------------------------;;
nil
(Mat:vxs v (/ 1.0 n))
)
)
(Mat:norm v)
)
)
;;;-----------------------------------------------------------;;
;;; Mat:v*v Returns the dot product of 2 vectors ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Vector Cross Product - Lee Mac ;;
;;; Args: u,v - vectors in R^3 ;;
;;;-----------------------------------------------------------;;
)
)
;;;-----------------------------------------------------------;;
;;; Mat:trp Transpose a matrix -Doug Wilson- ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Matrix x Vector - Vladimir Nesterovsky ;;
;;; Args: m - nxn matrix, v - vector in R^n ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Mat:mxm Multiply two matrices -Vladimir Nesterovsky- ;;
;;;-----------------------------------------------------------;;
)
;;;-----------------------------------------------------------;;
;;; Mat:Rotate90 Rotate a point 90 degree by a basepoint ;;
;;;-----------------------------------------------------------;;
(defun Mat:Rotate90
(Pt BasePt
/ a
) )
;;;-----------------------------------------------------------;;
;;; Mat:Get3PMatrix -Highflybird- ;;
;;;-----------------------------------------------------------;;
(defun Mat:Get3PMatrix
(p1 p2 p3
/ v1 v2 v3 mat org
) (defun AppendMatrix
(mat org
) '((0. 0. 0. 1.))
)
)
(setq v3
(Mat:unit
(Mat:v
^v v1 v2
))) (setq v2
(Mat:unit
(Mat:v
^v v3 v1
))) (AppendMatrix mat org) ;this->wcs transformation matrix
(AppendMatrix (Mat:trp mat) p1) ;wcs->this transformation matrix
)
)
;;input
(setq sP3
(getpoint "\nSpecify third source point or <continue>:")) (setq sP3
(Mat:Rotate90 sP2 sP1
) dP3 (Mat:Rotate90 dP2 dP1)
)
)
(foreach x '
(sP1 sP2 sP3 dP1 dP2 dP3
) )
(setq sclp
(getkword "\nScale objects based on alignment points? [Yes/No] <N>:"))
;;Get the transformation matrix
(setq mat1
(Mat:Get3PMatrix sP1 sP2 sP3
)) (setq mat2
(Mat:Get3PMatrix dP1 dP2 dP3
)) mat
(Mat:mxm
(cadr mat2
) (Mat:mxm mat0
(car mat1
))) )
)
;;Apply the transformation.
)
)
)