图层状态恢复和无VP
我需要一些意见。我创建了一个LISP例程,之后。用户的las选择将通过视口恢复图层状态。至少这是我想要的。作为标准,我们的CAD部门通过视口导入给定的图层状态,不仅可以恢复冻结/关闭的图层,还可以冻结图层。当通过视口导入模型空间图层状态时,它也会冻结该视口的冻结图层。我正试图让LISP自动完成这项工作。首先,我不确定我的计数器是否正常工作(将.las导入多个vports,如果适用)。第二,当一个图层状态通过LISP恢复时,它似乎不会冻结,尽管所有其他图层设置都已恢复。
如果layerstate restore命令的工作原理与手动执行略有不同,我希望将代码合并到vpfreeze中,将冻结的层作为同一例程的一部分,以符合公司标准。
感谢您的帮助。
谢谢
这是我的代码:
(定义c:ILS2(/\u path laspath lasfile las\u use)
(vl load com)
(setvar“ctab”“布局”)
(setq _路径(getvar“dwgprefix”))
(setq laspath(strcat路径“Xrefs\”))
(setq lasfile(GetField“选择要导入的图层状态(.LAS)文件:”laspath“LAS”16))
(图层状态导入lasfile)
(setq las_use(vl filename base lasfile))
(setq vp_集合(ssget“x”(列表(cons 0“视口”)))
(setq cntr 1)
(虽然(
(命令“.mspace”)
(layerstate restore las_use)
(setq cntr(+cntr 1))
)
(命令“.pspace”)
(普林斯)
) 不确定这是否可行?
(defun c:ILS2(/ path file vp_set)
(vl-load-com)
(and (vl-file-directory-p
(setq path
(strcat (getvar "DWGPREFIX") "Xrefs\\")))
(setq file (getfiled "Select a Layer States (.las) file" path "las" 16))
(layerstate-import file)
(setq vp_set (ssget "_X" (list (cons 0 "VIEWPORT"))))
(mapcar
(function
(lambda (x)
(layerstate-restore
(vl-filename-base file) x 2)))
(mapcar 'cadr (ssnamex vp_set))))
(princ))
谢谢你的回复。我不完全确定您所做的所有更改,但它似乎没有进入视口来恢复图层状态,然后vp冻结了纸张空间中的所有内容。我确实注意到它确实冻结了冻结的层。代码的哪一部分在这样做? 如果在Visual LISP编辑器帮助文件中查找layerstate restore,它会提供有关其使用的参数的大量信息。该函数中的“2”导致层冻结。 你能给我解释一下mapcar和lambda吗?我不理解这些函数的帮助文件。
我遵循layerstate restore的标志(1、2、4等),但我不理解为什么你的代码vp冻结,而不是冻结,为什么我的代码冻结,但不是vp冻结。在我看来,我调用的是与您相同的layerstate恢复函数。我希望这两种情况都能成为常规的一部分。谢谢你抽出时间。
我还查看了你的lsp的一些链接。给人印象深刻的也许有一天我会到达那里。 谢谢,我相信你会的。
至于你的代码和我的代码之间的不一致,我认为这与此有关:
正如从ACAD帮助中引用的那样,我提供了一个ename,而您没有,因此,您可能只需要忽略视口,只需要调用layerstate restore,而不使用viewport参数来获得所需的结果? 至于Mapcar和Lambda,我最近写了一篇关于它们的教程,但这篇文章尚未在常见问题解答中发布,这里是一个复制/粘贴版本:
什么是Mapcar&如何使用Lambda函数?
主要作者:李·麦克唐纳
上次更新日期:2009年6月13日[初稿]
根据我的经验,mapcar和lambda函数是AutoLISP编程语言中理解最少的两个函数,但是,如果正确理解和使用,它们可以替换多余的代码,并且是处理列表的强大函数。
Mapcar函数
简而言之,mapcar将对列表(或多个列表)的每个成员应用一个函数,并返回应用该函数的结果列表。
Mapcar使用以下格式调用:
其中是要应用的函数,并且。。。列表的数量等于函数所需的参数数量。因此,如果提供了采用单个参数的函数(例如strcase),则只需要一个列表。
为了用一个例子来澄清这个解释,假设我们有一个字符串列表:
假设我们需要将这些字符串中的每一个转换为大写字母(大写)。我们可以通过多种方式完成此任务,例如,使用foreach函数在列表中乱序,并创建一个新的字符串列表:
上述将变量nlist设置为:
然而,使用mapcar功能,可以用更少的编码来完成相同的任务:
上述内容将返回:
4请注意,mapcar提供了函数strcase,它使用了撇号,这样就不会计算strcase,而是将其视为参数。此外,我们知道strcase函数接受一个参数,即字符串,因此我们只需要提供一个列表——我们的字符串列表。
如图所示,返回的是一个大写字符串列表,就好像我们在列表的每个成员上都使用了strcase函数一样。
具有多个参数的函数
在上面的示例中,演示了strcase函数,并且只需要一个列表,因为strcase只需要一个参数,但是如果我们想要使用一个需要多个参数的函数呢?
假设我们有一个数字列表:
让我们假设要将上述列表中的每个数字添加到列表中的每个数字:
同样,我们可以使用foreach函数来实现这一点,但使用mapcar所需的代码要少得多:
在这里,我们为mapcar提供了“+”函数,该函数接受任意数量的数值参数并将它们相加。在上述示例中,mapcar将对每个列表的每个成员应用“+”函数,并返回结果列表:
与之前一样,撇号用于将函数“+”声明为参数,以防止对其求值并导致错误。这也可以通过使用报价功能来实现:
Lambda函数
回到原始字符串列表:
假设我们要转换每个字符串,使第一个字母大写,因此:
我们可以再次使用使用foreach的方法,并洗牌我们的列表:
但是我们也可以使用mapcar来节省一些代码。然而,LISP中没有允许我们大写单词首字母的函数,那么我们如何为mapcar提供一个要应用的函数呢?
我们可以自己定义一个函数并提供它:
在这里,我们定义了一个新函数(cap),它接受一个参数(str),并对该参数执行操作,在这种情况下,将第一个字母转换为大写字母。
但这意味着我们的代码中有一个额外的函数定义,它只能使用一次。完成此任务的更好方法是使用lambda函数。
lambda函数定义了一个匿名函数,并在定义新函数的开销不合理时使用,就像我们的例子一样。
因此,我们的代码可以修改为包含lambda函数:
上面,我们使用了lambda表达式来代替我们定义的函数(cap)。它接受一个参数(str)并在该字符串上执行操作,就像我们定义的函数一样-唯一的例外是,在mapcar函数完成其操作后,不再定义lambda函数,从而为问题提供了更整洁的解决方案。 请给我更多帮助。两项。首先,我通过简单地使用提供的视口和不使用提供的视口恢复图层状态,达到了我想要的结果;结果是层被冻结和VP冻结。不确定这是否是最好的方法,但它确实有效。
其次,我试图通过给出分支决策来修改您提供的代码——在所有视口上运行代码(默认值)或提示用户选择特定视口。不知道你能不能再帮我一次。
17
打扰一下 这很奇怪。我现在正在看我原来的帖子——它似乎在展示我发布的内容,还有更多的问题。我还发布了一些代码。你看到的帖子是否只显示“请提供更多帮助”?
页:
[1]
2