如果图层exi,则更改绘制顺序
大家好我试图编写简短的lisp,以检查层(在lisp中指定)是否存在,如果存在,请更改其绘制顺序(将其发送到后面或前面)。我组合了另外两个LISP,它们都工作得很好,但发现现在不工作了:“错误:函数不好:”
代码如下:
(defun C:cdo( );Correct Draw Order
(progn
(if (tblsearch "LAYER" "l1");test if layer exists
(
(setq la1 (ssget "X" '((8 . "l1"))))
(command "draworder" la1 "" "F")
);else
(command "");do this
);end if
(princ)
)
)
我没有在“else”后面放任何东西,但是即使层存在,也会出现错误。这一定很简单,但我感到困惑,无法找到自己的错误。有人能帮我指出吗?
(defun c:SendLayerToBack (/ ss)
(if (setq ss (ssget "_x" '((8 . "L1"))))
(progn
(sssetfirst nil ss)
(ai_draworder "_b")
)
(prompt "\n** Layer not found ** ")
)
(princ)
)
(defun c:BringLayerToFront (/ ss)
(if (setq ss (ssget "_x" '((8 . "L1"))))
(progn
(sssetfirst nil ss)
(ai_draworder "_f")
)
(prompt "\n** Layer not found ** ")
)
(princ)
)
感谢您的快速回复。你的代码工作完美:)我只是想知道我做错了什么?你能告诉我这个错误可能来自我的代码吗?这只是为了我对Lisp程序的理解。
再次感谢
不客气,鲍恩;我很乐意帮忙。
通过简单地检查有效的选择集,您可以验证层是否存在,以及所述层上是否存在对象-请注意,这并不检查锁定的层,这只是一个示例。一旦返回非Nil,则会在屏幕上选择之前制作的选择集,因为绘制顺序子函数(ai_draworder)需要首先进行隐式选择,然后我们调用提供必要的“back”或“front”参数的子函数来完成命令。
希望(更多?)立即感知。
干杯 好的,那么你的函数ai_draworder需要先进行选择。然而,我认为我在这两行中也做了同样的事情:
(setq la1 (ssget "X" '((8 . "l1"))))
(command "draworder" la1 "" "F")
选择la1,然后在常规draworder命令中使用它
在我添加“if”函数之前,它确实起了作用:
(if (tblsearch "LAYER" "l1");test if layer exists
这是否意味着在“if”中它会以某种方式切换我的命令顺序?
这不是我的子功能;它是AutoCAD的,在Acad20##Doc中定义。lsp
不,您对TBLSEARCH的调用返回非Nil,因此IF语句的测试表达式很好-鉴于您想要操作在所述层上找到的实体,因此没有必要,只需调用SSGET,而不是测试所述层上的有效实体选择集(如果实体被分配到该层,则隐式存在)。
在快速测试中,这些也可以很好地工作:
(defun c:SendLayerToBack2 (/ ss)
(if (setq ss (ssget "_x" '((8 . "L1"))))
(command "._draworder" ss "" "_b")
(prompt "\n** Layer not found ** ")
)
(princ)
)
(defun c:BringLayerToFront2 (/ ss)
(if (setq ss (ssget "_x" '((8 . "L1"))))
(command "._draworder" ss "" "_f")
(prompt "\n** Layer not found ** ")
)
(princ)
)
... 主要区别在于我的函数提供了“b”和“f”本地化选项,而上面的原始代码没有。在一个测试中,添加这个本地化选项可以“修复”代码。
HTH公司 再次感谢。我感谢你的帮助。
不客气。
页:
[1]