多个Poi上的多个块
海专家,如果我们有一个图形,其点超过1层(例如10层或20层,每层50个点),我们需要在一个层的每个点上放置一个块,并诸如此类。如果我们知道块与层具有相同的名称。
例如,层=树&块=树,层=棕榈&块=棕榈,层=杆&块=杆,层=垃圾箱&块=垃圾箱等等。
是否有任何lisp,我们可以通过它将不同的块放置在不同的层上,所有这些都在一个选择的窗口中。
当做 试一试:
(defun c:test ( / acdoc acsel acspc blk lay lst )
(setq acdoc (vla-get-activedocument (vlax-get-acad-object))
acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'paperspace 'modelspace))
)
(cond
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (getvar 'CLAYER))))))
(princ "\nCurrent Layer Locked.")
)
( (ssget '((0 . "POINT")))
(vlax-for obj (setq acsel (vla-get-activeselectionset acdoc))
(if
(or
(and
(member (setq lay (vla-get-layer obj)) lst)
(setq blk lay)
)
(and
(tblsearch "BLOCK" lay)
(setq lst (cons lay lst)
blk lay
)
)
(setq blk (findfile (strcat lay ".dwg")))
)
(vla-put-layer (vla-insertblock acspc (vla-get-coordinates obj) blk 1.0 1.0 1.0 0.0) lay)
)
)
(vla-delete acsel)
)
)
(princ)
)
(vl-load-com) (princ)
完全未经测试:
(defun c:test (/ dl td ln bn ss en ed i)
;;;DEFINE THE DELIMITER
(setq dl " & ")
;;;SETP THROUGH THE LAYER TABLE
(while (setq td (tblnext "LAYER" (not td)))
(and (setq ln (cdr (assoc 2 td)))
(wcmatch ln (strcat "*" dl "*"))
(setq i 1)
(while (/= (substr ln i (strlen dl)))
(setq i (1+ i)))
(setq bn (substr ln 1 (1- i)))
(or (findfile (strcat bn ".dwg"))
(tblsearch "BLOCK" bn))
(setq ss (ssget "X" (list (cons 0 "POINT")(cons 8 ln))))
(not (ssget "X" (list (cons 0 "INSERT")
(cons 2 bn)
(cons 8 ln))))
(while (setq en (ssname ss 0))
(setq ed (entget en))
(if (not (tblsearch "BLOCK" bn))
(progn (command "_.INSERT" bn)
(command)))
(entmake (list (cons 0 "INSERT")
(cons 2 bn)
(assoc 8 ed)
(assoc 10 ed)))
(ssdel en ss))))
(prin1))
-大卫 感谢李的出色工作,
谢谢david,但我还没有试过你的代码,
迎合双方的努力,
当做 不客气,西莫。 李海,
再次需要您的帮助,现在图形中的块名为sp,而不是point。在本例中,我尝试将代码(ssget’((0。“POINT”))更改为(ssget’((0。“insert”))
选择对象:;错误:ActiveX服务器返回错误:未知名称:坐标
和(ssget’((0。“block”))它显示了messege命令:TEST
选择对象:指定对角点:0
选择对象:*取消*
; 错误:功能已取消
你的帮助太过分了。 块参照没有坐标特性,而是使用InsertionPoint特性来存储其插入点的坐标,因此代码变为:
(defun c:test ( / acdoc acsel acspc blk lay lst )
(setq acdoc (vla-get-activedocument (vlax-get-acad-object))
acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'paperspace 'modelspace))
)
(cond
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (getvar 'CLAYER))))))
(princ "\nCurrent Layer Locked.")
)
( (ssget '((0 . "INSERT") (2 . "SP")))
(vlax-for obj (setq acsel (vla-get-activeselectionset acdoc))
(if
(or
(and
(member (setq lay (vla-get-layer obj)) lst)
(setq blk lay)
)
(and
(tblsearch "BLOCK" lay)
(setq lst (cons lay lst)
blk lay
)
)
(setq blk (findfile (strcat lay ".dwg")))
)
(vla-put-layer (vla-insertblock acspc (vla-get-insertionpoint obj) blk 1.0 1.0 1.0 0.0) lay)
)
)
(vla-delete acsel)
)
)
(princ)
)
(vl-load-com) (princ)
[未测试,假设块“SP”不是动态的] 谢谢李,
以便立即响应。块sp不是动态的。
再次感谢。
页:
[1]