快速建块,仍然有BUG
本帖最后由 菜卷鱼 于 2015-11-4 22:20 编辑BUG太多了,能力不足,搞不定,还需要进一步学习,以下代码仅供参考,、使用的话导致CAD死机甚至电脑死机自己负责啊
;;;;快速建块,花了两天时间,还是半成品。
;;;;建属性块时可能会出错,还可能有N多BUG
;;;;希望有人出手优化一下
;;;;建普通块是没问题的
(defun attblock (objs / obj info )
(setq info (entget objs))
(entmake(infodel info '(-1 330 5 )))
(setq obj (entnext objs))
(setq info (entget obj))
(while
(equal '(0 . "ATTRIB") ( assoc 0 info))
(entmake (infodel info '(-1 330 5 )))
(setq obj (entnext obj))
(setq info (entget obj)))
(entmake (list
'(0 . "SEQEND")
'(100 . "AcDbEntity")
'(67 . 0)
'(8 . "0")
)
)
)
(defun infodel (elist num)
(last(mapcar '(lambda(x)
(setq elist(vl-remove(assoc x elist)elist))
)
num
)
)
)
(defun ribdef ( info / elist)
(setq elist info
elist (subst '(0 . "ATTRIB")'(0 . "ATTDEF")elist)
elist (subst '(100 . "AcDbAttribute")'(100 . "AcDbAttributeDefinition") elist))
(last (mapcar '(lambda(x)
(setq elist(vl-remove(assoc x elist)elist))
)
'(-1 330 5 3 410 )
)
)
)
(defun UndoBe () ;;;;; undo begin
(vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(defun UndoE () ;;;;; undo end
(vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(DEFUN C:Qq( /*error* ss pt nn i ssattdefinfo )
(princ "Quick Block")
(defun *error* (s)
(if (/= s "取消")(undoe))
)
(setq ss (ssget)
nn (rtos(getvar 'cdate) 2 8)
pt (getvar 'viewctr)
ssattdef (ssadd))
(UndoBe)
(entmake (list
'(0 . "BLOCK")
'(100 . "AcDbEntity")
'(67 . 0)
'(8 . "0")
'(100 . "AcDbBlockBegin")
'(70 . 2)
'(1 . "")
(cons 10 pt)
(cons 2 nn)
)
)
(repeat (setq i (sslength ss))
(setq obj (ssname ss (setq i (1- i)))
info (entget obj))
(cond
((equal '(0 . "ATTDEF") ( assoc 0 info))
(setq ssattdef (ssadd obj ssattdef)) (entmake (infodel info '(-1 330 5 410)) ) )
((equal '(66 . 1)
( assoc 66 info)) (attblock obj))
(T (entmake (infodel info '(-1 330 5 410))) )
);;;end cond
);;;end repeat
(entmake (list
'(0 . "ENDBLK")
'(100 . "AcDbEntity")
'(100 . "AcDbBlockEnd")
)
)
(entupd (tblobjname "Block" nn))
(if(zerop (sslength ssattdef))
(entmake (list '(0 . "insert") (cons 2 nn) (cons 10 pt)))
(progn
(entmake (list '(0 . "insert") (cons 2 nn) (cons 10 pt) '(66 . 1)))
(repeat(setq i (sslength ssattdef))
(entmake (ribdef(entget (ssname ssattdef (setq i (1- i))))))
) ;;;end repeat
));;;end progn if
(entmake '((0 . "SEQEND")))
(repeat (setq i (sslength ss))
(entdel (ssname ss (setq i (1- i)))))
(UndoE)
(princ (strcat "\nCreated Block " nn))
(PRIN1))
(prin1)
;;;;
本帖最后由 菜卷鱼 于 2015-11-4 22:21 编辑
把没有子图元的图元建成块应该没问题的,其它的复杂点的块问题搞不定 菜卷鱼 发表于 2015-9-26 22:58 static/image/common/back.gif
其实我已经搞出没BUG的了,看没人回帖,就不发了
呵呵,可能大家都过节去了!不要那么辛苦 ,节日要多放松放松
另外论坛快速建块的贴子蛮多的,以时间做块名, 形心做基点,等等,
你说有N多BUG, 具体是哪些?也没说清楚,高手们也不好怎么解答,
菜卷鱼 发表于 2015-9-26 22:58 static/image/common/back.gif
其实我已经搞出没BUG的了,看没人回帖,就不发了
看来楼主是位高手,写程序都不用加注释,能发个没有BUG的出来共享一下不?谢谢! 楼主功底很深厚,MARK,在慢慢研究。。。 回帖呢,是什么快捷键? 菜卷鱼 发表于 2015-9-26 22:58 static/image/common/back.gif
其实我已经搞出没BUG的了,看没人回帖,就不发了
选择对象:; 错误: *error* 函数中出错无函数定义: VLAX-GET-ACAD-OBJECT 不能用啊,楼主 C:\asd.gif
页:
[1]
2