Search code examples
pythonautocadautocad-plugin

How to BlockReference object attributes


The problem is there is a field DEPT_NAME on BlockReference object not getting the value. how to to get the value

I tried the given code but not getting any results

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
from pyautocad import Autocad, APoint
from pyautocad.contrib.tables import Table
from comtypes import COMError
def props(cls):
  return [i for i in cls.__dict__.keys() if i[:1] != '_']
# 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
print(cwd)
for f in dwgfiles:
    print("++++++++++++++++++++++++++++++")
    print("++++++++++++++++++++++++++++++")
    print("++++++++++++++++++++++++++++++")
    print("++++++++++++++++++++++++++++++")

    print(f)
    if f.endswith(".dwg"):
        print("sdaasdas")
        """ open Document"""
        acad = Autocad()
        print(cwd)
        acad.app.Documents.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")
        count=0
        for entity in acad.ActiveDocument.ModelSpace:
            name = entity.EntityName
            print(name)
            if name == 'AcDbBlockReference':
                HasAttributes = entity.HasAttributes
                if HasAttributes:
                    # sheet.row(idx).write(0, entity.TextString)
                    sheet.row(idx).write(1, entity.ObjectID)
                    sheet.row(idx).write(2, cwd + "/" + f)
                    sheet.row(idx).write(3, str(entity.InsertionPoint))
                    sheet.row(idx).write(4, entity.Name)
                    sheet.row(idx).write(5,entity.Layer)
                    idx = idx + 1
                    print(entity.Name)
                    print(entity.Layer)
                    print(entity.ObjectID)
                    k=0

                    #print(entity.get_attrib_text('DEPT_NAME'))

                    for attrib in entity.GetAttributes():
                        print(attrib.DEPT_NAME)
                        print("+++++++")
                    exit()



        print(count)
        doc.Close(False)
        acad = None
wb.save("Exported.xls")

the error i am getting is this Traceback (most recent call last): File "auto1.py", line 78, in print(attrib.DEPT_NAME) File "D:\autocad_test\venv\lib\site-packages\win32com\client\dynamic.py", line 527, in getattr raise AttributeError("%s.%s" % (self.username, attr)) AttributeError: GetAttributes.DEPT_NAME


Solution

  • Assuming the implementation of this Python plugin is consistent with the properties & methods of the AutoCAD ActiveX object model, then you'll need to query the TagString property of the attribute and, if it matches your target attribute, output the TextString property of the attribute.

    I would guess that you'll need something along the lines of the following:

    for attrib in entity.GetAttributes():
        if attrib.TagString == 'DEPT_NAME':
            print(attrib.TextString)
            print("+++++++")
    exit()