乐筑天下

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

[编程交流] Lisp发送*显示*颜色

[复制链接]

4

主题

22

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:45:37 | 显示全部楼层 |阅读模式
首先,我想感谢用户“irneb”完成了代码的第一部分,该部分根据对象的显示颜色选择对象。
 
通过使用它,我添加了将这些对象发送回的功能。在我们的绘图表中,我们希望所有屏幕小于100%的对象都打印在所有实心黑线的“下方”,这就实现了这一点。
 
也就是说,有没有更好的方法来编码代码的较低部分?我是新来的,很难做到这一点,但我相信有一种更有效的方式来完成上述任务。最后,这种方法不包括块内的线——有没有办法将“颜色15”和“颜色17”(不是BYLAYER,块内的所有线都在第0层)发送回图形中的所有块内?我试了好几次都没用。谢谢你的帮助!!
 
  1. ;Shade2Back
  2. (defun c:s2b()
  3. (defun ssfilter-by-color (color / lay layers)
  4. ;; Get all the layer names which are set to the color
  5. (setq lay    (tblnext "LAYER" t) ;Get the 1st layer
  6.        layers "" ;Initialize the layer names filter string
  7. )
  8. (while lay ;Step through all layers
  9.    ;; Check if current layer is set to color
  10.    (if (= (cdr (assoc 62 lay)) color)
  11.      (setq layers (strcat "," (cdr (assoc 2 lay)) layers)) ;Add to filter string
  12.    )
  13.    (setq lay (tblnext "LAYER")) ;Get the next layer
  14. )
  15. (if (= layers "")
  16.    (list (cons 62 color))
  17.    (list '(-4 . "<OR")
  18.          '(-4 . "<AND")
  19.          (cons 8 (substr layers 2))
  20.          '(62 . 256)
  21.          '(-4 . "AND>")
  22.          (cons 62 color)
  23.          '(-4 . "OR>")
  24.    )
  25. )
  26. )
  27. (setq ss13 (ssget "_x" (ssfilter-by-color 13)))
  28. (setq ss15 (ssget "_x" (ssfilter-by-color 15)))
  29. (setq ss17 (ssget "_x" (ssfilter-by-color 17)))
  30. (setq ss23 (ssget "_x" (ssfilter-by-color 23)))
  31. (setq ss24 (ssget "_x" (ssfilter-by-color 24)))
  32. (setq ss26 (ssget "_x" (ssfilter-by-color 26)))
  33. (command "_draworder" ss17 "" "_back")
  34. (command "_draworder" ss15 "" "_back")
  35. (command "_draworder" ss13 "" "_back")
  36. (command "_draworder" ss23 "" "_back")
  37. (command "_draworder" ss24 "" "_back")
  38. (command "_draworder" ss26 "" "_back")
  39. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:49:01 | 显示全部楼层
您是否要求按特定顺序(根据您当前的代码)将具有各种颜色(13、15、17等)的对象发送到后面,或者只是要求所有此类对象显示在图形中其他对象的下方?
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 16:54:59 | 显示全部楼层
我想我更倾向于这样的事情:
 
  1. [b][color=BLACK]([/color][/b]defun c:db-s2b [b][color=FUCHSIA]([/color][/b]/ cl td c l str ss[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq td [b][color=MAROON]([/color][/b]tblnext [color=#2f4f4f]"LAYER"[/color] [b][color=GREEN]([/color][/b]not td[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  3.         [b][color=NAVY]([/color][/b]setq c [b][color=MAROON]([/color][/b]cdr [b][color=GREEN]([/color][/b]assoc 62 td[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  4.               l [b][color=MAROON]([/color][/b]cdr [b][color=GREEN]([/color][/b]assoc 2 td[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  5.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]assoc c cl[b][color=MAROON])[/color][/b]
  6.             [b][color=MAROON]([/color][/b]setq cl [b][color=GREEN]([/color][/b]subst [b][color=BLUE]([/color][/b]cons c [b][color=RED]([/color][/b]strcat [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc c cl[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] [color=#2f4f4f]","[/color] l[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  7.                             [b][color=BLUE]([/color][/b]assoc c cl[b][color=BLUE])[/color][/b] cl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  8.             [b][color=MAROON]([/color][/b]setq cl [b][color=GREEN]([/color][/b]cons [b][color=BLUE]([/color][/b]cons c l[b][color=BLUE])[/color][/b] cl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  9. [b][color=FUCHSIA]([/color][/b]foreach v '[b][color=NAVY]([/color][/b]13 15 17 23 24 26[b][color=NAVY])[/color][/b]
  10.    [b][color=NAVY]([/color][/b]and [b][color=MAROON]([/color][/b]setq str [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc v cl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  11.         [b][color=MAROON]([/color][/b]setq ss [b][color=GREEN]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]cons 8 str[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  12.         [b][color=MAROON]([/color][/b]command [color=#2f4f4f]"_.DRAWORDER"[/color] ss [color=#2f4f4f]""[/color] [color=#2f4f4f]"_Back"[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  13. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
您只需通过图层表一次。
 
-大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:56:58 | 显示全部楼层
或者,如果发送到后面的层的顺序无关紧要:
  1. (defun c:s2b-lm ( / sel )
  2.    (if (setq sel (ssget "_X" (getfilter '(13 15 17 23 24 26))))
  3.        (command "_.draworder" sel "" "_b")
  4.    )
  5.    (princ)
  6. )
  7. (defun getfilter ( lst / def rtn )
  8.    (while (setq def (tblnext "layer" (not def)))
  9.        (if (member (abs (cdr (assoc 62 def))) lst)
  10.            (setq rtn (vl-list* "," (cdr (assoc 2 def)) rtn))
  11.        )
  12.    )
  13.    (append
  14.       '((-4 . "<OR"))
  15.        (mapcar '(lambda ( x ) (cons 62 x)) lst)
  16.        (if rtn
  17.            (append
  18.               '((-4 . "<AND"))
  19.                (list (cons 8 (apply 'strcat (cdr rtn))) '(62 . 256))
  20.               '((-4 . "AND>"))
  21.            )
  22.        )
  23.       '((-4 . "OR>"))
  24.    )
  25. )

以上未经测试。
回复

使用道具 举报

4

主题

22

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:58:55 | 显示全部楼层
非常感谢您的帮助,以上两个代码都可以工作,而且非常干净、快速!!我确实喜欢David的代码按特定顺序将颜色发送回,例如,它可以将深色阴影线放在浅色阴影线的顶部。
 
我仍然不确定你如何在一幅图的所有块中都能做到这一点,最接近的例子是在一篇帖子中,它在块内发送“wipeout”。李的这段代码是否可以修改为将特定的颜色发送到背面?我试过了,但似乎没能成功。如果有什么不同的话,我需要发送到后面的唯一颜色是块内的15,而不是BYLAYER,是(cons 62.15)(??)。再次感谢,我已经摸索了一个多星期了,但没有取得多大成功。
 
>>>>>在图形中的所有块内向后发送区域覆盖的代码-
  1. (defun c:test ( / acdoc )
  2. ;; Lee Mac 20.06.11
  3. (setq acdoc (vla-get-activedocument (vlax-get-acad-object)))
  4. (vlax-for block (vla-get-blocks acdoc)
  5. (if
  6. (and
  7. (eq :vlax-false (vla-get-islayout block))
  8. (eq :vlax-false (vla-get-isxref block))
  9. )
  10. (
  11. (lambda ( / lst )
  12. (vlax-for obj block
  13. (if (eq "AcDbWipeout" (vla-get-objectname obj))
  14. (setq lst (cons obj lst))
  15. )
  16. )
  17. (if lst
  18. (vla-movetobottom (LM:SortentsTable block)
  19. (vlax-make-variant
  20. (vlax-safearray-fill
  21. (vlax-make-safearray vlax-vbobject (cons 0 (1- (length lst)))) lst
  22. )
  23. )
  24. )
  25. )
  26. )
  27. )
  28. )
  29. )
  30. (vla-regen acdoc acallviewports)
  31. (princ)
  32. )
  33. (defun LM:SortentsTable ( space / dict result )
  34. (cond
  35. (
  36. (not
  37. (vl-catch-all-error-p
  38. (setq result
  39. (vl-catch-all-apply 'vla-item
  40. (list (setq dict (vla-GetExtensionDictionary space)) "ACAD_SORTENTS")
  41. )
  42. )
  43. )
  44. )
  45. result
  46. )
  47. ( (vla-AddObject dict "ACAD_SORTENTS" "AcDbSortentsTable") )
  48. )
  49. )
  50. (vl-load-com) (princ)
回复

使用道具 举报

4

主题

22

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:04:33 | 显示全部楼层
有人接受吗?我真的很想能够发送所有实体与颜色15回。我附上了两张图片,表达了这是一个问题的原因。将其乘以20或30个单独的块名和多达20个图形。。。。任何帮助都将不胜感激!
 

                               
登录/注册后可看大图


                               
登录/注册后可看大图
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:04:54 | 显示全部楼层
我对字典的了解还不够。
 
我想我可以收集所有的ename并添加/修改/操作字典定义-大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:07:56 | 显示全部楼层
请尝试以下操作:
  1. ;; Colour to Back  -  Lee Mac
  2. ;; Sends all objects of a specific colour (object colour/layer colour) to the back of the draw order.
  3. (defun c:col2back ( / *error* col doc lac lck )
  4.    (setq col 15) ;; Colour to send to back
  5.    
  6.    (vlax-for lay (vla-get-layers (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  7.        (if (= :vlax-true (vla-get-lock lay))
  8.            (vla-put-lock (car (setq lck (cons lay lck))) :vlax-false)
  9.        )
  10.        (if (= col (vla-get-color lay))
  11.            (setq lac (cons (vla-get-name lay) lac))
  12.        )
  13.    )
  14.    (vlax-for blk (vla-get-blocks doc)
  15.        (if (= :vlax-false (vla-get-isxref blk))
  16.            (   (lambda ( / lst )
  17.                    (vlax-for obj blk
  18.                        (if (or (and (= acbylayer (vla-get-color obj)) (member (vla-get-layer obj) lac))
  19.                                (= col (vla-get-color obj))
  20.                            )
  21.                            (setq lst (cons obj lst))
  22.                        )
  23.                    )
  24.                    (if lst
  25.                        (vlax-invoke
  26.                            (vla-addobject
  27.                                (vla-getextensiondictionary blk)
  28.                                "acad_sortents"
  29.                                "acdbsortentstable"
  30.                            )
  31.                            'movetobottom lst
  32.                        )
  33.                    )
  34.                )
  35.            )
  36.        )
  37.    )
  38.    (foreach lay lck (vla-put-lock lay :vlax-true))
  39.    (vla-regen doc acallviewports)
  40.    (princ)
  41. )
  42. (vl-load-com) (princ)
回复

使用道具 举报

4

主题

22

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:12:44 | 显示全部楼层
李,我疯了!我让办公室里的每个人都对这件事垂涎三尺——多年来,这一直是一件让人恼火的事,没有人敢处理它。非常感谢CADtutor和这里愿意帮助他人的杰出人士!再次感谢李和大卫的帮助!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:15:01 | 显示全部楼层
很高兴听到jweber的演讲,我很高兴这个项目对你的工作很有用-谢谢你的感谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 14:08 , Processed in 0.420580 second(s), 72 queries .

© 2020-2025 乐筑天下

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