Python AutoCAD 绘图 您所在的位置:网站首页 最美逆行者用英语怎么说 Python AutoCAD 绘图

Python AutoCAD 绘图

2023-11-28 10:29| 来源: 网络整理| 查看: 265

目 录 Blog Links一、前言二、创建点及直线三、绘制多段线及样条曲线3.1 绘制普通多段线3.2 绘制含圆弧多段线3.3 绘制样条曲线 四、绘制圆及圆弧4.1 绘制圆4.2 绘制圆弧 五、绘制椭圆及椭圆弧5.1 绘制椭圆5.2 绘制椭圆弧 六、实体及图案填充6.1 实体填充6.2 圆形图案填充6.3 闭合多段线图案填充 七、绘图次序八、其他九、尾声

Blog Links

DalNur | 博客总目录

Python 二次开发 AutoCAD 简介

Python 二次开发 AutoCAD 设置

Python 二次开发 AutoCAD 图层

Python 二次开发 AutoCAD 绘图

Python 二次开发 AutoCAD 修改

Python 二次开发 AutoCAD 块组

Python 二次开发 AutoCAD 注释

Python 二次开发 AutoCAD 文件

Python 二次开发 AutoCAD 选择集

一、前言

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

在这里插入图片描述

在这里插入图片描述

AutoCAD绘图菜单

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

方式一: pyautocad #!/usr/bin/env python # -*- coding: utf-8 -*- """ ============================= Author: DalNur Email: [email protected] ============================= """ 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: [email protected] ============================= """ 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) 二、创建点及直线 设置点显示 pyacad.ActiveDocument.SetVariable("PDMODE", 35) # 设置点样式的显示方式 pyacad.ActiveDocument.SetVariable("PDSIZE", 2) # 设置点大小 pyautocad绘直线 startPoint = APoint(5, 8) # z坐标可空缺,空缺时系统默认其为0,即点Pnt1在CAD中坐标为(5,25,0)。 endPoint = APoint(20, 15) # pyautocad自动将各坐标转化为双精度浮点数。 lineObj = pyacad.model.AddLine(startPoint, endPoint) pywin32绘制点 startPntCoords = vtpnt(5, 5) startPoint = msp.AddPoint(startPntCoords) endPntCoords = vtpnt(20, 20) endPoint = msp.AddPoint(endPntCoords) pywin32绘直线 lineObj = msp.AddLine(startPntCoords, endPntCoords)

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

在这里插入图片描述

三、绘制多段线及样条曲线 3.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() 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 绘制圆 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 # 指定颜色 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.

在这里插入图片描述

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 # 指定颜色 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 绘制椭圆

在这里插入图片描述

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 # 指定颜色 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 绘制椭圆弧 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 # 指定颜色 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 实体填充 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 # 指定颜色 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代码如下:

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) 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 # 指定颜色 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 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() 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 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: [email protected]

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

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

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

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

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

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

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

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

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

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

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

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

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有