乐筑天下

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

[编程交流] 如果图层exi,则更改绘制顺序

[复制链接]

2

主题

10

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:38:55 | 显示全部楼层 |阅读模式
大家好
我试图编写简短的lisp,以检查层(在lisp中指定)是否存在,如果存在,请更改其绘制顺序(将其发送到后面或前面)。我组合了另外两个LISP,它们都工作得很好,但发现现在不工作了:“错误:函数不好:”
 
代码如下:
 
  1. (defun C:cdo( );  Correct Draw Order
  2. (progn
  3. (if (tblsearch "LAYER" "l1");test if layer exists
  4. (
  5. (setq la1 (ssget "X" '((8 . "l1"))))
  6. (command "draworder" la1 "" "F")
  7. );else
  8. (command "");do this
  9. );end if
  10. (princ)
  11. )
  12. )

 
我没有在“else”后面放任何东西,但是即使层存在,也会出现错误。这一定很简单,但我感到困惑,无法找到自己的错误。有人能帮我指出吗?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 22:48:45 | 显示全部楼层
  1. (defun c:SendLayerToBack (/ ss)
  2. (if (setq ss (ssget "_x" '((8 . "L1"))))
  3.    (progn
  4.      (sssetfirst nil ss)
  5.      (ai_draworder "_b")
  6.    )
  7.    (prompt "\n** Layer not found ** ")
  8. )
  9. (princ)
  10. )
  11. (defun c:BringLayerToFront (/ ss)
  12. (if (setq ss (ssget "_x" '((8 . "L1"))))
  13.    (progn
  14.      (sssetfirst nil ss)
  15.      (ai_draworder "_f")
  16.    )
  17.    (prompt "\n** Layer not found ** ")
  18. )
  19. (princ)
  20. )
回复

使用道具 举报

2

主题

10

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 23:03:34 | 显示全部楼层
感谢您的快速回复。你的代码工作完美:)我只是想知道我做错了什么?你能告诉我这个错误可能来自我的代码吗?这只是为了我对Lisp程序的理解。
 
再次感谢
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:05:43 | 显示全部楼层
 
不客气,鲍恩;我很乐意帮忙。
 
 
 
通过简单地检查有效的选择集,您可以验证层是否存在,以及所述层上是否存在对象-请注意,这并不检查锁定的层,这只是一个示例。一旦返回非Nil,则会在屏幕上选择之前制作的选择集,因为绘制顺序子函数(ai_draworder)需要首先进行隐式选择,然后我们调用提供必要的“back”或“front”参数的子函数来完成命令。
 
希望(更多?)立即感知。
 
干杯
回复

使用道具 举报

2

主题

10

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 23:13:26 | 显示全部楼层
好的,那么你的函数ai_draworder需要先进行选择。然而,我认为我在这两行中也做了同样的事情:
  1. (setq la1 (ssget "X" '((8 . "l1"))))
  2. (command "draworder" la1 "" "F")

 
选择la1,然后在常规draworder命令中使用它
在我添加“if”函数之前,它确实起了作用:
 
  1. (if (tblsearch "LAYER" "l1");test if layer exists

 
这是否意味着在“if”中它会以某种方式切换我的命令顺序?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:24:09 | 显示全部楼层
 
这不是我的子功能;它是AutoCAD的,在Acad20##Doc中定义。lsp
 
 
 
 
不,您对TBLSEARCH的调用返回非Nil,因此IF语句的测试表达式很好-鉴于您想要操作在所述层上找到的实体,因此没有必要,只需调用SSGET,而不是测试所述层上的有效实体选择集(如果实体被分配到该层,则隐式存在)。
 
在快速测试中,这些也可以很好地工作:
 
  1. (defun c:SendLayerToBack2 (/ ss)
  2. (if (setq ss (ssget "_x" '((8 . "L1"))))
  3.    (command "._draworder" ss "" "_b")
  4.    (prompt "\n** Layer not found ** ")
  5. )
  6. (princ)
  7. )
  8. (defun c:BringLayerToFront2 (/ ss)
  9. (if (setq ss (ssget "_x" '((8 . "L1"))))
  10.    (command "._draworder" ss "" "_f")
  11.    (prompt "\n** Layer not found ** ")
  12. )
  13. (princ)
  14. )

 
 
... 主要区别在于我的函数提供了“b”和“f”本地化选项,而上面的原始代码没有。在一个测试中,添加这个本地化选项可以“修复”代码。
 
HTH公司
回复

使用道具 举报

2

主题

10

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 23:32:52 | 显示全部楼层
再次感谢。我感谢你的帮助。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 23:47:21 | 显示全部楼层
 
不客气。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 06:35 , Processed in 0.904447 second(s), 68 queries .

© 2020-2025 乐筑天下

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