明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2577|回复: 24

python调用win32com操作CAD,识别图元

[复制链接]
发表于 2022-6-14 14:19 | 显示全部楼层 |阅读模式
本帖最后由 WCEO 于 2022-6-14 15:01 编辑


python调用win32com操作CAD,识别图元:文字提取
#本程序是写在一个calss类内,发帖时未做修改,不可直接复制粘贴使用


from win32com import client
import pythoncom
#创建选择集
def shaixuan_cad(self):
    pythoncom.CoInitialize()
    acad_app = client.Dispatch("AutoCAD.Application")
    self.doc=doc=acad_app.ActiveDocument  # Document object
    print(doc.Name)
    # 定义选择集参数
    SSetName = 'By所长_WCEO'
    #参数转换
    filterType = client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_I2, self.ftyp)    #参数类型转换
    filterData = client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_VARIANT, self.ftdt)    #参数类型转换
    try:  # 判断是否存在同名选择集,删除
        doc.SelectionSets.Item(SSetName).Delete()
    except:
        print("Delete selection failed")
    SSetTemp = doc.SelectionSets.Add(SSetName)
    #筛选并添加到选择集
    SSetTemp.Select(5, 0, 0, filterType, filterData)
    return SSetTemp
#设置选择集参数,调用选择集:txt为模糊匹配字符
def get_cad_text(self,txt):
    self.ftyp = [0, 100, 410, 1]
    self.ftdt = ['*Text', 'AcDb*', 'Model', '*'+str(txt)+'*']    #在模型中筛选文字或多行文字,文字内容可模糊匹配
    SSetTemp=self.shaixuan_cad()    #调用选择集函数,返回选择集
    for n, ent in enumerate(SSetTemp):    #遍历选择集中筛选的图元:文字或多行文字
        try:    #提取文字属性
            dic = {'CAD_Name': self.doc.Name,
                   'No.': n + 1,
                   'Textstring': ent.Textstring,
                   'ObjectName': ent.ObjectName,
                   'Linetype': ent.Linetype,
                   'color': ent.color,
                   'InsertionPoint': ','.join([str(('%.3f' % i)) for i in ent.InsertionPoint])
                   }
        except:
            continue
        if txt=='':ddd='全图匹配'
        else:ddd='字符匹配'
        if n == 0: self.out_excel('k', list(dic.keys()) + [ddd])    #调用写入Excel程序
        self.out_excel('v', list(dic.values()) + [ddd])    #调用写入Excel程序
    print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2022-6-14 14:52 | 显示全部楼层
python调用win32com操作CAD,识别图元:长度分层统计(直线、多段线)

    def get_line_long(self,txt):
        self.ftyp = [0, 100, 410, 8]
        self.ftdt = ['*Line','AcDb*','Model','*'+str(txt)+'*']
        SSetTemp = self.shaixuan_cad()
        dicc={}
        for n,ent in enumerate(SSetTemp):
            try:
                print(n,':::',ent.layer)
                if ent.EntityName == 'AcDbPolyline':
                    FirstPoint = ','.join([str('%.3f' % i) for i in ent.Coordinates[0:2]])+',0.000'
                    SecondPoint = ','.join([str('%.3f' % i) for i in ent.Coordinates[2:4]])+',0.000'
                elif ent.EntityName == 'AcDbLine':
                    FirstPoint=','.join([str('%.3f' % i) for i in ent.StartPoint])
                    SecondPoint=','.join([str('%.3f' % i) for i in ent.EndPoint])
                dic = {'CAD_Name': self.doc.Name,
                       'No.': n + 1,
                       'Layer': ent.layer,
                       'Length': round(ent.Length,3),
                       'color': ent.color,
                       'FirstPoint': FirstPoint,
                       'SecondPoint': SecondPoint,
                       }
            except:
                continue
            key = dic['Layer']
            name=re.sub(r'[^A-Za-z0-9_一-龢-]','_',key)
            if dic['Layer'] not in dicc.keys():
                dicc[key] = dic['Length']
                self.out_excel('新图层', [name, list(dic.keys())])
            else:
                dicc[key] += dic['Length']
            self.out_excel('dv', [name, list(dic.values())])
        self.out_excel('k', ['Layer', 'Length'])
        for k, v in dicc.items():
            self.out_excel('v', [k,v])
            time.sleep(0.1)
        print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')
 楼主| 发表于 2022-6-14 14:51 | 显示全部楼层
python调用win32com操作CAD,识别图元:属性块属性值提取

    def get_block_shuxing(self,txt):
        self.ftyp = [0, 100, 410, 66]
        self.ftdt = ['Insert', 'AcDb*', 'Model', 1]
        title = []
        SSetTemp = self.shaixuan_cad()
        for n, ent in enumerate(SSetTemp):
            try:
                dic = {'CAD_Name': self.doc.Name,
                       'No.': n + 1,
                       'Name': ent.name,
                       'EffectiveName': '',
                       'ObjectName': '',
                       'Layer': ent.layer,
                       'color': ent.color,
                       'InsertionPoint': ','.join([str(('%.3f' % i)) for i in ent.InsertionPoint])
                       }
                if title == []: title = list(dic.keys())
                data = ent.GetAttributes()
                for att in data:
                    ts=att.TagString
                    tx=att.TextString
                    if ts not in title: title.append(ts)
                    dic[ts] = tx
            except:
                continue
            if n==0:self.out_excel('k', title)
            lst = []
            for t in title:
                if t in dic.keys():
                    lst.append(dic[t])
                else:
                    lst.append('')
            self.out_excel('v', lst)
            dic.clear()
        self.out_excel('k', title)
        print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')
 楼主| 发表于 2022-6-14 14:49 | 显示全部楼层
python调用win32com操作CAD,识别图元:块数量统计

    def get_block_count(self,txt):
        self.ftyp = [0, 100, 410, 66,2]
        self.ftdt = ['Insert', 'AcDb*', 'Model', 0,'*'+str(txt)+'*']    #在模型中筛选无属性的块,块名可模糊匹配
        SSetTemp = self.shaixuan_cad()    #调用选择集函数,返回选择集
        dicc={}
        for n, ent in enumerate(SSetTemp):    #遍历选择集中筛选的图元:块
            try:    #提取块属性
                dic = {'CAD_Name': ent.Name,
                       'No.': n + 1,
                       'Name': ent.Name,
                       'EffectiveName': ent.EffectiveName,
                       'ObjectName': ent.ObjectName,
                       'Layer': ent.Layer,
                       'color': ent.color,
                       'InsertionPoint': ','.join([str(('%.3f' % i)) for i in ent.InsertionPoint])
                       }
            except:
                continue
            #新字典,统计块的个数
            if dic['Name'] not in dicc.keys():
                dicc[dic['Name']] = [list(dic.values())]
                self.out_excel('新苗木名', [dic['Name'], list(dic.keys())])    #调用写入Excel程序
            else:
                dicc[dic['Name']] += [list(dic.values())]
            self.out_excel('dv', [dic['Name'], list(dic.values())])    #调用写入Excel程序
        self.out_excel('k', ['Name', 'Num'])    #调用写入Excel程序
        for k,v in dicc.items():
            self.out_excel('v', [k, len(v)])    #调用写入Excel程序
            time.sleep(0.1)
        print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')
 楼主| 发表于 2022-6-14 14:54 | 显示全部楼层
python调用win32com操作CAD,识别图元:将图元数据输出到Excel文件
import xlwings as xw

    def out_excel(self, kv, list):
        print(kv,'---****---',list)
        self.ws = self.wb.sheets[self.funcname]
        if kv=='新苗木名' or kv=='新图层':
            name=list[0]
            self.ws_v = self.wb.sheets.add(name)
            self.ws_v.range('A1').value = list[1]
        elif kv == 'dv':
            name=list[0]
            self.ws_v = self.wb.sheets[name]
            self.ws_v.activate()
            row = self.ws_v.range(self.ws_v.used_range).rows.count
            self.ws_v.range('A' + str(row + 1)).select()
            self.ws_v.range('A' + str(row + 1)).value = list[1]
        elif kv == 'k':
            self.ws.range('A1').value = list
        elif kv == 'v':
            self.ws.activate()
            row = self.ws.range(self.ws.used_range).rows.count
            self.ws.range('A' + str(row + 1)).select()
            self.ws.range('A' + str(row + 1)).value = list
 楼主| 发表于 2022-6-14 14:55 | 显示全部楼层
补充:创建Excel工作簿和工作表

self.funcname=‘所长_WCEO QQ121841879’
pythoncom.CoInitialize()
app = xw.App(add_book=False)
self.wb = app.books.add()
self.ws=self.wb.sheets.add(name=self.funcname)
self.wb.sheets[1].delete()
 楼主| 发表于 2022-6-14 15:00 | 显示全部楼层
链接:https://pan.baidu.com/s/102yTBobH3jOCPQ0Yn3AlmA?pwd=WCEO
提取码:WCEO
--来自百度网盘超级会员V7的分享
发表于 2022-6-14 16:02 | 显示全部楼层
怎么 运行?不是很懂。
 楼主| 发表于 2022-6-14 17:27 | 显示全部楼层
flowerson 发表于 2022-6-14 16:02
怎么 运行?不是很懂。

python代码,需要安装python环境,然后把这些代码重新写成一个类或者改成一个个单独的py文件运行。
百度网盘里分享了打包好的exe文件,打开想要统计的CAD图纸,然后运行程序使用对应的功能。
哔哩哔哩上有本人录制的使用视频:https://www.bilibili.com/video/BV1YY4y1G7KU?spm_id_from=333.999.0.0&vd_source=22f968c8f7c8841759849afd5058a215
发表于 2022-6-15 08:28 | 显示全部楼层
你用pyqt5做界面,做出来的exe文件不臃肿吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 16:46 , Processed in 2.374797 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表