Python AutoCAD 绘图

admin 2019-7-22 14247

原文:https://blog.csdn.net/Hulunbuir/article/details/96589272 

----------------------

时间有限,后续完善。

Python pyautocad库 使用简介 https://blog.csdn.net/Hulunbuir/article/details/83715279

Python AutoCAD 系统设置 https://blog.csdn.net/Hulunbuir/article/details/96587211

Python AutoCAD 图层 https://blog.csdn.net/Hulunbuir/article/details/96588654

Python AutoCAD 选择集 https://blog.csdn.net/Hulunbuir/article/details/95446723

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
===========================
Author = Hulunbuir
Email:liyang@alu.hit.edu.cn
===========================
'''
from pyautocad import APoint
import numpy as np
import math
" # ******************************************* 1、创建点及直线 ******************************************** # "
# 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, Pnt2, Pnt3] = [APoint(35, 35), APoint(40, 35), 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坐标顺序排列构成的数组。
PlinePnts = aDouble(PlinePnts)
PlineObj = acad.model.AddPolyLine(PlinePnts)
## (2)、添加含圆弧的多段线
R = 50 # 圆角半径
L = 400 # 矩形长
B = 200 # 矩形宽
Pnt1 = APoint(0.5*L-R, -0.5*B)
Pnt2 = APoint(0.5*L, -0.5*B+R)
Pnt3 = APoint(0.5*L, 0.5*B-R)
Pnt4 = APoint(0.5*L-R, 0.5*B)
Pnt5 = APoint(-0.5*L+R, 0.5*B)
Pnt6 = APoint(-0.5*L, 0.5*B-R)
Pnt7 = APoint(-0.5*L, -0.5*B+R)
Pnt8 = APoint(-0.5*L+R, -0.5*B)
PlinePnts = np.array([Pnt1, Pnt2, Pnt3, Pnt4, Pnt5, Pnt6, Pnt7, Pnt8])
PlinePnts = PlinePnts.reshape(1, PlinePnts.shape[0] * PlinePnts.shape[1])[0]
PlineObj = acad.model.AddPolyLine(PlinePnts)
PlineObj.Closed = True  # 闭合多段线
bulgevalue = math.tan(math.pi/8)  # 凸度,为四分之一倍圆弧所对圆心角的正切值。
PlineObj.SetBulge(0, bulgevalue)  # 将多段线的第一部分设置为凸度为bulgevalue的圆弧。
PlineObj.SetBulge(2, bulgevalue)
PlineObj.SetBulge(4, bulgevalue)
PlineObj.SetBulge(6, bulgevalue)
## (3)、添加样条曲线
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图形对象。"
" ②、已解决 "
# 本方法没有采用pyautocad库;
# 特别感谢:ke1078 Email:354****89@qq.com;
# 以下代码由ke1078同学提供。
import pythoncom
import win32com.client
acad = win32com.client.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument
doc.Utility.Prompt("hello world\n")
mp = doc.ModelSpace
def vtpt(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)
[ptnName, ptnType, bAss, center, radius ] = ["ANSI31", 0, True, vtpt(0, 0, 0), 10]
outerLoop = []
outerLoop.append ( mp.AddCircle(center, radius))
outerLoop = vtobj(outerLoop)
hatchObj = mp.AddHatch(ptnType, ptnName, bAss)
hatchObj.AppendOuterLoop(outerLoop)
hatchObj.Evaluate()
" # *********************************************** 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 ************************************************* # "



最新回复 (0)
返回