WCEO 发表于 2022-6-14 14:19:00

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

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 =
    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()
                   }
      except:
            continue
      if txt=='':ddd='全图匹配'
      else:ddd='字符匹配'
      if n == 0: self.out_excel('k', list(dic.keys()) + )    #调用写入Excel程序
      self.out_excel('v', list(dic.values()) + )    #调用写入Excel程序
    print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')
PyQt5写的界面展示


WCEO 发表于 2022-6-14 14:52:00

python调用win32com操作CAD,识别图元:长度分层统计(直线、多段线)
    def get_line_long(self,txt):
      self.ftyp =
      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(])+',0.000'
                  SecondPoint = ','.join(])+',0.000'
                elif ent.EntityName == 'AcDbLine':
                  FirstPoint=','.join()
                  SecondPoint=','.join()
                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 = dic['Length']
                self.out_excel('新图层', )
            else:
                dicc += dic['Length']
            self.out_excel('dv', )
      self.out_excel('k', ['Layer', 'Length'])
      for k, v in dicc.items():
            self.out_excel('v', )
            time.sleep(0.1)
      print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')

WCEO 发表于 2022-6-14 14:51:00

python调用win32com操作CAD,识别图元:属性块属性值提取
    def get_block_shuxing(self,txt):
      self.ftyp =
      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()
                     }
                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 = tx
            except:
                continue
            if n==0:self.out_excel('k', title)
            lst = []
            for t in title:
                if t in dic.keys():
                  lst.append(dic)
                else:
                  lst.append('')
            self.out_excel('v', lst)
            dic.clear()
      self.out_excel('k', title)
      print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')

WCEO 发表于 2022-6-14 14:49:00

python调用win32com操作CAD,识别图元:块数量统计
    def get_block_count(self,txt):
      self.ftyp =
      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()
                     }
            except:
                continue
            #新字典,统计块的个数
            if dic['Name'] not in dicc.keys():
                dicc] =
                self.out_excel('新苗木名', , list(dic.keys())])    #调用写入Excel程序
            else:
                dicc] +=
            self.out_excel('dv', , list(dic.values())])    #调用写入Excel程序
      self.out_excel('k', ['Name', 'Num'])    #调用写入Excel程序
      for k,v in dicc.items():
            self.out_excel('v', )    #调用写入Excel程序
            time.sleep(0.1)
      print('所长的温馨提示:', '程序已运行结束,请注意查看已存储到Excel文件!By所长_WCEO QQ121841879')

WCEO 发表于 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
      if kv=='新苗木名' or kv=='新图层':
            name=list
            self.ws_v = self.wb.sheets.add(name)
            self.ws_v.range('A1').value = list
      elif kv == 'dv':
            name=list
            self.ws_v = self.wb.sheets
            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
      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

WCEO 发表于 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.delete()

WCEO 发表于 2022-6-14 15:00:00

链接:https://pan.baidu.com/s/102yTBobH3jOCPQ0Yn3AlmA?pwd=WCEO
提取码:WCEO
--来自百度网盘超级会员V7的分享

flowerson 发表于 2022-6-14 16:02:00

怎么 运行?不是很懂。

WCEO 发表于 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

烟盒迷唇 发表于 2022-6-15 08:28:00

你用pyqt5做界面,做出来的exe文件不臃肿吗
页: [1]
查看完整版本: python调用win32com操作CAD,识别图元