from pyautocad import Autocad, APoint
import math
import numpy as np
# 创建连接 autoCAD CAD运行,则连接,并始终与活跃的CAD窗口产生连接,没有则启动新CAD程序
acad = Autocad(create_if_not_exists=True)
acad.prompt("Hello, Autocad from Python\n")
print(acad.doc.Name) # 获取CAD文件名
"""---------------------------------------------------------------------------------"""
# 图层相关操作
new_layer = acad.ActiveDocument.Layers.Add("YDK_Layer")# 新建图层
acad.ActiveDocument.ActiveLayer = new_layer# 将某图层设置为当前图层
new_layer.color = 1# 设置图层颜色
# 设置图层线型
# new_layer.LineType = "ACAD_ISO02W100"
# new_layer.LineType = "ByLayer"
# 设置图层线宽
new_layer.LineWeight = 0.1
# 设置图层状态
new_layer.LayerOn = True # TRUE: 图层打开状态;FALSE: 关闭状态
new_layer.Lock = False # TRUE: 图层锁定;FALSE: 未锁定
# 指定图层名称
print("new_layer.Name "+new_layer.Name)
# 指定图元图层
circle = acad.model.AddCircle(APoint(0, 0), 200)
circle.Layer = "YDK_Layer"
# 批量创建图层
color_list = [1, 2, 3]
layers_name = ["YDK_图层_1", "YDK_图层_2", "YDK_图层_3"]
try:
len(color_list) == len(layers_name)
except:
print("图层颜色号个数 与图层个数不匹配")
layers_obj = [acad.ActiveDocument.Layers.Add(i) for i in layers_name]
for j in range(len(layers_obj)):
layers_obj[j].color = color_list[j]
"""---------------------------------------------------------------------------------"""
# 绘图常规操作(复制、移动、缩放........)
# 同位复制--指定对象
circle1 = acad.model.AddCircle(APoint(200, 200), 200)
circle2 = circle1.Copy()
circle2.Move(APoint(0, 0), APoint(100, 0))# 将图元---从源---向目标移动
# RetVal = object.Mirror(Point1, Point2)
circle2.Mirror(APoint(0, 0), APoint(100, 0))# 围绕轴创建 平面对象 镜像 图像副本
circle1.Delete()# 删除 指定对象或 一组保存的图层设置
# 获取对象与图形中其它对象的相交点
# RetVal = object.IntersectWith(IntersectObject, ExtendOption)
# ExtendOption:该选项指定两个对象中是否没有、单个或两个对象延伸来得到交点
# 0 = acExtendNone 两个对象均不延伸
# 1 = acExtendThisEntity 延伸基本对象。
# 2 = acExtendOtherEntity 延伸作为参数传递的对象。
# 3 = acExtendBoth 延伸两个对象
line1 = acad.model.AddLine(APoint(1000, 0), APoint(1500, 500))
line2 = acad.model.AddLine(APoint(1000, 500), APoint(1500, 0))
point = line1.IntersectWith(line2, 0)
print("line1.IntersectWith(line2, 0) ",point)
# 绕一点旋转图元对象
# object.Rotate(BasePoint, RotationAngle)
base_point = APoint(0, 0)
rotate_angle = math.pi/4
line1.Rotate(base_point, rotate_angle)
# 指定个别图元的线宽或图形的默认线宽
print("line1.Lineweight ",line1.Lineweight)
# 指定图元的线型
print("line1.LineType " ,line1.LineType)
# 创建由现有对象偏移指定距离的新对象
# circle1.OffSet(-10.0)
"""---------------------------------------------------------------------------------"""
# 表格创建
# RetVal = object.AddTable(InsertionPoint, NumRows, NumColumns, RowHeight, ColWidth)
table = acad.model.AddTable(APoint(0, 0), 5, 5, 100, 200)
# 设置指定行和列的文字值
# object.SetText(row, col, pStr)
table.SetText(3, 2, "列表")
# 设置指定行类型的文字高度
# object.SetTextHeight(rowTypes, TextHeight)
table.SetTextHeight(3, 50)
# 设置行和列的文字旋转角度
# object.SetTextRotation(row, col, TextRotation)
table.SetTextRotation(3, 2, math.pi/2)
# 设置在子选择集中单元格的行和列索引
# object.SetSubSelection(rowMin, rowMax, colMin, colMax)
# 设置表格中指定行索引所在的行的行高
# object.SetRowHeight(row, Height)
table.SetRowHeight(1, 500)
# 设置表格中指定列索引所在的列的列宽
# object.SetColumnWidth(col, Width)
table.SetColumnWidth(1, 500)
"""---------------------------------------------------------------------------------"""
# 块相关操作
# 创建块
grip = APoint(20, 0)
blockObj = acad.ActiveDocument.Blocks.Add(grip, "YDK_Block")
# 可以使用block_obj.Add....()向块中添加对象
# 插入图形文件或当前图形中已定义的命名块
# RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password])
# Name:插入的 AutoCAD 图形文件名称或图块名称。如果为文件名,则必须包含 .dwg 扩展名和任何路径信息以便 AutoCAD 找到该文件
"""---------------------------------------------------------------------------------"""
# 创建选择集
try:
acad.ActiveDocument.SelectionSets.Item("SS1").Delete()
except:
print("Delete selection failed")
slt = acad.ActiveDocument.SelectionSets.Add('SS1')
# 在屏幕上选择对象,并加入到选择集中
slt.SelectOnScreen()
print("请在屏幕拾取图元,以Enter键结束 ")
# 可以使用for循环遍历选择集中的对象进行操作
"""---------------------------------------------------------------------------------"""
# 标注相关操作
# 使用三点创建角度标注
# RetVal = object.AddDim3PointAngular(AngleVertex, FirstEndPoint, SecondEndPoint, TextPoint)
# AngleVertex:指定要测量的角度顶点的三维WCS坐标
angle_vertex = APoint(100, 100)
first_endpoint = APoint(100, 0)
second_endpoint = APoint(0, 100)
text_point = APoint(50, 50)
dim_arc = acad.model.AddDim3PointAngular(angle_vertex, first_endpoint, second_endpoint, text_point)
# 创建对齐标注对象
# RetVal = object.AddDimAligned(ExtLine1Point, ExtLine2Point, TextPosition)
# ExtLine1Point:仅用于输入指定尺寸界线第一端点的三维WCS坐标
# ExtLine2Point:仅用于输入指定尺寸界线第二端点的三维WCS坐标
# TextPosition:仅用于输入指定文字位置的三维WCS坐标
ext_line1_point = APoint(100, 0)
ext_line2_point = APoint(0, 100)
text_position = APoint(50, 100)
dim = acad.model.AddDimAligned(ext_line1_point, ext_line2_point, text_position)
# 创建圆弧的弧长标注
# RetVal = object.AddDimArc(ArcCenter, FirstEndPoint, SecondEndPoint, ArcPoint)
arc_center = APoint(100, 0)
first_endpoint = APoint(0, 100)
second_endpoint = APoint(100, 0)
arc_point = APoint(0, 0)
arc_dim = acad.model.AddDimArc(arc_center, first_endpoint, second_endpoint, arc_point)
"""---------------------------------------------------------------------------------"""
# 给定四个顶点创建 3DFace 对象
# RetVal = object.Add3DFace(Point1, Point2, Point3[, Point4])
point1 = APoint(0, 0)
point2 = APoint(100, 0)
point3 = APoint(100, 100)
point4 = APoint(0, 100)
d_face = acad.model.Add3DFace(point1, point2, point3, point4)
"""---------------------------------------------------------------------------------"""
# 给定圆弧的圆心、半径、起始角、终止角来创建圆弧
# RetVal = object.AddArc(Center, Radius, StartAngle, EndAngle)
# 起始角和终止角均已弧度表示
center = APoint(0, 0)
radius = 100
start_angle = math.pi/4
end_angle = math.pi/2
arc = acad.model.AddArc(center, radius, start_angle, end_angle)
"""---------------------------------------------------------------------------------"""
# 给定中心点和半径创建圆
# RetVal = object.AddCircle(Center, Radius)
center = APoint(0, 0)
radius = 150
circle = acad.model.AddCircle(center, radius)
"""---------------------------------------------------------------------------------"""
# 给定中心点、长轴上的一点和半径比在WCS的XY平面上创建椭圆
# RetVal = object.AddEllipse(Center, MajorAxis, RadiusRatio)
# Center:长轴和短轴的交点
# MajorAxis:指定椭圆右端点坐标
# RadiusRatio:定义椭圆长轴与短轴比率的正值
center = APoint(0, 0, 0)
maj_Axis = APoint(100, 0, 0)
ellipse = acad.model.AddEllipse(center, maj_Axis, 0.25)
"""---------------------------------------------------------------------------------"""
# 创建椭圆弧
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)
"""---------------------------------------------------------------------------------"""
# 创建图案填充对象
# RetVal = object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType])
center = APoint(200, 0)
radius = 150
circle1 = acad.model.AddCircle(center, radius)
pattern_type = 0
pattern_name = "ANSI31"
hatch = acad.model.AddHatch(pattern_type, pattern_name, True)
# hatch.AppendOuterLoop(circle1)
"""---------------------------------------------------------------------------------"""
# 在给定位置创建点对象
# RetVal = object.AddPoint(Point)
# point:三元素双精度数组
point = np.array([200., 200., 0.])
point = acad.model.AddPoint(point)
"""---------------------------------------------------------------------------------"""
# 绘制直线(起点和终点)
# RetVal = object.AddLine(StartPoint, EndPoint)
start_point = APoint(0, 0)
end_point = APoint(100, 100)
line = acad.model.AddLine(start_point, end_point)
"""---------------------------------------------------------------------------------"""
# 绘制普通多段线
# RetVal = object.AddPolyline(VerticesList)
# VerticesList:至少需要两点(六个元素)来构成一个多段线对象。该数组的大小必须为3的倍数
pnts = [APoint(35, 35), APoint(40, 35), APoint(43, 32)]
pnts = np.array([j for i in pnts for j in i])
print(pnts)
pline_obj = acad.model.AddPolyLine(pnts)
pline_obj.Closed = True # 设置多段线闭合
pline_obj.ConstantWidth = 0.5 # 设置多段线线宽
# 设置线宽的第二种方法:object.SetWidth(SegmentIndex, StartWidth, EndWidth)
SegmentIndex = 1 # 多段线的段号
StartWidth = 10 # 段起点处线宽
EndWidth = 20 # 段终点处线宽
pline_obj.color = 1 # 设置多段线线宽,设置颜色还可以通过创建颜色对象进行赋值
"""---------------------------------------------------------------------------------"""
# 创建通过两个唯一点的射线
# RetVal = object.AddRay(Point1, Point2)
point1 = APoint(0, 0)
point2 = APoint(100, 100)
ray = acad.model.AddRay(point1, point2)
"""---------------------------------------------------------------------------------"""
# 创建通过两个指定点构造线
# RetVal = object.AddXline(Point1, Point2)
point1 = APoint(0, 0)
point2 = APoint(200, 100)
x_line = acad.model.AddXline(point1, point2)
"""---------------------------------------------------------------------------------"""
# 添加多行文字
# RetVal = object.model.AddMText(InsertionPoint, Width, Text)
insertion_point = APoint(100, 100)
width = 100
text = """hello world!
hello python"""
m_text = acad.model.AddMText(insertion_point, width, text)
"""---------------------------------------------------------------------------------"""
# 添加单行文字
# RetVal = object.model.AddText(TextString, InsertionPoint, Height)
text_string = "hello world!"
Insertion_point = APoint(200, 200)
height = 10
s_text = acad.model.AddText(text_string, Insertion_point, height)
"""---------------------------------------------------------------------------------"""
# 相关属性
print("line.Angle ",line.Angle) # 获得直线角度
print("arc.ArcLength ",arc.ArcLength) # 获取指定圆弧的弧长
print(circle.Area) # 获得面积
m_text.AttachmentPoint = 2 # 设置多行文本的插入点
"""
插入点的位置索引:
1 = acAttachmentPointTopLeft
2 = acAttachmentPointTopCenter
3 = acAttachmentPointTopRight
4 = acAttachmentPointMiddleLeft
5 = acAttachmentPointMiddleCenter
6 = acAttachmentPointMiddleRight
7 = acAttachmentPointBottomLeft
8 = acAttachmentPointBottomCenter
9 = acAttachmentPointBottomRight
"""
s_text.Backward = True # 指定文字是否反向,True:文字反向;False:文字正向
print(x_line.BasePoint) # 指定射线或构造线基点
print(circle.Center) # 指定圆弧、圆、椭圆、视图或视口的中心
print(circle.Radius) # 指定圆弧或圆的半径
print(circle.Circumference) # 指定圆的周长
pline_obj.Closed = True # 设置多段线闭合,默认为False
circle.color = 1 # 指定对象的颜色,当使用该属性时,颜色可以在 0 到 256 范围的索引值进行设置和读取
pline_obj.ConstantWidth = 10 # 指定多段线的固定宽度
print(pline_obj.Coordinate(2)) # 获得多线索引点位的坐标值
print(pline_obj.Coordinates) # 指定对象中每个顶点的坐标
print(circle.Diameter) # 获得圆的直径
print(x_line.DirectionVector) # 获得射线、多段线的单位方向向量
m_text.DrawingDirection = 1 # 指定多行文字段落的的阅读方向0 = acLeftToRight;1 = acTopToBottom
print(arc.EndAngle) # 指定弧或椭圆的终止角度
print(arc.StartAngle) # 指定圆弧或椭圆的起点角度
print(arc.EndPoint) # 指定弧、直线或椭圆的终点
print(arc.StartPoint) # 指定圆弧、直线或椭圆的起点
print(arc.TotalAngle) # 获取圆弧的总角度
print(s_text.InsertionPoint) # 指定公差、文字、块或形的插入点
print(line.Length) # 获取对象的长度
print(m_text.LineSpacingDistance) # 指定多行文字的行间距
print(m_text.LineSpacingFactor) # 指定多行文字对象的相对行间距比例,输入值在 0.25 到 4 之间
print(ellipse.MajorAxis) # 指定椭圆的长轴方向
print(ellipse.MinorAxis) # 指定椭圆的短轴方向
print(ellipse.MajorRadius) # 指定椭圆的长轴半径
print(ellipse.MinorRadius) # 指定椭圆的短轴半径
print(ellipse.RadiusRatio) # 指定椭圆的长短轴半径比
print(circle.Normal) # 指定图元的三维法向单位矢量
s_text.Rotation = math.pi/2 # 指定文字对象的旋转
s_text.ScaleFactor = 2 # 指定对象的比例因子
print(s_text.StyleName) # 指定对象的打印样式名
print(x_line.SecondPoint) # 指定射线或构造线的第二点
print(s_text.TextAlignmentPoint) # 指定文字和属性参照的对齐点
print(s_text.TextString) # 指定图元的文字字符串
# print(m_text.Width) # 指定文本边界、视图、图像、工具栏或主应用程序窗口的宽度
def draw():
#1 循环画圆和线
p1 = APoint(0, 0)
p2 = APoint(50, 25)
for i in range(10):
text = acad.model.AddText('Hi %s!' % i, p1, 2.5)
acad.model.AddLine(p1, p2) # 画线:指定起点和终点
acad.model.AddCircle(p1, 10) # 指定圆心;半径;
# acad.model.AddArc(p2,400,1,180) #AddArc(center,radius,sDrgress,eDrgress)圆心 , 半径 ,开始弧 , 结束弧
p1.y += 10 # P1的y坐标累加10
dp = APoint(10, 0)
#2 遍历cad图形对象以及访问/修改对象属性
for text in acad.iter_objects_fast('Text'):
print('text: %s at: %s' % (text.TextString, text.InsertionPoint))
text.InsertionPoint = APoint(text.InsertionPoint) + dp
for obj in acad.iter_objects_fast(['Circle', 'Line']):
print(obj.ObjectName)
# 原文链接:https://blog.csdn.net/qq_44703886/article/details/111881128
# draw()
#
# # 点
# # shuzu=[1,2,3,4,5,6,7,8,9,10]
# # 绘制点
# acad.ActiveDocument.SetVariable("PDMODE", 35) # 设置点样式的显示方式
# acad.ActiveDocument.SetVariable("PDSIZE", 2) # 设置点大小
# # 绘制线
# # 创建图元
# pnts = [APoint(5, 5), APoint(10, 5), APoint(20, 20), APoint(25, 20)]
# pnts = [j for i in pnts for j in i] # 将各点坐标顺序变换为1行多列的1维数组。
# pnts = aDouble(pnts) # 数据类型转化为双精度浮点数
# plineObj = acad.model.AddPolyLine(pnts)
#
#
# # 指定颜色
# version = acad.Application.Version[:2] # 当前CAD的版本号
# clr = acad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
# clr.SetRGB(0, 0, 255) # 创建蓝色
# plineObj.TrueColor = clr # 指定颜色
#
#
# # 设置线宽
# segmentIndex = 2 # 多段线的段号,从0起计数。
# startWidth = 0.5 # 段起点处线宽
# endWidth = 1.0 # 段终点处线宽
# plineObj.SetWidth(segmentIndex, startWidth, endWidth) # 为多段线plineObj的第3段设置变宽度线宽
#
# acad.ActiveDocument.preferences.LineweightDisplay = 1 # 显示线宽
#
# acad.ActiveDocument.Application.ZoomAll()
# acad.ActiveDocument.Application.Update()
#
#
# #圆弧
# ArcCenter = APoint(20, 10)
# # ArcObj = acad.model.AddRectangle(ArcCenter, 5, math.radians(-60), math.radians(60))
# # ArcObj = acad.model.AddRectangle(ArcCenter, 5, math.radians(-60), math.radians(60))
# # AddArc(圆心,半径,始边角度(弧度制),终边角度(弧度制))
#
# #椭圆
# EllCenter = APoint(40, 10, 0)
# majAxis = APoint(5, 0, 0)
# EllObj = acad.model.AddEllipse(EllCenter, majAxis, 0.5)
#
# # 该椭圆以EllCenter为椭圆中心,长轴一端点为(45, 10, 0),且短轴长度为长轴的0.5倍;
#
# # SaveAs(filepath ,1)
# # 保存当前画好的图形 文件绝对路径 , 后面默认写1 不知道原因 (这方面文档很少,所以不知道怎么查
#
# #在cad控制面板中输出
# acad.prompt("Hello, Autocad from Python\n")
# #输出文件的名字
# print(acad.doc.Name) #Drawing1.dwg
# Add3DFace Add3DMesh Add3DPoly AddArc AddAttribute AddBox AddCircle AddCone AddCustomObject
# AddCylinder AddDim3PointAngular AddDimAligned AddDimAngular AddDimArc AddDimDiametric AddDimOrdinate AddDimRadial
# AddDimRadialLarge AddDimRotated AddEllipse AddEllipticalCone AddEllipticalCylinder AddExtrudedSolid AddExtrudedSolidALongPath
# AddHatch AddLeader AddLightWeightPolyline AddLine AddMLeader AddMLine
# AddMText AddPoint AddPolyfaceMesh AddPolyline AddRaster AddRay AddRegion AddRevolvedSolid AddShape AddSolid AddSphere AddSpline AddTable
# AddText AddTolerance AddTorus AddTrace AddWedge AddXLine AttachExternalReference InsertBlock Item
# 打开CAD
# acad.ActiveDocument.Application.Documents.Open(path)
# acad.ActiveDocument.Application.Documents.Open(r"d:\cad\01.dwg".decode("utf-8"))
# 新建CAD
# DrawingObj = acad.ActiveDocument.Application.Documents.Add("d:\cad\02.dwg")
# acad.doc.SaveAs('d:/test/test_SaveAs')# 默认保存为2007dwg
# acad.doc.SaveAs('d:/test/test_SaveAs',1)#保存为dwf
pyAutocad
于 2022-03-09 08:45:55 首次发布