Доступ к источнику локального компонента - Python

Автор Вират Лакх, 08.01.18, 05:50:53

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

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

Вират Лакх

Что мы умеем делать с источником:
iSourcePart7Params = kompas_api7_module.ISourcePart7Params(iPart7)
iSourcePart7Params.SourceMarking = oboznachenie   # Вносим в источник компонента Обозначение
iSourcePart7Params.SourceName = naimenovanie   # вставить в Наименование источника данные

А вот обновление материала, плотности и штриховки, создание объекта спецификации, запись исполнения через IEmbodimentsManager у локальных деталей внутри как? Локальный компонент не открыть как обычный компонент...
Всякие варианты вписать материал в источник не приводят к нормальному результату.
Например, через IPropertyKeeper читаем источник через GetPropertyValue, начинаем писать с помощью SetPropertyValue - получаем запись "поверх" в свойства компонента.
Кривые результаты или их отсутствие и через другие интерфейсы: IEmbodiment, IMassInertiaParam7, через апи5 и т.д.

upd Может попробовать в этих свойствах заменить нужные места.
iPropertyKeeper = kompas_api7_module.IPropertyKeeper(iPart7)
print iPropertyKeeper.Properties

<?xml version="1.0" encoding="utf-16"?>
<document baseEmbodiment="0" currentEmbodiment="0" modified="0">
        <descriptions>
                <propertyDescriptions>
                        <propertyDescription id="4" name="Обозначение" typeValue="string" natureId="V9838B815F57644818A63FC39DB304252"/>
                        <propertyDescription id="5" name="Наименование" typeValue="string" natureId="V9838B815F57644818A63FC39DB304252"/>
                        <propertyDescription id="9" name="Материал" typeValue="string" natureId="V9838B815F57644818A63FC39DB304252"/>
                        <propertyDescription id="10" name="Плотность" typeValue="double" natureId="V19FC3778AF154EB79CAEFBF05ECA64BE" unitId="V0E6F6906E36F473797089A7D9DEC8E29"/>
и т.д.

Вират Лакх

Пробую для работы с локальностью это из SDK: "Документ 3D > Компоненты > Интерфейс IPart7
IPart7 - методы
В этом разделе:
BeginEdit - Войти в режим редактирования компонента сборки
Возвращаемое значение:
Указатель на документ 3D IKompasDocument3D"
Но почему-то он мне None выдает. И не только для локального компонента, везде None.
Кто работал с BeginEdit в API7 ?

ТрындецЪ

Для начала хотя бы научиться изменять материал локальной детали.
Методы ksPart.SetMaterial (material, density) в связке с ksPart.Update() до режима редактирования на месте и в режиме редактирования на месте оба выдают True, хотя на деле ничего не изменяется. Это ошибка в API?
КОМПАС v16.0

Вират Лакх

И вообще, дело не в локальности. Мы и обычный компонент не можем обработать при редактировании на месте.
Кривые BeginEdit, которые неправильные интерфейсы выдают? Кто работал через АПИ с редактированием на месте?

Кстати, ошибка у компаса. Когда он показывает объекты спецификации редактируемого на месте компонента, он вкладку называет сборкой, а не этого компонента.

Как-то же компас с редактированием на месте нормально работает, а через API - нет.

Я попробовал редактирование на месте, но отказался от него.
При редактировании макроэлемента, мне тоже приходит указатель на сборку редактируемую на месте, далее я ищу сам компонент и открываю его для редактирования, после закрываю с сохранением, если компонент уже был открыт, нахожу его и редактирую, далее перехожу назад к сборке.

ТрындецЪ

Цитата: Sabahs от 02.02.18, 10:23:13
Я попробовал редактирование на месте, но отказался от него.
А с локальными деталями доводилось работать?

Вират Лакх

Как получить TopPart редактируемого на месте компонента, если нет IKompasDocument3D ???
Этот IKompasDocument3D - он для файла один или для каждого исполнения свой? Вроде один для всего файла.
У редактируемого на месте IKompasDocument3D должен отличаться от IKompasDocument3D сборки??
Если не должен отличаться, то iPart7 = iKompasDocument3D.TopPart в режиме редактирования на месте врет и выдает компонент, а не источник.
Если IKompasDocument3D должен отличаться, то как его получить?
Открывать - редактировать - сохранять - закрывать мы умеем. Но как быть с локальностью?
Из видео мало что понял.

IKompasDocument3D - он один для файла, исполнения имеют свой интерфейс и уже от них нужно получать IPart7:=IEmbodiment.Part - компонент исполнения.
С локальными деталями работал поверхностно, пока нет времени с ними играться.

Вират Лакх

По исполнениям вопросов нет. А вот что с редактированием на месте. Тоже один и тот же IKompasDocument3D?
Если научимся работать с редактируемыми на месте, то и локальные будут не проблема.

Код для редактирования на месте и видео работы кода.
+ Благодарностей: 1

ТрындецЪ

Последняя строка сообщения в окне выдаёт путь до сборки, в которой происходит редактирование на месте, а не до детали которая редактируется.
Как нам к этой локалке метод SetMaterial("Материал", 123) применить, чтобы материал записался в свойства её "источника", которые видны в режиме редактирования на месте? Если мы применим SetMaterial к компоненту pPart7, то материал изменится только в свойствах компонента, как составной части сборки, а в режиме редактирования на месте материал останется прежним.

Upd: По логике BeginEdit () должен был бы нам вернуть какой-то новый IKompasDocument3D, от которого мы бы получили методом .TopPart новый pPart7 свойства которого потом бы и меняли.

pPart7 - это тот компонент с которым Вы работаете, pPart7.BeginEdit - на сколько я понял, возвращает указатель на документ, куда входит редактируемый компонент, т.к. для верхних компонентов будет возвращать nil.
Свойства источника нужно попробовать, через свойства и отредактировать, где то на форуме темы были по данному вопросу.

ТрындецЪ

Цитата: Sabahs от 02.02.18, 13:33:56
Свойства источника нужно попробовать, через свойства и отредактировать, где то на форуме темы были по данному вопросу.
iPropertyKeeper опять же получаем от pPart7.
И если использовать метод SetPropertyValue( iProperty_Material, "Материал", True ), то свойство изменится только у детали, как компонента сборки, но не источника. Это я вчера проходил.

Upd: Если кому-то пригодится, вот код на Python:

iPropertyKeeper = kompas_api7_module.IPropertyKeeper(iPart7) # интерфейс получения/редактирования значения свойств
iPropertyMng = kompas_api7_module.IPropertyMng(application) # интерфейс Менеджера свойств
iProperty_Material = iPropertyMng.GetProperty(iDocument, 9.0) # получим свойство Материал у активного документа

iPropertyKeeper.SetPropertyValue( iProperty_Material, "Название материала", True ) # установим значение свойства в базовых единицах измерения