乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 81|回复: 19

[编程交流] 请帮助学习LISP例程!

[复制链接]

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:17:27 | 显示全部楼层 |阅读模式
你好
 
我已经使用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)
)
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 11:23:19 | 显示全部楼层
一种方法是遍历选择集ss1中的每个文本实体,并分别更改属性。我更喜欢VLisp函数。。。
将(子行)替换为
 
  1. (vl-load-com)
  2. (setq idx 0)
  3. (repeat (sslength ss1)
  4.   (setq obj (vlax-ename->vla-object (ssname ss1 idx)))
  5.   (vlax-put-property obj 'Layer "Commstextlayer")
  6.    (setq idx (1+ idx))
  7. )
未测试。。。如果层“Commstextlayer”不存在,则会出错
 
你也可以使用
再次。。。未经测试
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 11:24:43 | 显示全部楼层
好的,谢谢。。
 
我已经添加了这个。。。“Commstextlayer”层不存在。。然而,我认为它只会使层。
 
如果我想添加一行来创建一个新层,我会怎么做?
然后我还能在同一个lisp文件中更改图层的属性(线宽、颜色)等吗
 
谢谢你的帮助,
 
马库斯
回复

使用道具 举报

4

主题

940

帖子

961

银币

初来乍到

Rank: 1

铜币
12
发表于 2022-7-6 11:29:55 | 显示全部楼层
这可能会将层“Commstextlayer”设置为当前,因此您可能需要恢复以前的当前层
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 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”);在此处添加颜色、线型等
(普林斯)
)
 
 
谢谢你的帮助!
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 11:33:53 | 显示全部楼层
 
你有一组额外的括号
 
  1. (setq ss1 [color="Red"]([/color](ssget "X" (list (cons 0 "TEXT")(cons 8 lay_name)))[color="red"])[/color])

 
我可能会使用lpseifert方法迭代选择集,尤其是当需要更改几个对象属性时。也就是说,对于这个示例,Change命令也可以很好地工作。
 
  1. (DEFUN C:changetextonlayer()
  2. (if
  3.    (not
  4.      (tblsearch "layer" "Commstextlayer"))
  5.    (command "_layer" "m" "Commstextlayer" "LW" "0.25" "Commstextlayer" "C" "7" "Commstextlayer" "")
  6.    )
  7. (setq lay_name "EC_DATA_EQPM_E")
  8. (if
  9.    (setq ss1 (ssget "X" (list (cons 0 "TEXT")(cons 8 lay_name))))
  10.    (progn
  11.      (command "change" ss1 "" "p" "la" "Commstextlayer" "")
  12.      )
  13.    )      
  14. ; add color, linetype etc. in here
  15. (PRINC)
  16. )
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 11:38:58 | 显示全部楼层
我认为在“ssget”周围有一组不必要的括号,这可能是导致错误的原因。
 
此外,我建议(这只是一个建议)在尝试使用选择集之前,先检查一下选择集是否存在。您可以将其包装到IF语句中,如下所示:
 
(if(和ss1(not(tblsearch“layer”“Commstextlayer”))…)
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 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”“);在此处更改属性
(普林斯)
)
 
 
再次感谢你的帮助
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 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
 
 
它们不使用选择集,但您可以从中收集到一些信息。
 
 
关于你的问题,我可以这样处理。
 
  1. (defun c:TxtLay (/ Layer ELST ENT I NEWLAYER OLDLAYER SS)
  2. (setq OldLayer "EC_DATA_EQPM_E" NewLayer "EC_TEXT")
  3. (defun Layer (Nme Col LWgt)
  4.    (entmake (list (cons 0 "LAYER")
  5.                   (cons 100 "AcDbSymbolTableRecord")
  6.                   (cons 100 "AcDbLayerTableRecord")
  7.                   (cons 2  Nme)
  8.                   (cons 70 0)
  9.                   (cons 62 Col)
  10.                   (cons 370 LWgt))))
  11. (if (setq i -1 ss (ssget "_X" (list '(0 . "TEXT") (cons 8 OldLayer))))
  12.    (progn     
  13.      (or (tblsearch "LAYER" NewLayer)
  14.          (Layer "EC_TEXT" 7 25))
  15.      (while (setq ent (ssname ss (setq i (1+ i))))
  16.        (setq eLst (entget ent))
  17.       
  18.        (entmod (subst (cons 8 NewLayer) (assoc 8 eLst) eLst))))
  19.    (princ "\n** No Text Found **"))
  20. (princ))

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:47:09 | 显示全部楼层
另一方面,如果你真的想走VL路线,那么这条路会一直走下去
 
  1. (defun c:TxtLayVL (/ MakeVariant Itemp DOC NEWLAYER NLAYER OLDLAYER SELSETS SS)
  2. (vl-load-com)
  3. (setq OldLayer "EC_DATA_EQPM_E" NewLayer "EC_TEXT")
  4. (defun MakeVariant (typ lst)
  5.    (vlax-make-variant
  6.      (vlax-safearray-fill
  7.        (vlax-make-safearray (eval typ)
  8.          (cons 0 (1- (length lst)))) lst)))
  9. (defun itemp (collection item / result)
  10.      (if (not (vl-catch-all-error-p
  11.                 (setq result
  12.                        (vl-catch-all-apply (function vla-item)
  13.                          (list collection item)))))
  14.        result))
  15. (if (setq ss (itemp (setq SelSets
  16.                        (vla-get-SelectionSets
  17.                          (setq doc (vla-get-ActiveDocument
  18.                                      (vlax-get-acad-object))))) "TextLaySS"))
  19.    (vla-delete ss))
  20. (setq ss (vla-add SelSets "TextLaySS"))
  21. (vla-Select ss acSelectionSetAll
  22.    (MakeVariant vlax-vbInteger '(0 )
  23.      (MakeVariant vlax-vbVariant (list "TEXT" OldLayer)))
  24. (if (not (zerop (vla-get-count ss)))
  25.    (progn
  26.      (vla-StartUndoMark doc)
  27.      (or (itemp NewLayer (vla-get-Layers doc))
  28.          (progn
  29.            (setq nLayer (vla-Add (vla-get-layers doc) NewLayer))
  30.            (vla-put-Lineweight nLayer acLnWt025)
  31.            (vla-put-Color nLayer acWhite)))
  32.    
  33.      (vlax-for obj ss (vla-put-Layer obj NewLayer))
  34.      (vla-EndUndoMark doc))
  35.    (princ "\n** No Text Found **"))
  36. (vla-delete ss)
  37. (princ))
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 02:39 , Processed in 0.424498 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表