乐筑天下

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

[编程交流] 一些简单的Autolisp问题

[复制链接]

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:57:15 | 显示全部楼层 |阅读模式
我已经阅读了jeffsanders的一些教程,因为你们中有相当一部分人推荐了它。
 
我的一个问题是;如何建立选择集和实体之间的关系?例如(也是我的问题)(&A):
首先,我选择层为“STR”的所有对象:
然后(暂时假设选择都是文本)(&T)我想更改我所有选择的文本高度(因此使用他教程中的另一个复制片段):
我可以使用什么从选择集(mySet)跳转到更改实体(ent)?
 
毫无疑问,有更好的方法可以做到这一点,但这部分是解决问题,部分是理解。谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:02:48 | 显示全部楼层
嗨,史蒂夫,
 
有许多方法可以将选择集转换为其中包含的各种实体。
 
这里有几个不同方法的示例,在所有示例中,假设“ss”是一个变量,其选择集与之绑定。
 
  1. (setq i -1)
  2. (while (setq ent (ssname ss (setq i (1+ i))))
  3. (setq lst (cons ent lst)))
  4. (reverse lst)

 
上面使用了带有SSNAME函数的WHILE循环。SSNAME函数将返回位于选择集中某个索引处的实体的实体名称。索引从0开始,因此在循环之前i设置为-1。
 
以上内容将返回选择集中包含的实体列表。然后,可以使用此列表,使用FOREACH或MAPCAR等函数对实体执行操作。
 
或者,您可以在迭代集合的同时执行该操作:
 
  1. (setq i -1)
  2. (while (setq en (ssname ss (setq i (1+ i))))
  3. (setq enlist(entget en))
  4. (setq enlist (subst (cons 40 50) (assoc 40 enlist) enlist))
  5. (entmod enlist)
  6. (entupd en)
  7. ) ; end while

 
或者,您可以使用重复功能(稍微慢一点,但几乎不明显……):
 
  1. (repeat (setq n (sslength ss))
  2. (setq en (ssname ss (setq n (1- n))))
  3. (setq enlist(entget en))
  4. (setq enlist (subst (cons 40 50) (assoc 40 enlist) enlist))
  5. (entmod enlist)
  6. (entupd en)
  7. ) ; end Repeat

 
上面的步骤在集合中向后移动,从最高的索引数下降到零,然后依次对每个实体进行操作。
 
其他更先进的方法包括:
 
  1. (setq lst (vl-remove-if 'listp
  2.            (mapcar 'cadr (ssnamex ss))))

 
它将再次返回选择集中所有实体的列表,但需要调用(vl load com)来加载Visual LISP函数。这种方法虽然更加优雅,但比前面的示例慢。
 
希望这能有所帮助,如果你不理解我发布的内容,尽管问。。
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:04:52 | 显示全部楼层
李,谢谢你的快速回复。还有很多问题要处理,所以我会再问你。至于最后一种(高级)方法;那么Visual Lisp是大多数Autolisp用户的使用方式?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:09:19 | 显示全部楼层
 
有些人只是坚持使用AutoLISP,因为我相信VL只是完全整合到AutoCAD 2000中。
 
VL在AutoCAD中提供了更多的访问权限和灵活性,因为它是比AutoLISP更低级别的编程语言。但我只会在你完全精通AutoLISP之后才迁移到VL,因为VL拥有AutoLISP的所有功能&还有更多。。。
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:11:35 | 显示全部楼层
好的,我已经在我的计划中实施了第二个建议:
  1. (defun C:CTS()
  2. (if (setq ss (ssget "X" (list (cons 8 "STR")))) ;Create selection set with all objects with specified layer
  3.    (progn
  4.      (setq i -1)
  5.      (while (setq en (ssname ss (setq i (1+ i))))
  6.      (setq enlist (entget en))
  7.    ;(if (= "TEXT" (cdr(assoc 0 enlist)))(
  8.          (setq     enlist (subst (cons 72 1) (assoc 72 enlist) enlist) ; vertical align - middle = 1
  9.            enlist (subst (cons 73 2) (assoc 73 enlist) enlist) ; horizontal align - center = 2
  10.            enlist (subst (cons 7 "ISOCP") (assoc 7 enlist) enlist) ; text style
  11.            enlist (subst (cons 40 300) (assoc 40 enlist) enlist)) ; text height
  12.          (entmod enlist)
  13.          (entupd en)
  14.    ) ; end if
  15.      ) ; end while
  16.    )
  17.    (alert "Error: no layer exists")
  18. )
  19. (princ)
  20. )

 
给出的代码运行良好,是我添加到代码中的行导致了问题:
我认为注释掉的if语句有助于告诉程序哪些实体是文本,但(1)它不起作用(它说:错误:输入时虚线对中有额外的CDR)和(2)它似乎无论如何都不需要它。应该包括这样的if语句吗?如果是这样,我的有什么问题?
我遇到的另一个问题与文本对齐有关。出于某种原因,最初设置为“左”对齐的所有文本将移动到0,0。是什么让它这样做的?
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:14:33 | 显示全部楼层
良好的开端Steve,
 
我提出了一些改进意见:
 
  1. (defun c:cts (/ [color=Red][b]ss i en enlist[/b][/color])
  2. [b][color=Blue]  ;; Always remember to localise your variables[/color][/b]
  3. (if (setq ss (ssget "X" (list [b][color=Red](cons 0 "TEXT")[/color][/b] (cons 8 "0"))))
  4.   [color=Blue][b] ;; I have also filtered for TEXT items only[/b][/color]
  5.    (progn
  6.      (setq i -1)
  7.      (while (setq en (ssname ss (setq i (1+ i))))
  8.        (setq enlist (entget en)
  9.             [b][color=Red] enlist (subst (cons 11 (cdr (assoc 10 enlist))) (assoc 11 enlist) enlist)
  10. [/color][/b]
  11.              ;|[b][color=Blue] When Changing the Alignment Setting of Text, unless it is
  12.                 the default: 72=0 73=0, then you need to specify an Alignment point
  13.                 in DXF 11. I have used the insertion point from DXF 10.[/color][/b]
  14.              |;
  15.             
  16.              enlist (subst (cons 72 1) (assoc 72 enlist) enlist)     ; vertical align - middle = 1
  17.              enlist (subst (cons 73 2) (assoc 73 enlist) enlist)     ; horizontal align - center = 2
  18.              enlist (subst (cons 7 "ISOCP") (assoc 7 enlist) enlist) ; text style
  19.              enlist (subst (cons 40 300) (assoc 40 enlist) enlist))  ; text height
  20.        (entmod enlist)
  21.        (entupd en)
  22.        ) ; end while
  23.      )
  24.    (alert "Nothing Found")
  25.    )
  26. (princ)
  27. )
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:18:07 | 显示全部楼层
再次感谢,这是一个很大的帮助。这种对齐设置很有意义。
 
为了说明我对Lisp有多少不了解,我不得不问,如果可以使用ssget在整个图形中轻松搜索文本或某个图层的对象,难道不可能使用ssset函数将对象设置为相同的运动吗?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 13:19:41 | 显示全部楼层
@Steve1:
代码中带注释的“if”行不起作用,因为您试图使用简单的括号对语句进行分组-必须使用“progn”语句才能对if和else动作进行分组:
 
问候
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:24:55 | 显示全部楼层
 
好主意,但恐怕不行-(ssget“_X”)是执行此操作的最简单方法。
 
巧合的是,没有函数ssset,closest is,sssetfirst来控制夹点和选择集的选择。
 
顺便说一句,Msasu不错-我没有过多地讨论IF语句,因为我想用另一种方法,使用ss过滤器。
 
但是,有关IF语句等的更多信息,请参阅这里的Steve。
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:26:38 | 显示全部楼层
还有一件事,史蒂夫。
 
您使用什么创建LISP文件?我发现大多数没有经验的用户都使用记事本来写文件,因为这是他们习惯的格式。但我建议您改用ACAD附带的Visual LISP编辑器(当然,如果您还没有使用它的话)。只需在命令提示符下键入VLIDE,然后转到“文件”>“新建文件”,然后关闭。
 
Visual LISP编辑器中的帮助文件非常宝贵,您可以从中学到很多东西。
 
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 02:59 , Processed in 1.663376 second(s), 72 queries .

© 2020-2025 乐筑天下

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