> 文章列表 > python 操作CAD 二次开发 相关函数

python 操作CAD 二次开发 相关函数

python 操作CAD 二次开发 相关函数

import win32com.client as win32#输出dwg文件
from pyautocad import Autocad#输出dwg文件
import numpy as np#输出dwg文件

import pywin32 #输出dxf文件
import ezdxf #输出dxf文件

#打开CAD AutoCAD.Application.18 为 2010版本
#AutoCAD.Application.19 为 2014版本
#AutoCAD.Application.16 为 2004/2006版本
#AutoCAD.Application.17 为 2007/2008/2009版本

CAD对象 python对象名
TEXT AcDbText
MTEXT AcDbMText
POINT AcDbPoint
LINE AcDbLine
LWPOLYLINE AcDbPolyline
ARC AcDbArc
CIRCLE AcDbCircle
ELLIPSE AcDbEllipse
SPLINE AcDbSpline
HATCH AcDbHatch
MLINE AcDbMline
TABLE AcDbTable
####################
#######图形修改#####
#####################
item.Linetype = ‘DASHED’#修改线型
item.LinetypeScale = ‘10’ #修改线型比例
item.Lineweight = ‘100’#设置线宽
item.Height = ‘5’ #设置文字高度
##########################
#使用pywin32库############
##########################
wincad = win32.Dispatch(“AutoCAD.Application”)
doc = wincad.ActiveDocument
msp = doc.ModelSpace

doc.Utility.Prompt(“dk\\n”)#在控制台输出
#########################扩展属性读取#####################################
def vtInt(list):
“”“列表转化为整数”“”
return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, list)

def vtVariant(list):
“”“列表转化为变体”“”
return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, list)
try:
doc.SelectionSets.Item(“SS1”).Delete()
except:
print(“Delete selection failed”)
slt = doc.SelectionSets.Add(“SS1”)#创建选择集

slt.Select(5, 0, 0, vtInt([0, 8, 1000]), vtVariant([“LWPOLYLINE”, “BDMAP_地籍图框”, “JC10020”]))

slt.Select(5, 0, 0, vtInt([0, 8]), vtVariant([“LWPOLYLINE”, layer_fw]))#按属性进行选择
pnts = vtFloat1(APoint1)#将坐标集合转换成点坐标
slt1.SelectByPolygon(7, pnts)#根据多边形选择
slt.SelectOnScreen()#选择

set_width = doc.Utility.GetInteger(‘输入宽度(整数):\\n’)
ifdo = doc.Utility.GetKeyword(‘重复放缩输入y后空格,取消按任意键\\n’)
wincad = win32.Dispatch(“AutoCAD.Application”)
doc = wincad.ActiveDocument
msp = doc.ModelSpace
rtnObj = doc.Utility.Getpoint()
xy = rtnObj[0]
print(xy, rtnObj[1])
rtnObj = doc.Utility.GetEntity()

for text in acad.iter_objects(‘Text’):###循环文字

for item in slt:#循环选择集
zddm = item.GetXData(“BDMAP_XPMTK”)[1][1].split(‘$’)[0]#获取扩展属性
xy = item.Coordinates#获取多段线坐标
layer = item.layer#获取图层名
name = item.EntityName#获取图形类型
text_xy = item.TextString#获取文本内容
xy = item.InsertionPoint#获取文本坐标
xy = item.center#获取圆心坐标

print(doc.Name)#

pnts = [100, -50, 0, 100, 50, 0, -100, 50, 0, -100, -50, 0, -60, 10, 0]#点的三维坐标
pnts = vtfloat(pnts)#将坐标转换为数据

plineObj = msp.AddPolyLine(pnts)#绘制多段线
plineObj.Closed = True#闭合多段线

#进行计算填充图案
[ptnName, ptnType, bAss] = [“ANSI31”, 0, True]
outerLoop = []
outerLoop.append(plineObj)
outerLoop = vtobj(outerLoop)
hatchObj = msp.AddHatch(ptnType, ptnName, bAss)
hatchObj.AppendOuterLoop(outerLoop)
hatchObj.Evaluate()

rtnObj = doc.Utility.GetEntity()#选取图中的图形
a = rtnObj[0].ObjectID#所选的图形ID
b = rtnObj[1]#鼠标单击的坐标
sltObject = doc.ObjectIdToObject(rtnObj[0].ObjectID) # 图元ID转化为对应的图元
#给所选的图形改成红色
clr = doc.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”)
clr.SetRGB(255, 0, 0) # 创建红色
sltObject.TrueColor = clr # 指定颜色
doc.Application.Update()

#######################
#画点
def vtpnt(x, y, z=0):
return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))
pyacad.ActiveDocument.SetVariable(“PDMODE”, 35) # 设置点样式的显示方式
pyacad.ActiveDocument.SetVariable(“PDSIZE”, 2) # 设置点大小
startPntCoords = vtpnt(5, 5)
startPoint = msp.AddPoint(startPntCoords)#画点

#################
#画直线
lineObj = msp.AddLine(startPntCoords, endPntCoords)

#######################
#画多段线

创建图元

pnts = [5, 20, 0, 10, 20, 0, 20, 5, 0, 25, 5, 0]
points = vtfloat(pnts)
plineObj = msp.AddPolyline(points)

指定颜色

clr = doc.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”)
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()

######################
#画圆
#创建图元
center, radius = vtpnt(5, 5, 0), 2
circleObj = msp.AddCircle(center, radius)

指定颜色

clr = doc.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”)
clr.SetRGB(255, 0, 0) # 创建红色
circleObj.TrueColor = clr # 指定颜色

copyObj = sltObject.Copy()#复制图形
sltObject.Delete()#删除图形

#############################
#使用pyautocad库##############
#############################
pyacad = Autocad(create_if_not_exists=True)#打开CAD
pyacad.prompt(“Hello! AutoCAD from pyautocad.”)#在控制台输出文字提示
clr=R+256×G+256×256×B#颜色的计算方式
clr=198+256×224+256×256×180=11854022#如白色的数值
#模拟在控制台输出命令
acad = Autocad(create_if_not_exists=True)
acad.ActiveDocument.SendCommand(“C” + chr(13) + “0,0” +
chr(13) + “100,100” + chr(13) )# car(13)是回车,"0,0"是坐标,"L"是快捷键

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

####################
#画多段线

创建图元

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)

指定颜色

clr = pyacad.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”)
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()

########################
#画圆

创建图元

center = APoint(5, 5) # 圆心
radius = 4 # 半径
circleObj = pyacad.model.AddCircle(center, radius)

指定颜色

clr = pyacad.Application.GetInterfaceObject(“AutoCAD.AcCmColor.19”)
clr.SetRGB(0, 0, 255) # 创建蓝色
circleObj.TrueColor = clr # 指定颜色

##################
#打开文件
acad.ActiveDocument.Application.Documents.Open(r"D:\\AutoCAD\\PyAutoCAD.dwg")
DrawingObj.Activate() # 将New_Drawing设为当前文件。

##################
#另存文件
acad.ActiveDocument.Application.Documents(“PyAutoCAD.dwg”).Close(True, “PyAutoCAD_已变更.dwg”)
# 关闭PyAutoCAD.dwg文件。
# True 布尔值,为系统默认,表示打开文件后关闭前文件若发生变更,则保存变更,并另存为PyAutoCAD_已变更.dwg
# 此时文件夹中同时存在未变更的"PyAutoCAD.dwg"和已变更的"PyAutoCAD_已变更.dwg"
# 若第二项空缺,则新文件名为"PyAutoCAD.dwg",覆盖之前未变更的文件。
acad.ActiveDocument.SaveAs(r"D:\\AutoCAD\\PyAutoCAD_SaveAs", 61)

#############
#文件另存
pyacad.ActiveDocument.SaveAs(“D:\\AutoCAD\\TestSaveAs”, 61)
#版本 dwg dxf
2000 12 13
2004 24 25
2007 36 37
2010 48 49
2013 60 61
#将dwg文件另存为dxf文件
pyacad.ActiveDocument.Application.Documents(“PyAutoCAD.dwg”).SaveAs(“D:\\AutoCAD\\TestSaveAs”, 61)

##########################
######ezdxf##############
#############################

张召忠