wenlusong 发表于 2024-5-2 10:26:14

好东东我也想学习一下,不知道难不难!

664571221 发表于 2024-5-3 10:21:24

Gaudi 发表于 2024-4-27 10:52
大佬们,我这Lisp才会做第一个程序呢,就开始C#,是不是有点为时过早……




兄弟你是做啥的啊

cth2542 发表于 2024-5-6 10:07:08

收藏,慢慢学

Gaudi 发表于 2024-5-7 10:45:19

第三篇第四部分返回指定文字的坐标、根据坐标插入指定块并移动到指定图层



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

所以今天继续摸鱼继续。

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



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 返回的选择集中,返回具体的对象名称。

(setq ent (ssname selSet 0))

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


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

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

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

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

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

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

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


2

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

首先定义块文件的地址。

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

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

OK,这里有个小坑点:

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

(setq blkDef (strcat "*" blkDef))
在块地址前并入 *,这是CAD自带的功能。

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

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



3

最后是移动图层。

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

chenhuixo 发表于 2024-5-7 17:15:12

留名观看

walch2006 发表于 2024-5-8 10:13:26

很吸引人,正是新手需要的.话说我想用autolisp来获取梁图中集中标注、支柱原位、下部原位、上中原位、吊筋位置等信息,以及梁支座和梁的尺寸,列出表格,能实现不?

Gaudi 发表于 2024-5-8 16:48:14

第三篇第五部分修改增强属性块中特定属性标签的属性值



最后一个子函数了。

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

确实可行哈!

(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)

最后抄袭到的代码如下:
(defun SetBlockAttributeValue ( attributeName attributeValue )
(setq ent (entlast))
(setq vla-obj (vlax-ename->vla-object ent))
(vl-some
    '(lambda ( x )
      (if (= attributeName (vla-get-tagstring x))
      (progn (vla-put-textstring x attributeValue) attributeValue)
      )
    )
    (vlax-invoke-method vla-obj 'getattributes)
)
)

自己修改了下,更适合这次的需求。

lin091 发表于 2024-5-10 22:28:19

新手学习中,感谢楼主开好贴

小城调调 发表于 2024-5-13 15:50:12


感谢分享,坐等更新。

weijiewen 发表于 2024-5-14 14:29:19

很实用的新手教材!
页: 1 2 3 4 5 [6]
查看完整版本: 新手从零开始的第一份LISP程序全纪录