明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: Gaudi

[讨论] 新手从零开始的第一份LISP程序全纪录

    [复制链接]
发表于 2024-5-2 10:26:14 | 显示全部楼层
好东东我也想学习一下,不知道难不难!

点评

非常煎蛋,带着需求做,不加班的诱惑很大  发表于 2024-5-9 19:53
发表于 2024-5-3 10:21:24 | 显示全部楼层
Gaudi 发表于 2024-4-27 10:52
大佬们,我这Lisp才会做第一个程序呢,就开始C#,是不是有点为时过早……

兄弟你是做啥的啊

点评

普通的画图工  发表于 2024-5-9 19:54
发表于 2024-5-6 10:07:08 | 显示全部楼层
收藏,慢慢学
 楼主| 发表于 2024-5-7 10:45:19 | 显示全部楼层
第三篇  第四部分  返回指定文字的坐标、根据坐标插入指定块并移动到指定图层




过了一个安稳的五一,没有傻逼业主和施工单位打电话。

所以今天继续摸鱼继续。

这部分的标题比较长,因为几个功能都比较煎蛋,就一起描述了。



1

首先是根据标注的桩号,得到指定桩号的位置信息。

  1. (setq selSet (ssget "X" (list (cons 0 "TEXT") (cons 1 text))))


一个新的函数 ssget,这也算是一个很常用的函数,毕竟要针对对象进行操作,绝大部分情况下需要有一个特定的选择集。

ssget 后面有三个部分,第一个是选择模式,例如 "C" (交叉窗口), "W" (窗口), "F" (上一个选择集), "L" (最后创建的对象), "P" (前一个选择集), "I" (反转选择), "N" (新建选择集) 等。如果省略,则默认为交互式选择模式。

这次使用的“X”,代表全图范围查找。

第二个是一系列的点对数据,跟前位 entmake 有点像哦。

0,代表要选择 text 文本;1,代表内容。

第三个是提示,懒得写,反正自己知道是在干什么。



找到相应的文本后,需要读取文本的坐标和旋转角度。

将上述 ssget 返回的选择集中,返回具体的对象名称。

  1. (setq ent (ssname selSet 0))


0就是代表选择集里的第1个实体。


返回具体对象名称后,就要提取内容了。

  1. (list (cdr (assoc 11 (entget ent))) (cdr (assoc 50 (entget ent))))


这里面的函数作用都是之前有提过,都是操作列表的函数。

11和50也是之前提供的DXF群码。

作用就是返回坐标和角度。

注意坐标有两类,一个是10,这是文字坐标;这次用的11,是对齐坐标。

为什么要使用cdr和assoc这两个函数呢,因为 assoc 返回的是一个点对列表,前面是 dxf 群码,后面是对应的数值。


2

找到对应桩号文字的坐标和角度后,就可以插入块了。

首先定义块文件的地址。

  1. (setq blkDef (strcat folderPath "\\" blockName ".dwg"))


极其简单的一行代码,唯一注意点是 autolisp 中的地址分隔符应该用"\\",因为"\"好像会作为代码处理还是咋的。

OK,这里有个小坑点:

插入的块应该是分解状态,不能作为快参照。
不然进一步处理很麻烦。

  1. (setq blkDef (strcat "*" blkDef))

在块地址前并入 *,这是CAD自带的功能。

然后就是调用 command,这个很煎蛋了,不赘述。
  1. (command "_insert" blkDef textPosition "1"  textAngle)


用下划线是将命令转为命令行模式而不是图形模型。
不是所有的命令都有这个变化。
也不是所有的命令都需要这个变化才能转为命令行模式。



3

最后是移动图层。

太煎蛋了朋友们,我直接丢代码。
  1. (setq layername (strcat treatMent cateGory))
  2. (command "change" "l" "" "p" "la" layername "")

发表于 2024-5-7 17:15:12 | 显示全部楼层
留名观看  
发表于 2024-5-8 10:13:26 | 显示全部楼层
很吸引人,正是新手需要的.话说我想用autolisp来获取梁图中集中标注、支柱原位、下部原位、上中原位、吊筋位置等信息,以及梁支座和梁的尺寸,列出表格,能实现不?

点评

谢谢支持。你这个功能拆分出来应该是很简单的,如果纯粹自用,也就不需要考虑数据的合法性之类。只要你说的这些部件在CAD中,你可以考虑下直接用CAD命令的dataextraction,如果要用到Lisp,论坛里我记得有cad转ecel  发表于 2024-5-9 19:56
 楼主| 发表于 2024-5-8 16:48:14 | 显示全部楼层
第三篇  第五部分  修改增强属性块中特定属性标签的属性值




最后一个子函数了。

首先想到的是使用 command 配合 _attedit 命令。

确实可行哈!

  1. (command "_attedit" "y" "" attributeName "" "l" "v" "r" attributeValue "")


但是它有个很大的BUG:选择模式 l 只能选择最近一次创建的标签。

也就是说,如果不在建立块的时候,将需要修改的标签最后选择,那它是选择不到的。

那只能用 VLA 命令了。

功能拆分:
A 选择对象并转为 VLA 对象
B 把属性块的所有标签都读取一遍
C 如果和要修改的标签内容相同,就修改其属性值

……
然后我没写出来。

是的,朋友们,不是每次把功能拆分了就能写出来代码的。

这时候就要求助互联网了。
除了本论坛,我常用的网站还有三个:
index.html (techshelps.github.io)
Lee Mac Programming: Custom Programs for AutoCAD (lee-mac.com)
CAD开发者社区 - AutoCAD二次开发文档,CAD二次开发,CAD插件开发,中文CAD文档 - 中文CAD开发文档,CAD二次开发问题交流,优秀插件分享 (cadn.net.cn)

最后抄袭到的代码如下:
  1. (defun SetBlockAttributeValue ( attributeName attributeValue )
  2.   (setq ent (entlast))
  3.   (setq vla-obj (vlax-ename->vla-object ent))
  4.   (vl-some
  5.     '(lambda ( x )
  6.       (if (= attributeName (vla-get-tagstring x))
  7.         (progn (vla-put-textstring x attributeValue) attributeValue)
  8.       )
  9.     )
  10.     (vlax-invoke-method vla-obj 'getattributes)
  11.   )
  12. )


自己修改了下,更适合这次的需求。
发表于 2024-5-10 22:28:19 来自手机 | 显示全部楼层
新手学习中,感谢楼主开好贴

点评

都是新手,一起学习,拒接加班  发表于 2024-5-11 21:52
发表于 2024-5-13 15:50:12 | 显示全部楼层

感谢分享,坐等更新。
发表于 2024-5-14 14:29:19 | 显示全部楼层
很实用的新手教材!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 18:29 , Processed in 0.183560 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表