Python AutoCAD 绘图



Blog Links






一、前言


  各种图元的绘制是 CAD 绝对的核心功能,CAD 主要能实现如下图所示的图元绘制,包括常见的,直线、多段线、圆、图案填充、单行文字、多行文字、标注等等。



在这里插入图片描述


在这里插入图片描述

AutoCAD绘图菜单


  本文分别采用 pyautocad 库及 pywin32 库两种方式连接 CAD ,从不同角度介绍图形的绘制,两种连接方式如下:



  • 方式一: pyautocad
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: liyang@alu.hit.edu.cn
    =============================
"""

from pyautocad import Autocad, APoint, aDouble
import math

pyacad = Autocad(create_if_not_exists=True)
pyacad.prompt("Hello! Autocad from pyautocad.")
print(pyacad.doc.Name)

  • 方式二:pywin32
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    =============================
    Author: DalNur
    Email: liyang@alu.hit.edu.cn
    =============================
"""

import pythoncom
import win32com.client
import math

wincad = win32com.client.Dispatch("AutoCAD.Application")
doc = wincad.ActiveDocument
doc.Utility.Prompt("Hello! Autocad from pywin32com.\n")
msp = doc.ModelSpace
print(doc.Name)

def vtpnt(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)


def vtfloat(lst):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, lst)




二、创建点及直线


  1. 设置点显示
pyacad.ActiveDocument.SetVariable("PDMODE", 35)  # 设置点样式的显示方式
pyacad.ActiveDocument.SetVariable("PDSIZE", 2)  # 设置点大小

  1. pyautocad绘直线
startPoint = APoint(5, 8)  # z坐标可空缺,空缺时系统默认其为0,即点Pnt1在CAD中坐标为(5,25,0)。
endPoint = APoint(20, 15)  # pyautocad自动将各坐标转化为双精度浮点数。
lineObj = pyacad.model.AddLine(startPoint, endPoint)

  1. pywin32绘制点
startPntCoords = vtpnt(5, 5)
startPoint = msp.AddPoint(startPntCoords)

endPntCoords = vtpnt(20, 20)
endPoint = msp.AddPoint(endPntCoords)

  1. pywin32绘直线
lineObj = msp.AddLine(startPntCoords, endPntCoords)


  以上代码运行后,效果如下图所示:


在这里插入图片描述





三、绘制多段线及样条曲线


3.1 绘制普通多段线


  1. pyautocad绘多段线
# 创建图元
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 = pyacad.model.AddPolyLine(pnts)


# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.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段设置变宽度线宽


pyacad.ActiveDocument.preferences.LineweightDisplay = 1  # 显示线宽


pyacad.ActiveDocument.Application.ZoomAll()
pyacad.ActiveDocument.Application.Update()

  1. pywin32绘多段线
# 创建图元
pnts = [5, 20, 0, 10, 20, 0, 20, 5, 0, 25, 5, 0]
points = vtfloat(pnts)
plineObj = msp.AddPolyline(points)


# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
plineObj.TrueColor = clr  # 指定颜色


# 设置线宽
segmentIndex = 0  # 多段线的段号,从0起计数。
startWidth = 1.0  # 段起点处线宽
endWidth = 0.5  # 段终点处线宽
plineObj.SetWidth(segmentIndex, startWidth, endWidth)  # 为多段线plineObj的第1段设置变宽度线宽


doc.preferences.LineweightDisplay = 1  # 显示线宽


doc.Application.ZoomAll()
doc.Application.Update()


  以上代码运行后,效果如下图所示:


在这里插入图片描述




3.2 绘制含圆弧多段线


  详见博客:Python 二次开发 AutoCAD 简介 >> 七、绘图 >> 7.1 倒角矩形 。



在这里插入图片描述



3.3 绘制样条曲线


splinePnts = [APoint(5, 12), APoint(12, 5), APoint(18, 8), APoint(25, 5)]
splinePnts = [j for i in splinePnts for j in i]
splinePnts = aDouble(splinePnts)
startTan = APoint(1, -10)  # startTan为样条曲线起点处切线的方向向量。
endTan = APoint(1, -5)  # endTan为样条曲线终点处切线的方向向量。
SplineObj = pyacad.model.AddSpline(splinePnts, startTan, endTan)


在这里插入图片描述





四、绘制圆及圆弧


4.1 绘制圆


  1. pyautocad
# 创建图元
center = APoint(5, 5)  # 圆心
radius = 4  # 半径
circleObj = pyacad.model.AddCircle(center, radius)

# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(0, 0, 255)  # 创建蓝色
circleObj.TrueColor = clr  # 指定颜色

  1. pywin32
center, radius = vtpnt(5, 5, 0), 2
circleObj = msp.AddCircle(center, radius)

# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
circleObj.TrueColor = clr  # 指定颜色


  以上代码运行后,效果如下图所示:


在这里插入图片描述




4.2 绘制圆弧


  An arc is always drawn counterclockwise from the start point to the endpoint. The StartPoint and EndPoint properties of an arc are calculated through the StartAngle, EndAngle, and Radius properties.


在这里插入图片描述



  1. pyautocad
# 创建图元
center = APoint(5, 5)  # 圆心
radius = 4  # 半径
startAngle = math.radians(-60)  # 始边角度(弧度制)
endAngle = math.radians(60)  # 终边角度(弧度制)
arcObj = pyacad.model.AddArc(center, radius, math.radians(-60), math.radians(60))

# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(0, 0, 255)  # 创建蓝色
arcObj.TrueColor = clr  # 指定颜色

  1. pywin32
# 创建图元
center, radius = vtpnt(5, 5, 0), 2
startAngle = math.radians(-60)  # 始边角度(弧度制)
endAngle = math.radians(60)  # 终边角度(弧度制)
arcObj = msp.AddArc(center, radius, math.radians(-60), math.radians(60))

# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
arcObj.TrueColor = clr  # 指定颜色


  以上代码运行后,效果如下图所示:


在这里插入图片描述





五、绘制椭圆及椭圆弧


5.1 绘制椭圆


在这里插入图片描述



  1. pyautocad
# 创建图元
center = APoint(8, 5, 0)  # 椭圆中心
majAxis = APoint(5, 0, 0)  # majAxis为主轴(长轴)端点相对于椭圆中心的坐标增量。
radRatio = 0.5  # 短长轴之比为0.5
ellObj = pyacad.model.AddEllipse(center, majAxis, radRatio)

# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(0, 0, 255)  # 创建蓝色
ellObj.TrueColor = clr  # 指定颜色

  1. pywin32
# 创建图元
center = vtpnt(13, 5, 0)  # 椭圆中心
majAxis = vtpnt(5, 0, 0)  # majAxis为主轴(长轴)端点相对于椭圆中心的坐标增量。
radRatio = 0.5  # 短长轴之比为0.5
ellObj = msp.AddEllipse(center, majAxis, radRatio)

# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
ellObj.TrueColor = clr  # 指定颜色


  以上代码运行后,效果如下图所示:


在这里插入图片描述




5.2 绘制椭圆弧


  1. pyautocad
# 创建图元
center = APoint(-3, 5, 0)  # 椭圆中心
majAxis = APoint(5, 0, 0)  # majAxis为主轴(长轴)端点相对于椭圆中心的坐标增量。
radRatio = 0.5  # 短长轴之比为0.5
ellObj = pyacad.model.AddEllipse(center, majAxis, radRatio)
ellObj.startAngle = -90 * (3.14 / 180)
ellObj.endAngle = 90 * (3.14 / 180)

# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(0, 0, 255)  # 创建蓝色
ellObj.TrueColor = clr  # 指定颜色

  1. pywin32
# 创建图元
center = vtpnt(3, 5, 0)  # 椭圆中心
majAxis = vtpnt(5, 0, 0)  # majAxis为主轴(长轴)端点相对于椭圆中心的坐标增量。
radRatio = 0.5  # 短长轴之比为0.5
ellObj = msp.AddEllipse(center, majAxis, radRatio)
ellObj.startAngle = 90 * (3.14 / 180)
ellObj.endAngle = -90 * (3.14 / 180)

# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
ellObj.TrueColor = clr  # 指定颜色


  以上代码运行后,效果如下图所示:


在这里插入图片描述





六、实体及图案填充


6.1 实体填充


  1. pyautocad
# 创建图元
pnt1, pnt2, pnt3, pnt4 = APoint(-10, 5, 0), APoint(-10, 10, 0), APoint(-3, 5, 0), APoint(-3, 10, 0)
solidObj = pyacad.model.AddSolid(pnt1, pnt2, pnt3, pnt4)

# 指定颜色
version = pyacad.Application.Version[:2]  # 当前CAD的版本号
clr = pyacad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(0, 0, 255)  # 创建蓝色
solidObj.TrueColor = clr  # 指定颜色

  1. pywin32
# 创建图元
pnt1, pnt2, pnt3, pnt4 = vtpnt(3, 5, 0), vtpnt(3, 10, 0), vtpnt(10, 5, 0), vtpnt(10, 10, 0)
solidObj = msp.AddSolid(pnt1, pnt2, pnt3, pnt4)

# 指定颜色
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)
clr.SetRGB(255, 0, 0)  # 创建红色
solidObj.TrueColor = clr  # 指定颜色


  以上代码运行后,效果如下图所示:


在这里插入图片描述




6.2 圆形图案填充


ptnName, ptnType, bAss, center, radius = "ANSI31", 0, True, vtpnt(10, 10, 0), 7
outerLoop = []
circleObj = msp.AddCircle(center, radius)
outerLoop.append(circleObj)
outerLoop = vtobj(outerLoop)
hatchObj = msp.AddHatch(ptnType, ptnName, bAss)
hatchObj.AppendOuterLoop(outerLoop)
hatchObj.Evaluate()  # 进行填充计算,使图案吻合于边界
hatchObj.PatternScale = 0.2  # 设置填充图案比例


  以上代码运行后,效果如下图所示:


在这里插入图片描述




6.3 闭合多段线图案填充


  详见博客:Python 二次开发 AutoCAD 简介 >> 七、绘图 >> 7.2 闭合多段线图案填充 。


在这里插入图片描述





七、绘图次序


  Autodesk AutoCAD 2014: ActiveX Reference Guide 文档中关于绘图次序例子的Python代码如下:


  1. Set drawing to display lineweights and create a True Color object.
doc.preferences.LineweightDisplay = 1  # 显示线宽
version = wincad.Application.Version[:2]  # 当前CAD的版本号
clr = wincad.Application.GetInterfaceObject("AutoCAD.AcCmColor.%s" % version)

  1. Draw a polyline
points = [4, 4, 0, 3, 5, 0, 6, 20, 0]
points = vtfloat(points)
plineObj = msp.AddPolyline(points)
plineObj.Lineweight = 211  # 设置线宽
clr.SetRGB(90, 110, 150)
plineObj.TrueColor = clr  # 指定颜色

  1. Draw a line
startPoint = vtpnt(5, 13)
endPoint = vtpnt(5, 27)
lineObj = msp.AddLine(startPoint, endPoint)
lineObj.Lineweight = 211
clr.SetRGB(50, 80, 230)
lineObj.TrueColor = clr

  1. Draw a circle
centerPoint = vtpnt(10, 15, 0)
radius = 5
circleObj = msp.AddCircle(centerPoint, radius)
circleObj.Lineweight = 211
clr.SetRGB(60, 200, 220)
circleObj.TrueColor = clr

doc.Application.ZoomAll()
doc.Application.Update()

  1. Get an extension dictionary and, if necessary, add a SortentsTable object.
eDictionary = msp.GetExtensionDictionary()

try:
    sentityObj = eDictionary.GetObject("ACAD_SORTENTS")
except:
    sentityObj = eDictionary.AddObject("ACAD_SORTENTS", "AcDbSortentsTable")

ObjIds = [plineObj.ObjectID, lineObj.ObjectID, circleObj.ObjectID]  # 获取图元ID

  1. Move the circle object to the bottom
varObject = doc.ObjectIdToObject(ObjIds[2])  # 获取圆形图元
# varObject.Delete()  删除圆

varObject = vtobj([varObject, ])
sentityObj.MoveToBottom(varObject)
doc.Application.Update()


在这里插入图片描述





八、其他


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"                   # 指定图层




九、尾声


  以上,便是关于 Python 二次开发 AutoCAD 绘图 的简单介绍。

  因篇幅有限,某些非关键功能未做详细介绍,如有疑问,欢迎邮件交流,Email: liyang@alu.hit.edu.cn

  本文部分功能的实现离不 ke1078 同学的大力帮助,有些功能看似简单,但第一次实现却是相当不容易的。

  鉴于相关示例代码相对较少,特写本文,一方面是为自己的阶段性学习做一个总结,另一方面更是为有需要的人提供多一点参考。

  本文仅用于个人学习,除此之外,无其他任何用途。

  因本人野生学习 Python ,水平确实有限,文中难免有所疏漏,还请各位大神不吝批评指正。

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

  本文最早发表于 2018-12-13 18:20:21,作为博客 Python 二次开发 AutoCAD 简介 的一部分。

  为了清晰直观,于 2019-07-20 14:23:44 单独创建本文。

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

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

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

  打赏可备注邮箱,本人将赠送本系列博客的全部 Python 源代码。

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




在这里插入图片描述






  • 88
    点赞
  • 538
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 149
    评论
评论 149
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hulunbuir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值