python从Cass文件中提取数据
·
import os,sys
import pythoncom,win32com.client
import pandas as pd
#创建选择集
def CreateSelectionSets(Doc,name):
try:
Doc.SelectionSets.Item(name).Delete()
except:
print("Delete selection failed")
SelectionSet = Doc.SelectionSets.Add(name)
return SelectionSet
#创建组
def CreateGroup(Doc,name):
try:
Doc.Groups.Item(name).Delete()
except:
print("Delete Group failed")
group = Doc.Groups.Add(name)
return group
#数据转化函数
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(list):
"""列表转化为浮点数"""
return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, list)
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)
#获取软件
wincad = win32com.client.Dispatch("AutoCAD.Application")
Doc = wincad.ActiveDocument
fullpath=(Doc.path)
#获取文件夹下的所有文件
filelists=[os.path.join(fullpath,i) for i in filter((lambda x: '.dwg' in x),os.listdir(fullpath))]
'''
acad=Autocad(create_if_not_exists=True)
acad.prompt('Hello')
Doc=acad.doc
fullpath=(Doc.path)
'''
#读取excel文件
df=pd.read_excel(r"E:\2020\七月份\提取数据.xlsx")
# df = df.dropna()
heads=df.head(0).columns.values
newfiles={}
for i in range(heads.size):
newfiles[i]=os.path.join(fullpath,'提取',heads[i]+'.dwg')
#新建dwg
newDoc=wincad.Documents.Add()
newDoc.SaveAs(newfiles[i])
newDoc.close()
#关闭当前文档
Doc.close()
for filelist in filelists:
#打开每个文档
print('正在运行',filelist)
curDoc=wincad.Documents.Open(filelist)
sset=CreateSelectionSets(curDoc,'Sset1')
sset.Delete()
sset=CreateSelectionSets(curDoc,'Sset1')
#获取指定列数据,并过滤空值
datas1=df[heads[0]].dropna().values
datas2=df[heads[1]].dropna().values
datas3=df[heads[2]].dropna().values
datas4=df[heads[3]].dropna().values
#选择集选择数据
sset.clear()
# sset.Select(5, 0, 0, filterType, filterData) # 实现过滤
sset.Select(5, 0, 0)
# print(sset.count)
# print(sset[0].layer)
#定义新的列表存储数据
sset_all=[]
sset1=[]
sset2=[]
sset3=[]
sset4=[]
for i in range(len(sset)):
#获取扩展属性
XDataType, XDataValue=sset[i].GetXData("SOUTH")
if XDataValue!=None:
if XDataValue[1] in datas1: #第一列
# sset.RemoveItems(vtobj([sset]))
# sset.RemoveItems(vtobj([sset[i]]))
sset1.append(sset[i])
elif XDataValue[1] in datas2: #第二列
sset2.append(sset[i])
elif XDataValue[1] in [datas3[0],datas3[1],datas3[2]]: #第三列
sset3.append(sset[i])
elif XDataValue[1] in [str(datas4[0])]: #第四列
sset4.append(sset[i])
if sset[i].EntityName == "AcDbText": #第三列
if sset[i].textString in [datas3[3],datas3[4],datas3[5],datas3[6],datas3[7]]:
sset3.append(sset[i])
if sset[i].layer=='DLSS': #第四列
sset4.append(sset[i])
sset_all=[sset1,sset2,sset3,sset4]
num=-1
for sset_temp in sset_all:
num+=1
if len(sset_temp)>0:
#转换数据类型,创建组
groupitems=vtobj(sset_temp)
group1=CreateGroup(curDoc,heads[num])
group1.Delete()
group1=CreateGroup(curDoc,heads[num])
group1.AppendItems(groupitems)
#拷贝数据
curDoc.SendCommand("copyclip g "+heads[num] + chr(13)+ chr(13))
#粘贴数据
curDoc1=wincad.Documents.Open(newfiles[num])
# wincad.ActiveDocument=curDoc1
curDoc1.SendCommand ("_pasteorig ")
curDoc1.Application.ZoomExtents()
curDoc1.Save()
curDoc1.close()
#关闭当前文档
curDoc.close()
print('结束运行',filelist)
# curDoc2.close()
# curDoc3.close()
# curDoc4.close()
# num=0
# #1
# if sset1.count>0:
# #转换数据类型,创建组
# groupitems=vtobj(sset1)
# group1=CreateGroup(curDoc,heads[num])
# group1.Delete()
# group1=CreateGroup(curDoc,heads[num])
# group1.AppendItems(groupitems)
# #拷贝数据
# curDoc.SendCommand("copyclip g "+heads[num] + chr(13)+ chr(13))
# #粘贴数据
# curDoc1=wincad.Documents.Open(newfiles[num])
# curDoc1.SendCommand ("_pasteorig ")
# curDoc1.Application.ZoomExtents()
# curDoc1.Save()
# # curDoc1.close()
# #2
# num+=1
# if sset2.count>0:
# #转换数据类型,创建组
# groupitems=vtobj(sset2)
# group1=CreateGroup(curDoc,heads[num])
# group1.Delete()
# group1=CreateGroup(curDoc,heads[num])
# group1.AppendItems(groupitems)
# #拷贝数据
# curDoc.SendCommand("copyclip g "+heads[num] + chr(13)+ chr(13))
# #粘贴数据
# curDoc1=wincad.Documents.Open(newfiles[num])
# curDoc1.SendCommand ("_pasteorig ")
# curDoc1.Application.ZoomExtents()
# curDoc1.Save()
# # curDoc1.close()
# #3
# num+=1
# if sset3.count>0:
# #转换数据类型,创建组
# groupitems=vtobj(sset3)
# group1=CreateGroup(curDoc,heads[num])
# group1.Delete()
# group1=CreateGroup(curDoc,heads[num])
# group1.AppendItems(groupitems)
# #拷贝数据
# curDoc.SendCommand("copyclip g "+heads[num] + chr(13)+ chr(13))
# #粘贴数据
# curDoc1=wincad.Documents.Open(newfiles[num])
# curDoc1.SendCommand ("_pasteorig ")
# curDoc1.Application.ZoomExtents()
# curDoc1.Save()
# # curDoc1.close()
# #4
# num+=1
# if sset4.count>0:
# #转换数据类型,创建组
# groupitems=vtobj(sset4)
# group1=CreateGroup(curDoc,heads[num])
# group1.Delete()
# group1=CreateGroup(curDoc,heads[num])
# group1.AppendItems(groupitems)
# #拷贝数据
# curDoc.SendCommand("copyclip g "+heads[num] + chr(13)+ chr(13))
# #粘贴数据
# curDoc1=wincad.Documents.Open(newfiles[num])
# curDoc1.SendCommand ("_pasteorig ")
# curDoc1.Application.ZoomExtents()
# curDoc1.Save()
# # curDoc1.close()
# msp = curDoc.ModelSpace
#获取指定行数据
# data=df.ix[0].values
# 注释
'''
# if "172001-1" in data:
# print(data)
# #过滤对象
# filterType=[]
# filterData=[]
# filterType.append(-4)
# filterData.append("<AND")
# filterType.append(1001)
# filterData.append("SOUTH")
# filterType.append(1000)
# filterData.append(datas1[0])
# for data in datas1:
# # filterType.append(-4)
# # filterData.append("<AND")
# filterType.append(1001)
# filterData.append("SOUTH")
# filterType.append(1000)
# filterData.append(data)
# # filterType.append(-4)
# # filterData.append("AND>")
# filterType.append(-4)
# filterData.append("AND>")
# filterType = [-4,1001, 1000,-4] # 定义过滤类型
# filterData = ["<AND","SOUTH", "171201-1","AND>"] # 设置过滤参数
# filterType = [1001, 1000] # 定义过滤类型
# filterData = ["SOUTH", "171201-1"] # 设置过滤参数
# #171201-1
# filterType = [1001] # 定义过滤类型
# filterData = ["SOUTH"] # 设置过滤参数
# filterType = vtInt(filterType) # 数据类型转化
# filterData = vtVariant(filterData) # 数据类型转化
'''
# 注释
获取扩展属性那块尝试了通过过滤的方式来获取相应数据,没有成功,python和VBA都不能实现,不知道原因,希望
得到大神的指点
更多推荐
所有评论(0)