pyAutocad

在这里插入图片描述

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

感谢https://blog.csdn.net/weixin_43496130/article/details/105827187

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值