Command: MBR
Function rotates selected block the same angle as selecte line or base block. Function works correct only with objects orienatated in 2D.
Code:
;;; =================================================
;;; MATCH_BLOCKS_ROTATION_v2_01.LSP
;;;
;;; Written by Andrzej Kalinowski, www.autolisps.blogspot.com
;;; v2.00 - 16.02.2015
;;; v2.01 - 01.03.2019 - misc updates
;;;
;;; Command: MBR
;;; Function rotates selected block the same angle as selecte line or base block. Function works correct only with objects orienatated in 2D.
;;; =================================================
(vl-load-com)
(defun C:MBR (/ obj1 obj2 pckpt type1 type2 pbazowy rotat_rad pt2)
;-----------------------------------------
;selection of block to rotate
;-----------------------------------------
(setq obj2 nil)
(prompt "select block: ")
(while (= obj2 nil)
(setq obj2 (ssget "_:S+."))
(if (= obj2 nil)
(princ "\nwrong object");then
(if (> (sslength obj2) 1);else
(progn
(princ "\nselect only one object")(princ)
(setq obj2 nil)
);progn
(progn ; else
(setq obj2 (ssname obj2 0));else
(setq type1 (cdr (assoc 0 (entget obj2) ) ) )
(if
(not
(and
(= type1 "INSERT");chekcs if object is block or xref
);and
);not
(setq obj2 nil)
();else
);if
);progn else
); if
); if
); while
;-----------------------------------------
;selection of base block
;-----------------------------------------
(setq obj1 nil)
(while (= obj1 nil)
(setq obj1 (entsel "\nselect reference object: line, block or polyline "))
(if (/= obj1 nil)
(progn
(setq type1 (cdr (assoc 0 (entget (car obj1) ) ) ) ); setq
(if (and (/= type1 "INSERT") (/= type1 "LINE") (/= type1 "LWPOLYLINE"))
(progn
(prompt "\nwrong object")
(setq obj1 nil)
); progn
); if
); progn
); if
); while
(setq
pckpt (cadr obj1)
obj1 (vlax-ename->vla-object (car obj1))
obj2 (vlax-ename->vla-object obj2)
);setq
;-----------------------------------------
;reading of objects rotation
;-----------------------------------------
(cond
( (= (vla-get-objectname obj1) "AcDbBlockReference")
(setq rotat_rad (vlax-get obj1 'Rotation) ) )
( (= (vla-get-objectname obj1) "AcDbLine")
(setq rotat_rad (vlax-get obj1 'Angle) ) )
( (= (vla-get-objectname obj1) "AcDbPolyline")
(setq rotat_rad (AK_LWPLINE_SEGM_COORDS (vlax-vla-object->ename obj1) pckpt) )
(terpri)(princ rotat_rad)(princ "\t")
(setq rotat_rad (angle (car rotat_rad) (cadr rotat_rad) ) )
)
);cond
(vla-put-rotation obj2 rotat_rad)
(princ)
);defun
;;; =================================================
;;; LWPLINE_SEGM_COORDS
;;; =================================================
(defun AK_LWPLINE_SEGM_COORDS (enam1 pckPT1 / sgm_nr pt1 pt2 cords);returns points in WCS
(setq
cords (vlax-get (vlax-ename->vla-object enam1) 'Coordinates)
sgm_nr (* (fix (vlax-curve-getParamAtPoint enam1 (vlax-curve-getClosestPointTo enam1 pckPT1) )) 2 )
pt1 (list (nth (+ sgm_nr 0) cords) (nth (+ sgm_nr 1) cords))
pt2 (list (nth (+ sgm_nr 2) cords) (nth (+ sgm_nr 3) cords))
pckPT1 (list pt1 pt2)
);setq
pckPT1
) ;defun
Example:
Download file: MATCH_BLOCKS_ROTATION_v2.FAS

No comments:
Post a Comment