鬼魔 发表于 2007-1-7 01:00:00

[求助]全部按颜色分层

本帖最后由 作者 于 2007-1-7 1:02:46 编辑 <br /><br /> <p>本人经常要处理大量来自各处的图块</p><p>颜色无法统一,不方便打印</p><p>之前在论坛找到一个LISP,但是无法处理块里面的,</p><p>麻烦那个仁兄有空帮忙加工下,小弟先谢了</p><p>以下是别人做的</p><p></p><p>(defun c:hs (/ cc ss n e lay clist kk)<br/>&nbsp; (setq clist (list 255))<br/>&nbsp; (repeat 254<br/>&nbsp;&nbsp;&nbsp; (setq clist (cons (1- (car clist)) clist))<br/>&nbsp; )<br/>&nbsp; (foreach cc clist<br/>&nbsp;&nbsp;&nbsp; (if&nbsp;(not kk)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ (strcat "\n搜索物体中... 颜色 " (itoa cc)))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;(repeat kk (princ "\010"))<br/>&nbsp;(princ (itoa cc))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (setq kk (strlen (itoa cc)))<br/>&nbsp;&nbsp;&nbsp; (setq ss (ssget "x" (list (cons 62 cc))))<br/>&nbsp;&nbsp;&nbsp; (if&nbsp;ss<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp;(setq kk nil)<br/>&nbsp;(setq n 0)<br/>&nbsp;(while (setq e (ssname ss n))&nbsp;;highlight the objects<br/>&nbsp;&nbsp; (redraw e 3)<br/>&nbsp;&nbsp; (setq n (1+ n))<br/>&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;;while<br/>&nbsp;(setq<br/>&nbsp;&nbsp; lay (getstring<br/>&nbsp;&nbsp;(strcat "\n请为颜色为 " (itoa cc) " 的物体指定层名: ")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;)<br/>&nbsp;(if (tblsearch "LAYER" lay)<br/>&nbsp;&nbsp; (command "chprop" ss "" "c" "bylayer" "layer" lay "")<br/>&nbsp;&nbsp; (progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yn (getint<br/>&nbsp;&nbsp;&nbsp;&nbsp; "\n指定的层不存在. \n键入任意数字创建此层&lt;跳过&gt;: "<br/>&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if&nbsp;yn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "layer" "m"&nbsp;&nbsp;&nbsp;&nbsp; lay&nbsp;&nbsp;&nbsp;&nbsp; "c"&nbsp;&nbsp;&nbsp;&nbsp; cc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ""<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "chprop"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "c"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bylayer"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "layer" lay&nbsp;&nbsp;&nbsp;&nbsp; ""<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;;progn<br/>&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;;if<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;if<br/>&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;foreach<br/>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;end&nbsp; </p>

q274592467 发表于 2016-10-21 14:04:15

能不能用框选的方法选择分层,有的不要全部

鬼魔 发表于 2007-1-7 17:42:00

出运吧,遇个好心人

highflybir 发表于 2007-1-7 19:42:00

本帖最后由 作者 于 2007-1-7 19:43:06 编辑 <br /><br /> <p>这个问题的关键在于如果物体的颜色是随块的话(颜色号为"0"),不太好办,其他的都可以解决。</p><p>明天贴上一个lisp程序供讨论.</p>

highflybir 发表于 2007-1-8 17:30:00


(defun C:ddd (/ Obj blocklist block n)
(vl-load-com)
(setq *OBJ (vlax-get-acad-object))
(setq *DOC (vla-get-activedocument *OBJ))
(setq *MSP (vla-get-modelspace *DOC))
(setq laysel (vla-get-layers *DOC))
(vlax-for obj *MSP   ;取得模型空间对象集合
    (ccb obj)                           ;遍历模型空间对象
)
(setq blocklist (vla-get-blocks *DOC));取得块集合
(vlax-for block blocklist;遍历块集合
    (vlax-for n block   ;遍历单个块
      (ccb n)
    )
)
)
(defun ccb (obj / col laynam laytab laycol layobj)
(if (and (vlax-property-available-p obj 'color)
    (vlax-property-available-p obj 'layer)
      )
    (progn
      (setq col (itoa (vla-get-color obj)))
      (cond
( (= col "256")
   (progn
   (setq laynam (vla-get-layer obj))
   (setq laytab (tblsearch "layer" laynam))
   (setq laycol (itoa (cdr (assoc 62 laytab))))
   (if (= (tblsearch "layer" laycol) nil)
       (progn
         (setq layobj (vla-add laysel laycol))
         (vla-put-color layobj laycol)
            )
   )
   (vla-put-layer obj laycol)
   )
)
( (/= col "256")
   (progn
   (if (= (tblsearch "layer" col) nil)
       (progn
         (setq layobj (vla-add laysel col))
         (vla-put-color layobj col)
       )
   )
   (vla-put-layer obj col)
   (vla-put-color obj 256)
   )
)
      )
    )
)
)
上面这个程序基本能满足要求,然而:
说实在话,对于块内的情况要复杂的多,因为如果物体的颜色是随层的话,得首先确定块在哪个图层,而对于同名块可以在不同的图层;如果物体的颜色是随块的话,得确定块的颜色。最好的办法就是把图中所有插入的图块全都炸到不能再炸为止,--注仅仅针对图块而言。

鬼魔 发表于 2007-1-8 21:36:00

<p>非常感谢版主,这个程序确实非常好用,如果各位觉得好请麻烦顶下</p><p>&nbsp;</p>

龙龙仔 发表于 2007-1-10 12:48:00

4樓的程序,做了很多無用的步驟!    8-(

highflybir 发表于 2007-1-10 14:10:00

<p><font face="Verdana" color="#da2549"><font color="#000000">多谢</font><strong>龙龙仔</strong><font color="#000000">指点:</font></font></p><p><font face="Verdana">我就很纳闷为什么上面那个程序效率较低呢?也不知道哪个步骤可以去掉,望能指点!</font></p>

龙龙仔 发表于 2007-1-10 16:55:00

本帖最后由 作者 于 2007-1-10 17:18:44 编辑 <br /><br /> <p>(defun C:ddd (/ *DOC *OBJ BLOCKLIST)<br/>&nbsp; (vl-load-com)<br/>&nbsp; (setq *OBJ (vlax-get-acad-object))<br/>&nbsp; (setq *DOC (vla-get-activedocument *OBJ))<br/>&nbsp; ;;(setq *MSP (vla-get-modelspace *DOC))<br/>&nbsp; (setq laysel (vla-get-layers *DOC))<br/>&nbsp; ;;modelspace &amp; paperspace屬圖塊的一種,所以下列程序多出來了!<br/>&nbsp; ;;(vlax-for obj&nbsp;*MSP&nbsp;&nbsp;;取得模型空間對像集合<br/>&nbsp; ;;&nbsp; (ccb obj)&nbsp;&nbsp;&nbsp;&nbsp;;遍歷模型空間對像<br/>&nbsp; ;;)<br/>&nbsp; (setq blocklist (vla-get-blocks *DOC)) ;取得塊集合<br/>&nbsp; (vlax-for block blocklist&nbsp;&nbsp;;遍歷塊集合<br/>&nbsp;&nbsp;&nbsp; (vlax-for n&nbsp;block&nbsp;&nbsp;&nbsp;;遍歷單個塊<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ccb n)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (PRINC)<br/>)<br/>(defun ccb (obj / COL LAYCOL LAYNAM LAYOBJ LAYTAB)<br/>&nbsp; ;;所有圖塊中物件一定有color &amp; layer 屬性,不必check<br/>&nbsp; ;;(if (and (vlax-property-available-p obj 'color)<br/>&nbsp; ;;&nbsp;&nbsp;&nbsp; (vlax-property-available-p obj 'layer)<br/>&nbsp; ;;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; ;;(progn<br/>&nbsp; (setq col (itoa (vla-get-color obj)))<br/>&nbsp; (cond<br/>&nbsp;&nbsp;&nbsp; ((= col "256")<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;;(progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq laynam (vla-get-layer obj))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq laytab (tblsearch "layer" laynam))<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;;tblsearch好像比較花時間,改用別的方法吧!<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq laycol (itoa (cdr (assoc 62 laytab))))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= (tblsearch "layer" laycol) nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp; (setq layobj (vla-add laysel laycol))<br/>&nbsp; (vla-put-color layobj laycol)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-layer obj laycol)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;;)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; ((/= col "256")<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;;(progn<br/>&nbsp;&nbsp;&nbsp;&nbsp; (if (= (tblsearch "layer" col) nil)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<br/>&nbsp; (setq layobj (vla-add laysel col))<br/>&nbsp; (vla-put-color layobj col)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-layer obj col)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (vla-put-color obj 256)<br/>&nbsp;&nbsp;&nbsp;&nbsp; ;;)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; ;;)<br/>&nbsp; ;;)<br/>)</p><p><br/></p>

highflybir 发表于 2007-1-10 17:41:00

<p>谢谢<font face="Verdana" color="#da2549"><strong>龙龙仔</strong><font color="#000000">斑竹的指点。</font></font></p><p><font face="Verdana">其中改进我的一个陋习(受了书本的影响形成的),使我明白了一些VBA概念和方法,纠正了一些错误,</font><font face="Verdana">虽然是小小指点,但收益不小。 </font></p><p><font face="Verdana">在此致谢!</font></p>

龙龙仔 发表于 2007-1-11 07:53:00

本帖最后由 作者 于 2007-1-11 12:25:08 编辑


;;程序我改寫了一下,會快一點
(defun TABLE (S / D R)
(while (setq D (tblnext S (null D)))
    (setq R (cons (cons (cdr (assoc 2 D)) (cdr (assoc 62 D)))
    R
   )
    )
)
)
(defun C:DDDD (/ OBJ BLOCKLIST BLOCK N LST)
(vl-load-com)
(setq *OBJ (vlax-get-acad-object))
(setq *DOC (vla-get-activedocument *OBJ))
(setq LAYSEL (vla-get-layers *DOC))
(setq LST (TABLE "Layer"))
(setq BLOCKLIST (vla-get-blocks *DOC)) ;取得塊集合
(vlax-for BLOCK BLOCKLIST;遍歷塊集合
    (vlax-for N BLOCK   ;遍歷單個塊
      (CCBB N)
    )
)
(princ)
)
(defun ML ()
(if (not (assoc LAYCOL LST))
    (progn
      (setq LST (cons (cons LAYCOL LAYCOL) LST))
      (setq LAYOBJ (vla-add LAYSEL LAYCOL))
      (vla-put-color LAYOBJ LAYCOL)
    )
)
)
(defun CCBB (OBJ / LAYCOL LAYNAM)
(setq LAYCOL (itoa (vla-get-color OBJ)))
(if (= LAYCOL "256")
    (progn
      (setq LAYNAM (vla-get-layer OBJ))
      (setq LAYCOL (cdr (assoc LAYNAM LST)))
      (ML)
    )
    (progn
      (ML)
      (vla-put-color OBJ 256)
    )
)
(vla-put-layer OBJ LAYCOL)
)
页: [1] 2
查看完整版本: [求助]全部按颜色分层