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
很实用的新手教材!