Lee Mac 发表于 2022-7-6 15:20:28

图层检索器说明

大家好,
 
之前,我发布了一个线程,要求提供一个函数,该函数将成功检索活动文档中所有层的列表。
 
ASMI善意地向我提供了以下信息:
 


(defun laylist (/ oLst)
   (vl-load-com)
   (vlax-for l
       (vla-get-Layers
         (vla-get-ActiveDocument
         (vlax-get-acad-object)
         ) ;_end vla-get-ActiveDocument
       ) ;_end vla-get-Layers
   (setq oLst
      (cons (vla-get-Name l) oLst)
   ) ; end setq
   ) ; end vlax-for
   (setq oLst (reverse oLst))
) ;_end defun


 
然而,当我试图借助Vlide帮助文件来分析这一点时,我无法确定函数的实际功能。
 
我意识到可能有一种更简单的方法来检索这样的列表,而不必涉猎Active X方法,也许:
 

(defun laylist (/ lay oLst)
   (setq lay (tblnext "LAYER" T))
   (while lay
   (setq oLst (cons (cdr (assoc 2 lay)) oLst)
         lay(tblnext "LAYER")
   ) ;_end setq
   ) ;_end while
   (setq oLst (reverse oLst))
) ;_end defun

但是我真的很想开始理解VL,因为我发现它可以做的比普通的LISP多得多,-(从ASMI的几个例子来看…)
 
如果您能帮助我们逐步解释ASMI的代码,我们将不胜感激。
 
谢谢各位,
 

wizman 发表于 2022-7-6 15:32:26

我不是最好的解释,但以下是我最简单的解释:
无论何时,当你对vla表达式中发生的事情感到怀疑时,你总是可以转储以查看其中的内容:
您可以在vlide中逐个运行:
(vl load com)
(vlax dump Object(vlax get acad Object)t)
 
(vlax转储对象(vla get ActiveDocument
(vlax get acad object))t)
(vlax转储对象(vla get Layers
(vla获取ActiveDocument
(vlax get acad对象)
) ;_ 结束vla获取ActiveDocument
) ;_ 结束vla获取层
t)
 
vlax for类似于autolisp中的foreach,在这里用于单步/循环遍历层集合,在autolisp中也称为层表。您还需要了解autocad对象模型层次,以了解哪些是应用程序对象,
文档对象,
集合对象,
图形和非图形对象,
首选项、打印和实用程序对象

David Bethel 发表于 2022-7-6 15:41:06

李,
 
我从来没有想过vl函数在任何需要可读性或效率的地方。是的,他们可以做一些AutoLisp有问题的事情,但总的来说这不适合我-大卫

Lee Mac 发表于 2022-7-6 15:57:54

 
好的,大卫,首先,
 
我知道你从哪里来——我也不太喜欢他们,但我觉得我不知道他们能做什么,这让我处于劣势。
 
这里的一些问题我感到困惑,然后有人来用VL解决了它们,所以我认为最好深入研究一下,看看这是怎么回事。
 
感谢您在那里提供了检索层的简短片段,您在某种程度上简化了我的例程。
 
我认为(tblnext“layer”(不是tdef))在第一次迭代时返回(tblnext“layer”T),否则返回(tblnext“layer”nil),因此从表的开头开始。这是正确的吗?
 
再次感谢。

Lee Mac 发表于 2022-7-6 16:02:41

 
威兹曼,
 
谢谢你的回复,我真的很感谢你花时间帮助我理解这一点。
 
继续浏览您发布的代码,我可以看到VL是如何建立的,一个命令接一个命令。
 
我看到了如何通过每个额外的代码部分缩小要检索的项的范围。
 
感谢您的帮助性演练。
 
干杯
 

CAB 发表于 2022-7-6 16:18:58

查看VLIDE帮助/内容/

Lee Mac 发表于 2022-7-6 16:28:47

干杯,出租车,我去看看。
页: [1]
查看完整版本: 图层检索器说明