Lee Mac 发表于 2022-7-5 20:53:06

下面是一个更完整的示例,用于检索特定的图层过滤器:
 
(defun getlayerfilter ( filter / dict )
(if
   (and
   (setq dict
       (cdr
         (assoc 360
         (entget
             (cdr
               (assoc 330
               (entget (tblobjname "LAYER" "0"))
               )
             )
         )
         )
       )
   )
   (setq dict
       (cdr
         (assoc -1
         (dictsearch dict "ACAD_LAYERFILTERS")
         )
       )
   )
   )
   (dictsearch dict filter)
)
)
 
用图层过滤器的名称命名:
 
(getlayerfilter "YourLayerFilter")

Tharwat 发表于 2022-7-5 20:57:07

没错,测试的图形中没有图层过滤器。
 
我还不习惯处理层过滤器,因为我们公司处理的所有承包商都没有使用过滤器
大多数人在绘图时也不遵循图层名称,这使我只能坚持使用图层对话框。
 
因此,在添加一个过滤器到绘图后,我得到了这个,我认为它是空的。。。
 
谢谢。

Lee Mac 发表于 2022-7-5 21:00:54

为了进一步演示,下面是一个向ACAD\U LAYERFILTERS字典添加新图层特性过滤器(XRecord)的示例。如果ACAD\U LAYERFILTERS字典不存在(即,如果尚未将图层特性过滤器添加到图形中),则代码还将构建该字典。
 
(defun test ( filter / dict xdict )
(if
   (and
   (setq xdict
       (cdr
         (assoc 360
         (entget
             (cdr
               (assoc 330
               (entget (tblobjname "LAYER" "0"))
               )
             )
         )
         )
       )
   )
   (or
       (setq dict
         (cdr
         (assoc -1
             (dictsearch xdict "ACAD_LAYERFILTERS")
         )
         )
       )
       (setq dict
         (dictadd xdict "ACAD_LAYERFILTERS"
         (entmakex
            '(
               (0 . "DICTIONARY")
               (100 . "AcDbDictionary")
               (280 . 0)
               (281 . 1)
             )
         )
         )
       )
   )
   (not (dictsearch dict filter))
   )
   (dictadd dict filter
   (entmakex
       (list
         (cons 0 "XRECORD")
         (cons 100 "AcDbXrecord")
         (cons 280 1)
         (cons 1 filter)
         (cons 1 "#*")
         (cons 1 "3")
         (cons 1 "*")
         (cons 70 768)
         (cons 1 "*")
         (cons 1 "*")
         (list -3
         (list "ACAD"
             (cons 1000 "( NAME== \"#*\" ) and ( COLOR== \"3\" ) and LOCKED == \"FALSE\"")
         )
         )
       )
   )
   )
)
)
 
为清楚起见,我已将层过滤器属性硬编码到代码中,以便仅使用层过滤器名称调用该函数,即:
 
(test "MyFilter")
 
如果提供的名称(上面的“MyFilter”)在图形中尚未作为图层过滤器出现,则将向字典中添加一个新的图层过滤器。添加的图层过滤器将允许名称匹配“#*”、图层颜色为“3”且图层被解锁的图层(三个任意选择的属性用于演示)。
 
请注意,除了存储名称、颜色、线型等属性的多个DXF group 1代码外,xRecord还需要存储描述属性值的字符串的扩展数据。
 
图层过滤器的DXF代码没有文档记录,但我一路上收集了一些信息:
 

;; Layer Filter XRecord Data

The following list details the various DXF codes and values contained in the Xrecord:

1 Name of Filter
1 Layer Name
1 Color
1 Linetype
70 (Please refer further below)
1 Lineweight
1 PlotStyle

The 70 DXF code can contain one of the following numbers or an addition of them:

ON/OFF
On 1
Off 3

FREEZE/THAW
Freeze 4
Thaw 12

CURRENT VPORT
Freeze 16
Thaw 48

NEW VPORT
Freeze 64
Thaw 192

LOCK/UNLOCK
Lock 256
UnLock 768

PLOT
Plot 1024
Don't Plot 3072
 
我希望这有帮助。

Lee Mac 发表于 2022-7-5 21:01:34

 
这是dictsearch为您添加的层过滤器返回的xRecord数据(我假设您将其称为“Tharwat”)。
 
您可以使用以下工具获取XRecord的DXF组的完整列表:
 
6

Tharwat 发表于 2022-7-5 21:05:25

 
你真是太好了,除了你为我们展示的例子之外。
 
我想我必须开始学习字典,才能处理或理解像你带来的东西。
 
非常感谢。
 
塔瓦特

Lee Mac 发表于 2022-7-5 21:08:03

 
谢谢塔瓦,不客气。
 
字典是在图形中存储数据的一种非常有效的方法,因此了解如何操作字典确实非常有用。此外,布局、多重引线样式、多重引线样式、打印样式等项目都存储在字典中,如上图所示,一些对象使用扩展字典来存储其他数据。
 
还有一些Visual LISP方法用于操作字典*和其中包含的XRecords,但在我看来,使用Vanilla AutoLISP可以更容易地操作这些对象,因为可以避免使用安全数组和变体等。
 
[*查看文档对象的Dictionaries属性,以及Dictionary对象的AddObject/GetObject方法(可以被视为类似于dictadd/dictsearch函数),然后是与XRecord对象相关的Get/SetXRecordData方法,但这些方法使用相同的数据结构(DXF组)正如Vanilla等价物所使用的一样,尽管必须将其转换为整数的变体和变体的变体。]

harrison-matt 发表于 2022-7-5 21:12:13

李,
 
我已经看了上面的例子,并熟悉了那个特定的XRECORD,但我仍然在努力找出如何在过滤器中添加新的/查看现有的子过滤器。
 
谨致问候,
 
马特

Lee Mac 发表于 2022-7-5 21:15:28

马特,你具体想做什么?

harrison-matt 发表于 2022-7-5 21:17:36

目前,我有一个过滤层名称的过滤器:M-*&MK-*层,在该过滤器中,我有子过滤器,用于过滤带有*HVAC*的层,以及另一个过滤器,用于过滤*管道*等。这些子过滤器布置在第一个机械过滤器下。更多信息请参见图片。此外,我现在将这些过滤器组和属性过滤器导出到*。可以导入到对话框中的lft文件(仅在垂直产品上,即AutoCAD MEP)。我想有一个程序,当我插入我的图层块时,程序要么插入图层过滤器,要么创建它们。
 
谨致问候,
 
马特

tombu 发表于 2022-7-5 21:20:39

我想用lisp添加我的所有图层过滤器属性。从“图层过滤器”对话框复制特性适用于大多数情况。我唯一搞不懂的是“身份”。它们仅显示为图标。对于属性,我尝试了STATUS==未使用,STATUS==未使用,STATUS==未使用。两者都不起作用。
 
 
 
(getlayerfilter“NODE”)和所有使用NAME属性的方法都非常有效。
(getlayerfilter“所有未使用的层”)使用状态将不起作用。这些可以存储在单独的词典中吗?
页: 1 [2]
查看完整版本: 图层特性过滤器