pyautocad库 使用简介
一、前沿
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对象模型的根对象,通过它,用户可以访问任何其他的对象或任何对象指定的特性或方法。对象模型给出了上级对象与下级对象之间的访问关系。
AutoCAD对象都至少具有一个属性,用于描述对象。例如,圆具有半径、面积、线型等属性,通过这些属性能描述出一个具体的圆。
二、与CAD的连接
#!/usr/bin/env python
# -*- coding: utf-8 -*-”’
===========================
Author = Hulunbuir
Email:liyang@alu.hit.edu.cn
===========================
”’” # ******************************************** 与CAD的连接 ********************************************* # ”
from pyautocad import Autocad
acad = Autocad(create_if_not_exists=True)
# 连接正在运行的CAD程序;
# 若CAD未运行,则程序自动启动CAD,启动较慢,请耐心等待;
# 自动启动的CAD文件采用默认名称Drawing1。acad.prompt(“Hello! Autocad from Python.”)
# 在CAD命令行显示”Hello! Autocad from Python.”,用于测试对CAD的控制是否成功;
# 此时,注意观察命令行,若无反应可按F2,查看命令输入历史。print(acad.doc.Name)
# 获得与Python连接的正在运行的CAD文件名。#!/usr/bin/env python
# -*- coding: utf-8 -*-”’
===========================
Author = Hulunbuir
Email:liyang@alu.hit.edu.cn
===========================
”’” # ******************************************** 与CAD的连接 ********************************************* # ”
from pyautocad import Autocad
acad = Autocad(create_if_not_exists=True)
# 连接正在运行的CAD程序;
# 若CAD未运行,则程序自动启动CAD,启动较慢,请耐心等待;
# 自动启动的CAD文件采用默认名称Drawing1。acad.prompt(“Hello! Autocad from Python.”)
# 在CAD命令行显示”Hello! Autocad from Python.”,用于测试对CAD的控制是否成功;
# 此时,注意观察命令行,若无反应可按F2,查看命令输入历史。print(acad.doc.Name)
# 获得与Python连接的正在运行的CAD文件名。” # ************************************************ END ************************************************ # ”
三、系统设置
” # ********************************************* 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,即可设置图纸空间背景色。## (2)、设置十字光标颜色
” 非关键功能,语法与(1)类似,为了节约篇幅,在此不做赘述,如有需求,联系本人,以下有标题而无内容的原因与此相同。 ”
” # ********************************************* 2、显示设置 ********************************************* # ”
# 2、显示设置
## (1)、显示线宽
acad.ActiveDocument.preferences.LineweightDisplay = 1
# 等号后为布尔值,TRUE = 1,显示线宽,FALSE = 0,隐藏线宽。## (2)、显示自动捕捉靶框
## (3)、显示自动捕捉标记
## (4)、显示极轴追踪矢量## (5)、显示点样式
acad.ActiveDocument.SetVariable(“PDMODE”, 35)
# 系统默认值为0;
# 详细信息见CAD帮助文档AUTOSNAP(系统变量)。## (6)、关闭实体填充显示
acad.ActiveDocument.Preferences.SolidFill = 0
# 执行重新生成图形命令后才变更显示
acad.ActiveDocument.Regen(0)
# 重新生成图形” # ********************************************* 3、尺寸设置 ********************************************* # ”
# 3、尺寸设置
## (1)、设置十字光标大小
acad.ActiveDocument.Application.preferences.Display.CursorSize = 5
# 等号后取1到100的整数,表示十字光标占屏幕面积的百分比,10代表占比为10%,系统默认值为5。## (2)、设置自动捕捉靶框大小
## (3)、设置自动捕捉标记大小## (5)、设置点大小
acad.ActiveDocument.SetVariable(“PDSIZE”, 10)” # ********************************************* 4、草图设置 ********************************************* # ”
## 4、草图设置
## (1)、开启栅格显示
acad.ActiveDocument.SetVariable(“GRIDMODE”, 1)
# 0 关闭栅格显示## (2)、开启正交模式
## (3)、极轴追踪
### ①、开启极轴追踪
### ②、用所有极轴角设置追踪并相对上一段测量极轴角
## (4)、开启对象捕捉” # ********************************************* 5、视图设置 ********************************************* # ”
# 5、设置视图
## (1)、俯视图及西南等轴测图
” 因时间、精力及个人水平有限,更改系统预设视图暂未解决,如哪位大神已掌握,还请在评论中附上代码,在此跪谢!!!”
## (2)、全视图
acad.ActiveDocument.Application.ZoomAll()” # ***************************************** 6、设置文件自动保存 ****************************************** # ”
# 6、设置文件自动保存
acad.ActiveDocument.Application.preferences.OpenSave.AutoSaveInterval = 0.51
# 等号后数值为自动保存间隔分钟数,非负,可为小数;
# 当为小数时,系统自动取整,取整规则为:小数部分<=0.5时,向下取整,>0.5时,向上取整;
# 例如:当等号后值为4.5时,系统自动取为4,当为4.51时系统自动取为5;
# 当数值<=0.5时,自动保存功能关闭。” # ************************************************ END ************************************************ # “
四、图层
” # ********************************************* 1、新建图层 ********************************************* # ”
# 1、新建图层
LayerObj = acad.ActiveDocument.Layers.Add(“HIT_Layer”)
# 添加新图层,图层名称为”HIT_Layer”。
acad.ActiveDocument.ActiveLayer = LayerObj
# 将”HIT_Layer”图层设置为当前图层。
” # ******************************************* 2、图层颜色设置 ******************************************* # ”
# 2、图层颜色设置
ClrNum = 1
LayerObj.color = ClrNum
# ClrNum为颜色索引号,其取值范围为[0,256];
# 标准颜色的颜色索引号指定如下::1 红、2 黄、3 绿、4 青、5 蓝、6 洋红、7 白/黑;
# 0 ByBlock、256 ByLayer;
# 其他颜色索引号见 https://wenku.baidu.com/view/9d458b70195f312b3069a505.html。
” # ******************************************* 3、图层线型设置 ******************************************* # ”
# 3、图层线型设置
acad.ActiveDocument.Linetypes.Load(“ACAD_ISO08W100”, “acadiso.lin”)
# 加载线型,”ACAD_ISO05W100″为线型名称,详细信息见CAD帮助文档;
# “acadiso.lin”为用于公制单位的线型定义文件,详细信息见CAD帮助文档;
# 为图层指定线型前,需先加载相关线型;
# 注意:不能重复加载,否则报错——’记录名重复’;
# 可利用try…except…finally…机制,处理此类报错。
LayerObj.Linetype = “ACAD_ISO08W100″
# 设置图层线型;
# 指定线型前,若不想以Load方式加载线型,也可在CAD程序中点击线型>其他>加载,加载全部所用线型;
# 若既没采用Load方式也没有在CAD程序中手动加载线型,则程序会报错——’未找到主键’。
” # ******************************************* 4、图层线宽设置 ******************************************* # ”
# 4、图层线宽设置
LayerObj.Lineweight = 13
# 13表示线宽为0.01mm的13倍,即0.13mm;
# 线宽值∈{0,5,9,13,15,18,20,25,30,35,40,50,53,60,70,80,90,100,106,120,140,158,200,211};
# 线宽值在上述集合中选取,含义为0.01mm的整数倍;其他数值非系统默认;
# 可以修改现有线宽,但不能添加或删除线宽,修改在CAD程序中进行。
” # ************************************************ END ************************************************ # ”
五、绘图
acad.ActiveDocuent.SendCommand(“L”+chr(13)+“0,0”+chr(13)+”100,100″+chr(18)+chr(18))
” # ******************************************* 1、创建点及直线 ******************************************** # ”
from pyautocad import APoint
import numpy as np
import math
# 1、创建点及直线
startPoint = APoint(5, 25)
endPoint = APoint(25, 35)
# z坐标可空缺,空缺时系统默认其为0,即点Pnt1在CAD中坐标为(5,25,0);
# 系统自动将各坐标转化为双精度浮点数。
LineObj = acad.model.AddLine(startPoint, endPoint)
” # **************************************** 2、添加多段线及样条曲线 **************************************** # ”
# 2、添加多段线及样条曲线
## (1)、添加多段线
Pnt1 = APoint(35, 35)
Pnt2 = APoint(40, 35)
Pnt3 = APoint(43, 32)
PlinePnts = np.array([Pnt1, Pnt2, Pnt3])
PlinePnts = PlinePnts.reshape(1, PlinePnts.shape[0] * PlinePnts.shape[1])[0]
# 将各点坐标顺序变换为行数据;
# 添加样条曲线时参数仅支持1行多列的1维数组,即将各点x,y,z坐标顺序排列构成的数组。
PlineObj = acad.model.AddPolyLine(PlinePnts)
## (2)、添加样条曲线
Pnt1 = APoint(35, 32)
Pnt2 = APoint(42, 25)
Pnt3 = APoint(48, 28)
Pnt4 = APoint(55, 25)
SplinePnts = np.array([Pnt1, Pnt2, Pnt3, Pnt4])
SplinePnts = SplinePnts.reshape(1, SplinePnts.shape[0] * SplinePnts.shape[1])[0]
startTan = APoint(1, -10)
endTan = APoint(1, -5)
SplineObj = acad.model.AddSpline(SplinePnts, startTan, endTan)
# startTan为样条曲线起点处切线的方向向量;
# endTan为样条曲线终点处切线的方向向量。
” # ******************************************* 3、添加圆及圆弧 ******************************************** # ”
# 3、添加圆及圆弧
## (1)、圆
CircleCenter = APoint(10, 10)
CircleObj = acad.model.AddCircle(CircleCenter, 5)
# AddCircle(圆心, 半径)
## (2)、圆弧
ArcCenter = APoint(20, 10)
ArcObj = acad.model.AddArc(ArcCenter, 5, math.radians(-60), math.radians(60))
# AddArc(圆心,半径,始边角度(弧度制),终边角度(弧度制))
” # ***************************************** 4、添加椭圆及椭圆弧 ****************************************** # ”
# 4、添加椭圆及椭圆弧
## (1)、椭圆
EllCenter = APoint(40, 10, 0)
majAxis = APoint(5, 0, 0)
EllObj = acad.model.AddEllipse(EllCenter, majAxis, 0.5)
# 该椭圆以EllCenter为椭圆中心,长轴一端点为(45, 10, 0),且短轴长度为长轴的0.5倍;
# majAxis为主轴(长轴)端点相对于椭圆中心的坐标增量;
# 0.5短长轴之比。
## (2)、椭圆弧
EllArcCenter = APoint(50, 10)
majAxis = APoint(5, 0, 0)
EllArcObj = acad.model.AddEllipse(EllArcCenter, majAxis, 0.5)
EllArcObj.startAngle = -90 * (3.14 / 180)
EllArcObj.endAngle = 90 * (3.14 / 180)
” # ********************************************* 5、实体填充 ********************************************* # ”
# 5、实体填充
Pnt1 = APoint(65, 5, 0)
Pnt2 = APoint(65, 35, 0)
Pnt3 = APoint(75, 5, 0)
Pnt4 = APoint(75, 35, 0)
solidObj = acad.model.AddSolid(Pnt1, Pnt2, Pnt3, Pnt4)
” # ********************************************* 6、图案填充 ********************************************* # ”
# 6、图案填充
” 暂未解决 ”
patternName = “ANSI31″
PatternType = 0
bAssociativity = True
center = APoint(0, 0, 0)
radius = 10
outerLoop = acad.model.AddCircle(center, radius)
hatchObj = acad.model.AddHatch(PatternType, patternName, bAssociativity)
hatchObj.AppendOuterLoop (outerLoop)
hatchObj.Evaluate
” 运行上述代码报错,报错内容为:对象数组无效。”
” 可能原因:outerLoop可能无法代表圆这一CAD图形对象。”
” 因时间精力有限,暂未仔细研究ActiveX Reference Guide”
” 如有大神已解决,还请在评论中附上代码,在此跪谢!!!”
” # *********************************************** 7、其他 *********************************************** # ”
# 7、其他
import pyautocad.types
pyautocad.types.distance(Pnt1, Pnt2) # 计算点Pnt1和点Pnt2间的距离
print(Pnt1)
print(tuple(Pnt1)) # 将点Pnt1坐标转化为元组
print(list(Pnt1)) # 将点Pnt1坐标转化为列表
print(Pnt1+Pnt2) # 两点对应坐标相加,也支持其他数学运算。
LineObj.layer = “Python” # 指定图层
LineObj.Linetype = “ACAD_ISO05W100” # 指定线型
LineObj.LinetypeScale = 1 # 设置线型比例
LineObj.Lineweight = 200 # 设置线宽
clr = acad.ActiveDocument.Application.GetInterfaceObject (“AutoCAD.AcCmColor.19″)
clr.SetRGB(255, 0, 255) # R=255,G=0,B=255。
solidObj.TrueColor = clr # 指定实体填充的RGB颜色
” # ************************************************ END ************************************************* # ”
六、修改
” # ******************************************** 1、复制及删除 ******************************************** # ”
# 1、复制及删除
copyObj = EllObj.Copy()
# 原位置复制,复制的图元与原图元重合。
copyObj.Delete()
” # ******************************************** 2、平移及旋转 ******************************************** # ”
# 2、平移及旋转
startPnt = APoint(0, 0)
endPnt = APoint(30, 0)
EllObj.Move(startPnt,endPnt)
BasePoint = APoint(0, 0)
RotationAngle = math.radians(30)
EllObj.Rotate(BasePoint, RotationAngle)
# BasePoint为旋转基点,即旋转轴过此点且平行于z轴;
# RotationAngle为旋转角度(弧度制),角度正负由右手系确定。
” # ******************************************** 3、镜像及缩放 ******************************************** # ”
# 3、镜像及缩放
startPnt = APoint(50, 50)
endPnt = APoint(50, -50)
MirObj = EllObj.Mirror(startPnt, endPnt)
# startPnt为镜像线起点,endPnt为镜像线终点;
# 镜像后原图元不删除。
BasePoint = APoint(0, 0)
ScaleFactor = 5
SclEntObj = EllObj.ScaleEntity(BasePoint, ScaleFactor)
# ScaleFactor为缩放比例。
” # *********************************************** 4、阵列 ********************************************** # ”
# 4、阵列
## (1)、矩形阵列
numberOfRows = 5
numberOfColumns = 5
numberOfLevels = 1
distanceBwtnRows = 20
distanceBwtnColumns = 20
distanceBwtnLevels = 1
retObj = EllObj.ArrayRectangular(numberOfRows, numberOfColumns, numberOfLevels,
distanceBwtnRows, distanceBwtnColumns, distanceBwtnLevels)
## (2)、环形阵列
centerPoint = APoint(30, 0)
noOfObjects = 4
angleToFill = 3.14
retObj = EllObj.ArrayPolar(noOfObjects, angleToFill, centerPoint)
” 运行上述(1)、(2)代码报错,报错内容为:KeyError: 9。”
” 报错原因未知,虽然报错,但能顺利执行,不影响使用。”
” 可利用try…except…finally…机制,处理此类报错。”
” # ************************************************ END ************************************************* # ”
七、块组
” # *********************************************** 1、块 ************************************************ # ”
# 1、块
## (1)、创建新块
grip = APoint(20, 0)
blockObj = acad.ActiveDocument.Blocks.Add(grip, “HIT_Block”)
# 新建块的名称为”HIT_Block”;
# grip为块定位夹点所在位置。
## (2)、添加图元到块
center = APoint(0, 0)
radius = 10
CircleObj = blockObj.AddCircle(center, radius)
center = APoint(40, 10)
majAxis = APoint(10, 0, 0)
EllObj = blockObj.AddEllipse(center, majAxis, 0.5)
## (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 )
# 外部文件名尽量与当前文件中的各块名称不同;
# 插入后外部文件名将作为其在当前文件中的块名;
# 外部文件的坐标原点为其作为块的定位夹点。
” # *********************************************** 2、组 ************************************************ # ”
# 2、组
## (1)、创建新组
groupObj = acad.ActiveDocument.Groups.Add(“Harbin Institute of Technology”)
# 新建组的名称为”Harbin Institute of Technology”
” 因没有解决对象数组无效问题,故暂无法将图元添加到组中 ”
” # ************************************************ END ************************************************ # ”
八、注释
标注是向图形中添加测量注释的过程,我们可以为各种对象沿各个方向创建标注。要简化图形组织和标注缩放,建议在图纸空间上创建标注,而不是在模型空间中创建标注。为了方便理解,关于标注的部分概念如下图所示。
” # ********************************************** 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
# 设置对齐夹点在图纸空间中的绝对位置,可为任意一已知点;
# 若用户自定义对齐方式,则需设置此项。
# # (3)、文本缩放
” # ******************************************** 2、文本样式 ********************************************* # ”
# 2、文本样式
## (1)、创建文字样式
txtStyleObj = acad.ActiveDocument.TextStyles.Add(“HIT_TxtStyle”)
## (2)、将特定文字样式设为当前
acad.ActiveDocument.ActiveTextStyle = acad.ActiveDocument.TextStyles.Item(“Standard”)
## (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 字节及笔画形式。
### ②、为特定文本样式设置字体
## (4)、设置字体倾斜角度
” # ******************************************** 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 竖直标注。
## (2)、对齐标注
ExtLine1Point = APoint(5, 25)
ExtLine2Point = APoint(25, 35)
TextPosition = APoint(-5, 25)
dimAliObj = acad.model.AddDimAligned(ExtLine1Point, ExtLine2Point, TextPosition)
# ExtLine1Point 第一尺寸界线的起点;
# ExtLine2Point 第二尺寸界线的起点;
# TextPosition 尺寸线定位点,尺寸线或其延长线过该点。
# dimObj.Update
## (3)、角度标注
AngleVertex = APoint(0, 0)
FirstEndPoint = APoint(6, 8)
SecondEndPoint = APoint(6, -8)
TextPoint = APoint(10, 10)
dimAngObj = acad.model.AddDimAngular(AngleVertex, FirstEndPoint, SecondEndPoint, TextPoint)
# AngleVertex 角度顶点;
# FirstEndPoint 第一尺寸界线端点;
# SecondEndPoint 第二尺寸界线端点;
# TextPoint 尺寸圆弧线定位点,即尺寸圆弧线过该点。
## (4)、弧长标注
ArcCenter = APoint(0, 0)
FirstEndPoint = APoint(6, 8)
SecondEndPoint = APoint(6, -8)
ArcPoint = APoint(20, 0)
dimArcObj = acad.model.AddDimArc(ArcCenter, FirstEndPoint, SecondEndPoint, ArcPoint)
# ArcCenter 圆弧中心;
# FirstEndPoint 第一尺寸界线端点;
# SecondEndPoint 第二尺寸界线端点;
# ArcPoint 尺寸圆弧线定位点,即尺寸圆弧线过该点。
## (5)、直径及半径标注
ChordPoint = APoint(0, 10)
FarChordPoint = APoint(0, -10)
LeaderLength = 40
dimDiaObj = acad.model.AddDimDiametric(ChordPoint, FarChordPoint, LeaderLength)
# ChordPoint 圆任意一直径的端点;
# FarChordPoint 直径的另一端点;
# LeaderLength 引线长度,为点ChordPoint到标准文字定位夹点的距离;
# 标注类型可在相应的系统变量如DIMUPT等中更改。
Center = APoint(0, 0)
ChordPoint = APoint(10, 0)
LeaderLength = 10
dimRadObj = acad.model.AddDimRadial(Center, ChordPoint, LeaderLength)
# Center 被标注圆或圆弧的圆心
” # ******************************************** 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”)
# 说明:以下设置为<样式替代>
# 标注样式替代是对当前标注样式中的指定设置所做的更改;
# 它与在不更改当前标注样式的情况下更改尺寸标注系统变量等效;
# 使用标注样式替代,无需更改当前标注样式便可临时更改标注系统变量。
## (3)、设置尺寸线及尺寸界限
### ①、超出标记
### ②、基线间距
### ③、超出尺寸线
acad.ActiveDocument.SetVariable(“DIMEXE”, 1.25)
# 指定尺寸界线超出尺寸线的距离。
### ④、起点偏移量
acad.ActiveDocument.SetVariable(“DIMEXO”, 0.625)
# 设定自图形中定义标注的点到尺寸界线的偏移距离。
## (4)、设置箭头
### ①、设定尺寸线箭头类型。
acad.ActiveDocument.SetVariable(“DIMBLK”, “_ARCHTICK”)
# “_ARCHTICK”表示建筑标记
### ②、设定引线箭头。
### ③、尺寸线箭头大小
acad.ActiveDocument.SetVariable(“DIMASZ”, 2.5)
## (5)、设置标注文字
### ①、文字样式
acad.ActiveDocument.SetVariable(“DIMTXSTY”, “HIT_TxtStyle”)
### ②、文字高度
acad.ActiveDocument.SetVariable(“DIMTXT”, 2.5)
# 设定当前标注文字样式的高度;
# 如果在此选项卡上指定的字样式具有固定的文字高度,则该高度将替代在此处设置的文字高度;
# 如果要在此处设置标注文字的高度,请确保将文字样式的高度设置为 0。
### ③、文字位置
acad.ActiveDocument.SetVariable(“DIMTAD”, 1)
# 控制标注文字相对尺寸线的垂直位置;
# 0 表示标注文字在尺寸界线之间居中放置;
# 1 表示将标注文字放置在尺寸线上方,从尺寸线到文字最低基线的距离为当前 DIMGAP 的值。
acad.ActiveDocument.SetVariable(“DIMJUST”, 0)
# 水平控制标注文字在尺寸线上相对于尺寸界线的水平位置;
# 0 表示将文字置于尺寸线之上,并在尺寸界线之间置中对正。
acad.ActiveDocument.SetVariable(“DIMGAP”, 0.625)
# 设定文字相对尺寸线的位置。
### ④、文字对齐
acad.ActiveDocument.SetVariable(“DIMTIH”, 0)
# 控制所有标注类型(坐标标注除外)的标注文字在尺寸界线内的位置;
# 0 表示将文字与尺寸线对齐;
# 1 表示水平绘制文字。
acad.ActiveDocument.SetVariable(“DIMTOH”, 0)
# 控制标注文字在尺寸界线外的位置。
## (6)、设置主单位
### ①、线性标注精度
acad.ActiveDocument.SetVariable(“DIMDEC”, 2)
# 设定标注文字中的小数位数;
# 2 表示显示小数点后三位;
### ②、小数分隔符
acad.ActiveDocument.SetVariable(“DIMDSEP”, “.”)
# “.”表示小数分隔符,也可设置为”,”。
acad.ActiveDocument.SetVariable(“DIMADEC”, -1)
# 设置角度标注精度与线性标注精度相同
” # ******************************************** 5、多重引线 ********************************************* # ”
# 5、多重引线
## (1)、创建多重引线
ArrowPnt = APoint(0, 0)
BaselinePnt = APoint(10, 10)
PntsArray = np.array([ArrowPnt, BaselinePnt])
PntsArray = PntsArray.reshape(1, PntsArray.shape[0] * PntsArray.shape[1])[0]
MLeaderObj = acad.model.AddMLeader(PntsArray, 0)
# ArrowPnt 箭头位置;
# BaselinePnt 基线位置 ;
# 1 表示多重引线的索引号,为正整数。
## (2)、设置箭头大小
MLeaderObj.ArrowheadSize = 2
# 指箭头高度;
# 此项将覆盖系统变量DIMASZ的值。
## (3)、设置基线长度
MLeaderObj.DoglegLength = 8
## (4)、设置基线间隙
MLeaderObj.LandingGap = 3
# 基线端点到文字起点的距离
## (5)、指定文字样式
MLeaderObj.TextStyleName = “HIT_TxtStyle”
## (6)、指定文字内容
MLeaderObj.TextString = “HIT”
” # ************************************************ END ************************************************ # ”
九、文件
” # ******************************************** 1、打开文件 ********************************************* # ”
” 以下代码请不要在一个文件中同时运行,否则会报错,原因是逻辑冲突。”
” 在D盘创建新文件夹并命名为AutoCAD ”
# 1、打开文件
acad.ActiveDocument.Application.Documents.Open(“D:\AutoCAD\PyAutoCAD.dwg”)
# CAD程序中至少存在一个打开的图形空间,否则报错,报错内容为:无法获取Document对象。
” # ******************************************** 2、新建文件 ********************************************* # ”
# 2、新建文件
DrawingObj = acad.ActiveDocument.Application.Documents.Add(“”)
# 无法直接命名,新建的文件为系统默认名称,即Drawing1、Drawing2等;
# 若更改名称,在关闭时定义。
” # ******************************************** 3、设定当前 ********************************************* # ”
# 3、设定当前
## (1)、已知文件名设为当前
acad.ActiveDocument.Application.Documents(“PyAutoCAD.dwg”).Activate()
# 将PyAutoCAD.dwg设为当前文件。
## (2)、未知文件名设为当前
DrawingObj.Activate()
# 将New_Drawing设为当前文件。
” # ***************************************** 4、关闭并保存变更 ****************************************** # ”
# 4、关闭并保存变更
## (1)、关闭已存在文件
acad.ActiveDocument.Application.Documents(“PyAutoCAD.dwg”).Close(True, “PyAutoCAD_已变更.dwg”)
# 关闭PyAutoCAD.dwg文件。
# True 布尔值,为系统默认,表示打开文件后关闭前文件若发生变更,则保存变更,并另存为PyAutoCAD_已变更.dwg
# 此时文件夹中同时存在未变更的”PyAutoCAD.dwg”和已变更的”PyAutoCAD_已变更.dwg”
# 若第二项空缺,则新文件名为”PyAutoCAD.dwg”,覆盖之前未变更的文件。
## (2)、关闭新建文件
DrawingObj .Close(True, “HIT.dwg”)
# 关闭New_Drawing文件。
# 文件夹中仅存在”HIT.dwg”一个文件。
## (3)、关闭当前文件
acad.ActiveDocument.Close()
# 关闭当前文档。
” # ******************************************** 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。
” # ************************************************ END ************************************************ # ”
十、选择集
1、连接及库导入
#!/usr/bin/env python
# -*- coding: utf-8 -*-
”’
=============================
Author = Hulunbuir & DalaiNur
Email: liyang@alu.hit.edu.cn
Last Update: 2019.07.28 14:00
=============================
”’
from pyautocad import Autocad
from pyautocad import APoint
import numpy as np
import pythoncom
import win32com.client
acad = Autocad(create_if_not_exists = True)
acad.prompt(“Hello! AutoCAD from pyautocad.”)
print(acad.doc.Name)
2、常规选择
“创建名称为SS1的选择集”
try:
acad.ActiveDocument.SelectionSets.Item(“SS1”).Delete()
except:
print(“Delete selection failed”)
slt = acad.ActiveDocument.SelectionSets.Add(‘SS1’)
(1) 屏幕拾取
slt.SelectOnScreen()
print(“请在屏幕拾取图元,以Enter键结束”)
obj = slt[0]
print(obj.ObjectID)
print(slt)
(2) 选择过定点图元
pnt = APoint(0, 0)
slt.SelectAtPoint(pnt)
obj = slt[0]
print(obj.StartPoint)
# 当点pnt存在于不止一个图元上时
# 该选择方法仅能选择出其中的一个图元
# 多个选择不出来
(3) 多边形框选
“选择pnts内各点围成的边界内全部图元”
pnts = [APoint(0, 0), APoint(15000, 0), APoint(15000, 15000),
APoint(0, 15000), APoint(0, 0)]
pnts = np.array([j for i in pnts for j in i], dtype = np.float)
slt.SelectByPolygon(6, pnts)
# acSelectionSetWindowPolygon = 6
obj = slt[0]
print(obj.StartPoint)
(4) 全选
slt.Select(5)
# acSelectionSetAll = 5
obj = slt[0]
print(obj.layer)
print(obj.StartPoint)
3、快速选择
过滤器的实现
(1) 滤出0图层上的所有圆
” ********************************* —- 创建图元 —- ********************************* ”
acad = Autocad(create_if_not_exists=True)
acad.prompt(“Hello! Autocad from Python.”)
print(acad.doc.Name)
[pnt1,pnt2,pnt3,pnt4,pnt5,pnt6] = [APoint(40, 40),APoint(500, 500),APoint(300, 200),
APoint(600, 200),APoint(700, 200), APoint(100, 0)]
# 创建点的另一种方式
pnt = np.array([50, 50, 0], dtype = np.float)
acad.model.AddPoint(pnt)
LineObj = acad.model.AddLine(pnt1, pnt2)
CircleObj = acad.model.AddCircle(pnt3, 100)
ArcObj = acad.model.AddArc(pnt4, 50, 0, 1.57)
EllObj = acad.model.AddEllipse(pnt5, pnt6, 0.5)
” ********************************** —- 选择集 —- ********************************** ”
# 添加名称为“SS1”的选择集
try:
doc.SelectionSets.Item(“SS1”).Delete()
except:
print(“Delete selection failed”)
slcn = doc.SelectionSets.Add(“SS1″)
# 过滤出在0图层上的圆
# 略
” ************************************ —- END —- ************************************ ”
十一、API
官网:https://pyautocad.readthedocs.io >> API
” # *********************************************** 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号
······ 未完,待续!
十、尾声
以上,便是pyautocad模块的使用方法简介,因篇幅有限,某些非关键功能未做详细介绍,如有疑问,欢迎邮件来询。
仅以此文为我断断续续近3个月的Python调用CAD学习做一个总结,同时也为有需要的人提供多一点参考。
胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的pāo子里快乐徜徉。
因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。
最后,祝各位攻城狮们,珍爱生命,保护发际线!
本文部分内容,源于网络!
———————
作者:Hulunbuir
来源:CSDN
原文:https://blog.csdn.net/Hulunbuir/article/details/83715279
版权声明:本文为博主原创文章,转载请附上博文链接!
大神您好!看Active X中例子,outerLoop好象是对象数组,另一个AppendOuterLoop例子画了一个圆和直线,再填充的,我试试建了数组,仍然无用