请帮助学习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)
) 一种方法是遍历选择集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”不存在,则会出错
你也可以使用
再次。。。未经测试 好的,谢谢。。
我已经添加了这个。。。“Commstextlayer”层不存在。。然而,我认为它只会使层。
如果我想添加一行来创建一个新层,我会怎么做?
然后我还能在同一个lisp文件中更改图层的属性(线宽、颜色)等吗
谢谢你的帮助,
马库斯 这可能会将层“Commstextlayer”设置为当前,因此您可能需要恢复以前的当前层 非常感谢你。。。
这是我的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”);在此处添加颜色、线型等
(普林斯)
)
谢谢你的帮助!
你有一组额外的括号
(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)
) 我认为在“ssget”周围有一组不必要的括号,这可能是导致错误的原因。
此外,我建议(这只是一个建议)在尝试使用选择集之前,先检查一下选择集是否存在。您可以将其包装到IF语句中,如下所示:
(if(和ss1(not(tblsearch“layer”“Commstextlayer”))…) 谢谢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”“);在此处更改属性
(普林斯)
)
再次感谢你的帮助 你好,斯卡拉曼甘普,
你已经有很多选择了,这是我的提议
也许可以看看这些线程,了解如何更改实体的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))
有很多方法可以解决这些问题,看看这个帖子吧。
李 另一方面,如果你真的想走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