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都不能实现,不知道原因,希望
得到大神的指点
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐