Количество макроэлементов и их свойства

Автор Okolobaha, 06.04.20, 17:21:44

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Okolobaha

Доброго времени суток. Подскажите пожалуйста как можно получить атрибуты макроэлементов из конкретного вида чертежа. Хочется получить обозначение(с исполнением) и наименование каждого элемента, который есть в виде.241241.JPG

Slaviation

Добрый день.
Запускать на активном чертеже с макроэлементами.

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
property_mng = kompas_api7_module.IPropertyMng(application)
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
views = views_and_layers_manager.Views
empty_val = VARIANT(pythoncom.VT_EMPTY, None)
for views_item in views:
    view = kompas_api7_module.IView(views_item)
    drawing_container = kompas_api7_module.IDrawingContainer(view)
    macro_objects = drawing_container.MacroObjects
    for macro_objects_item  in macro_objects:
        macro_object = kompas_api7_module.IMacroObject(macro_objects_item)
        property_keeper = kompas_api7_module.IPropertyKeeper(macro_object)
        for name in ("Обозначение", "Наименование"):
            property = property_mng.GetProperty(empty_val , name)
            value, from_source = "", True
            value = property_keeper.GetPropertyValue(property, value, True, from_source)[1]
            print(name, value)
+ Благодарностей: 1

Okolobaha

Цитата: Slaviation от 08.04.20, 12:08:34Добрый день.
Запускать на активном чертеже с макроэлементами.

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache, VARIANT
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application
property_mng = kompas_api7_module.IPropertyMng(application)
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
views = views_and_layers_manager.Views
empty_val = VARIANT(pythoncom.VT_EMPTY, None)
for views_item in views:
    view = kompas_api7_module.IView(views_item)
    drawing_container = kompas_api7_module.IDrawingContainer(view)
    macro_objects = drawing_container.MacroObjects
    for macro_objects_item  in macro_objects:
        macro_object = kompas_api7_module.IMacroObject(macro_objects_item)
        property_keeper = kompas_api7_module.IPropertyKeeper(macro_object)
        for name in ("Обозначение", "Наименование"):
            property = property_mng.GetProperty(empty_val , name)
            value, from_source = "", True
            value = property_keeper.GetPropertyValue(property, value, True, from_source)[1]
            print(name, value)
Огромное спасибо.

antonwantstosleep

Здравствуйте!

А если это не просто макроэлемент, а библиотечный элемент kobject?

Например, из библиотеки "Элементы структурированных кабельных систем". У объекта есть:
- стандартные свойства макроэлемента ("Обозначение", "Наименование", "Масса" и т.д.)
- дополнительные группы свойств:
  - маркировка ("Марка", "Марка заводская (над чертой)", "Включить в спецификацию")
  - отображение ("Фоновая заливка", "Размеры", "Сечение")
  - габариты ("Длина, мм", "Ширина, мм", "Высота, мм")
  - положение ("Выс. отм., м")

Приведенный выше скрипт, как я понимаю, работает только со стандартными свойствами. В частности, property_keeper.Properties содержит:
<?xml version="1.0"?>
<infObject>
<property id="name" value="Розетка RJ-11" type="string" />
<property id="count" value="1" type="int" />
<property id="marking" expression="">
<property id="base" value="" type="string" />
<property id="embodimentDelimiter" value="-" type="string" />
<property id="embodimentNumber" value="" type="string" />
<property id="additionalDelimiter" value="." type="string" />
<property id="additionalNumber" value="" type="string" />
<property id="documentDelimiter" value=" " type="string" />
<property id="documentNumber" value="" type="string" />
</property>
</infObject>
где, как я понимаю, marking - это "Обозначение".

Подскажите, как получить остальные свойства (или параметры... путаюсь пока с терминологией)? Например, "Маркировка"->"Марка"?

Спасибо!

Slaviation

Добрый день/
А так не работает?
for name in ("Марка", "Марка заводская (над чертой)", "Включить в спецификацию", "Фоновая заливка", "Размеры", "Сечение", "Длина, мм", "Ширина, мм", "Высота, мм", "Выс. отм., м"):

antonwantstosleep

#5
Slaviation, к сожалению, нет.

Я так понимаю, всё-таки тут получаются только стандартные свойства текущего документа. В частности, если сказать:
empty_val = VARIANT(pythoncom.VT_EMPTY, None)
properties = property_mng.GetProperties(empty_val)
for property_item in properties:
    print(property_item.Name)
где empty_val согласно документации является
Цитата: undefinedLibname (VARIANT) - полный путь к библиотеке на диске VT_BSTR, либо указатель на документ VT_DISPATCH. Текущий документ - VT_EMPTY
, то мы получим следующее:
Обозначение
Наименование
Количество
Материал
Плотность
Масса
Автор
Организация
Комментарий
Тип объекта
Позиция
Полное имя файла
Имя файла
Создан
Последнее изменение
Раздел спецификации
Разработал
Проверил
Утвердил
Т. контр.
Н. контр.
Класс точности
Знак неуказанной шероховатости
Параметр неуказанной шероховатости
Рассекать на разрезах
Зона
Примечание
Форматы листов документа
Литера
Характер работы
Подписал
Количество листов документа
Код продукции

Ну, и это же касается макрообъектов.

antonwantstosleep

Кажется, что все доп. свойства хранятся в свойстве макроэлемента UserParams. Если сказать:
macro_object = kompas_api7_module.IMacroObject(macro_objects_item)
user_params = macro_object.UserParams
то мы получим объект типа memoryview, который по документации является
ЦитироватьСвойство позволяет устанавливать и получать массив SAFEARRAY со структурой пользо­вательских параметров объекта.

Я вообще не шарю ни в питоне, ни в C... тем более в вопросах прямой работы с памятью. Как же расковырять этот массив?

Пробовал делать:
for user_param in user_params:
    print(user_param)

Выводит кучу строк с байтами, где промелькивает и про specification, и про mark.. похоже, то, что нужно.