Python script to iterate through all of the drawing (.dwg) files in a directory the script is in and create a spreadsheet with the
Text (either from text object or block attribute)
ObjectID (from text object or block)
Path and dwg file.
from both Paper Space and Model Space.
It should be easy to modify the code to search for a particular named block (Like a Titleblock for instance)
Note: to run if you have Python installed. Copy code below and save it as a .py file. Throw it in directory with cad files and double click.
AUTOCAD MUST BE OPEN IN ORDER FOR THIS TO WORK
from __future__ import print_function
from os.path import join, dirname, abspath
from xlutils.copy import copy
import xlrd
import xlwt
from pyautocad import Autocad, APoint
import os
import win32com.client
#Create workbook
book = xlwt.Workbook()
ws = book.add_sheet("ExportedData")
book.save("Exported.xls")
#Open the workbook
xl_workbook = xlrd.open_workbook("Exported.xls")
sheet_names = xl_workbook.sheet_names()
xl_sheet = xl_workbook.sheet_by_name(sheet_names[0])
wb = copy(xl_workbook)
sheet = wb.get_sheet(0)
dwgfiles = filter(os.path.isfile, os.listdir( os.curdir ) )
cwd = os.path.abspath(os.path.curdir) #current working dir
for f in dwgfiles:
if f.endswith(".dwg"):
""" open Document"""
acad = Autocad()
acad.docs.Open(cwd + "/" + f)
print (acad.doc.Name)
num_cols = xl_sheet.ncols # Number of columns
idx = 1
acad = win32com.client.Dispatch("AutoCAD.Application")
doc = acad.ActiveDocument # Document object
print ("MODEL SPACE")
for entity in acad.ActiveDocument.ModelSpace:
name = entity.EntityName
if name == 'AcDbText':
sheet.row(idx).write(0,entity.TextString)
sheet.row(idx).write(1,entity.ObjectID)
sheet.row(idx).write(2,cwd + "/" + f)
idx = idx + 1
if name == 'AcDbBlockReference':
HasAttributes = entity.HasAttributes
if HasAttributes:
# print(entity.Name)
# print(entity.Layer)
# print(entity.ObjectID)
for attrib in entity.GetAttributes():
if attrib.TagString != "DATA":
sheet.row(idx).write(0,attrib.TextString )
sheet.row(idx).write(1,entity.ObjectID)
sheet.row(idx).write(2,cwd + "/" + f)
idx = idx + 1
print ("PAPER SPACE")
for entity in acad.ActiveDocument.PaperSpace:
name = entity.EntityName
if name == 'AcDbText':
sheet.row(idx).write(0,entity.TextString)
sheet.row(idx).write(1,entity.ObjectID)
sheet.row(idx).write(2,cwd + "/" + f)
idx = idx + 1
if name == 'AcDbBlockReference':
HasAttributes = entity.HasAttributes
if HasAttributes:
# print(entity.Name)
# print(entity.Layer)
# print(entity.ObjectID)
for attrib in entity.GetAttributes():
if attrib.TagString != "DATA":
sheet.row(idx).write(0,attrib.TextString )
sheet.row(idx).write(1,entity.ObjectID)
sheet.row(idx).write(2,cwd + "/" + f)
idx = idx + 1
doc.Close(False)
acad = None
wb.save("Exported.xls")