• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Реализация вычитания компонентов.

Автор dlsh, 16.02.24, 08:26:37

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

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

dlsh

Добрый день.

Необходимо реализовать программно вычитание компонентов. Начал копать документацию и в ней нашел только интерфейс IMoldCavities.
Примеров его использования (на любом языке) ни на форуме не в сети не нашел. Попробовал сделать запись скрипта на питоне, но скрипт не записывается.
Поэтому начал пытаться сам реализовать данный алгоритм и возникло несколько вопросов.
Порядок действий в GUI следующий.
Исходно открыта сборка с двумя деталями в ней. И необходимо из детали №1 вычесть деталь №2 (деталь №2 состоит из нескольких тел).
1. Заходим в режим редактирования на месте детали №1.
2. Выбираем команду Моделирование->Вычесть компоненты
3. Выбираем в компонентах детали №2 несколько необходимых тел.
4. Жмем птичку зеленого цвета и готово.

Что удалось накодить.
п.1 **Вход в режим редактирования на месте**
Делаю это так:
ksAPI7::IKompasDocument3DPtr doc( GetCurrentDocument() );
ksAPI7::IParts7Ptr iPartsdoc->GetTopPart()
ksAPI7::IPart7Ptr part = iParts->GetPart(0);
ksAPI7::IOpenDocumentParamPtr doc_param = part->GetOpenDocumentParam();
ksAPI7::IKompasDocument3DPtr doc3D_edit = part->BeginEdit(doc_param);    // предполагаю что это и есть вход в режим редактирования на месте...? Но странно что значек в GUI не появляется...
п.2 **Выбираем команду Моделирование->Вычесть компоненты**
А вот здесь загвоздка. Как я понял порядок действия такой, получаем ksAPI7::IMoldCavitiesPtr, выполняем Add() и получаем ksAPI7::IMoldCavityPtr... далее пока непонятно.
Не могу понять как получить ksAPI7::IMoldCavitiesPtr...

Если есть у кого пример (на любом языке) вычитания компонентов, прошу подлиться.

Nipal

#1
pModelContainer:=pPart7 as IModelContainer;
IModelContainer.MoldCavities - Коллекция операций вычитания компонентов.

dlsh

ModelContainer.MoldCavities - да, это похоже то что и нужно. Получил IMoldCavities.

А как пользоваться IMoldCavities/IMoldCavity ?
На сколько я понял в IMoldCavities находятся IMoldCavity...
Не могу соотнести это с тем как выглядит это в UI. В ручно режиме мы выбираем в команде вычитания компонентов те тела, которые нам необходимо вычесть.
А как в программе добавить тела для вычитания... было бы логично если команда Add принимала интерфейсы объектов для вычитания... но в ней по факту нет аргументов.
В описании крайне скудно (вообще ничего) не сказано что это за метод Add для IMoldCavities...
Какой порядок работы с IMoldCavities / IMoldCavity для процедуры добавления тел для вычитания и выполнения самого вычитания?

Nipal

pMoldCavity:=pMoldCavities.Add;
Заполняете:
 - массив - Parts;
 - Scale - Масштаб;
 - ScaleCentre - Точка центра масштабирования.
pMoldCavity.Update;

dlsh

Написал следующий код:

  ksAPI7::IKompasDocument3DPtr doc( GetCurrentDocument() );
  ksAPI7::IPart7Ptr iPart7 = doc->GetTopPart();
    ksAPI7::IParts7Ptr iParts = iPart->Parts;
  // -- Далее перебираются детали и из них выбирается деталь из которой
  // буду вычитать (ReducedPart) и тела которые я хочу вычесть (SubBodies)
  // SubPart - это деталь для вычитания ... для тестов
  PArray<ksAPI7::IBody7Ptr> SubBodies;
  PArray<ksAPI7::IPart7Ptr> SubPart;
  ksAPI7::IPart7Ptr ReducedPart;
  for (int i = 0; i < iParts->Count; i++) {
    ksAPI7::IPart7Ptr part = iParts->GetPart(i);
    auto PartName = part->GetName();
    // --
    if (PartName == _bstr_t{ L"Матрица" }) {
      ReducedPart = part;
    } else {
      if (PartName == _bstr_t{ L"Деталь для вычитания" }) {
        SubPart.Add(new ksAPI7::IPart7Ptr{part} );
      }

      PArray<IDispatchPtr> Bodies;
      FillObjects(iParts->GetItem(i)->GetOwner()->GetResultBodies(), Bodies);
      for (uint j = 0; j < Bodies.Count(); j++) {
        SubBodies.Add(new ksAPI7::IBody7Ptr{ Bodies[j] });
      }
    }
  }
  _variant_t  varReducedBodies = CreateDispSafeArray(SubBodies);
  _variant_t  varReducedPart = CreateDispSafeArray(SubPart);
  // -- Reduced
  ksAPI7::IKompasDocument3DPtr doc3D_ReducedPart = ReducedPart->BeginEdit(ReducedPart->GetOpenDocumentParam());
  ksAPI7::IModelContainerPtr mCont = ksAPI7::IModelContainerPtr(doc3D_ReducedPart->GetTopPart());
  ksAPI7::IMoldCavitiesPtr cavities = mCont->GetMoldCavities();

  ksAPI7::IMoldCavityPtr cavity = cavities->Add();
  cavity->Parts = varReducedBodies;                    // это то что я и хотел, добавить тела для вычитания как в UI
  _variant_t cavity_Parts = cavity->Parts;              // ничего почемуто не добавилось
 
  cavity->Parts = varReducedPart;                      // здесь одна простая деталь добавляется
  cavity_Parts = cavity->Parts;                        // и она успешно добавилась

  auto cavityValid = cavity->GetValid();
  cavity->Update();

  ReducedPart->EndEdit(true);

но ничего не происходит... прошу посмотреть, может я что то не так делаю.

Nipal

Разберитесь с вариантным массивом.
+ Благодарностей: 1

dlsh

Добрый день.
Разобрался с вычитанием компонентов, все работает если передавать IMoldCavity::Parts массив объектов с интерфейсом IPart7.
Теперь нужно вычесть определенные тела в компоненте (деталь/сборка) как это показано в анимации ниже.
Пробовал вместо IPart7 передавать массив IBody7, но IMoldCavity::Parts такой массив не принимает.
Каким образом это можно реализовать по аналогии с UI в КОМПАС?


Nipal

Покажите, как выглядит окно, когда ручками это делается, а то мне лень, там скорее всего нужно дополнительно подготовить процесс, над чем делать данные манипуляции.