乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 204|回复: 9

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

[复制链接]

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:19:00 | 显示全部楼层 |阅读模式
python调用win32com操作CAD,识别图元:文字提取
#本程序是写在一个calss类内,发帖时未做修改,不可直接复制粘贴使用
from win32com import client
import pythoncom
#创建选择集
def shaixuan_cad(self):
    pythoncom.CoInitialize()
    acad_app = client.Dispatch(".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')
PyQt5写的界面展示

vcxhfppf1a4.jpg

vcxhfppf1a4.jpg

回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:52:00 | 显示全部楼层
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')
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:51:00 | 显示全部楼层
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')
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:49:00 | 显示全部楼层
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')
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:54:00 | 显示全部楼层
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
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 14:55:00 | 显示全部楼层
补充:创建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()
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 15:00:00 | 显示全部楼层
链接:https://pan.baidu.com/s/102yTBobH3jOCPQ0Yn3AlmA?pwd=WCEO
提取码:WCEO
--来自百度网盘超级会员V7的分享
回复

使用道具 举报

9

主题

129

帖子

15

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-6-14 16:02:00 | 显示全部楼层
怎么 运行?不是很懂。
回复

使用道具 举报

3

主题

13

帖子

3

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-6-14 17:27:00 | 显示全部楼层

python代码,需要安装python环境,然后把这些代码重新写成一个类或者改成一个个单独的py文件运行。
百度网盘里分享了打包好的exe文件,打开想要统计的CAD图纸,然后运行程序使用对应的功能。
哔哩哔哩上有本人录制的使用视频:https://www.bilibili.com/video/BV1YY4y1G7KU?spm_id_from=333.999.0.0&vd_source=22f968c8f7c8841759849afd5058a215
回复

使用道具 举报

7

主题

450

帖子

22

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
473
发表于 2022-6-15 08:28:00 | 显示全部楼层
你用pyqt5做界面,做出来的exe文件不臃肿吗
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 23:20 , Processed in 0.373094 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表