alanjt 发表于 2022-7-6 11:51:28

 
哈哈,你会把他吓跑的。
 
这里有一种组合方式。
 
(defun c:TEst (/ OldLayer NewLayer ss la)

(setq OldLayer "EC_DATA_EQPM_E"
       NewLayer "EC_TEXT"
) ;_ setq

(cond
   ((setq ss (ssget "_X" (list '(0 . "TEXT") (cons 8 OldLayer))))
    (or *AcadDoc* (setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
    (or (tblsearch "layer" NewLayer)
      (progn (setq la (vla-add (vla-get-layers *AcadDoc*) NewLayer))
               (vla-put-color la 7)
               (vla-put-lineweight la 25)
      ) ;_ progn
    ) ;_ or

    (vlax-for x (setq ss (vla-get-activeselectionset *AcadDoc*))
      (vl-catch-all-apply
      (function vla-put-layer)
      (list x la)
      ) ;_ vl-catch-all-apply
    ) ;_ vlax-for
    (vla-delete ss)
   )
) ;_ cond
(princ)
) ;_ defun

Lee Mac 发表于 2022-7-6 11:54:49

哈哈,我不经常在VL中进行选择集,所以它让人耳目一新

jammie 发表于 2022-7-6 11:56:52

 
8
 
代码的顺序在这里很重要。虽然在第一印象中它看起来不错,但实际上您正在尝试将许多参数传递给if表达式。我建议查看AutoCAD的Visual Lisp IDE的帮助文件,以获取有关条件测试的信息
 
这应该行得通
 
9

scaramangamp 发表于 2022-7-6 11:59:02

你好。。。我对这一切都是陌生的-正如你可能知道的那样Lisp和Visual Lisp之间有什么区别?
 
哪一个最容易理解和使用,我应该用哪一个来解决这个问题?
 
谢谢
 
马库斯

Lee Mac 发表于 2022-7-6 12:04:54

Visual LISP是Vanilla LISP的扩展,它使用ActiveX模型。
 
vla-*函数是VBA组件的Visual LISP版本。
vlax-*函数没有VBA替代方案
vlr-*函数用于反应器,类似于VBA事件,但其用法/语法不同。
 
Visual LISP可能更直观,具有“vla put layer”之类的功能,但数据类型(变体/安全数组)不太直观-我建议您习惯在Vanilla LISP中处理数据,以便您习惯列表的概念,然后进入Visual LISP(至少我是这样做的)。
 

scaramangamp 发表于 2022-7-6 12:05:28

谢谢李的澄清,我担心这将是一个缓慢而痛苦的学习过程(主要是从错误中学习)。
 
Jammie,用那个密码。。我正在使用它,因为它似乎是最容易遵循的。在倒数第二行,它说“setq ss1”,我们还需要这个setq吗,因为它在代码中其他地方没有引用。
 
此外,它在代码中的哪里移动了文本(在EC\u DATA\u EQPM\u E上找到)到层“EC\u text”,因为我看不到那行代码?
 
谢谢
 
马库斯

Lee Mac 发表于 2022-7-6 12:09:22

Jammie写了这句话并发表了评论

scaramangamp 发表于 2022-7-6 12:13:01

这是正确的吗虽然现在似乎是
“错误:错误的参数类型:listp”!!
 
 
马库斯

Lee Mac 发表于 2022-7-6 12:14:29

如果要使用“subst”,请看我前面的示例。
 
Jammie的解决方案设置为使用chprop或类似命令调用。

alanjt 发表于 2022-7-6 12:19:36

如果你是新手,我会坚持使用命令调用,只是为了适应编程。
页: 1 [2]
查看完整版本: 请帮助学习LISP例程!