你也许听说过Python,能对Revit进行开发,能对Ansys进行开发,能对编写grasshopper脚本,也能编写Dynamo脚本,但你也许没有听说过,Python能对CAD进行开发,今天就带你走进这样一个世界。

AutoCAD是一个广受欢迎的绘图软件,在建筑、机械、制造、工业等各个行业受到广泛关注和使用,对各行各业设计人员来说,掌握AutoCAD软件绘图是一个基本功。

本期使用材料:Python3.6,CAD2014

一、相关内容简介

ActiveX Automation是ActiveX为Windows系统提供的一项重要计算机技术,允许应用程序之间通过数据嵌入或链接方式进行程序间的数据共享,允许程序间相互控制和沟通。

Python是一门解释性语言,在过去的一段时间很欢迎,由于其易用性和可拓展性,在科研和实际生产项目中都展现了非常强大的力量。

pyautocad是一个受到python支持的AutoCAD ActiveX Automation库,由俄罗斯工程师Roman Haritonov开发。

pyautocad安装方法:pip install pyautocad

如果安装速度太慢,参考参考这篇文章来进行换源。

下面就pyautocad使用方法和常见功能进行介绍。

二、使用方法

执行Python代码时候请务必保持CAD软件对要操作的图纸保存过且处于打开状态。

三、常见功能

主要包含自动绘图、CAD对象读取、属性修改等操作。

1.自动绘图

(1)创建图层

示范代码,设置了图层名称、颜色、线宽

from 

执行完成代码

批量创建图层也使用该方法。

(2)创建几何形状和文字

通过pyautocad可以绘制各类常见图形和文字,并支持颜色,线性等属性设置。

代码如下:

from pyautocad import Autocad, APoint, aDoubleacad = Autocad(create_if_not_exists=True)
acad.prompt("Hello, Autocad from Pythonn")
print(acad.doc.Name)
point_list = []
point = "point"p1 = APoint(0, 0)
p2 = APoint(50, 0)
p3 = APoint(100, 0)
p4 = APoint(150, 0)p5 = APoint(0, 50)
p6 = APoint(50, 50)
p7 = APoint(100, 50)
p8 = APoint(150, 50)# 使用多段线工具绘制两个矩形
rectangle_1 = [p1, p2, p6, p5, p1]
rectangle_2 = [p3, p4, p8, p7, p3]rectangle_1 = [j for i in rectangle_1 for j in i]
rectangle_2 = [j for i in rectangle_2 for j in i]rectangle_1 = aDouble(rectangle_1)
rectangle_2 = aDouble(rectangle_2)acad.model.AddPolyLine(rectangle_1)
acad.model.AddPolyLine(rectangle_2)# 创建三个圆及其对应的圆心注释
acad.model.AddCircle(p6, 25)
acad.model.AddText("O1", p6, 6)acad.model.AddCircle(p7, 25)
acad.model.AddText("O2", p7, 6)circle = acad.model.AddCircle(APoint(75, 50), 25)
color = acad.doc.Application.GetInterfaceObject("AutoCAD.AcCmColor.22")
color.SetRGB(255, 0, 0)
circle.TrueColor = color
acad.model.AddText("O3", APoint(75, 50), 6)# 绘制一条直线连接两个圆心
line = acad.model.AddLine(p6, p7)
color = acad.doc.Application.GetInterfaceObject("AutoCAD.AcCmColor.22")
color.SetRGB(255, 0, 0)
line.TrueColor = colorprint("succeed")

运行后成果如下图:

这里注意代码中GetInterfaceObject函数中的AutoCAD.AcCmColor参数和CAD版本有关,已在CSDN博客上进行了简单总结。https://blog.csdn.net/www963257827/article/details/106540476

创建其他图形也使用非常类似的做法。

2.CAD对象读取

(1)读取多段线

矩形等多边形也是多段线。

以下图为例

使用以下代码,来获取每个多段线的图层、面积、颜色。

from pyautocad import Autocad,APoint# 连接及库导入
acad = Autocad(create_if_not_exists=True)
Name = str(acad.doc.Name).split('.')[0]# 获取所有面积线图层下的多段线
All_PolyLine = []
for PolyLine in acad.iter_objects('PolyLine'):All_PolyLine.append([PolyLine.Layer,PolyLine.Area,PolyLine.Color])for item in All_PolyLine:print(item)

运行结果:

注意面积是平方毫米,在CAD里面设置颜色可以使用到RGB,但是获取一般是使用索引颜色,1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑;颜色索引值由RGB发展而来,=R+256*G+256*256*B,0、黑色;255、红;65535、黄;65280、绿;16776960、青;16711680、蓝色;16711935、洋红;16777215、白色;。

['C-2', 98091209.03372192, 3]
['面积线', 2520227.8256306117, 256]
['A-ANNO-TXT', 587254.9055283407, 6]
['A-ANNO-TXT', 587254.9055283407, 6]
['A-ANNO-TXT', 587254.9055284548, 6]
['C-5', 51060000.000019744, 3]
['C-2', 11759945.03892056, 4]
['C-2', 3249859.4010866988, 4]
['C-4', 4160001.056999847, 4]
['C-2', 2520264.697892314, 1]
['C-4', 2240872.4654725655, 7]
['C-4', 1330776.7576205786, 7]
['C-4', 840084.133205322, 7]
['C-2', 979990.7850327509, 7]
['C-2', 1049999.9234942412, 7]
['C-2', 2310079.998951645, 7]
['C-4', 1399486.7558849957, 96]
['C-4', 1120294.6026601, 96]
['C-2', 1120000.0491443346, 96]
['C-2', 1399986.8276547259, 96]
['C-2', 839977.4907388565, 96]
['C-5', 779889.5110795434, 96]
['C-5', 1020000.0049100417, 96]
['C-4', 124433008.56296578, 3]
['C-4', 20060570.435499072, 4]
['C-4', 779116.4012199271, 96]
['C-4', 839641.7594418161, 96]
['C-4', 1680333.9012027157, 7]
['面积线', 960000.0000007467, 96]
['C-5', 7207248.23532404, 4]
['C-5', 2311720.767704343, 1]
['C-4', 8075219.763373986, 1]
['面积线', 364454293.2754315, 6]
['C-3', 6060000.025629456, 4]
['面积线', 2519969.7264163825, 256]
['A-ANNO-TXT', 587254.9055283407, 6]
['A-ANNO-TXT', 587254.9055283407, 6]
['A-ANNO-TXT', 587254.9055284548, 6]
['C-1', 2380101.5847119256, 7]
['C-1', 1890000.0013882837, 7]
['C-1', 1679999.9208089765, 96]
['C-3', 840000.3311603391, 96]
['C-3', 4649999.984865353, 4]
['C-1', 3249973.6391162067, 4]
['面积线', 279999.9998518797, 1]
['面积线', 2520000.000000908, 1]
['C-3', 1189985.7041473116, 7]
['C-3', 1189985.7041471447, 96]
['C-2', 11699955.77990386, 4]
['C-1', 840007.4665881894, 96]
['C-2', 780006.5635638126, 96]
['C-3', 77809984.88052835, 3]
['C-3', 719999.9999986846, 96]
['C-1', 1280000.000000004, 96]
['C-2', 1280411.183736003, 96]
['C-1', 0.0, 3]
['C-2', 98088338.75570826, 3]
['C-2', 979990.7850327509, 7]
['C-2', 1049999.9234941297, 7]
['C-2', 2310079.998952029, 7]
['C-2', 1120000.0491443567, 96]
['C-2', 1399986.8276547259, 96]
['面积线', 345739150.7966157, 6]
['C-2', 3249859.4010866657, 4]
['C-1', 11762117.43490041, 4]

(2)读取更多图形种类

采用这个图为例,其中包含圆、多边形、多线、圆弧、椭圆、样条曲线,且每个图形的种类对应图层,比如图中选中的圆对应的图层就是圆,方便展示效果。

获取了以上六种图形相关属性。

from pyautocad import Autocad,APoint# 连接及库导入acad = Autocad(create_if_not_exists=True)
Name = str(acad.doc.Name).split('.')[0]# 获取所有面积线图层下的多段线
All_PolyLine = []# 获取线
for line in acad.iter_objects('Line'):All_PolyLine.append(['线',line.Layer,line.Color])# 获取多段线
for polyLine in acad.iter_objects('PolyLine'):All_PolyLine.append(['多段线',polyLine.Layer,polyLine.Area,polyLine.Color])# 获取样条曲线
for spline in acad.iter_objects('Spline'):All_PolyLine.append(['样条曲线',spline.Layer,spline.Area,spline.Color])# 获取圆
for circle in acad.iter_objects('Circle'):All_PolyLine.append(['圆',circle.Layer,circle.Area,circle.Color])# 获取圆弧
for arc in acad.iter_objects('Arc'):All_PolyLine.append(['圆弧',arc.Layer,arc.Area,arc.Color])# 获取椭圆
for ellipse in acad.iter_objects('Ellipse'):All_PolyLine.append(['椭圆',ellipse.Layer,ellipse.Area, ellipse.Color])for item in All_PolyLine:print(item)

运行结果

可以看到,多线、多边形、样条曲线属于线类型的同时,多边形还属于多段线,其他类型也有一些交叉重叠。

(3)读取块

目前pyautocad 支持对CAD图纸中的块信息读取,这里以读取块名称为例,以下图为例。

实例代码如下:

from pyautocad import Autocad,APoint acad = Autocad(create_if_not_exists=True) Name = acad.doc.Name print(Name) # 获取块数量 blocks_nums = acad.doc.Blocks.count # 获取所有块 blocks = acad.ActiveDocument.Blocks blocks_names = [blocks.Item(i).Name for i in range(blocks_nums)] # [acad.ActiveDocument.Blocks.Item(i).Name for i in range(blocks_nums)] # 获取块中所有仅含'平面图'块名 blocks_names_cleared = [] for i in range(blocks_nums): if '平面图' in blocks_names[i]: blocks_names_cleared.append(blocks_names[i]) print(blocks_names_cleared)

from pyautocad import Autocad,APointacad = Autocad(create_if_not_exists=True)
Name = acad.doc.Name
print(Name)# 获取块数量
blocks_nums = acad.doc.Blocks.count
# 获取所有块
blocks = acad.ActiveDocument.Blocks
blocks_names = [blocks.Item(i).Name for i in range(blocks_nums)]
# [acad.ActiveDocument.Blocks.Item(i).Name for i in range(blocks_nums)]
# 获取块中所有仅含'平面图'块名
blocks_names_cleared = []
for i in range(blocks_nums):if '平面图' in blocks_names[i]:blocks_names_cleared.append(blocks_names[i])
print(blocks_names_cleared)

运行结果

3.属性修改

在可以获取属性的基础上,我们可以对属性进行修改,以这个图纸为例,将所有图形的图层替换为默认图层。

实现代码如下

from pyautocad import Autocad,APoint# 连接及库导入
acad = Autocad(create_if_not_exists=True)
Name = str(acad.doc.Name).split('.')[0]# 修改线图层
for line in acad.iter_objects('Line'):line.Layer = '0'# 修改多段线图层
for polyLine in acad.iter_objects('PolyLine'):polyLine.Layer = '0'# 修改样条曲线图层
for spline in acad.iter_objects('Spline'):spline.Layer = '0'# 修改圆图层
for circle in acad.iter_objects('Circle'):circle.Layer = '0'# 获取圆弧修改线图层
for arc in acad.iter_objects('Arc'):arc.Layer = '0'# 修改椭圆图层
for ellipse in acad.iter_objects('Ellipse'):ellipse.Layer = '0'

运行代码结果

总结

即使我们已经开始进入BIM时代,开始使用BIM相关软件进行绘图,但很多时候还是离不开二维。以CAD为代表的二维设计软件,在提供我们展示专业能力平台的同时,往往因为三维的不成熟和设计人员对二维内容的熟悉,CAD在未来一段时间还是会延续。合理的利用计算机资源,结合自身专业背景,对CAD进行开发,也可以提高我们的工作效率。

计算机没有autoCAD_BKM ? 37期 — 教你Python玩转AutoCAD相关推荐

  1. python黑马视频全套-黑马上海37期Python全套视频课程

    资源内容: 黑马上海37期Python全套视频课程|____激活码2018692.txt|____课件资料 |____基础班-就业班课件资料 -1-4位基础班 5-14就业班 |____安装包.开发工 ...

  2. 什么是python基础教程-python基础教程之python是什么?概念解析

    Python,是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CP ...

  3. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  4. 计算机专业的毕业设计论文如何写作 python毕业设计题目

    计算机专业的毕业设计论文如何写作 & python毕业设计题目   源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 论文是毕设中很重要的部分 ...

  5. 【Python进入山东小学教材】吴恩达:孩子会识字后立马教她Python!

    如果说2017年有一门最火"外语",那一定是Python.现在,Python的这把火已经烧到了程序员的圈子外. Python进入山东小学教材,小学生开始学Python 据" ...

  6. CSDN 周赛37期题解

    CSDN 周赛37期题解 1.题目名称:幼稚班作业 2.题目名称:异或和 3.题目名称:大整数替换数位 4.题目名称:莫名其妙的键盘 卡个bug 小结 1.题目名称:幼稚班作业 幼稚园终于又有新的作业 ...

  7. http://click.aliyun.com/m/20492/ DT科技评论第37期:Cato_Network将会重新定义下一代网络以及安全

    原文链接 DT科技评论第37期:Cato Network将会重新定义下一代网络以及安全 dt科技评论  2017-05-10 15:08:12  浏览68  评论0 安全 无线 防火墙 云安全 互联网 ...

  8. Python培训教程之Python基础知识点梳理

    Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...

  9. 《强化学习周刊》第37期:视觉深层框架、Transformer World模型、注意力增强强化学习...

    No.37 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和 ...

最新文章

  1. 《大话数据结构》第9章 排序 9.4 简单选择排序
  2. C语言merge sort归并排序算法(附完整源码)
  3. 释放Linux磁盘空间方法
  4. 安装win10的笔记本有10个地方需要微调
  5. SpringCloud微服务:Eureka组件之服务注册与发现
  6. Android 博客园客户端 (四) 基本功能完成(博客列表和内容、新闻列表和内容、推荐博主)...
  7. 【转】JavaScript顶级对象参考模型
  8. internet信息服务器管理器,细述Win10系统上开启internet信息服务(iis)管理器的操作步骤...
  9. 任务01-信息编码:纯⽩⾊的bmp图⽚ 用Hex Editor Neo画一个“C
  10. mysql未开启binlog恢复_无全量备份、未开启binlog日志,利用percona工具恢复delete的数...
  11. SSH免密登录(笔记)
  12. ES 查询一,基于URL 的查询
  13. 小记 百度地图 soso地图 经纬度偏移
  14. 字符串转化为json对象和json数组
  15. 微信小程序答题,怎么设计页面渲染,答完一题,跳到下一题
  16. javaSE (十七)Date、SimpleDateFormat、Calendar类的方法(计算在这个世界上生活多少天、显示今夕何年何月、判断闰年还是平年)
  17. 基于HFSS的天线设计流程
  18. np.mean()和np.std()函数
  19. 语音识别相关资料整理
  20. FEKO仿真涂覆目标时的参数设置

热门文章

  1. 基金转换——乾坤大挪移
  2. NAT ALG技术白皮书
  3. win7系统安装 cygwin 的详细步骤
  4. WMI 入门学习实例
  5. 字符串匹配——KMP算法
  6. 网易免费企业邮怎样设置客户端?
  7. ts服务器cal文件激活,付费网课ts文件如何解密?m3u8无IV信息
  8. pythonif语句怎么换行输入_李沁和李易峰演的电视剧叫什么名字
  9. 助力中国 DevOps 运动,ONES 携手 DevOps 社区举办第12届 Meetup
  10. Mysql的课外补充与进阶