Ahankhah 发表于 2022-7-6 07:32:56

图层过滤器特性

大家好,
有没有办法定义一个属性过滤器,让lyers排除一些模式?
 
(假设要隐藏以“3D”开头的层,wcmatch函数中的匹配模式是“~3D*”…)
 
感谢您的帮助。

Lee Mac 发表于 2022-7-6 07:41:31

下面是一个供您考虑的示例:
 

(defun c:addfilter ( / dc fn xd )
   
   (setq fn "No 3D")
   
   (if
       (and
         (setq xd
               (cdr
                   (assoc 360
                     (entget
                           (cdr
                               (assoc 330
                                 (entget
                                       (tblobjname "LAYER" "0")
                                 )
                               )
                           )
                     )
                   )
               )
         )
         (or (setq dc (cdr (assoc -1 (dictsearch xd "ACAD_LAYERFILTERS"))))
               (setq dc
                   (dictadd xd "ACAD_LAYERFILTERS"
                     (entmakex
                        '(
                               (0 . "DICTIONARY")
                               (100 . "AcDbDictionary")
                               (280 . 0)
                               (281 . 1)
                           )
                     )
                   )
               )
         )
         (null (dictsearch dc fn))
       )
       (dictadd dc fn
         (entmakex
               (list
                  '(0 . "XRECORD")
                  '(100 . "AcDbXrecord")
                  '(280 . 1)
                   (cons 1 fn)
                  '(1 . "~3D *")
                  '(1 . "*")
                  '(1 . "*")
                  '(70 . 0)
                  '(1 . "*")
                  '(1 . "*")
                  '(-3
                     (
                           "ACAD"
                           (1000 . "( NAME== \"~3D *\" )")
                     )
                   )
               )
         )
       )
   )
   (princ)
)

Ahankhah 发表于 2022-7-6 07:49:34

李,非常感谢。
 
这是非常有用的,绝对是我要求的代码,但我在修改您的程序以定义一个过滤器以包括一些模式并排除一些其他模式时遇到了一个问题。
 
例如,当我定义一个过滤器以包括“2D*”并排除“3D”时,我改变了模式“3D*,2D*”,但它不起作用。
我的复习有什么问题?
 
 

Lee Mac 发表于 2022-7-6 07:54:11

 
据我所知,我不认为图层特性过滤器的“名称”字段可以处理具有多个模式的通配符(每个模式必须作为过滤器的新规则输入,然后使用包含或逻辑门处理规则)。
 
但是,由于层名称不能同时以“2D*”和“3D*”开头,因此过滤器只需为“2D*”即可仅包含带有此前缀的层,因此自动排除带有“3D*”前缀的层。

BIGAL 发表于 2022-7-6 08:02:13

这有点过时,但你可以用-LA来做同样的事情-la off 2d*T 3d*on 1d*

Ahankhah 发表于 2022-7-6 08:10:53

 
李,你说得对。我的例子并不好。让我一步一步地解释我的问题:
 
首先,我想确认您的代码是否正常,问题可能是由于AutoCAD的错误。
 
 
 
假设您有一个包含以下图层的图形:
[列表]
[*]“3D门建筑”
[*]“3D窗户建筑”
[*]“2D门建筑”
[*]“2D窗户建筑”
[*]“3D HVAC机械”
[*]“2D HVAC机械”
[*]“门建筑”
[*]“窗户建筑”
[*]“HVAC机械”
[*]“柱结构”
[*]“梁结构”
[*]...
1-要定义一个过滤器来显示与“*-architecture”匹配的层,使用“*-architecture”,您的代码运行良好。
 
2-要定义一个过滤器来隐藏与“*-架构”匹配的层,使用“~*-架构”,代码运行良好。
 
3-要定义一个过滤器来显示与“*-架构”或“*-结构”匹配的层,使用“*-架构,*-结构”,代码可以正常工作。
 
4-要定义过滤器以显示与“*-架构”或“3D*”匹配的层,使用“*-架构,3D*”,代码无法按预期工作。
 
5-要定义一个过滤器来隐藏匹配“*-架构”或“*-结构”的层,使用“~*-架构,~*-结构”,代码不起作用。
 
6-要定义一个过滤器来隐藏匹配“*-架构”的层或显示匹配“3D*”的层,使用“~*-架构,3D*”,代码不起作用。
(???)
 
有什么建议吗?
 
图层过滤器示例。图纸

Ahankhah 发表于 2022-7-6 08:16:21

BIGAL,我不想关闭图层。事实上,图层过滤器在图层“下拉菜单”或“图层窗口”中隐藏图层。

Lee Mac 发表于 2022-7-6 08:22:58

 
对于图形中的此过滤器,您将“Architectural”误贴为“Aechitectural”
 
 
由于过滤器中的每个规则都是使用OR逻辑应用的,“~*-架构”规则将允许“-Structural”层,类似地,“~*-Structural”规则将允许“-Structural”层,因此两者都将保留。
 
您需要使用:“(*-架构,*-结构)”来排除两者,但是,此过滤器将存储在ACLYDICTIONARY字典中,而不是ACAD\u LAYERFILTERS字典中,因此需要不同的代码。
 
 
如果我理解了你的意图,我认为这是不可能的,因为这需要逻辑:即排除“*-架构”并包括“3D*”

Ahankhah 发表于 2022-7-6 08:32:38

 
 
 

Lee Mac 发表于 2022-7-6 08:34:09

非常欢迎你,阿汉哈,我希望你能从我的简单示例中了解更多关于字典结构的信息
页: [1]
查看完整版本: 图层过滤器特性