明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6271|回复: 17

[求助]全部按颜色分层

  [复制链接]
发表于 2007-1-7 01:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-1-7 1:02:46 编辑

本人经常要处理大量来自各处的图块

颜色无法统一,不方便打印

之前在论坛找到一个LISP,但是无法处理块里面的,

麻烦那个仁兄有空帮忙加工下,小弟先谢了

以下是别人做的

(defun c:hs (/ cc ss n e lay clist kk)
  (setq clist (list 255))
  (repeat 254
    (setq clist (cons (1- (car clist)) clist))
  )
  (foreach cc clist
    (if (not kk)
      (princ (strcat "\n搜索物体中... 颜色 " (itoa cc)))
      (progn
 (repeat kk (princ "\010"))
 (princ (itoa cc))
      )
    )
    (setq kk (strlen (itoa cc)))
    (setq ss (ssget "x" (list (cons 62 cc))))
    (if ss
      (progn
 (setq kk nil)
 (setq n 0)
 (while (setq e (ssname ss n)) ;highlight the objects
   (redraw e 3)
   (setq n (1+ n))
 )    ;while
 (setq
   lay (getstring
  (strcat "\n请为颜色为 " (itoa cc) " 的物体指定层名: ")
       )
 )
 (if (tblsearch "LAYER" lay)
   (command "chprop" ss "" "c" "bylayer" "layer" lay "")
   (progn
     (setq
       yn (getint
     "\n指定的层不存在. \n键入任意数字创建此层<跳过>: "
   )
     )
     (if yn
       (command "layer" "m"     lay     "c"     cc      ""
         ""      "chprop"        ss      ""      "c"
         "bylayer"       "layer" lay     ""
        )
     )
   )    ;progn
 )    ;if
      )
    )     ;if
  )     ;foreach
)     ;end 

发表于 2016-10-21 14:04 | 显示全部楼层
能不能用框选的方法选择分层,有的不要全部
 楼主| 发表于 2007-1-7 17:42 | 显示全部楼层
出运吧,遇个好心人
发表于 2007-1-7 19:42 | 显示全部楼层
本帖最后由 作者 于 2007-1-7 19:43:06 编辑

这个问题的关键在于如果物体的颜色是随块的话(颜色号为"0"),不太好办,其他的都可以解决。

明天贴上一个lisp程序供讨论.

发表于 2007-1-8 17:30 | 显示全部楼层
  1. (defun C:ddd (/ Obj blocklist block n)
  2.   (vl-load-com)
  3.   (setq *OBJ (vlax-get-acad-object))
  4.   (setq *DOC (vla-get-activedocument *OBJ))
  5.   (setq *MSP (vla-get-modelspace *DOC))
  6.   (setq laysel (vla-get-layers *DOC))
  7.   (vlax-for obj *MSP   ;取得模型空间对象集合
  8.     (ccb obj)                           ;遍历模型空间对象
  9.   )
  10.   (setq blocklist (vla-get-blocks *DOC));取得块集合
  11.   (vlax-for block blocklist  ;遍历块集合
  12.     (vlax-for n block   ;遍历单个块
  13.       (ccb n)
  14.     )
  15.   )
  16. )
  17. (defun ccb (obj / col laynam laytab laycol layobj)
  18.   (if (and (vlax-property-available-p obj 'color)
  19.     (vlax-property-available-p obj 'layer)
  20.       )
  21.     (progn
  22.       (setq col (itoa (vla-get-color obj)))
  23.       (cond
  24. ( (= col "256")
  25.    (progn
  26.      (setq laynam (vla-get-layer obj))
  27.      (setq laytab (tblsearch "layer" laynam))
  28.      (setq laycol (itoa (cdr (assoc 62 laytab))))
  29.      (if (= (tblsearch "layer" laycol) nil)
  30.        (progn
  31.          (setq layobj (vla-add laysel laycol))
  32.          (vla-put-color layobj laycol)
  33.               )
  34.      )
  35.      (vla-put-layer obj laycol)
  36.    )
  37. )
  38. ( (/= col "256")
  39.    (progn
  40.      (if (= (tblsearch "layer" col) nil)
  41.        (progn
  42.          (setq layobj (vla-add laysel col))
  43.          (vla-put-color layobj col)
  44.        )
  45.      )
  46.      (vla-put-layer obj col)
  47.      (vla-put-color obj 256)
  48.    )
  49. )
  50.       )
  51.     )
  52.   )
  53. )
上面这个程序基本能满足要求,然而:
说实在话,对于块内的情况要复杂的多,因为如果物体的颜色是随层的话,得首先确定块在哪个图层,而对于同名块可以在不同的图层;如果物体的颜色是随块的话,得确定块的颜色。最好的办法就是把图中所有插入的图块全都炸到不能再炸为止,--注仅仅针对图块而言。
 楼主| 发表于 2007-1-8 21:36 | 显示全部楼层

非常感谢版主,这个程序确实非常好用,如果各位觉得好请麻烦顶下

 

发表于 2007-1-10 12:48 | 显示全部楼层
4樓的程序,做了很多無用的步驟!    8-(
发表于 2007-1-10 14:10 | 显示全部楼层

多谢龙龙仔指点:

我就很纳闷为什么上面那个程序效率较低呢?也不知道哪个步骤可以去掉,望能指点!

发表于 2007-1-10 16:55 | 显示全部楼层
本帖最后由 作者 于 2007-1-10 17:18:44 编辑

(defun C:ddd (/ *DOC *OBJ BLOCKLIST)
  (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))
  ;;modelspace & paperspace屬圖塊的一種,所以下列程序多出來了!
  ;;(vlax-for obj *MSP  ;取得模型空間對像集合
  ;;  (ccb obj)    ;遍歷模型空間對像
  ;;)
  (setq blocklist (vla-get-blocks *DOC)) ;取得塊集合
  (vlax-for block blocklist  ;遍歷塊集合
    (vlax-for n block   ;遍歷單個塊
      (ccb n)
    )
  )
  (PRINC)
)
(defun ccb (obj / COL LAYCOL LAYNAM LAYOBJ LAYTAB)
  ;;所有圖塊中物件一定有color & layer 屬性,不必check
  ;;(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))
     ;;tblsearch好像比較花時間,改用別的方法吧!
     (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-10 17:41 | 显示全部楼层

谢谢龙龙仔斑竹的指点。

其中改进我的一个陋习(受了书本的影响形成的),使我明白了一些VBA概念和方法,纠正了一些错误,虽然是小小指点,但收益不小。 

在此致谢!

发表于 2007-1-11 07:53 | 显示全部楼层
本帖最后由 作者 于 2007-1-11 12:25:08 编辑

  1. ;;程序我改寫了一下,會快一點
  2. (defun TABLE (S / D R)
  3.   (while (setq D (tblnext S (null D)))
  4.     (setq R (cons (cons (cdr (assoc 2 D)) (cdr (assoc 62 D)))
  5.     R
  6.      )
  7.     )
  8.   )
  9. )
  10. (defun C:DDDD (/ OBJ BLOCKLIST BLOCK N LST)
  11.   (vl-load-com)
  12.   (setq *OBJ (vlax-get-acad-object))
  13.   (setq *DOC (vla-get-activedocument *OBJ))
  14.   (setq LAYSEL (vla-get-layers *DOC))
  15.   (setq LST (TABLE "Layer"))
  16.   (setq BLOCKLIST (vla-get-blocks *DOC)) ;取得塊集合
  17.   (vlax-for BLOCK BLOCKLIST  ;遍歷塊集合
  18.     (vlax-for N BLOCK   ;遍歷單個塊
  19.       (CCBB N)
  20.     )
  21.   )
  22.   (princ)
  23. )
  24. (defun ML ()
  25.   (if (not (assoc LAYCOL LST))
  26.     (progn
  27.       (setq LST (cons (cons LAYCOL LAYCOL) LST))
  28.       (setq LAYOBJ (vla-add LAYSEL LAYCOL))
  29.       (vla-put-color LAYOBJ LAYCOL)
  30.     )
  31.   )
  32. )
  33. (defun CCBB (OBJ / LAYCOL LAYNAM)
  34.   (setq LAYCOL (itoa (vla-get-color OBJ)))
  35.   (if (= LAYCOL "256")
  36.     (progn
  37.       (setq LAYNAM (vla-get-layer OBJ))
  38.       (setq LAYCOL (cdr (assoc LAYNAM LST)))
  39.       (ML)
  40.     )
  41.     (progn
  42.       (ML)
  43.       (vla-put-color OBJ 256)
  44.     )
  45.   )
  46.   (vla-put-layer OBJ LAYCOL)
  47. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-17 09:42 , Processed in 0.327604 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表