明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2592|回复: 13

[源码] 征求:图层归统程序源码....

[复制链接]
发表于 2015-12-14 17:30:57 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2015-12-14 18:07 编辑

问题提出:

       一:工作初始:

              我们画图初始坏境,设置了一定量图层:颜色、线型。

          二:工作过程产生新实体入层,然而,新实体的颜色、线型,并没有和初始图层完全相符。

      三:求这样功能的lisp :
      
             选择一范围内所有实体,判断每个实体的:颜色,线型;假如这样颜色和线型的图层已存在,就落去,否则,就建立这样颜色+线型的图层出来(新层名就用颜色号),并把这个实体改到新层去......;新增加的图层程序自动记录,下一实体判断要比较的图层,多了这一个.......;如此循环.......


         四:目的与结果:           
                程序处理完,保证:颜色和线型相同的实体,存在唯一的该层上。颜色不同不在该层,线型不同也不在该层。


*******************************************************************

      我在本论坛找过"按色分层”源码如下,假如如此使用,虽然按颜色分了层,但却把线型搞乱了,因此,需要完善线型问题,连线型要考虑在内一起判断......;改造成“按色、线分层”出来!
  1. (defun C:DDDD (/ *DOC *OBJ *LAY blocks layers)
  2.    (setvar "CMDECHO" 0)
  3. (vl-load-com)
  4.   (setq *OBJ (vlax-get-acad-object))
  5.   (setq *DOC (vla-get-activedocument *OBJ))
  6.   (setq *LAY (vla-get-layers *DOC))              ;取得层集合
  7.   (table)
  8.   (setq blocks (vla-get-blocks *DOC))            ;取得块集合
  9.   (vlax-for block blocks           ;遍历块集合
  10.     (vlax-for n block            ;遍历单个块
  11.       (ccb n)
  12.     )
  13.   )

  14. (setvar "CMDECHO" 1)
  15.   (princ)
  16. )
  17. (defun ccb (object / colour laynam laycol)
  18.   (setq colour (itoa (vla-get-color object)))    ;取得物体颜色号
  19.   (cond            
  20.     ( (or (= colour "256") (= colour "0"))       ;如果物体颜色随层或随块
  21.       (setq laynam (vla-get-layer object))       ;取得物体所在层名
  22.       (setq laycol (cdr (assoc laynam layers)))  ;取得层颜色
  23.       (setq colour (itoa laycol))            
  24.       (ML)                                      
  25.     )
  26.     ( (ML)
  27.       (vla-put-color object 256)                 ;否则改变物体颜色为随层
  28.     )
  29.   )
  30.   (vla-put-layer object colour)                  ;对物体改层到颜色号层
  31. )
  32. (defun ML (/ layobj)
  33.    (if (not (assoc colour layers))                ;如果颜色号不在图层表中
  34.      (progn
  35.      (setq layers (cons (cons colour laycol) layers))
  36.       
  37.                                                            ;重新构造图层表
  38.       (setq layobj (vla-add *LAY colour )    )   ;创建颜色号图层
  39.       
  40.       (vla-put-color layobj colour)
  41.              ;对颜色号层赋色

  42.    
  43. )

  44.   )
  45. )
  46. (defun table (/ name color Nname)
  47.   (vlax-for n *LAY                               ;遍历层集合
  48.     (setq name (vla-get-name n))                 ;取得层名
  49.     (setq color (vla-get-color n))               ;取得层颜色
  50.     (setq layers (cons (cons name color) layers));获得层名和颜色号表
  51.     (setq Nname (read name))
  52.     (if (= (type Nname) (type 1))                ;如果层名是整数
  53.       (if (= (strlen (itoa Nname)) (strlen name))
  54.         (if (and (> Nname 0) (< Nname 256))      ;並且>0,<256
  55.           (if (/= color Nname)                   ;如果层颜色不等于层名
  56.             (vla-put-color n Nname)              ;则改层颜色为层名

  57.           )
  58.         )
  59.       )
  60.     )
  61.   )
  62. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-12-14 22:37:50 | 显示全部楼层
本帖最后由 wzg356 于 2015-12-15 01:16 编辑

颜色相同、线型不同的层如何取名区分?

下面的是通通重来一遍
  1. ;按颜色+线型建层重新归拢(newla)
  2. ;是否所有对象均有线型属性没考虑,颜色随块没考虑(我搞不定)
  3. (defun newla ( / ss i ee obj pro1 pro2 pro3 pro4 pro5 Laname)
  4. (setq ss(ssget))
  5. (setq i 0)
  6. (while (setq ee (ssname ss i))      
  7.   (setq obj (vlax-ename->vla-object ee)
  8.        pro1 (vlax-get-property obj "Layer")
  9.        pro2(vlax-get-property obj "Color")
  10.        pro3(vlax-get-property obj "Linetype")
  11.        pro4(cdr (assoc 62 (tblsearch "LAYER" pro1)));;图元现在层颜色
  12.        pro5(cdr (assoc 6 (tblsearch "LAYER" pro1)));;图元现在层线型
  13.     )
  14.   (setq pro2(if (equal pro2 256) pro4 pro2));图元颜色
  15.   (setq pro3(if (equal pro3 "ByLayer") pro5 pro3));图元线型
  16.   (setq Laname
  17.     (strcat
  18.       "色" (rtos  pro2 2  0);图元颜色
  19.       "+线"  pro3 ;图元线型
  20.     )
  21.   );颜色+线型的图层名
  22.   (If (= (Tblsearch "layer" Laname) nil)
  23.     ;;;颜色+线型取名定义新图层
  24.     (command "-layer" "n" Laname "c" pro2 Laname "l" pro3 Laname "")        
  25.   )
  26. (if(equal pro1 Laname)nil(command "chprop" ee "" "la" Laname ""));;把东东放进去
  27. (setq i (+ i 1))
  28. )
  29. )

点评

1:不能循环 2:判断语句哪里需要完善,就是,假如实体的颜色和线型都相符已存在,就落去,不要建立新的,并把它一道该层了。  发表于 2015-12-15 06:35
 楼主| 发表于 2015-12-15 06:39:53 | 显示全部楼层
本帖最后由 尘缘一生 于 2015-12-15 16:23 编辑
wzg356 发表于 2015-12-14 22:37
颜色相同、线型不同的层如何取名区分?

下面的是通通重来一遍

我仅会普通编程,见谅,不是为建立新层,是该建的建,不需要建的不建,并不动实体的层,不符合的才建立它,并把它归层过去。

        取得现已存在的:层表,颜色和线型,判断存在实体是否相符,不相符-->建立该层-->把该实体移到该层。
     关键是下一实体:

       A:要是正好符合已有的存在层,不动它  B:符合本程序新建立的层,就移动到该层  C:假如都没有符合它的层存在-->循环建立------>
发表于 2015-12-15 13:48:28 | 显示全部楼层
  1. ;另一种,拿对象颜色 线型与已有层颜色 线型比较
  2. ;==========================
  3. ;取得已有层的属性表
  4. ;返回((层名1 颜色 线型)(层名2 颜色 线型)......)
  5. (defun getlalst ( / TBL TBL_LIST )
  6. (while (setq TBL (tblnext "LAYER" (null TBL)))
  7.         (setq TBL_LIST
  8.                 (cons
  9.                         (list
  10.                                 (cdr (assoc 2 TBL))
  11.                                 (cdr (assoc 62 TBL))
  12.                                 (cdr (assoc 6 TBL))
  13.                         )
  14.                         TBL_LIST
  15.                 )
  16.         )
  17. )
  18. )

  19. ;取得图元的图层+颜色+线型信息
  20. ;(getenpro (car(entsel)))
  21. ;返回(层名 颜色 线型)
  22. (defun getenpro (ee / obj pro1 pro2 pro3 pro4 pro5)              
  23.         (setq obj (vlax-ename->vla-object ee)
  24.              pro1 (vlax-get-property obj "Layer")
  25.              pro2(vlax-get-property obj "Color")
  26.              pro3(vlax-get-property obj "Linetype")
  27.              pro4(cdr (assoc 62 (tblsearch "LAYER" pro1)));;图元现在层颜色
  28.              pro5(cdr (assoc 6 (tblsearch "LAYER" pro1)));;图元现在层线型
  29.     )
  30.     (list  pro1 ;图层
  31.             (if (equal pro2 256) pro4 pro2);图元颜色
  32.             (if (equal pro3 "ByLayer") pro5 pro3);图元线型
  33.     )
  34. )
  35. (defun c:newla1 ( / ss i ee lalst enlst co lsty lalst1 a Laname)
  36. (setq ss(ssget))
  37. (setq i 0)
  38. (while (setq ee (ssname ss i))             
  39.         (setq lalst (getlalst) lalst1 nil)
  40.         (setq enlst (getenpro ee)
  41.                 co  (cadr enlst);图元颜色
  42.                 lsty (caddr enlst);图元线型
  43.         )
  44.         (if (member enlst lalst )
  45.                 nil
  46.                 (progn
  47.                         (foreach a        lalst
  48.                                 (if (equal (cdr enlst) (cdr a)) (setq lalst1  (cons a lalst1)))
  49.                         );颜色线型相同的层,可能有多个
  50.                         (if lalst1
  51.                                 (command "chprop" ee "" "la" (car lalst1) "")
  52.                                 (progn
  53.                                         (setq Laname(strcat "色" (rtos co 2  0)"+线" lsty ))
  54.                                         ;颜色+线型的图层名
  55.                                         (If (= (Tblsearch "layer" Laname) nil)
  56.                                                 (command "-layer"
  57.                                                         "n" Laname
  58.                                                         "c" co Laname
  59.                                                         "l" lsty Laname ""
  60.                                                 )                       
  61.                                         );;;颜色+线型取名定义新图层
  62.                                         (command "chprop" ee "" "la" Laname "")                                       
  63.                                 )
  64.                         )
  65.                 )
  66.         )
  67.         (setq i (+ i 1))
  68. )
  69. )
发表于 2015-12-15 14:05:20 | 显示全部楼层
本帖最后由 wzg356 于 2015-12-15 14:30 编辑

有循环的呀?选择集里面逐个判断。

本身你的逻辑有问题,如果已有层颜色+线型相同的有多个,难道要搞一个图层合并?拿不如用沙发楼的。

第一个(沙发):类似于把已有层按颜色+线型更名,每刷一遍,选择的对象自动按对象颜色、线型归入相应的层。
第二个(楼上):只按对象颜色、线型与已有层颜色+线型对比并归入相应层(如果颜色+线型相同的层有多个,只选一个放进去),或按颜色、线型建新层并把相应图元放进去。

也就是第一个统一层名规则
第二个只管层的颜色+线型,新建层颜色+线型不会与已有层颜色+线型重复(已有的是否重复不管),但新层名可能与已有层名重复就没考虑了,只是概率极小,可以用
 楼主| 发表于 2015-12-15 16:38:38 | 显示全部楼层
wzg356 发表于 2015-12-15 14:05
有循环的呀?选择集里面逐个判断。

本身你的逻辑有问题,如果已有层颜色+线型相同的有多个,难道要搞一个 ...

       假如2个实体,颜色与线型均相同,存在于已经存在得两个层上,我们不管它,为什么要管?有必要吗?因为他们的颜色与线型与层的定义同,没错!
    为了优化?归并层,当然好,因为归并层的代码早有了。
   
      我没有发现存在一个代码能把颜色和线型与所存在得层设置不同的,变对了它,因为,没有这个功能,任何代码,把实体按颜色分层的,都无有任何意义,试想以下:

     1:我一个实体,为LINE ,色为红色,线型为 实线,存在层 1上
     2:我还有一个实体,为LINE, 色为红色,线型为“轴线”,也存在层1上,这个实体不对,因为层1是存实线且红色的!

    就要把实体变对与层设置相符得去,不用管层最后是多少个,多又怎么样?嫌多,归并即可,有代码了,哪么,最基本的实体都变不过去,还归并个鸟?

点评

啰嗦!!! 不要光说! ,拿出示意图, 图文说明比较好!  发表于 2015-12-15 17:21
发表于 2015-12-15 16:53:47 | 显示全部楼层
第二个还不行?
发表于 2015-12-15 17:14:15 | 显示全部楼层
光图层的话  cad的标准检查就可以吧

点评

线实体的话,不能光层,尤其设置了随层的,一变就出错,必须同时考虑线型分层去。  发表于 2015-12-15 17:30
 楼主| 发表于 2015-12-15 17:21:51 | 显示全部楼层
本帖最后由 尘缘一生 于 2015-12-15 17:23 编辑
wzg356 发表于 2015-12-15 16:53
第二个还不行?

我确实看不大懂,但从判断部分啥的,觉得很正确的,但我实验运行不了,变量说错误中断,我改了下循环条件,也不行。看运行信息啊,输入层名为“BYAYER”,然后就中断了。
    我CAD初始存在的层,线型都是随层的。
  1. ;另一种,拿对象颜色 线型与已有层颜色 线型比较
  2. ;==========================
  3. ;取得已有层的属性表
  4. ;返回((层名1 颜色 线型)(层名2 颜色 线型)......)
  5. (defun getlalst ( / TBL TBL_LIST )
  6. (while (setq TBL (tblnext "LAYER" (null TBL)))
  7.         (setq TBL_LIST
  8.                 (cons
  9.                         (list
  10.                                 (cdr (assoc 2 TBL))
  11.                                 (cdr (assoc 62 TBL))
  12.                                 (cdr (assoc 6 TBL))
  13.                         )
  14.                         TBL_LIST
  15.                 )
  16.         )
  17. )
  18. )

  19. ;取得图元的图层+颜色+线型信息
  20. ;(getenpro (car(entsel)))
  21. ;返回(层名 颜色 线型)
  22. (defun getenpro (ee / obj pro1 pro2 pro3 pro4 pro5)              
  23.         (setq obj (vlax-ename->vla-object ee)
  24.              pro1 (vlax-get-property obj "Layer")
  25.              pro2(vlax-get-property obj "Color")
  26.              pro3(vlax-get-property obj "Linetype")
  27.              pro4(cdr (assoc 62 (tblsearch "LAYER" pro1)));;图元现在层颜色
  28.              pro5(cdr (assoc 6 (tblsearch "LAYER" pro1)));;图元现在层线型
  29.     )
  30.     (list  pro1 ;图层
  31.             (if (equal pro2 256) pro4 pro2);图元颜色
  32.             (if (equal pro3 "ByLayer") pro5 pro3);图元线型
  33.     )
  34. )
  35. (defun c:newla1 ( / ss i ee lalst enlst co lsty lalst1 a Laname)
  36. (setq ss(ssget))
  37. (setq n (sslength ss))
  38. (setq i 0)
  39. (while (< i n)
  40.         (setq ee (ssname ss i))            
  41.         (setq lalst (getlalst) lalst1 nil)
  42.         (setq enlst (getenpro ee)
  43.                 co  (cadr enlst);图元颜色
  44.                 lsty (caddr enlst);图元线型
  45.         )
  46.         (if (member enlst lalst )
  47.                 nil
  48.                 (progn
  49.                         (foreach a        lalst
  50.                                 (if (equal (cdr enlst) (cdr a)) (setq lalst1  (cons a lalst1)))
  51.                         );颜色线型相同的层,可能有多个
  52.                         (if lalst1
  53.                                 (command "chprop" ee "" "la" (car lalst1) "")
  54.                                 (progn
  55.                                         (setq Laname(strcat "色" (rtos co 2  0)"+线" lsty ))
  56.                                         ;颜色+线型的图层名
  57.                                         (If (= (Tblsearch "layer" Laname) nil)
  58.                                                 (command "-layer"
  59.                                                         "n" Laname
  60.                                                         "c" co Laname
  61.                                                         "l" lsty Laname ""
  62.                                                 )                        
  63.                                         );;;颜色+线型取名定义新图层
  64.                                         (command "chprop" ee "" "la" Laname "")                                       
  65.                                 )
  66.                         )
  67.                 )
  68.         )
  69.         (setq i (+ i 1))
  70. )
  71. )
 楼主| 发表于 2015-12-15 17:27:12 | 显示全部楼层
尘缘一生 发表于 2015-12-15 16:38
假如2个实体,颜色与线型均相同,存在于已经存在得两个层上,我们不管它,为什么要管?有必要吗? ...

没法用图表示,我有一红色实体线,和一红色轴线,用哪个按色分层(一楼我发的代码),它却生成个新层,把这2个实体都收进去,却同时变成了实线,大错特错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 00:29 , Processed in 0.250121 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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