本帖最后由 自贡黄明儒 于 2013-10-8 14:55 编辑
第三版===================================================================
- ;;[功能] 图元当前坐标系下包围盒,4角点坐标
- ;|
- 4 = 左上;3 = 右上
- 1 = 左下;2 = 右下
- |;
- ;;Flag : T时,返回最小包围盒角点;nil时,返回包围盒角点
- ;;说明 1 使用前加载须加载highflybird的程序Matrix-Lib.LSP
- ;; 2 作者保留本程序的一切权利,但你可以自由拷贝与复制、修改本程序用于非商业目的
- ;; 3 自贡黄明儒 2013年10月8日
- ;;示例(HH:Ent4pt (car (entsel)) T),返回UCS坐标系下坐标
- (defun HH:Ent4pt (ent Flag / ENT LST MAT MAT1 MAXPT MINPT OBJ UCSFLAG X)
- (cond ((= (type ent) 'ENAME)
- (setq obj (vlax-ename->vla-object ent))
- )
- ((= (type ent) 'VLA-OBJECT) (setq obj ent))
- (T (exit))
- )
- (and Flag
- (setq Mat (Mat:EntityMatrix ent))
- (setq Mat1 (cadr Mat));Mat1 4x4
- (setq Mat (car Mat));Mat 4x4
- )
- (if (= (getvar "WORLDUCS") 0)
- (setq UcsFlag T)
- )
- (cond ((and Flag UcsFlag)
- (vla-TransformBy obj (vlax-tmatrix Mat))
- )
- (UcsFlag (vla-TransformBy obj (vlax-tmatrix (MAT:u2w))))
- (Flag (vla-TransformBy obj (vlax-tmatrix Mat)))
- )
- (vla-GetBoundingBox obj 'minPt 'maxPt) ;得到包围框
- (setq minPt (vlax-safearray->list minPt))
- (setq maxPt (vlax-safearray->list maxPt))
- (cond ((and Flag UcsFlag)
- (vla-TransformBy obj (vlax-tmatrix Mat1))
- )
- (UcsFlag (vla-TransformBy obj (vlax-tmatrix (MAT:w2u))))
- (Flag (vla-TransformBy obj (vlax-tmatrix Mat1)))
- )
- (setq lst (list minPt
- (list (car maxPt) (cadr minpt) (caddr minPt))
- maxPt
- (list (car minpt) (cadr maxPt) (caddr minPt))
- )
- )
- (COND (Flag nil)
- (UcsFlag (setq mat1 (MAT:w2u)))
- )
- (cond ((or Flag UcsFlag)
- (setq lst (mapcar '(lambda (x) (mat:mxp mat1 x)) lst)) ;wcs坐标
- (setq lst (mapcar '(lambda (x) (trans x ent 1)) lst))
- )
- )
- lst
- )
第二版===================================================================
;;[功能] 图元当前坐标系下包围盒,4角点坐标
;|
4 = 左上;3 = 右上
1 = 左下;2 = 右下
|;
;;Flag : T时,返回最小包围盒角点;nil时,返回包围盒角点
;;说明 1 使用前加载须加载highflybird的程序Matrix-Lib.LSP
;; 2 作者保留本程序的一切权利,但你可以自由拷贝与复制、修改本程序用于非商业目的。
;; 3 自贡黄明儒 2013年9月27日
- ;;[功能] 图元当前坐标系下包围盒,4角点坐标
- ;|
- 4 = 左上;3 = 右上
- 1 = 左下;2 = 右下
- |;
- ;;Flag : T时,返回最小包围盒角点;nil时,返回包围盒角点
- ;;说明 1 使用前加载须加载highflybird的程序Matrix-Lib.LSP
- ;; 2 作者保留本程序的一切权利,但你可以自由拷贝与复制、修改本程序用于非商业目的。
- ;; 3 自贡黄明儒 2013年9月27日
- (defun HH:Ent4pt (ent Flag / ENT LST MAT MAT1 MATLST MATRIX
- MAXPT MINPT OBJ ORIGIN REVMAT UCSFLAG WCSORG X XDIR
- YDIR ZDIR
- )
- ;;1 矩阵的变换与逆变换
- (defun GetMatrix (lst org Revflag / I J MAT)
- (setq mat (vlax-make-safearray vlax-vbDouble '(0 . 3) '(0 . 3)))
- (setq i 0)
- (repeat 3
- (vlax-safearray-put-element mat i 3 (nth i org)) ;平移变换
- (setq j 0)
- (repeat 3
- (if RevFlag
- (vlax-safearray-put-element mat i j (nth j (nth i lst))) ;角度逆变换
- (vlax-safearray-put-element mat i j (nth i (nth j lst))) ;角度的变换
- )
- (setq j (1+ j))
- )
- (setq i (1+ i))
- )
- (vlax-safearray-put-element mat 3 3 1)
- mat ;返回矩阵
- )
- ;;2 本程序主程序
- (cond ((= (type ent) 'ENAME)
- (setq obj (vlax-ename->vla-object ent))
- )
- ((= (type ent) 'VLA-OBJECT) (setq obj ent))
- (T (exit))
- )
- (and Flag
- (setq Mat (Mat:EntityMatrix ent))
- (setq Mat1 (cadr Mat))
- (setq Mat (car Mat))
- )
- (setq UcsFlag (getvar "WORLDUCS"))
- (if (= UcsFlag 0) ;UCS与WCS不同
- (setq UcsFlag T ;设置标志位为true
- xdir (getvar "UCSXDIR") ;X方向矢量
- ydir (getvar "UCSYDIR") ;Y方向矢量
- zdir (MAT:vxv xdir ydir) ;X和Y的方向矢量的叉积
- origin (getvar "UCSORG") ;原点
- WcsOrg (trans '(0 0 0) 0 1) ;WCS的原点相对UCS的坐标
- matLst (list xdir ydir zdir) ;旋转的变换矩阵表
- matrix (GetMatrix matLst origin nil) ;从WCS到UCS(ocs)的变换矩阵
- revMat (GetMatrix matLst WcsOrg T) ;从UCS(ocs)到WCS的变换矩阵
- )
- (setq UcsFlag nil) ;否则不予变换
- )
- ;;在UCS下先变换物体到WCS下,取得物体的包围框,然后把物体变换回到UCS
- (cond ((and Flag UcsFlag) (vla-TransformBy obj (vlax-tmatrix Mat)))
- (UcsFlag (vla-TransformBy obj revMat))
- (Flag (vla-TransformBy obj (vlax-tmatrix Mat)))
- )
- (vla-GetBoundingBox obj 'minPt 'maxPt) ;得到包围框
- (setq minPt (vlax-safearray->list minPt))
- (setq maxPt (vlax-safearray->list maxPt))
- (cond ((and Flag UcsFlag) (vla-TransformBy obj (vlax-tmatrix Mat1)))
- (UcsFlag (vla-TransformBy obj matrix))
- (Flag (vla-TransformBy obj (vlax-tmatrix Mat1)))
- )
- (setq lst (list minPt
- (list (car maxPt) (cadr minpt) (caddr minPt))
- maxPt
- (list (car minpt) (cadr maxPt) (caddr minPt))
- )
- )
- (COND (Flag nil)
- (UcsFlag (setq mat1 (vlax-safearray->list matrix)))
- )
- (cond ((or Flag UcsFlag)
- (setq lst (mapcar '(lambda (x) (mat:mxp mat1 x)) lst)) ;wcs坐标
- (setq lst (mapcar '(lambda (x) (trans x ent 1)) lst))
- )
- )
- lst
- )
第一版===================================================================
;;看了highflybird的矩阵和trans,实在没有悟透,请高手们出手,如何获取UCS下旋转过的对象的四个角点,在此首先表示感谢!!
;;主要是想用于求最小包围盒,以便对任何对象画中心线
;;[功能] 图元当前坐标系下包围盒,4角点坐标
;|
4 = 左上;3 = 右上
1 = 左下;2 = 右下
|;
;;Flag : T时,返回最小包围盒角点;nil时,返回包围盒角点
;;说明 1 使用前加载须加载highflybird的程序Matrix-Lib.LSP
;; 2 本程序是在G版的帮助和烧糊了一锅稀饭的代价下,试验出来的
;; 3 本程序是在highflybird选择集最小包围盒基础上发展而来
;; 4 不足之处是用了command,有待改善
;; 5 自贡黄明儒 2013年9月19日 中秋节
;; 6 使用者须保留以上信息
;;示例(HH:Ent4pt (car (entsel)) T),返回UCS坐标系下坐标
(defun HH:Ent4pt (ent Flag / ENT LST MATLST MATRIX MAXPT MINPT
OBJ ORIGIN REVMAT UCSFLAG WCSORG X XDIR YDIR ZDIR
)
;;1 矩阵的变换与逆变换
(defun GetMatrix (lst org Revflag / I J MAT)
(setq mat (vlax-make-safearray vlax-vbDouble '(0 . 3) '(0 . 3)))
(setq i 0)
(repeat 3
(vlax-safearray-put-element mat i 3 (nth i org)) ;平移变换
(setq j 0)
(repeat 3
(if RevFlag
(vlax-safearray-put-element mat i j (nth j (nth i lst))) ;角度逆变换
(vlax-safearray-put-element mat i j (nth i (nth j lst))) ;角度的变换
)
(setq j (1+ j))
)
(setq i (1+ i))
)
(vlax-safearray-put-element mat 3 3 1)
mat ;返回矩阵
)
;;2 本程序主程序
(cond ((= (type ent) 'ENAME)
(setq obj (vlax-ename->vla-object ent))
)
((= (type ent) 'VLA-OBJECT) (setq obj ent))
(T (exit))
)
(and Flag (command "_.UCS" "NEW" "Object" ent))
;;先判断UCS是否与WCS相同。如是则取得UCS的X方向,
;;Y方向,Z方向,UCS原点及WCS的原点相对UCS的坐标点
;;然后得到UCS变换矩阵和到WCS的逆变换矩阵
(setq UcsFlag (getvar "WORLDUCS"))
(if (= UcsFlag 0) ;UCS与WCS不同
(setq UcsFlag T ;设置标志位为true
xdir (getvar "UCSXDIR") ;X方向矢量
ydir (getvar "UCSYDIR") ;Y方向矢量
zdir (MAT:vxv xdir ydir) ;X和Y的方向矢量的叉积
origin (getvar "UCSORG") ;原点
WcsOrg (trans '(0 0 0) 0 1) ;WCS的原点相对UCS的坐标
matLst (list xdir ydir zdir) ;旋转的变换矩阵表
matrix (GetMatrix matLst origin nil) ;从WCS到UCS(ocs)的变换矩阵
revMat (GetMatrix matLst WcsOrg T) ;从UCS(ocs)到WCS的变换矩阵
)
(setq UcsFlag nil) ;否则不予变换
)
;;在UCS下先变换物体到WCS下,取得物体的包围框,然后把物体变换回到UCS,并把矩形也变换回去
(and UcsFlag (vla-TransformBy obj revMat)) ;反变换到WCS
(vla-GetBoundingBox obj 'minPt 'maxPt) ;得到包围框
(setq minPt (vlax-safearray->list minPt))
;;(setq minPt (trans minPt ent 1))
(setq maxPt (vlax-safearray->list maxPt))
(and UcsFlag (vla-TransformBy obj matrix)) ;变换回到UCS
(and Flag (command "_.UCS" "p"))
(and UcsFlag (setq matrix (vlax-safearray->list matrix)))
(setq lst (list minPt
(list (car maxPt) (cadr minpt) (caddr minPt))
maxPt
(list (car minpt) (cadr maxPt) (caddr minPt))
)
) ;ocs坐标?
(and UcsFlag
(setq lst (mapcar '(lambda (x) (mat:mxp matrix x)) lst)) ;wcs坐标
(setq lst (mapcar '(lambda (x) (trans x ent 1)) lst)) ;ucs坐标
)
lst
)
;;下面的代码可以验证
;;148.1 [功能] 根据点表画多段线
(defun draw-pline1 (pts)
(command "_PLINE")
(mapcar 'command pts)
(command "c")
)
;;(draw-pline(HH:Ent4pt (car (entsel)) T))
;;(draw-pline(HH:Ent4pt (car (entsel)) nil))
|