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

news/2024/12/22 20:26:36/

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##############
#############################


http://www.ppmy.cn/news/48207.html

相关文章

Python 使用pipreqs命令生成 `requirements.txt`报错

Python 使用pipreqs命令生成 requirements.txt报错:Fatal error in launcher: Unable to create process using ‘“E:\Anaconda\python.exe” “D:\Anaconda\Scripts\pipreqs.exe” ./ --encodingutf-8’: ??? 问题描述—Python 使用pipreqs命令生成 requireme…

MySQL_第09章_子查询

第09章_子查询 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。 SQL 中子查询的使用大大…

怎么设置动态壁纸?这样做就行!

案例:怎么设置动态壁纸 【朋友们,我的壁纸一直都是静态的,最近感觉有点审美疲劳了,想换些好看的动态壁纸,有朋友知道应该如何设置动态壁纸吗?】 经常使用电脑的朋友可能会觉得一直用同一张壁纸会感觉审美…

RabbitMQ之Work Queues

​ 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起…

IEEE14节点系统在如短路分析,潮流研究,互连电网中的研究(Simulink)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

Android/SELinux 添加 AVC 权限

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 增加属性配置 在文件路径下增加了如下代码用于gc02m1的兼容倒置前置摄像头成像配置 //daisy if(MSM8909_SENSORS){ property_set("ro.camera.gc02m1", "1"); } /home/scooper/works…

自动化测试工程师需要具备什么技能?

如果是初入门的学习者,不建议拿一本书从头学,很可能会被里边一些专业术语和不常用的技术带偏,不论在公司还是在其他岗位上自学测试,都可以用自己搭建好的项目来练手(如果在公司有现成的项目更好)&#xff0…

一文看懂数据云平台的“可观测性”技术实践

背景 这是一家大型制造集团。为监控及预测工厂设备运行情况,IT部门在数据云平台DataSimba上按天执行数据作业,每24小时对工厂设备的日志数据进行分析,发现能对业务起到很好的辅助作用,效果不错。 “要不升级为每1个小时跑一次&am…