求高手帮忙编一个可以刷块的LISP
工作中经常遇到块会发生镜像,一个一个的改太麻烦,请高手帮忙给编一个可以刷块的LISP谢谢。;;;未考虑属性快
(defun c:BlkBrush(/ ENT ENL P0 $KD KD SS P1 EL NEWL)
(setq ent (car (entsel "\n源图块:"))
enl (entget ent)
)
(redraw ent 3)
(setq p0 (vlax-3d-point (cdr (assoc 10 enl))))
(initget 7 "Yes No")
(if (not (or (= "Yes" $kd) (= "No" $kd))) (setq $kd "Yes"))
(setq kd (getkword (strcat "\n 是否刷新比例尺 <" $kd ">:")))
(if (= "" kd) (setq kd $kd))
(setq $kd kd)
(while (setq ss (ssget (list (assoc 0 enl))))
(repeat (setq n (sslength ss))
((lambda (x / p1 el NewL ppl obj)
(setq el (entget x)
p1 (vlax-3d-point (cdr (assoc 10 el)))
NewL (subst (assoc -1 el) (assoc -1 enl) enl)
Newl (subst (assoc 330 el) (assoc 330 enl) Newl)
Newl (subst (assoc 5 el) (assoc 5 enl) Newl)
Newl (subst (assoc 8 el) (assoc 8 enl) Newl)
)
(if (assoc 6 el) (setq Newl (subst (assoc 6 el) (assoc 6 enl) Newl)))
(if (assoc 62 el) (setq Newl (subst (assoc 62 el) (assoc 62 enl) Newl)))
(if (= kd "No")
(setq Newl (subst (assoc 41 el) (assoc 41 enl) Newl)
Newl (subst (assoc 42 el) (assoc 42 enl) Newl)
Newl (subst (assoc 43 el) (assoc 43 enl) Newl)
)
)
(entmod Newl)
(vla-move (setq obj (vlax-ename->vla-object x)) p0 p1)
)
(ssname ss (setq n (1- n)))
)
)
)
(redraw ent 4)
(princ)
)
顶一个!!! 赞一个!
为什么要刷块呢
直接复制不行吗?
直接块替换不是更快吗? 请教G版,能否增加捕捉功能,使目标块保持原有位置不变? 首先感谢版主的帮助,还有一个疑问向版主请教,为什么刷的块都找不到了? 看看下面程序也是捕捉的问题,替换的图块也经常不见
;图块替换
(vl-load-com)
(defun substblk (newblkname oldblk / box
boxmax boxmin insp newblk newblkname
newbox newmax newmin oldblk scx
scy
)
(vla-GetBoundingBox
(vlax-ename->vla-object oldblk)
'boxmin
'boxmax
)
(setq boxmin (vlax-safearray->list boxmin)
boxmax (vlax-safearray->list boxmax)
box (mapcar '- boxmax boxmin)
)
(entmake
(list
'(0 . "INSERT")
'(100 . "AcDbEntity")
'(100 . "AcDbBlockReference")
(cons 2 newblkname)
'(10 0.0 0.0 0.0)
'(41 . 1.0)
'(42 . 1.0)
'(43 . 1.0)
)
)
(setq newblk (entlast))
(vla-GetBoundingBox
(vlax-ename->vla-object newblk)
'newmin
'newmax
)
(setq newmin (vlax-safearray->list newmin)
newmax (vlax-safearray->list newmax)
newbox (mapcar '- newmax newmin)
)
(setq scx(/ (car box) (car newbox))
scy(/ (cadr box) (cadr newbox))
insp (mapcar '- boxmin (mapcar '* newmin (list scx scy 0)))
)
(entmod (list (cons -1 newblk)
(cons 10 insp)
(cons 41 scx)
(cons 42 scy)
)
)
(entdel oldblk)
)
(defun c:htk ()
(cond ((and
(setq newblkname (getstring "\n新块名:"))
(if (tblsearch "block" newblkname)
t
(alert "查无此块!")
)
(setq ss (ssget '((0 . "insert")))) ;请加入自定过滤
)
(setq i -1)
(repeat
(sslength ss)
(setq oldblk (ssname ss (setq i (1+ i))))
(substblk newblkname oldblk)
)
)
)
(princ)
)
Gu_xl 发表于 2011-8-15 13:16
图框,里面的字用的字段,刷不了。烦请改下
页:
[1]