Вопрос для экспертов и гуру )

Автор once, 30.06.23, 14:39:53

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

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

once

Начал я недавно переделывать модули для Компас v14 на Компас v21 и столкнулся вот с какой проблемой.
Во вложении проект в котором при отладке происходят чудеса.
В программе рекурсивно перебираются детали и сборки "Heat gun.a3d", который идет как пример вместе с Компасом (Папка установки Компас\Samples\Heat_gun).
Детали и сборки модели помещаются в список List<IPart7> _test.
Затем этот список перебирается в цикле и каждой детали или сборке устанавливается источник цвета и красный цвет.
В процессе перебора списка в цикле происходит магия.
Вначале цикла список выглядит так (см. рис. 1). На нем видно, что _test[1].Name равен "Термоэлемент".
Затем, когда идет четвертая итерация в цикле (i = 3) _test[3].Name = "Кожух" в методе Paint после установки цвета для _test[3] и вызова метода IModelObject.Update(), _test[1], который был "Термоэлемент", стал
равен "Кожух" (см. рис. 2). Понимаю, что это звучит странно, но получается, что по ссылке на com-объект Компаса, записанной в _test[1] теперь другой объект? Но со списком не производится никаких манипуляций, только перебор!!!
В дальнейшем в цике после вызова Update() происходят аналогичные непонятки, на рисунке 3 представлен конечный список после перебора.
На нем видно, что _test[1] теперь вообще "Выключатель", а "Трубка", которая была в списке под индексом 11, вообще пропала (она в итоге и не покрасилась в красный).
Кто-нибудь может объяснить что происходит и как с этим бороться? В Компас v14 такие же действия отрабатывают корректно.

Чтобы наблюдать вышеописанную магию нужно скачать проект TestKompas, зарегистрировать библиотеку через Reg64.bat (запускать от админа, лежит в папке с проектом. Предварительно изменить в нем путь к библиотеке TestKompas.dll).
Теперь подключаем библиотеку в Компас со вкладки ActiveX (TestKompas.Class1), она появится в меню "Приложения\Компас тест\Покажи магию", запускаем проект в debug, открываем Heat gun.a3d ((Папка установки Компас\Samples\Heat_gun)) и смотрим магию.

ITE

А в чем вопрос? ты то сам понял про что понаписал? похоже на какойто бред для забивания головы:D

once

Цитата: Igor87 от 30.06.23, 15:56:47А в чем вопрос? ты то сам понял про что понаписал? похоже на какойто бред для забивания головы:D

Ну я и не сомневался, что будут подобные ответы, поэтому даже написал, что описанное "звучит странно", понимал, что не многие вообще дочитают до конца, поэтому в заголовке сразу обращался к гуру и экспертам. Для тех кому не лень нужно просто повторить описанные действия, увидеть, что происходит какая-то непонятная херня, названная магией, и попытаться объяснить происходящее.

DesignЯR

Цитата: once от 30.06.23, 21:41:10Ну я и не сомневался, что будут подобные ответы, поэтому даже написал, что описанное "звучит странно", понимал, что не многие вообще дочитают до конца, поэтому в заголовке сразу обращался к гуру и экспертам. Для тех кому не лень нужно просто повторить описанные действия, увидеть, что происходит какая-то непонятная херня, названная магией, и попытаться объяснить происходящее.
Такая система тут не работает. Сейчас собираем инфу(все нарушения Правил Форума) для РосПотребНадзора для закрытия этого форума( и не только) ввиду нарушения ряда собственноустановленных правил.

once

Попытаюсь компактнее сформулировать ))
Есть список, содержащий ссылки на com-объекты Компаса (детали и сборки IPart7). Перебирая в цикле этот список, детали и сборки меняют цвет на красный, соответственно вызывается метод IModelObject.Update(), после чего i-й элемент списка, ссылающийся на деталь X, начинает ссылаться на деталь Y. Никаких манипуляций со списком, кроме перебора не производится. Как такое возможно?

once

А гуру с экспертами то - не настоящие )). Но а если серьезно, то я ожидал что хотя бы кто-то отпишется, типа "у меня не повторяется подобное" или "у меня повторяется, но я не знаю как это объяснить". Но нет, этот форум может помочь только начинающим.

Doom

Скачивать и собирать и смотреть врятли кто то будет ибо нет времени - проще код сам выложи и так проще и наглядней будет..

Вират Лакх

Где-то в 19-й версии API путала интерфейсы при открытии и редактировании компонента в невидимом режиме. Конкретно эту ошибку исправили.
Может быть что-то подобное у вас, косяк API, но в другом месте.
from win32com.client import Dispatch, gencache

API7 = gencache.EnsureModule('{69AC2981-37C0-4379-84FD-5DD2F3C0A520}', 0, 1, 0)
iApplication = Dispatch('Kompas.Application.7')
iPropertyMng  = API7.IPropertyMng(iApplication)

iKompasDocument = iApplication.ActiveDocument
iTopPart = API7.IKompasDocument3D(iKompasDocument).TopPart

print(iTopPart.FileName) # Имя главной сборки здесь показывает верно

filename = iTopPart.Parts.Part(0).FileName

iKompasDocument_part = iApplication.Documents.Open(filename, False, False) # Открываем в невидимом режиме (в видимом режиме ошибки нет)
iTopPart_part = API7.IKompasDocument3D(iKompasDocument_part).TopPart

iPropertyKeeper = API7.IPropertyKeeper(iTopPart_part)
iPropertyNaim = iPropertyMng.GetProperty(iKompasDocument_part, 5.0)
iPropertyKeeper.SetPropertyValue(iPropertyNaim, 'zzz', True) # Вносим изменение в любое свойство

print(iTopPart.FileName) # Имя главной сборки здесь показывает НЕверно

iKompasDocument_part.Close(0)

once

Цитата: Вират Лакх от 06.07.23, 05:26:54Может быть что-то подобное у вас, косяк API, но в другом месте.
Возможно вы правы.

once

Оказывается все было как всегда просто и ответ лежал на поверхности. Изменять свойства моделей (деталей и сборок) в подсборках нужно внутри IPart7.BeginEdit() и IPart7.EndEdit(). Тогда вышеописанных коллизий не возникает, однако их не было и в Компас 14.
+ Благодарностей: 1

Lapin

Изменилась логика, немного.