Создать отчет. Интерфейс IReport.

Автор Михаил88, 28.11.23, 18:11:24

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

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

Валерий Изранов

Михаил, все написанное в сообщении 57 никакого отношения к макросу не имеет.
Предлагаю:
при открытой главной сборке, компонент "Трубка" открыть для редактирования в окне.
У Компаса будет открыто окно с главной сборкой и окно с Трубкой.
В окне Трубка изменить Наименование, нажать зеленую кнопочку и сохранить файл.
Перейти в окно главной сборки. Сборка должна спросить "компонент Трубка изменился. Перестроить?"
Сказать что Да
В главной сборке выделить Трубка и спросить свойства компонента.
Наименование должно быть новым.
Запустить макрос.

И правильно p3452 спрашивает где и когда ты устанавливаешь столбцы отчета с нужными свойствами?

p3452

Цитата: Михаил88 от 29.11.23, 15:25:35Далее открываю  компонент из этой сборки на редактирование (редактирование в окне, редактирование на месте или просто открыть т.е. нужно изменить свойство в источнике) затем меняю свойство в источнике например обозначение, наименование, материал, примечание и т.д. Жму сохранить. Перехожу в главную сборку, с которой раннее делали отчет и создаю отчет заново с помощью макроса. В отчете xls увидите, что свойство имеет старое значение.
Также в главной сборке можно выделить компонент, в который вносили изменения и нажать свойство модели. В верху обозначение и наименование если изменяли их  будут иметь правильные значения согласно последним изменения, а если опуститься ниже то в списке свойств значения измененных свойств будут иметь старые значения.

А через "Редактор свойств" (Управление - Отчеты - Редактор свойств) Вы видите внесенные изменения?
(скорее всего, то же, не видите!!!)

p3452

Цитата: Михаил88 от 29.11.23, 15:25:35р3452, Вы я на сколько помню тоже создавали отчет. У Вас в программе при выше описанных действиях тоже проявляется данная ошибка?

Об ЭТОЙ ошибке, но в отношении работы Редактора свойств писал ранее на форуме...
Но с ЭТОЙ ошибкой в Отчетах не сталкивался, возможно из-за специфики работы (свойства не правятся вручную).
+ Благодарностей: 1

Михаил88

Через редактор свойств тоже стоит старое значение.

Screenshot_3.bmp

p3452

Цитата: Михаил88 от 29.11.23, 19:05:02Через редактор свойств тоже стоит старое значение.
БАГ - имеет место быть!!!

p/s: Тут глянул свой старый код - составлял спецификации для КМД, через "Отчеты + Ассоциативные таблицы + программная правка" - наверное не спроста, пошел таким путем...
+ Благодарностей: 1

Михаил88

Сейчас, как раз тоже сидел занимался этим вопросом, как сделать доработку и все работало корректно.

Упрощенный алгоритм выглядит так - рекурсивно прохожусь по всем компонентам сборки изменяю нужные свойства, а именно ставлю галочку по источнику через SetPropertyValue (тут нужно будет сделать проверку, а нужно ли всем компонентам делать значение свойства по источнику(нужно подумать)), если нужно то восстанавливаю ReadOnly=True (доступность редактирования). Делаю обновление через Update().
Попробовал вроде все работает, после этих доработок отчет получается корректный. Как допишу макрос и по тестирую его выложу сюда. Это конечно костыль. Может когда то удастся найти решение получше.

Всем спасибо!

P.S. если будут еще мысли пишите.
+ Благодарностей: 2

Валерий Изранов

Михаил нашел ошибку при работе некоторых версий Компаса.
Действительно, при изменении компонента (например изменении Наименования)
в Отчете и Редакторе свойств Сборки это отображается только после сохранения,
закрытия и нового открытия Сборки.
В сообщении 60 Михаил правильно наметил путь развития макроса.
Дополнительно хорошо бы установить список свойств "по умолчанию" которые будут устанавливаться.
Должна быть возможность изменения списка пользователями.
Макрос должен быть в виде .exe файла. Перспектива установки на компьютер свежих версий Питон
очень многих отпугнет.
Пожелаем Михаилу успехов и будем ждать готового продукта.

p3452

Цитата: Михаил88 от 29.11.23, 20:57:14Упрощенный алгоритм выглядит так - рекурсивно прохожусь по всем компонентам сборки изменяю нужные свойства, а именно ставлю галочку по источнику через SetPropertyValue (тут нужно будет сделать проверку, а нужно ли всем компонентам делать значение свойства по источнику(нужно подумать)), если нужно то восстанавливаю ReadOnly=True (доступность редактирования). Делаю обновление через Update().
1. Зачем "галочку по источнику", если хотите присвоить индивидуальные свойства? Хотя, работает и так и так - проверено.
2. Если, все-таки, заморачиватся ручным редактированием, то редактировать не через Дерево построения, а ТОЛЬКО через Редактор свойств - то же проверил, работает.

p/s: Кстати, еще одно "свидетельство" наличия БАГа - если использовать смешанное редактирование (и через Дерево, и через Редактор свойств), то Компас частенько крашится...
+ Благодарностей: 2

Михаил88

#68
Цитата: p3452 от 30.11.23, 10:29:281. Зачем "галочку по источнику", если хотите присвоить индивидуальные свойства? Хотя, работает и так и так - проверено.
Получается такая ситуация, что хоть внешне галочка и стоит(у меня так в к18.1) по факту связь свойства с источником потеряна. Ставя еще раз галочку я эту связь тем самым восстанавливаю.
Я вообще несколько лет работал и создавал отчеты макросом и даже не замечал ошибки, что свойства перестают обновляться. Заметил случайно. По модели создал отчет перед тем, как передать в производство заметил небольшие ошибки то ли обозначение то ли материал где то был ошибочно назначен. Открыл исходную сборку сделал нужные изменения в нужных деталях. Сновал создал отчет. Начал смотреть и увидел, что значения свойств старые. Начал разбираться и обнаружил данную проблему. Много чего перепробовал, не раз брался за решение этой проблемы и ни чего не получалось. В этот момент я стал предполагать, что все таки ошибка в API. Создал тему и оказалось, что не только у меня проблемы, а у Вас тоже были проблемы. Макросом я значения свойств не присваиваю. Я просто создаю отчет c нужными мне стилями и настройками и сохраняю его в excel, далее с помощью разных функций дорабатываю, как мне нужно. Можно и стандартным функционалом компаса создавать отчет, но нужно выбирать стили и делать предварительные настройки и т.д., а потом еще оформлять. Макросом мне проще и быстрее и меньше возможных ошибок. При выставлении настроек можно галочку забыть поставить и т.д. Я стараюсь по минимуму тратить время на рутинные операции тем более если их можно заменить работой программы. Тогда больше остается время на более интересную и важную работу или на самообразование.

Цитата: p3452 от 30.11.23, 10:29:282. Если, все-таки, заморачиватся ручным редактированием, то редактировать не через Дерево построения, а ТОЛЬКО через Редактор свойств - то же проверил, работает.

Спасибо, я попробую.

Вообще редко возникает ситуация когда мне нужно, что то исправлять в модели и потом создавать отчет заново, по этому и ошибку обнаружил не сразу. Да еще и когда компас перезапускаешь все связи восстанавливаются. Я мог и продолжать так дальше работать зная этот нюанс.
Мне больше было интересно разобраться у меня ошибка или в API. Если у меня то значит можно подправить и уйти от этой проблемы и не заморачиваться с перезапуском компаса.
Если в API то тут уже искать обходные пути или работать с тем что есть.
+ Благодарностей: 2

p3452

Итак:
1. Ваш макрос полностью РАБОТОСПОСОБЕН, при условии редактирования свойств компонентов сборки через Редактор свойств.
2. Если редактирование свойств выполнялось в Дереве построений, то требуется дополнительная программная обработка - обновление свойств всех компонентов.
3. Обнаружен и подтвержден БАГ Компас-а (не API !) - рассинхронизация информации о свойствах компонент в Дереве построения и Редакторе свойств.
+ Благодарностей: 1

Михаил88

#70
Цитата: p3452 от 30.11.23, 14:44:331. Ваш макрос полностью РАБОТОСПОСОБЕН, при условии редактирования свойств компонентов сборки через Редактор свойств.
Если запустить редактор свойств из сборки и изменить свойство например наименование у детали входящей в сборку то пропадает связь с источником, соответственно если открыть деталь то там будет старое наименование. Изменение свойств через редактор свойств мне не подходит.
Screenshot_1.bmpScreenshot_2.bmp
По крайней мере так работает редактор свойств в к18,1.

После первого запуска макроса, когда свойства перестают обновляться.
Если например открываю деталь Трубка в отдельном окне и через редактор свойств меняю свойство наименование. Сохраняю. Закрываю. Перехожу в сборку проверяю свойство детали Наименование детали Трубка в списке свойств осталось старое, но галочка уже отсутствует. Ее ставлю и только тогда получаю верное наименование. Но в большинстве случаев получаю вылет компаса.

Цитата: p3452 от 30.11.23, 14:44:333. Обнаружен и подтвержден БАГ Компас-а (не API !) - рассинхронизация информации о свойствах компонент в Дереве построения и Редакторе свойств.
Похоже да так оно и есть.

По крайней мере для к18,1 остается только вариант с дополнительной программной обработкой всех свойств.
Или держать в голове, что нужно сделать перезапуск компаса если менял свойства.

p3452

То, что вы показали в виде контекстного меню это не "связь с источником", а восстановление свойств "по источнику" (привидение в соответствие) - связь то остается через файл (свойство "полное имя файла")...

Вы, возможно и не подозревая об этом, затронули ПРОБЛЕМУ, которую АСКОН не берется решать уже много версий и Мы ее затронули "краешком" - изменение свойств, переменных и пр. у вставленных компонентов, фрагментов и пр. - предмет для отдельной "темы".
Кстати, совсем недавно была Тема о вставке параметрического фрагмента - то же следствие этой ПРОБЛЕМЫ...
+ Благодарностей: 1

Валерий Изранов

Если в Компасе начиная с К20 (К18?) при открытой сборке нажать
Управление-Отчеты-Создать отчет, то на экране появится таблица со всеми компонентами сборки.
Если после этого разыскать и нажать крошечную кнопочку "Сохранить отчет как.."
появится диалог выбора имени файла для сохранения. Выбрать "Электронные таблицы Excel.xls"
В том месте, где указали появится еще более интересный файл.

Вот это Михаил пытается сделать автоматически с помощью своего макроса.




Михаил88

Цитата: p3452 от 30.11.23, 16:30:36То, что вы показали в виде контекстного меню это не "связь с источником", а восстановление свойств "по источнику" (привидение в соответствие) - связь то остается через файл (свойство "полное имя файла")...
Вы правы назвал не правильно, но смысл тот же восстановить по источнику получается только вручную и через обновление с помощью программы.

Михаил88

Небольшой пример, как можно обойти проблему c тем, что значения в списке свойств остаются без изменения.
Но самым надежным вариантом скорее всего остается перезапуск компаса если до этого создавали отчет через интерфейс IReport и после этого меняли свойства в источнике компонента.

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import gencache, Dispatch, VARIANT

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                            pythoncom.IID_IDispatch))
property_mng = kompas_api7_module.IPropertyMng(application)
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
part7 = kompas_document_3d.TopPart
parts = part7.PartsEx(0)
# 4.0 - Обозначение
# 5.0 - Наименование
tuple_properties = (4.0, 5.0)

for part in parts:
    property_keeper = kompas_api7_module.IPropertyKeeper(part)
    for property_number in tuple_properties:
        prop = property_mng.GetProperty(kompas_document, property_number)
        result, value, source = property_keeper.GetPropertyValue(prop, '', True, True)
        print(result, value, source)
        if source:
            property_keeper.SetPropertyValue(prop, VARIANT(pythoncom.VT_EMPTY, None), True)
            prop.Update()

report = property_mng.GetReport(kompas_document, kompas6_constants.ksRTPropertiesReport)
# Установить индекс текущего стиля.
report.CurrentStyleIndex = 0
# Перестроить отчет.
report.Rebuild()
report.SaveAs(r'C:\Users\User\Desktop\report\Отчет.xls')

kompas_document_3d.RebuildDocument()
kompas_document.Save()
+ Благодарностей: 2

p3452

Аналогично, за исключением выделенного:
result, value, source = property_keeper.GetPropertyValue(prop, '', True, [b]True[/b])
        print(result, value, source)
        [b][s]if source[/s][/b]:
Возможно Мы разные цели преследуем...

p/s: Вот как назвать администратора форума, который даже с CMS-кой работать не может - символы форматирования в Коде не работают!


Михаил88

#76
Если я Вас правильно понял.
Объясню зачем зачем использую GetPropertyValue.
Если в сборку входят компоненты, у которых изначально была отключена галочка по источнику еще до работы макроса.
То тогда если не проверить значение source эта галочка по ставится и значение свойства изменится согласно значению, которое стоит в источнике. А это не нужно.
А вот там где изначально галочка стояла по источнику, а после работы макроса и получения отчета эти свойства перестали обновляться эту галочку нужно поставить, хотя если посмотреть она и так визуально стоит.

Screenshot_2.bmp

В данном случае мне само значение свойства не важно (при проверке), мне главное получить source, чтобы понимать изначально галочка стояла или нет.
Надеюсь я смог понятно объяснить и не запутал. Я бы мог вообще просто сделать срез по индексу от результата, который возвращает метод GetPropertyValue и получить только переменную source, но решил все таки вывести все три значения, которые возвращает данный метод. Чтобы было более понятно.

Screenshot_3.bmp
+ Благодарностей: 1

p3452

- Понятно.
(Я, при тестировании, даже не стал заморачиваться "source" - обновил ВСЕ свойства)

Kilia

Всем привет! Научите, пожалуйста, как указать путь до файла со стилями отчётов?

Kilia

Нашёл сам=)
после строки
report = property_mng.GetReport(kompas_document, kompas6_constants.ksRTPropertiesReport)
добавить
path_report_style = r'C:\Users\User\Desktop\Стиль отчёта.lrt' # Путь до файла со стилями отчётов
style = report.AddStyle(path_report_style, 315608966869) # Указать путь до стилей отчетов и id отчета
И убрать строку

rreport.CurrentStyleIndex = 0 # Установить индекс текущего стиля.