Python pyautocad库 使用简介

目 录

  • 〇、相关文章
  • 一、前沿
  • 二、与CAD的连接
  • 三、系统设置
  • 四、图层
  • 五、绘图
  • 六、修改
  • 七、块组
  • 八、注释
  • 九、文件
  • 十、选择集
  • 十一、API
  • 十二、尾声
  • 十三、鸣谢

〇、相关文章

  • Python pyautocad库 使用简介
  • Python AutoCAD 系统设置
  • Python AutoCAD 图层
  • Python AutoCAD 绘图
  • Python AutoCAD 修改
  • Python AutoCAD 块组
  • Python AutoCAD 注释
  • Python AutoCAD 文件
  • Python AutoCAD 选择集

一、前沿

Pyautocad库由俄罗斯工程师Roman Haritonov开发,用于简化使用Python语言书写AutoCAD ActiveX Automation脚本,因官方参考实例较少,为了方便大家交流和学习,特将pyautocad模块的基本用法,做如下简要说明。

1、Pyautocad库的安装

如已安装Anaconda,在 Anaconda Prompt 中键入 pip install pyautocad 便可自动完成该库的导入;如未安装 Anaconda,也可 pip 手动导入,其在PyPI(Python Package Index)上的注册地址为: https://pypi.org/project/pyautocad 。

2、版本说明

Python:3.6.0
CAD:2014
Pyautocad:0.2.0

3、ActiveX Automation

ActiveX Automation是ActiveX为Windows用户提供的一项重要技术,可以使各应用程序间通过数据嵌入或链接的方式共享数据,并在Windows系统统一管理下进行协调,让这些应用程序以一定的流程相互沟通,相互控制,即一个程序暴露其可用对象,另一个程序控制这些对象,设置属性、调用方法,从而实现某种功能,完成所要求的动作。

AutoCAD程序开放某些对象给Windows系统,使用程序语言并通过ActiveX Automation,我们就可以对这些对象进行存取。 AutoCAD ActiveX接口的主要构件就对象,每一个显露的对象均精确代表一个AutoCAD组件。

AutoCAD以分层结构来组织对象,分层结构的视图称为“对象模型”,如下图所示。Application对象是AutoCAD ActiveX Automation对象模型的根对象,通过它,用户可以访问任何其他的对象或任何对象指定的特性或方法。对象模型给出了上级对象与下级对象之间的访问关系。
Python pyautocad库 使用简介_第1张图片
AutoCAD对象都至少具有一个属性,用于描述对象。例如,圆具有半径、面积、线型等属性,通过这些属性能描述出一个具体的圆。
为了清晰直观及逻辑清楚,本系列文章部分代码并未兼顾效率,故代码行数较多,还请见谅。

二、与CAD的连接

事实上,pyautocad库仅仅起到了接口作用,pyautocad利用comtypes.client启动或连接CAD(见下图pyautocad源代码),就启动速度而言,pyautocad恰恰是最慢的。所以,大家不必纠结采用何种方式与CAD建立连接。以下三种方式任选其一,推荐使用第三种。因为,利用win32com这一个库,可以与Excel、Word等等其他程序建立密切的联系。基于此,本文实际上与pyautocad关系已不大,只是将其作为一个开头,本文大部分介绍的是AutoCAD ActiveX 。这也是为什么其余相关文章的标题均是【Python Autocad ××××】的原因。由于本人学习Python如何接CAD时,最先了解到就是pyautocad库,我相信大部分小白也是从这个库开始的,为作纪念,也为初学者能更方面的搜索到本文,本文标题不做变更。
建议:三种连接方式尽量不要相互混着用,否则会有意想不到的错误,对于初学者尽量采用pyautocad的方式连接CAD,相关的运行逻辑了解清楚后,再采用其他方式,程序报错是在所难免的,耐心解决。
Python pyautocad库 使用简介_第2张图片
与CAD建立连接的三种方式:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.30 18:46
=============================
'''

# 以下两种方式均可实现与正在运行着的CAD的连接

" # *********************************************** 方式一 *********************************************** # "

from pyautocad import Autocad

acad = Autocad(create_if_not_exists = True)
    # 连接正在运行的CAD程序;
    # 若CAD未运行,则程序自动启动CAD,启动较慢,请耐心等待;
    # 自动启动的CAD文件采用默认名称Drawing1。

acad.prompt("Hello! AutoCAD from pyautocad.")
    # 在CAD命令行显示"Hello! Autocad from Python.",用于测试对CAD的控制是否成功;
    # 此时,注意观察命令行,若无反应可按F2,查看命令输入历史。

print(acad.doc.Name)
    # 获得与Python连接的正在运行的CAD文件名。

" # *********************************************** 方式二 *********************************************** # "

import comtypes.client

acad = comtypes.client.GetActiveObject("AutoCAD.Application")
    # 获取正在运行的AutoCAD应用程序对象
doc = acad.ActiveDocument
    # 获取当前文件
ms = doc.ModelSpace
    # 获取当前文件的模型空间
    
doc.Utility.Prompt("Hello! AutoCAD from comtypes.")
print(doc.Name)

" # *********************************************** 方式三 *********************************************** # "

import win32com.client as win32

acad = win32.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument
ms = doc.ModelSpace

doc.Utility.Prompt("Hello! AutoCAD from win32com.")
print(doc.Name)
" # ************************************************ END ************************************************ # "

三、系统设置

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

" # ********************************************* 1、颜色设置 ********************************************* # "

# 1、颜色设置

## (1)、设置模型空间背景色
acad.ActiveDocument.Application.preferences.Display.GraphicsWinModelBackgrndColor = 0
          # 等号后为非负整数,取值范围为[0,16777215],为十进制下的颜色代号,由RGB颜色值转化而来;
          # 具体计算公式为:R+256*G+256*256*B;
          # 例如:对于白色(R=255,G=255,B=255),颜色代号为255+256*255+256*256*255=16777215。
          # 常用标准颜色代号如下:
          # 0、黑色;255、红;65535、黄;65280、绿;16776960、青;16711680、蓝色;16711935、洋红;16777215、白色;
          # 将GraphicsWinModelBackgrndColor替换为GraphicsWinLayoutBackgrndColor,即可设置图纸空间背景色。

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/96587211" # ************************************************ END ************************************************ # "

为了节约篇幅,本文未能详尽列出关于系统设置方面的全部代码,如有需求,详见:
文章: Python AutoCAD 系统设置;
网址: https://blog.csdn.net/Hulunbuir/article/details/96587211 。

四、图层

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

" # ********************************************* 1、新建图层 ********************************************* # "

# 1、新建图层

LayerObj = acad.ActiveDocument.Layers.Add("HIT_Layer")
     # 添加新图层,图层名称为"HIT_Layer"。
acad.ActiveDocument.ActiveLayer = LayerObj
     # 将"HIT_Layer"图层设置为当前图层。

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/96588654" # ************************************************ END ************************************************ # "

为了节约篇幅,本文未能详尽列出关于图层方面的全部代码,如有需求,详见:
文章: Python AutoCAD 图层;
网址: https://blog.csdn.net/Hulunbuir/article/details/96588654 。

五、绘图

采用如下方式可实现以CAD命令方式绘图。
Python pyautocad库 使用简介_第3张图片

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

from pyautocad import APoint
import numpy as np
import math

" # ******************************************* 1、创建点及直线 ******************************************** # "

# 1、创建点及直线

## (1)、创建点

### ①、方法一
pnt = APoint(50, 50)
acad.model.AddPoint(pnt)

### ②、方法二
pnt = np.array([50, 50, 0], dtype = np.float)
acad.model.AddPoint(pnt)

" # **************************************** 2、添加多段线及样条曲线 **************************************** # "

# 2、添加多段线及样条曲线

## (1)、添加多段线

pnts = [APoint(0, 0), APoint(40, 35), APoint(43, 32),  APoint(50, 32), APoint(55, 35)]
pnts = np.array([j for i in pnts for j in i], dtype = np.float)
pline_obj = acad.model.AddPolyLine(pnts)

## (2)、添加含圆弧的多段线

[L, B, R] = [400, 200, 50]
          # L、B、R分别为矩形的长度、矩形的宽度及圆角半径。

x = [0.5*(L-2*R), 0.5*L]  # 倒角矩形各关键点横坐标的绝对值;
y = [0.5*(B-2*R), 0.5*B]  # 倒角矩形各关键点纵坐标的绝对值;

pnts = [APoint(x[0], -y[1]), APoint(x[1], -y[0]), APoint(x[1], y[0]),
        APoint(x[0], y[1]), APoint(-x[0], y[1]), APoint(-x[1], y[0]),
        APoint(-x[1], -y[0]), APoint(-x[0], -y[1])]
        
pnts = np.array([j for i in pnts for j in i], dtype = np.float)
pline_obj = acad.model.AddPolyLine(pnts)

pline_obj.Closed = True                # 闭合多段线
bulgevalue = math.tan(math.pi/8)       # 凸度,为四分之一倍圆弧所对圆心角的正切值。
[pline_obj.SetBulge(2*i, bulgevalue) for i in range(4)]
          # 将多段线的第1、3、5、7部分设置为凸度为bulgevalue的圆弧。

···

" # ********************************************* 6、图案填充 ********************************************* # "

# 6、图案填充

'''
# 本方法没有采用pyautocad库;
# 特别感谢:ke1078 Email:354****[email protected];
# 以下代码由ke1078同学提供。
'''

import pythoncom
import win32com.client

acad = win32com.client.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument
doc.Utility.Prompt("hello world\n")
mp = doc.ModelSpace

def vtpt(x,y,z=0):
   return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x,y,z))

def vtobj(obj):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, obj)

[ptnName, ptnType, bAss, center, radius ] = ["ANSI31", 0, True, vtpt(0, 0, 0), 10]

outerLoop = []
outerLoop.append (mp.AddCircle(center, radius))
outerLoop = vtobj(outerLoop)
hatchObj = mp.AddHatch(ptnType, ptnName, bAss)
hatchObj.AppendOuterLoop(outerLoop)
hatchObj.Evaluate()

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/96589272" # ************************************************ END ************************************************* # "

为了节约篇幅,本文未能详尽列出关于绘图方面的全部代码,如有需求,详见:
文章: Python AutoCAD 绘图;
网址: https://blog.csdn.net/Hulunbuir/article/details/96589272 。

六、修改

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

" # ******************************************** 1、复制及删除 ******************************************** # "

# 1、复制及删除

copyObj = EllObj.Copy()
     # 原位置复制,复制的图元与原图元重合。

copyObj.Delete()

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/97393167" # ************************************************ END ************************************************* # "

为了节约篇幅,本文未能详尽列出关于修改方面的全部代码,如有需求,详见:
文章: Python AutoCAD 修改;
网址: https://blog.csdn.net/Hulunbuir/article/details/97393167 。

七、块组

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''
" # *********************************************** 1、块 ************************************************ # "

# 1、块

## (3)、插入块

### ①、从当前文件中插入块
insertionPnt = APoint(0, 0)
RetVal = acad.model.InsertBlock(insertionPnt, "HIT_Block", 1, 1, 1, 0 )
          # acad.model.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation);
          # insertionPnt为块的插入点,即块的定位夹点与图纸空间中的该点对齐。
          
### ②、从外部文件中插入块
insertionPnt = APoint(10, 0)
RetVal = acad.model.InsertBlock(insertionPnt, "D:\AutoCAD\Harbin.dwg", 1, 1, 1, 0 )
          # 外部文件名尽量与当前文件中的各块名称不同;
          # 插入后外部文件名将作为其在当前文件中的块名;
          # 外部文件的坐标原点为其作为块的定位夹点。

## (4)、添加属性到块

[height, mode, prompt, insertionPoint, tag, value] \
    = [1, 2, "Attribute_Prompt", APoint(0, 0), "Attribute_Tag", "Attribute_Value"]
         # 各变量的含义依次为:字高、模式、提示、插入点、标记、默认。
attributeObj = blockObj.AddAttribute(height, mode, prompt, insertionPoint, tag, value)

## (5)、已有块属性的读取
'''
# RetVal = object.GetAttributes() 此方法在不借助其他库的情况下如何使用暂时未知;
# 采用把块炸开将属性部分暴露出来,然后提取其相关信息的方式获取属性信息;
# 此方式虽然曲折,但至少可行,如有更高效的方法还请评论区附上代码,造福大众。
'''

# 不采用如下方式,直接炸开块会报错;
# 删除过多的块属性时,可能报错;
# 原因可能是程序运行过快,一次性删除不掉,此时要反复多删几次。

try:
    RetVal.Explode()  # 炸开块
except:
    RetVal.Delete()   # 删除重复    

for obj in acad.iter_objects("AttributeDefinition"):
    # 以下获取块的属性信息
    # 如果想获取某一特定块的属性信息可以用ObjectID识别特定块
    print(obj.ObjectName)
    print(obj.TagString)
    print(obj.TextString)
    print(obj.PromptString)

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/97393463" # ************************************************ END ************************************************ # "

为了节约篇幅,本文未能详尽列出关于块组方面的全部代码,如有需求,详见:
文章: Python AutoCAD 块组;
网址: https://blog.csdn.net/Hulunbuir/article/details/97393463 。

八、注释

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

" # ********************************************** 1、文字 *********************************************** # "

# 1、文字

## (1)、创建新文本
textString = "Harbin Institute of Technology"
insertPnt = APoint(0, 0)
height = 2.5
textObj = acad.model.AddText(textString, insertPnt, height)
          # textString:文本内容;height:字高;
          # 系统默认对齐夹点位于文字基线左侧;
          # 采用系统默认对齐方式时,insertPnt为对齐夹点的位置坐标;
          # 当用户自定义对齐方式时,insertPnt以对齐方式中的为准。

## (2)、对齐方式
AlignNum = 7
textObj.Alignment = AlignNum
          # AlignNum为对齐夹点位置标识号,其取值范围为[0,14];
          # 0 基线左对齐、1 基线居中对齐、2 基线右对齐;
          # 7 表示对齐夹点位于top cennter;
insertPnt = APoint(0, 10)
textObj.TextAlignmentPoint = insertPnt
          # 设置对齐夹点在图纸空间中的绝对位置,可为任意一已知点;
          # 若用户自定义对齐方式,则需设置此项。

" # ******************************************** 2、文本样式 ********************************************* # "

# 2、文本样式

## (1)、创建文字样式
txtStyleObj = acad.ActiveDocument.TextStyles.Add("HIT_TxtStyle")

## (3)、设置字体

### ①、为当前文本样式设置字体
acad.ActiveDocument.ActiveTextStyle.SetFont("楷体", False, False, 1, 0 or 0)
          # acad.ActiveDocument.ActiveTextStyle.SetFont(Typeface, Bold, Italic, charSet, PitchandFamily)
          # Typeface 字体名称;
          # Bold 加粗,布尔值,False为不加粗字体;
          # Italic 倾斜,布尔值,False为倾斜字体;
          # CharSet 字体字符集,1为默认字符集;
          # PitchAndFamily 字节及笔画形式。

" # ******************************************** 3、尺寸标注 ********************************************* # "

# 3、尺寸标注

## (1)、线性及旋转线性标注
import math
XLine1Point = APoint(5, 25)
XLine2Point = APoint(25, 35)
DimLineLocation = APoint(10, 20)
RotationAngle = math.radians(0)
dimRotObj = acad.model.AddDimRotated(XLine1Point, XLine2Point, DimLineLocation, RotationAngle)
          # XLine1Point 第一尺寸界线的起点;
          # XLine2Point 第二尺寸界线的起点;
          # DimLineLocation 尺寸线定位点,尺寸线或其延长线过该点;
          # RotationAngle 尺寸线与水平方向的夹角,去弧度制;
          # RotationAngle=0 水平标注,RotationAngle=90 竖直标注。

" # ******************************************** 4、标注样式 ********************************************* # "

# 4、标注样式

## (1)、创建新标注样式
DimStyleObj = acad.ActiveDocument.DimStyles.Add("HIT_DimStyle")
print(dimAliObj.StyleName) 
          # 打印标注对象的标准样式名称
          # 系统自带标注样式 ISO-25

## (2)、将特定标注样式设为当前
acad.ActiveDocument.ActiveDimStyle = acad.ActiveDocument.DimStyles.Item("HIT_DimStyle")

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/97394254" # ************************************************ END ************************************************ # "

为了节约篇幅,本文未能详尽列出关于注释方面的全部代码,如有需求,详见:
文章: Python AutoCAD 注释;
网址: https://blog.csdn.net/Hulunbuir/article/details/97394254 。

九、文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

"  以下代码请不要在一个文件中同时运行,否则会报错,原因是逻辑冲突。"
"  在D盘创建新文件夹并命名为AutoCAD "

" # ******************************************** 1、打开文件 ********************************************* # "

# 1、打开文件

acad.ActiveDocument.Application.Documents.Open("D:\AutoCAD\PyAutoCAD.dwg")
     # CAD程序中至少存在一个打开的图形空间,否则报错,报错内容为:无法获取Document对象。

" # ******************************************** 2、新建文件 ********************************************* # "

# 2、新建文件

DrawingObj = acad.ActiveDocument.Application.Documents.Add("")
     # 无法直接命名,新建的文件为系统默认名称,即Drawing1、Drawing2等;
     # 若更改名称,在关闭时定义。

" # ******************************************** 5、另存为 *********************************************** # "

# 5、另存为

## (1)、当前文件另存为
acad.ActiveDocument.SaveAs("D:\AutoCAD\PyAutoCAD_SaveAs", 61)
          # 将当前文件另存为PyAutoCAD_SaveAs.dxf;
          # 此时,程序关闭当前文件,将PyAutoCAD_SaveAs.dxf切换为当前文件。
          # 61表示另存为文件的类型是AutoCAD 2013 DXF,常用类型如下:
          # 12 AutoCAD 2000 DWG (*.dwg),13 AutoCAD 2000 DXF (*.dxf);
          # 24 AutoCAD 2004 DWG (*.dwg),25 AutoCAD 2004 DXF (*.dxf);
          # 36 AutoCAD 2007 DWG (*.dwg),37 AutoCAD 2007 DXF (*.dxf);
          # 48 AutoCAD 2010 DWG (*.dwg),49 AutoCAD 2010 DXF (*.dxf);
          # 60 AutoCAD 2013 DWG (*.dwg),61 AutoCAD 2013 DXF (*.dxf);
          # 系统默认为AutoCAD 2013 DWG (*.dwg)。

## (2)、指定文件另存为
acad.ActiveDocument.Application.Documents("PyAutoCAD.dwg").SaveAs("D:\AutoCAD\PyAutoCAD_SaveAs", 61)
          # 将特定文件PyAutoCAD.dwg另存为PyAutoCAD_SaveAs.dxf。

······ 其余功能详见:https://blog.csdn.net/Hulunbuir/article/details/97395152" # ************************************************ END ************************************************ # "

本文篇幅有限,因此未能详尽列出关于文件方面的全部代码,如有需求,详见:
文章: Python AutoCAD 文件;
网址: https://blog.csdn.net/Hulunbuir/article/details/97395152 。

十、选择集

Python AutoCAD 选择集
详见:https://blog.csdn.net/Hulunbuir/article/details/95446723 。

十一、API

官网:https://pyautocad.readthedocs.io >> API

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
=============================
Author = Hulunbuir & DalaiNur
Email: [email protected]
Last Update: 2019.08.14 15:38
=============================
'''

" # *********************************************** 1、api ********************************************** # "

# 1、api - Main Autocad interface

## (1)、get_selection(text='Select objects')

# 从屏幕中选择图元,并获取其特性;
# 以直线为例,其余图元类似,代码如下:

select_lineobj = acad.get_selection(text="请选择直线,按Enter键确认")
lineobj = select_lineobj[0]
          # lineobj为从屏幕中选择的直线对象;
          # 0为对象索引号,若选择的直线个数为n,对象索引号应不大于n-1.

print(lineobj.StartPoint)  # 所选直线起点坐标
print(lineobj.EndPoint)    # 所选直线终点坐标
print(lineobj.Length)      # 所选直线长度
print(lineobj.ObjectID)    # 所选直线的ID号

" # ********************************************** 2、types ********************************************* # "

# 2、types - 3D Point and other AutoCAD data types

" # ********************************************** 3、utils ********************************************* # "

# 3、utils - Utility functions

" # ***************************************** 4、contrib.tables ***************************************** # "

# 4、contrib.tables - Import and export tabular data from popular formats

" # ********************************************** 5、cache ********************************************* # "

# 5、cache - Cache all object’s attributes

" # ************************************************ END ************************************************ # "

十二、尾声

以上,便是pyautocad模块的使用方法简介,因篇幅有限,某些非关键功能未做详细介绍,如有疑问,欢迎邮件来询。

仅以此文为我断断续续近3个月的Python调用CAD学习做一个总结,同时也为有需要的人提供多一点参考。

胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的pāo子里快乐徜徉。

因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。

最后,祝各位攻城狮们,珍爱生命,保护发际线!

本文部分内容,源于网络!

欢迎大家点赞、评论及转载,转载请注明出处!

为我打call,不如为我打款!

打赏可备注邮箱,本人会将上述代码发送给各位土豪!

十三、鸣谢

特别感谢ke1078同学对本文许多高级功能的实现提供的帮助!

Python pyautocad库 使用简介_第4张图片

你可能感兴趣的:(AutoCAD)