HEJINC 发表于 2022-7-6 09:40:02

检查是否存在层

我正在尝试创建if/then/else命令语句。我创建了两套lisp例程。一组用于打开/关闭外部参照dwg中的图层,另一组用于冻结和解冻视口中的图层,具体取决于它们应用于的规程。
 
模型空间打开/关闭lisp
 
(defun c:LAYFLR ()
(COMMAND "LAYER" "SET" "0" "")
(COMMAND "LAYER" "ON" "*A-AC" "ON" "A-AC" "")
(COMMAND "LAYER" "ON" "*A-AC-ATTIC" "ON" "A-AC-ATTIC" "")
(COMMAND "LAYER" "ON" "*A-AC-EXT" "ON" "A-AC-EXT" "")
(COMMAND "LAYER" "ON" "*A-ACC" "ON" "A-ACC" "")
(COMMAND "LAYER" "ON" "*A-ACC-EXT" "ON" "A-ACC-EXT" "")
(COMMAND "LAYER" "ON" "*A-ACC-UPPR" "ON" "A-ACC-UPPR" "")

 
 
图纸空间冻结/解冻lisp
 
(defun c:LAYFLRVP ()
(COMMAND "LAYER" "SET" "0" "")
(COMMAND "VPLAYER" "T" "*A-AC" "C" "")
(COMMAND "VPLAYER" "T" "*A-AC-ATTIC" "C" "")
(COMMAND "VPLAYER" "T" "*A-AC-EXT" "C" "")
(COMMAND "VPLAYER" "T" "*A-ACC" "C" "")
(COMMAND "VPLAYER" "T" "*A-ACC-EXT" "C" "")
(COMMAND "VPLAYER" "T" "*A-ACC-UPPR" "C" "")

 
 
现在,我在这里展示了lisp的一部分,我使用了大约100个层。然后*用于提取外部参照的dwg名称。
 
我的问题是顶部lisp,因为即使外部参照dwg中不存在图层,模型空间也可以完美地工作。但是,对于图纸空间,底部的lisp可以工作,但如果dwg中缺少图层,则会在命令行崩溃
 
我想创建一个if/then/else状态!
检查某个层是否存在,如果存在,则冻结或解冻它,如果不存在,则跳到下一个if/then/else语句。
 
我该怎么做。我的lisp知识有限且自学成才
 
请帮忙
 
HEJINC公司

irneb 发表于 2022-7-6 09:52:04

请参阅(tblsearch“LAYER”“LayerName”)函数。如果层不存在,则返回nil,因此可以在if/cond中使用它。

HEJINC 发表于 2022-7-6 09:56:10

谢谢你的回复。我对此做了一些web搜索,找到了(tblsearch“LAYER”“LayerName”)的参考。此外,我以前没有创建任何if/cond语句。这就是我为什么发这个帖子的原因,我不知道如何将它们组合成一个有效的声明,哈哈

David Bethel 发表于 2022-7-6 10:02:18

对于批处理层工作,可以使用以下内容:
 

(defun c:batchlay (/ laylist)

(setq laylist '("1D" "2D" "3D"))

(command "_.LAYER" "_Unlock" "0" "_ON" "0" "_Thaw" "0" "_Set" "0")
(foreach l laylist
   (if (tblsearch "LAYER" l)
       (command "_Unlock" l "_Thaw" l "_On" l)
       (princ)))
(command "")

(prin1))

 
 
只需根据需要更改laylist和命令-大卫

irneb 发表于 2022-7-6 10:06:56

不用太担心。。。它们一点也不难。
 
假设您正在寻找一个名为a-ACC-UPPR的层。
对于第二项,可以将其视为一组语句(如果其第一项的计算结果不是nil,则其中一个语句将执行):
正如你所见,cond比if更全面。只是不需要将几个if嵌套在一起,也不需要任何程序将几个lisp调用组合成一个Then/Else部分。
 
当您想用*通配符匹配测试层名称时,您的特定系统将变得有点困难。不幸的是,tblsearch无法处理此问题。另一种方法是使用tblnext方法依次遍历每一层的DXF代码。然后使用wcmatch函数测试其DXF代码2(即层名称),该函数使用*通配符(刚才它也区分大小写,因此在检查之前,您可能还希望使用strcase将所有内容更改为大写)。
 
另一种选择是:
现在,您可以在自己的代码中使用该定义:
对其他人重复上述步骤。
 
注意,这不是最有效的方法。实际上,我会浏览一次层列表(使用cons函数将它们的所有名称提取到一个列表中)。然后,每次检查另一层的存在时,通过该列表将比使用tblnext快得多。

HEJINC 发表于 2022-7-6 10:13:49

谢谢你的回复,你肯定比我更了解这一点,我在建筑和cad绘图方面的专业知识。但我喜欢用时间创造东西。
 
再次感谢你的帮助。
 
我认为你最后的选择会最有效,因为“外卡”。我在区分大小写的部分下。这不是问题。我将使用layerWCmatch尝试最后一个选项。现在肯定还有什么事。我希望这不是在我的头上,哈哈
 
但基本上我会有一个Lisp程序的LAYFLRVP。lsp“层地板视点”
然后定义“layerWCmatch”,首先,正如您编码的那样
然后为每一层编写一条IF语句,第二步,正如您编码的那样
 
????
再次感谢你的帮助
 
HEJINC公司

irneb 发表于 2022-7-6 10:19:27

那就行了。LayerWCMatch只需从某处加载即可正确运行。如果它与您使用它的代码在同一个LSP文件中,您可以确定它总是在需要时加载的。您可以将其保存在另一个文件中,并在您自己的文件中的某个位置进行(加载“路径/文件名”)调用,或者自动加载另一个文件。你想做什么由你决定。
 
我在各种文件中有很多这样的助手函数,我只需要在需要时加载它们。否则,每次打开DWG时,我都必须加载1000个LSP文件。更糟糕的是,在不同的LSP中有1000个相同defun的副本。
 
至于把代码放在你的前面。。。其实没有必要。它需要在代码运行之前加载,即在用户键入命令(或单击按钮)之前。所以它甚至可能在同一LSP中的代码之后。或者,您可以在某个ifs中使用它之前,在您的defun中对其外部文件进行加载调用-这样,它只会在实际使用时加载。
 
顺便说一句,我也主要从事建筑与制图-但我认为我的B.Com(信息系统)在编程方面帮了我很多。不仅仅是在这里(和其他论坛)为自己测试东西和提问——这通常比一个无私的讲师教得好得多

HEJINC 发表于 2022-7-6 10:24:28

我是一名绘图员,我7次考试中有4次考完了。我也是我所在办公室的cad经理。我为我的cad创建了一个自定义菜单程序。我甚至还用了一个12x12的平板电脑和一个冰球。我有一个大约有800个按钮的平板电脑;常规命令、用于绕过重复输入的自定义命令、图层的快捷方式等。这些年来,我创造了自己的做事方式,让我的生活在绘图时变得更轻松。我拥有的大多数LISP文件都是几年前从别人那里得到的。我已经把其中的一些编辑成了另外一两个版本。我自己创造了一些,但并没有比我发布的内容复杂多少。我所有的知识都来自于环顾四周,玩游戏&几年前我有一些Lisp程序的病变,我只是不完全理解。因此,即使是帖子内容也令人困惑。但这是现在教更多,所以谢谢
 
我再解释一下我是怎么做的
 
我有一个基本dwg(外部参照到另一个dwg)和我所有适用的元素,arch,frmg,fndn,elec,mech,civil。现在,我有一套lisp(我2年前创建的mspace-onse),用于打开或关闭不适用于我想要展示的学科的层。(例如:平面图,只有拱门。相关层显示,少数例外,但大多数结构材料是关闭的)。现在,当我在一张纸上写下2条规则时。例如,电气和机械,我可以在Pspace中创建两个视口,单击每个视口,然后运行相应的lisp。所以必须记住哪一层是为哪一个规程打开或关闭的。这就是我要做的
 
因为我不需要在每个规程的每个lisp文件中加载“layerWCwatch”。我可以创建一个单独的lisp“LAYERWC”。使用您的代码来编写lisp。
 
加载acad时,我使用主lisp文件。在该文件中,我为每个lisp文件添加了所有希望加载的lisp,而不是使用启动套件。下面显示的是我将添加到启动lisp中的内容。所以它是在启动时加载的
 
(自动加载“LAYERWC”(“LayerWCMatch”))
 
然后,我将为视口创建新的Lisp,每个规程一个。列出其中的每一层。我在下面以2为例,而不是我使用的100多个
 
(定义C:LAYFLRVP()
(if(LayerWCMatch“*A-AC”)
(命令“VPLAYER”“F”“*A-AC”“C”“))
(if(LayerWCMatch“*A-WALL-CMU”)
(命令“VPLAYER”“T”“*A-WALL-CMU”“C”“))
)
 
每一层都必须单独控制。没有足够的空间来解释,如果你和我一起坐在我的桌子上,我可以在5到10分钟内带你去。I图片胜过千言万语J
 
这样行吗。为了这个项目,我费了好大的劲,哈哈J
再次感谢

irneb 发表于 2022-7-6 10:29:35

如果自动装弹机没有弄错德芬的名字,那就完美了。我为自己的钱包重新编写了自动运行程序,你可以在我为开源项目(Caddons)设计的菜单系统中看到它的一个示例。基本上,我有一个MNL文件,如果安装了CUI,它会自动加载。然后在其中,Caddons:AutoLoad-defun执行您想要执行的操作(即,由于defun调用而自动加载,而不是defun名称前缀为c的命令调用)。参见Caddons中的第182行。MNL文件。它进一步检查了CUI的加载位置,因此不需要将该文件夹放在“选项”中的“支持文件夹”中:这使安装更加简单。
 
对于这一个文件来说,这可能太多了。因此,我只需在基本LSP中添加一个普通(加载“LAYERWC”)。这将是最简单的,尤其是因为这是一个如此小的defun。

HEJINC 发表于 2022-7-6 10:37:19

我正要回到网站,因为网站已经关闭了。
 
现在我正在从cad 2006转换到2010,所以当我有机会尝试时,我会告诉你会发生什么
 
再次感谢你的帮助
页: [1] 2
查看完整版本: 检查是否存在层