乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 159|回复: 15

[编程交流] LISP用于指定图层颜色

[复制链接]

1

主题

2

帖子

0

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 17:31:05 | 显示全部楼层 |阅读模式
大家好,
 
我正在使用Map 3D导入大量。shp文件以设置我的基本文件。我遇到的问题是,所有的对象都带有“白色”的层颜色。通过查看图形,很难知道对象位于哪一层。
 
我的想法是一个LISP,它会为每个层指定一种颜色,可能只是前六种颜色。它最终会看起来像下面这样。。。
 
BLDG_1695_1160C——颜色1
Default_BASEBALL--颜色2
Default\u Basketball\u FUTURE--颜色3
Default_BLDG_1695_1155A--颜色4
Default_BLDG_1695_1155B--颜色5
Default\u BLDG\u 1695\u 1160B--颜色6
Default\u BLDG\u 1695\u 1160C--颜色1
默认_边界--颜色2
Default\u CENTERROW--颜色3
Default\u CONINDEXDES--颜色4
Default\u CONINTERDES--颜色5
默认_上下文--颜色6
Default\u ESMT--颜色1
Default_EXEDGPVMT--颜色2
是否有LISP将为图层指定不同的颜色?
 
提前感谢
 
托尼
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
362
发表于 2022-7-6 17:36:17 | 显示全部楼层
你想要随机的颜色还是预定的颜色?
 
下面将为每个层指定不同的颜色(按1-255的顺序)。如果您想要随机颜色,在lisp中有一个随机数生成器。如果你想要每个层有一个特定的颜色,那么你必须建立一些映射列表,这样它就会知道每个层使用什么颜色。
 
  1. (vl-load-com)
  2. (defun C:Lcolor ( / c x)
  3. (setq c 1)
  4. (vlax-for
  5.    x
  6.    (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object)))
  7.    (vla-put-Color x c)
  8.    (if (eq c 255)
  9.      (setq c 1)
  10.      (setq c (1+ c))
  11.    )
  12. )
  13. )
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 17:40:52 | 显示全部楼层
试试这个。必须解锁并解冻列表中的所有层。
 
  1. (defun c:layd(/ Lst curLay fLst laySet)
  2. (setq Lst (list
  3. '("BLDG_1695_1160C" 1)
  4. '("Default_BASEBALL" 2)
  5. '("Default_BASEBALL_FUTURE" 3)
  6. '("Default_BLDG_1695_1155A" 4)
  7. '("Default_BLDG_1695_1155B" 5)
  8. '("Default_BLDG_1695_1160B" 6)
  9. '("Default_BLDG_1695_1160C" 1)
  10. '("Default_BOUNDARY" 2)
  11. '("Default_CENTERROW" 3)
  12. '("Default_CONINDEXDES"        4)
  13. '("Default_CONINTERDES" 5)
  14. '("Default_CONTEXTDES" 6)
  15. '("Default_ESMT" 1)
  16. '("Default_EXEDGPVMT" 2)
  17. ); end list
  18. ); end setq
  19. (vl-load-com)
  20. (foreach lay Lst
  21.    (if
  22.      (not
  23. (vl-catch-all-error-p
  24.   (setq curLay(vl-catch-all-apply 'vla-Item
  25.      (list(vla-get-Layers
  26.              (vla-get-ActiveDocument
  27.                   (vlax-get-acad-object)))(car lay))))))
  28.      (progn
  29. (vla-put-Color curLay(cadr lay))
  30. (setq fLst(list(cons 8(vla-get-Name curLay))))
  31. (if
  32.   (setq laySet(ssget "_X" fLst))
  33.   (progn
  34.     (foreach itm
  35.              (mapcar 'vlax-ename->vla-object
  36.                       (vl-remove-if 'listp
  37.                         (mapcar 'cadr(ssnamex laySet))))
  38.       (vla-put-Color itm acByLayer)
  39.     ); end foreach
  40.   ); end if
  41. ); end progn
  42.    ); end progn
  43. ); end if
  44. ); end foreach
  45. (princ)
  46. ); end of c:layd
回复

使用道具 举报

18

主题

65

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
107
发表于 2022-7-6 17:43:11 | 显示全部楼层
我们可以将材质名称附加到特定层,然后使用lisp进行渲染,而不是将颜色附加到层
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 17:47:12 | 显示全部楼层
>萨姆萨1
 
已阅读您的PM:
 
  1. (defun c:pumat(/ Lst sSet mLst cMat sCnt lCnt mCnt eCnt)
  2. (vl-load-com)
  3. (setq Lst (list
  4.        '("0" "Global")
  5.        '("Layer1" "Material 1")
  6.        '("Layer2" "Material 2")
  7.      ); end list
  8.            ); end setq
  9. (vl-load-com)
  10. (if(setq sSet(ssget "_X" '((0 . "*SOLID"))))
  11. (progn
  12.    (setq sCnt 0 lCnt 0)
  13.    (vlax-for mat (vla-get-Materials
  14.            (vla-get-ActiveDocument
  15.              (vlax-get-acad-object)))
  16.      (setq mLst(cons(vla-get-Name mat)mLst))
  17.      ); end vlax-for
  18.    (foreach itm
  19.        (mapcar 'vlax-ename->vla-object
  20.          (vl-remove-if 'listp
  21.            (mapcar 'cadr(ssnamex sSet))))
  22.       (if(setq cMat
  23.                 (cadr
  24.                   (assoc
  25.                     (setq cLay(vla-get-Layer itm))Lst)))
  26.         (if(member cMat mLst)
  27.           (if(vl-catch-all-error-p
  28.                (vl-catch-all-apply 'vla-put-Material
  29.                  (list itm cMat)))
  30.             (setq lCnt(1+ lCnt))
  31.             (setq sCnt(1+ sCnt))
  32.             ); end if
  33.           (if(not(member cMat mCnt))
  34.            (setq mCnt(cons cMat mCnt))
  35.             ); end if
  36.           ); end if
  37.         (if(not(member cLay eCnt))
  38.           (setq eCnt(cons cLay eCnt))
  39.           ); end if
  40.        );end if
  41.     ); end foreach
  42.    (if(or(/= 0 lCnt)(/= 0(length mCnt))(/= 0(length eCnt)))
  43.      (progn
  44. (princ "\n========================= ERROR LIST =========================\n")
  45. (if(/= 0(length mCnt))
  46.   (progn
  47.     (princ "\nFollowing materials missed in drawing: \n")
  48.     (foreach mat mCnt
  49.       (princ(strcat "\n " mat))
  50.       ); end foreach
  51.     (princ "\n")
  52.     ); end progn
  53.   ); end if
  54.       (if(/= 0(length eCnt))
  55.   (progn
  56.     (princ "\nSome solid layers missed in list: \n")
  57.     (foreach lay eCnt
  58.       (princ(strcat "\n " lay))
  59.       ); end foreach
  60.     (princ "\n")
  61.     ); end progn
  62.   ); end if
  63. (if(/= 0 lCnt)
  64.    (princ(strcat "\n" (itoa lCnt) " were on locked layer!\n"))
  65.   ); end if
  66. (princ "\n========================== END LIST ==========================\n")
  67. (textscr)
  68. ); end progn
  69.      ); end if
  70.              (princ(strcat "\n<<< Materials are appropriated for "
  71.               (itoa sCnt) " of "
  72.               (itoa(sslength sSet)) " solids >>>"))
  73.    ); end progn
  74. (princ "\n<!> No Solids Found <!> ")
  75. ); end if
  76. (princ)
  77. ); end of c:pumat
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 17:53:53 | 显示全部楼层
你已经完成了3/4,也许一个脚本就可以了
 
-图层
颜色1 BLDG_1695_1160C
颜色2 Default\u BASEBALL
颜色3 Default\u Basketball\u FUTURE
颜色4 Default\u BLDG\u 1695\u 1155A
等等等等
Default_BLDG_1695_1155B--颜色5
Default\u BLDG\u 1695\u 1160B--颜色6
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 17:56:11 | 显示全部楼层
>比加尔
 
最后一个家伙想将材料附着到某些层上的实体上,你能用脚本实现吗?
回复

使用道具 举报

18

主题

65

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
107
发表于 2022-7-6 18:02:41 | 显示全部楼层
嗨,阿斯米,
 
谢谢你的回复。运行脚本时,显示以下错误:,
 
错误:没有函数定义:VLA-GET-MATERIALS
 
你能帮忙解决这个问题吗。
 
当做
萨姆萨1
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 18:03:55 | 显示全部楼层
哎呀!
 
让我高兴。请在文件的开头或结尾添加(vl load com)表达式。VLA函数没有它就无法工作。或者再次复制列表。我只是补充一下。
回复

使用道具 举报

18

主题

65

帖子

49

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
107
发表于 2022-7-6 18:08:51 | 显示全部楼层
在开始时添加(vl load com)后,我仍然得到相同的错误。。
我对lisp的了解是nill
 
这就是我修改的地方
 
(定义c:pumat(/Lst sSet mLst cMat sCnt lCnt mCnt eCnt)
(vl load com)
(setq Lst(列表
“(“Layer1”“APE BUMP”)
 
); 结束列表
); 结束setq
 
 
VLA-GET-MATERIALS是我再次遇到的错误
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 13:34 , Processed in 0.615333 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表