scaramangamp 发表于 2022-7-6 11:17:27

请帮助学习LISP例程!

你好
 
我已经使用CAD一段时间了,我很有经验。。。然而,我现在正试图编写一个lisp例程来进行简单的更改。。。但我被卡住了!
 
我想做的是:
 
1) 选择“EC\u DATA\u EQPM\u E”层上的所有文本(该层上有其他对象)
2) 将此文本移动到新层“Commstextlayer”
 
当我执行此lisp时,我会收到错误消息:
“错误:无函数定义:nil”
 
我很确定我在某个地方犯了一个基本错误(下面的例行程序)。。但我不知道如何修复它。。。非常感谢您的帮助,或者如果您有一个类似的lisp,我可以修改它,那就太好了
 
非常感谢,
 
马库斯
 
 
我的常规:
 
(defun c:changetextonlayer()
(setq lay_名称“EC_DATA_EQPM_E”)
(setq ss1((ssget“X”(list(cons 0“TEXT”)(cons 8 lay_name ()))))
(subst(cons 8“通信层”)(assoc 8 ss1)ss1)
)

lpseifert 发表于 2022-7-6 11:23:19

一种方法是遍历选择集ss1中的每个文本实体,并分别更改属性。我更喜欢VLisp函数。。。
将(子行)替换为
 

(vl-load-com)
(setq idx 0)
(repeat (sslength ss1)
(setq obj (vlax-ename->vla-object (ssname ss1 idx)))
(vlax-put-property obj 'Layer "Commstextlayer")
   (setq idx (1+ idx))
)
未测试。。。如果层“Commstextlayer”不存在,则会出错
 
你也可以使用
再次。。。未经测试

scaramangamp 发表于 2022-7-6 11:24:43

好的,谢谢。。
 
我已经添加了这个。。。“Commstextlayer”层不存在。。然而,我认为它只会使层。
 
如果我想添加一行来创建一个新层,我会怎么做?
然后我还能在同一个lisp文件中更改图层的属性(线宽、颜色)等吗
 
谢谢你的帮助,
 
马库斯

lpseifert 发表于 2022-7-6 11:29:55

这可能会将层“Commstextlayer”设置为当前,因此您可能需要恢复以前的当前层

scaramangamp 发表于 2022-7-6 11:30:55

非常感谢你。。。
 
这是我的lsp。文件,但它仍然无法工作,它会收到“错误:无函数定义:nil”错误消息。。。你知道它有什么毛病吗?
 
(DEFUN C:changetextonlayer()
(setq lay_名称“EC_DATA_EQPM_E”)
(setq ss1((ssget“X”(list(cons 0“TEXT”)(cons 8 lay_name ()))))
(如果(不是
(tblsearch“layer”“Commstextlayer”))
(命令“_layer”“m”“Commstextlayer”“”“LW”“0.25”“Commstextlayer”“C”“7”“Commstextlayer”);在此处添加颜色、线型等
(普林斯)
)
 
 
谢谢你的帮助!

jammie 发表于 2022-7-6 11:33:53

 
你有一组额外的括号
 
(setq ss1 ((ssget "X" (list (cons 0 "TEXT")(cons 8 lay_name)))))

 
我可能会使用lpseifert方法迭代选择集,尤其是当需要更改几个对象属性时。也就是说,对于这个示例,Change命令也可以很好地工作。
 
(DEFUN C:changetextonlayer()

(if
   (not
   (tblsearch "layer" "Commstextlayer"))
   (command "_layer" "m" "Commstextlayer" "LW" "0.25" "Commstextlayer" "C" "7" "Commstextlayer" "")
   )

(setq lay_name "EC_DATA_EQPM_E")

(if
   (setq ss1 (ssget "X" (list (cons 0 "TEXT")(cons 8 lay_name))))

   (progn

   (command "change" ss1 "" "p" "la" "Commstextlayer" "")
   )
   )      
; add color, linetype etc. in here
(PRINC)
)

Freerefill 发表于 2022-7-6 11:38:58

我认为在“ssget”周围有一组不必要的括号,这可能是导致错误的原因。
 
此外,我建议(这只是一个建议)在尝试使用选择集之前,先检查一下选择集是否存在。您可以将其包装到IF语句中,如下所示:
 
(if(和ss1(not(tblsearch“layer”“Commstextlayer”))…)

scaramangamp 发表于 2022-7-6 11:41:18

谢谢Jammie,我删除了额外的括号,并对其进行了轻微更改(按照Jammie的建议更改了顺序,并将“commstextlayer”替换为“EC_TEXT”)
 
我现在得到一个“语法错误”你知道为什么这可能是。。。?
 
我想我会保持命令行不变。。因为这是我真正理解的少数几点之一谢谢你的建议。
 
在我的脚本中,文本是否真的被移动到了新的层上?
 
(DEFUN C:changetextonlayer()
(如果(不是
(tblsearch“layer”“EC_TEXT”))
(setq lay_名称“EC_DATA_EQPM_E”)
(setq ss1(ssget“X”(列表(cons 0“文本”)(cons 8 lay_名称)))
(命令“_layer”“m”“EC\u TEXT”“LW”“0.25”“EC\u TEXT”“C”“7”“EC\u TEXT”“);在此处更改属性
(普林斯)
)
 
 
再次感谢你的帮助

Lee Mac 发表于 2022-7-6 11:44:52

你好,斯卡拉曼甘普,
 
你已经有很多选择了,这是我的提议
 
也许可以看看这些线程,了解如何更改实体的DXF代码:
 
LISP函数解释(文本替换):
http://www.cadtutor.net/forum/showpost.php?p=264546&postcount=15
 
 
LISP函数说明(文字高度变化):
http://www.cadtutor.net/forum/showpost.php?p=306576&postcount=14
 
 
它们不使用选择集,但您可以从中收集到一些信息。
 
 
关于你的问题,我可以这样处理。
 

(defun c:TxtLay (/ Layer ELST ENT I NEWLAYER OLDLAYER SS)

(setq OldLayer "EC_DATA_EQPM_E" NewLayer "EC_TEXT")

(defun Layer (Nme Col LWgt)
   (entmake (list (cons 0 "LAYER")
                  (cons 100 "AcDbSymbolTableRecord")
                  (cons 100 "AcDbLayerTableRecord")
                  (cons 2Nme)
                  (cons 70 0)
                  (cons 62 Col)
                  (cons 370 LWgt))))

(if (setq i -1 ss (ssget "_X" (list '(0 . "TEXT") (cons 8 OldLayer))))
   (progn   

   (or (tblsearch "LAYER" NewLayer)
         (Layer "EC_TEXT" 7 25))

   (while (setq ent (ssname ss (setq i (1+ i))))
       (setq eLst (entget ent))
      
       (entmod (subst (cons 8 NewLayer) (assoc 8 eLst) eLst))))

   (princ "\n** No Text Found **"))

(princ))

 
有很多方法可以解决这些问题,看看这个帖子吧。
 

Lee Mac 发表于 2022-7-6 11:47:09

另一方面,如果你真的想走VL路线,那么这条路会一直走下去
 

(defun c:TxtLayVL (/ MakeVariant Itemp DOC NEWLAYER NLAYER OLDLAYER SELSETS SS)
(vl-load-com)

(setq OldLayer "EC_DATA_EQPM_E" NewLayer "EC_TEXT")

(defun MakeVariant (typ lst)
   (vlax-make-variant
   (vlax-safearray-fill
       (vlax-make-safearray (eval typ)
         (cons 0 (1- (length lst)))) lst)))

(defun itemp (collection item / result)
   (if (not (vl-catch-all-error-p
                (setq result
                     (vl-catch-all-apply (function vla-item)
                         (list collection item)))))
       result))

(if (setq ss (itemp (setq SelSets
                     (vla-get-SelectionSets
                         (setq doc (vla-get-ActiveDocument
                                     (vlax-get-acad-object))))) "TextLaySS"))
   (vla-delete ss))

(setq ss (vla-add SelSets "TextLaySS"))

(vla-Select ss acSelectionSetAll
   (MakeVariant vlax-vbInteger '(0 )
   (MakeVariant vlax-vbVariant (list "TEXT" OldLayer)))

(if (not (zerop (vla-get-count ss)))
   (progn
   (vla-StartUndoMark doc)

   (or (itemp NewLayer (vla-get-Layers doc))
         (progn
         (setq nLayer (vla-Add (vla-get-layers doc) NewLayer))
         (vla-put-Lineweight nLayer acLnWt025)
         (vla-put-Color nLayer acWhite)))
   
   (vlax-for obj ss (vla-put-Layer obj NewLayer))

   (vla-EndUndoMark doc))

   (princ "\n** No Text Found **"))

(vla-delete ss)
(princ))
页: [1] 2
查看完整版本: 请帮助学习LISP例程!