免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 6495|回复: 21
收起左侧

Python3操作AutoCAD:利用pyautocad库能够自动化地进行CAD画图

  [复制链接]

8

主题

8589

铜板

22

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
24354
发表于 2021-9-17 11:01 | 显示全部楼层 |阅读模式
本帖最后由 aoao1 于 2021-9-17 11:13 编辑

笔者其实是一名机器学习算法工程师,工作中最痛苦的事儿就是标注数据。而我遇到的不仅仅是标注类别、标签之类的,我需要标注户型图中餐厅和客厅的分区多边形,这个就需要我读取户型图数据(也就是坐标点),然后画图画出来,分析后进行分区画框(其实就是找出分区坐标点)。这个项目工作任务量还是很大,难度也不低,标注数据难度更大。我需要写脚本,否则我哪里知道坐标点怎么标呀。各种画图工具其实也没多大用,我就想着自己开发一个分区标注工具,核心就是利用pyautocad库将已有坐标点画出来,在CAD软件上进行矩形框的添加,再利用程序将分区坐标点读取出来,自动写入户型图格式文件中。这样我需要做的仅仅就是看户型图画框这么简单的数据标注工作。
项目核心还是利用pyautocad进行api操作。官网上关于这个库的文档资料很少,讲解得也不全。我这里就总结各种常用的操作,也就是我用到的操作。(说白了,这个库就是将数据通过接口输入给CAD应用里进行操作,所以在画图过程中,CAD进程一定不能关闭,本质还是CAD在画图,而且画线操作不能太快,CAD应用来不及反应也可能会报错,这个问题有待解决)
pyautocad的Github地址:https://github.com/reclosedev/pyautocad从里面可以看到源码,找到基本用法,也能找到官方文档。(建议好好阅读,本来讲解就少,不能随便看看,出bug的几率很大)
pyautocadpyautocad包可以用任何版本的cad进行操作,实际上接口都是一样的。文档中首先给出连接cad的代码:
from pyautocad import Autocad
# 自动连接上cad,只要cad是开着的,就创建了一个<pyautocad.api.Autocad> 对象。这个对象连接最近打开的cad文件。 # 如果此时还没有打开cad,将会创建一个新的dwg文件,并自动开启cad软件
acad = Autocad(create_if_not_exists=True)# acad.prompt() 用来在cad控制台中打印文字
acad.prompt("Hello, Autocad from Python")# acad.doc.Name储存着cad最近打开的图形名print acad.doc.Name
其实接下来就可以利用文档中给的接口进行画图了,每个接口不难理解,但是接口参数没有详细的例子很是头疼。我使用过的接口在下面,笔者尽量将参数写清楚:
#导入APoint类是非常必要的,画图都是靠点来画,而且CAD中所有的点都必须用APoint类进行包裹。APoint(10,30),# 其中10代表点的x坐标,30代表点的y坐标。from pyautocad import APointimport math
# 画直线,p1是画线的第一个点,p2是第二个点
acad.model.AddLine(p1,p2)
# 添加文本,第一个参数就是添加的文本字符串,第二p是被APoint类包裹的点,也就是说在哪个坐标下显示文本,15是文本字体大小
text = acad.model.AddText("{0}".format(text), p, 15)# 文本从p1点移动到p2点
text.move(p1, p2)
# 画圆,第一个参数p就是APoint类包裹的点,也就是圆心位置,第二参数10是半径大小
acad.model.AddCircle(p, 10)
# 画圆弧,第一个参数是在哪个点画圆弧,第二个参数是半径,第三个是开始弧(弧度制,不是角度制),第四个点是结束弧。
acad.model.AddArc(p, radius, math.radians(90), math.radians(270))
# 保存cad图到指定位置,第一个参数一定是保存的绝对路径!!,64是保存的一种格式,笔者从1到100都试了一遍,# 有一些是可以生成图的,都是CAD可以打开的文件类型格式。其实跟着笔者写64就好!
acad.doc.SaveAs("{0}".format(save_path), 64)
[size=10.0000pt]·
那接下来就可以结合Python画图了,来个例子(很官方):
from pyautocad import Autocad, APoint


acad = Autocad(create_if_not_exists=True)
acad.prompt("Hello, Autocad from Python\n")print(acad.doc.Name)

p1 = APoint(0, 0)
p2 = APoint(50, 25)for i in range(5):
    text = acad.model.AddText('Hi %s!' % i, p1, 2.5)
    acad.model.AddLine(p1, p2)
    acad.model.AddCircle(p1, 10)
    p1.y += 10

dp = APoint(10, 0)# !!!!!!!遍历cad图形对象以及访问/修改对象属性for text in acad.iter_objects('Text'):
    print('text: %s at: %s' % (text.TextString, text.InsertionPoint))
    text.InsertionPoint = APoint(text.InsertionPoint) + dp
for obj in acad.iter_objects(['Circle', 'Line']):
    print(obj.ObjectName)
[size=10.0000pt]·
结果是:
file:///C:\Users\hp\AppData\Local\Temp\ksohtml1476\wps1.png
这个方法提取可以PolyLine的各个顶点,帮我我项目的大忙了。!!!
for item in acad.iter_objects("PolyLine"):
    print(item.Coordinates)'''
(-462.01707322354014, 719.8251441314151, 207.17175903027055, 1056.4031530064085,
389.6778054895749, 574.9096117303479, -143.80140284041954, 434.6687742615859,
-326.30744929972207, -60.84885181138725, -564.9692056597924, 308.45202158973643,
-327.4641724567995, 461.94033545845366, -593.0470534647193, 546.8614421365228,
-616.4452718779175, 803.9696476627087)
'''# 第1、2个元素构成第一个坐标, 3、4个元素构成第二个坐标,以此类推,每两个元素构成一个坐标。
[size=10.0000pt]·
错误参考:
file:///C:\Users\hp\AppData\Local\Temp\ksohtml1476\wps2.png
其他的具体都可以去官网去仔细研究,来一张户型图的CAD图结束这一篇技术分享博客吧!

file:///C:\Users\hp\AppData\Local\Temp\ksohtml1476\wps3.png
转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/Tong_T/article/details/83029695
[size=10.5000pt]


8

主题

1万

铜板

33

好友

地信专家组

Rank: 14Rank: 14Rank: 14Rank: 14

积分
1658

地信元老地信专家组名人堂勋章灌水勋章宣传勋章

发表于 2021-10-5 08:39 | 显示全部楼层
感谢分享,看看,学习学习
回复 支持 反对

使用道具 举报

0

主题

3967

铜板

1

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1713
发表于 2021-10-7 17:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

10

主题

1万

铜板

20

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3720
发表于 2021-11-10 10:02 | 显示全部楼层
谢谢你的分享
回复 支持 反对

使用道具 举报

10

主题

1万

铜板

20

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3720
发表于 2021-11-10 10:02 | 显示全部楼层
谢谢你的分享
回复 支持 反对

使用道具 举报

3

主题

6107

铜板

6

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
892
发表于 2021-12-4 19:52 | 显示全部楼层
感谢楼主的分享
回复 支持 反对

使用道具 举报

0

主题

1万

铜板

2

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2605
发表于 2021-12-16 10:40 | 显示全部楼层
感谢分享,支持
回复 支持 反对

使用道具 举报

33

主题

4万

铜板

19

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
10860

活跃勋章

发表于 2022-11-26 15:18 | 显示全部楼层
看起来有点复杂。
回复 支持 反对

使用道具 举报

0

主题

2万

铜板

6

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3555
发表于 2023-2-28 16:22 | 显示全部楼层
路过支持一下
回复 支持 反对

使用道具 举报

1

主题

2583

铜板

1

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
109
发表于 2023-3-15 21:50 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

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

本版积分规则

在线客服
快速回复 返回顶部 返回列表