Как заблокировать атрибуты объекта BlockReference - PullRequest
1 голос
/ 28 марта 2019

Проблема в том, что в объекте BlockReference отсутствует поле DEPT_NAME, которое не получает значение. как получить значение

Я попробовал данный код, но не получил никаких результатов

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")

ошибка, которую я получаю это Traceback (последний вызов был последним): Файл "auto1.py", строка 78, в печать (attrib.DEPT_NAME) Файл "D: \ autocad_test \ venv \ lib \ site-packages \ win32com \ client \ dynamic.py", строка 527, в getattr поднять AttributeError ("% s.% s"% (self. username , attr)) AttributeError: GetAttributes.DEPT_NAME

1 Ответ

2 голосов
/ 28 марта 2019

Предполагая, что реализация этого подключаемого модуля Python соответствует свойствам и методам объектной модели AutoCAD ActiveX, вам потребуется запросить свойство TagString атрибута и, если он соответствует вашему целевому атрибуту, вывести TextString свойство атрибута.

Я думаю, вам понадобится что-то вроде следующего:

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