Проблема при назначение материала детали из сборки

Автор anton.gorschnev, 17.10.24, 16:58:02

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

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

anton.gorschnev

Не удается назначить материал детали из сборки, деталь открыта на редактирование. Что делаю не так?????
foreach (IPart7 IPart7_ in IParts7)
            {
                if (IPart7_.Detail)
                {
                    try
                    {
                        OpenDocumentParam OpenDocumentParam_= IPart7_.GetOpenDocumentParam();
                        OpenDocumentParam_.ReadOnly = false;
                        OpenDocumentParam_.Visible = false;
                        IKompasDocument3D _KompasDocument3D= IPart7_.BeginEdit(OpenDocumentParam_);
                        IPart7_.SetMaterial("Тестовый материал", 777);
                        IModelObject IModelObject_ = (IModelObject)IPart7_;
                        //после обновления материал меняется на исходный ??????
                        IModelObject_.Update();
                        _KompasDocument3D.Save();
                        IPart7_.EndEdit(true);
                    }
                    catch (Exception Ex)
                    {
                        Debug.Print(Ex.ToString());
                     }
                }
            }

p3452

"Каша, каша - опять каша!"
Перемешали все, что только можно...

Как вариант:
IKompasDocument3D doc3D7 = ...;
IPart7 part7 = doc3D7.TopPart;
part7.SetMaterial("наименование материала", [плотность]); 
part7.Update();

anton.gorschnev

Не помогло, с этого я начал. Ваш способ работает при редактирование материала у детали, если же я пытаюсь поменять материал детали в контексте сборки при обновлении возращается старый материал.
по поводу лишнего вроде все по SDK.
4. Изменение материала и плотности вступает в силу после вызова метода IModelObject::Update.
IPart7_.Update(); тоже достаточно проверил.
3. Метод используется в детали для верхнего компонента, в сборках - для вставленных деталей, открытых на редактирование.

lavgirb

Цитата: p3452 от 17.10.24, 23:57:50"Каша, каша - опять каша!"
Перемешали все, что только можно...

Как вариант:
IKompasDocument3D doc3D7 = ...;
IPart7 part7 = doc3D7.TopPart;
part7.SetMaterial("наименование материала", [плотность]); 
part7.Update();
Я при замене материала детали (компонента сборки) открываю эту деталь и меняю материал в ней. Как в цитате.
Потом дублирую замену материала у самого компонента сборки. Без TopPart
После каждого part7.Update еще делаю part7.RebuildModel и потом  RebuildDocument
+ Благодарностей: 1

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

Цитата: lavgirb от 18.10.24, 10:00:37открываю эту деталь и меняю материал в ней
Да, великолепно.

Цитата: lavgirb от 18.10.24, 10:00:37Потом дублирую замену материала у самого компонента сборки
А это как и зачем?

anton.gorschnev

Замены материала в OpenSourceDocument хватает (я думал что BeginEdit, должно было хватать). У меня осталось два не решенных вопроса 1) как обновить деталь в сборке (в сборке (после всех  Update и RebuildModel) все равно требует обновления (хранить сборку откуда пришли IPart7_ не планировал) 2) как понять что IPart7_ элемент сборки (хотел написать универсальный метод для сборок и деталей в который планировал подавать List<IPart7> и характеристики материала).
   
OpenDocumentParam OpenDocumentParam_ = IPart7_.GetOpenDocumentParam();
                        OpenDocumentParam_.ReadOnly = false;
                        OpenDocumentParam_.Visible = false;
                        IKompasDocument3D _KompasDocument3D = (IKompasDocument3D)IPart7_.OpenSourceDocument(OpenDocumentParam_);
                        IPart7 _IPart7 = _KompasDocument3D.TopPart;
                        _IPart7.SetMaterial("Тестовый материал 4", 780);
                        _IPart7.Update();
                        //_IPart7.RebuildModel(true);
                        //_KompasDocument3D.RebuildDocument();
                        //IPart7_.Update();
                        //IPart7_.RebuildModel(true);

anton.gorschnev

Пока остановился на таком варианте
foreach (IPart7 IPart7_ in IParts7)
            {
                if (IPart7_.Detail && !Document3DStart.TopPart.Detail)
                {
                        OpenDocumentParam OpenDocumentParam_ = IPart7_.GetOpenDocumentParam();
                        OpenDocumentParam_.ReadOnly = false;
                        OpenDocumentParam_.Visible = false;
                        IKompasDocument3D _KompasDocument3D = (IKompasDocument3D)IPart7_.OpenSourceDocument(OpenDocumentParam_);
                        IPart7 _IPart7 = _KompasDocument3D.TopPart;
                        _IPart7.SetMaterial("Name", 780);
                        _IPart7.Update();
                }
                else if (IPart7_.Detail && Document3DStart.TopPart.Detail)
                {
                    IPart7_.SetMaterial("Name", 780);
                    IPart7_.Update();
                }
            }
            if ( !Document3DStart.TopPart.Detail){ Document3DStart.RebuildDocument(); }

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

Цитата: anton.gorschnev от 18.10.24, 10:57:38хотел написать универсальный метод для сборок и деталей
У Сборок свойства Материал нет.

UU