乐筑天下

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

[编程交流] 检查是否存在层

[复制链接]

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:40:02 | 显示全部楼层 |阅读模式
我正在尝试创建if/then/else命令语句。我创建了两套lisp例程。一组用于打开/关闭外部参照dwg中的图层,另一组用于冻结和解冻视口中的图层,具体取决于它们应用于的规程。
 
模型空间打开/关闭lisp
 
  1. (defun c:LAYFLR ()
  2. (COMMAND "LAYER" "SET" "0" "")
  3. (COMMAND "LAYER" "ON" "*A-AC" "ON" "A-AC" "")
  4. (COMMAND "LAYER" "ON" "*A-AC-ATTIC" "ON" "A-AC-ATTIC" "")
  5. (COMMAND "LAYER" "ON" "*A-AC-EXT" "ON" "A-AC-EXT" "")
  6. (COMMAND "LAYER" "ON" "*A-ACC" "ON" "A-ACC" "")
  7. (COMMAND "LAYER" "ON" "*A-ACC-EXT" "ON" "A-ACC-EXT" "")
  8. (COMMAND "LAYER" "ON" "*A-ACC-UPPR" "ON" "A-ACC-UPPR" "")

 
 
图纸空间冻结/解冻lisp
 
  1. (defun c:LAYFLRVP ()
  2. (COMMAND "LAYER" "SET" "0" "")
  3. (COMMAND "VPLAYER" "T" "*A-AC" "C" "")
  4. (COMMAND "VPLAYER" "T" "*A-AC-ATTIC" "C" "")
  5. (COMMAND "VPLAYER" "T" "*A-AC-EXT" "C" "")
  6. (COMMAND "VPLAYER" "T" "*A-ACC" "C" "")
  7. (COMMAND "VPLAYER" "T" "*A-ACC-EXT" "C" "")
  8. (COMMAND "VPLAYER" "T" "*A-ACC-UPPR" "C" "")

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

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:52:04 | 显示全部楼层
请参阅(tblsearch“LAYER”“LayerName”)函数。如果层不存在,则返回nil,因此可以在if/cond中使用它。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:56:10 | 显示全部楼层
谢谢你的回复。我对此做了一些web搜索,找到了(tblsearch“LAYER”“LayerName”)的参考。此外,我以前没有创建任何if/cond语句。这就是我为什么发这个帖子的原因,我不知道如何将它们组合成一个有效的声明,哈哈
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:02:18 | 显示全部楼层
对于批处理层工作,可以使用以下内容:
 
  1. [b][color=BLACK]([/color][/b]defun c:batchlay [b][color=FUCHSIA]([/color][/b]/ laylist[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]setq laylist '[b][color=NAVY]([/color][/b][color=#2f4f4f]"1D"[/color] [color=#2f4f4f]"2D"[/color] [color=#2f4f4f]"3D"[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  3. [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.LAYER"[/color] [color=#2f4f4f]"_Unlock"[/color] [color=#2f4f4f]"0"[/color] [color=#2f4f4f]"_ON"[/color] [color=#2f4f4f]"0"[/color] [color=#2f4f4f]"_Thaw"[/color] [color=#2f4f4f]"0"[/color] [color=#2f4f4f]"_Set"[/color] [color=#2f4f4f]"0"[/color][b][color=FUCHSIA])[/color][/b]
  4. [b][color=FUCHSIA]([/color][/b]foreach l laylist
  5.    [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]tblsearch [color=#2f4f4f]"LAYER"[/color] l[b][color=MAROON])[/color][/b]
  6.        [b][color=MAROON]([/color][/b]command [color=#2f4f4f]"_Unlock"[/color] l [color=#2f4f4f]"_Thaw"[/color] l [color=#2f4f4f]"_On"[/color] l[b][color=MAROON])[/color][/b]
  7.        [b][color=MAROON]([/color][/b]princ[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  8. [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]""[/color][b][color=FUCHSIA])[/color][/b]
  9. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

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

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 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快得多。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

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

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 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
再次感谢
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 10:37:19 | 显示全部楼层
我正要回到网站,因为网站已经关闭了。
 
现在我正在从cad 2006转换到2010,所以当我有机会尝试时,我会告诉你会发生什么
 
再次感谢你的帮助
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 00:33 , Processed in 0.878120 second(s), 72 queries .

© 2020-2025 乐筑天下

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