本帖最后由 llsheng_73 于 2025-8-3 19:37 编辑
由于不想计算其它图形与参考图形之间的缩放和旋转量,因此只做以块参照为例,进行了比较偷懒的处理方法,导致使用场景受限,偷懒的办法是把要复制的东西做到一个无名图块,以选定的参考对象(块参照)的基点、插入点,比例,旋转等对新做的图块内的对象通过平移,缩放和旋转进行纠正(由于处理方法过于简单,参考对象必须XY比例一致),然后对所选的每一个要放置东西的图块插入点位置按相应的比例和旋转角插入图块
 - (vl-load-com)
- (defun l2array(l / A)
- (vlax-safearray-fill(vlax-make-safearray 9(cons 0(1-(length l))))
- (mapcar(function(lambda(x / a)(setq a(type x))(cond((='ename a)(vlax-ename->vla-object x))((='VLA-OBJECT a)x))))l)))
- (defun c:tt(/ *doc *model *blocks blk blkname s1 s e p Origin ang bl o)
- (setq *doc(vlax-get-property(vlax-get-acad-object)'activedocument)
- *model(vlax-get-property *doc 'modelspace)
- *blocks(vlax-get-property *doc'blocks))
- (while(and(or(PROMPT"\n选选择要复制的图元对象")(setq s1(ssget)))
- (or(PROMPT"\n选择参考图元对象(参照块)")(setq e(ssget":E:S"'((0 . "insert")))))
- (setq e(vlax-ename->vla-object(ssname e 0)))
- (or(PROMPT"\n选择要放置的位置(与参考对象同名块)")
- (setq blkm(vlax-get-property e'name) s(ssget(list'(0 . "insert")(cons 2 blkm))))))
- (setq p1(vlax-safearray->list(vlax-variant-value(vlax-get-property e'InsertionPoint)))
- s1(vl-remove-if'listp(mapcar'cadr(ssnamex s1)))
- p(apply'mapcar(cons'list(apply'append(mapcar'(lambda(x / a b)
- (vlax-invoke-method(vlax-ename->vla-object x)'getboundingbox'a 'b)
- (list(vlax-safearray->list a)(vlax-safearray->list b)))s1))))
- p(mapcar'+'(0 0)(car(vl-sort(mapcar(function(lambda(y)(mapcar'(lambda(x)(apply y x))p)))'(min max))
- '(lambda(x y)(>(distance p1 x)(distance p1 y))))))
- Origin(vlax-get-property(vlax-invoke-method *blocks'item blkm)'Origin)
- blk(vlax-invoke-method *blocks'add Origin"*U")
- blkname(vlax-get-property blk'name)
- ang(-(+ pi pi)(vlax-get-property e'Rotation))
- bl(/ 1(vlax-get-property e 'XScaleFactor)))
- (vlax-invoke-method *doc'copyobjects(l2array s1)blk)
- (vlax-for x blk
- (vlax-invoke-method x 'move(vlax-3d-point p1)Origin)
- (vlax-invoke-method x 'ScaleEntity Origin bl)
- (vlax-invoke-method x 'rotate Origin ang))
- (vlax-for x (vlax-get-property *doc'ActiveSelectionSet)
- (setq o(vlax-invoke-method *model'InsertBlock
- (vlax-get-property x 'InsertionPoint)
- blkname
- (vlax-get-property x'XScaleFactor)
- (vlax-get-property x'YScaleFactor)
- (vlax-get-property x'ZScaleFactor)
- (vlax-get-property x'Rotation)))
- (or(not(VL-CATCH-ALL-ERROR-P(VL-CATCH-ALL-APPLY(function vlax-invoke-method)(list o 'exlpode))))
- (vlax-invoke-method o 'delete))
- )
- (VL-CATCH-ALL-ERROR-P(VL-CATCH-ALL-APPLY(function vlax-invoke-method)(list blk 'exlpode)))
- )
- )
|