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

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

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

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

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

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

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

ksAggregateDefinition или ksMoldCavityDefinition, как использовать?

Автор Темира, 12.12.14, 00:35:49

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

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

Темира

Доброго времени суток.Столкнулась с такой проблемой(в использовании API Компаса новичок): Я создаю сборку, создаю в ней одну деталь и добавляю в эту сборку другую деталь(можно, в принципе, добавлять сразу две детали), необходимо применить булеву операцию вычитания. Как это сделать, не понимаю. Как получить интерфейс ksAggregateDefinition? как заполнить массив ksMoldCavityDefinition->PartArray()? Надеюсь на вашу помощь.

Можно попробовать так получить.
entity:=ksEntity(part.NewEntity(o3d_aggregate));
AggregateDef:=ksAggregateDefinition(entity.GetDefinition);

Темира


Темира

я делаю, что то не так, а что не знаю(Может у вас пример по использованию ksAggregateDefinition есть?Выложу свой код, на всякий случай
        kom = KGAX1->GetKompasObject();
   d3d = kom->ActiveDocument3D();

   d3d->Create(FALSE, FALSE);

   pt = d3d->GetPart(pNew_Part);
        path = "C:\\Proga\\d1.m3d";
   d3d->SetPartFromFile(WideString(path).c_bstr(), pt, TRUE);
   path = "C:\\Proga\\stran.m3d";
   d3d->SetPartFromFile(WideString(path).c_bstr(), pt, TRUE);

   d3d = kom->ActiveDocument3D();
   pt->GetPart(pTop_Part);
   ksPartCollectionPtr ent =
      ksPartCollectionPtr(d3d->PartCollection(pTop_Part));
   y = ent->GetCount();
   pt->BeginEdit();
   ksEntityPtr entity = ksEntityPtr(pt->NewEntity(o3d_aggregate));

   ksAggregateDefinitionPtr AggregateDef =
      ksAggregateDefinitionPtr(entity->GetDefinition());
   AggregateDef->set_BooleanType(2);

   entity->Create();

   pt->EndEdit(true);

Наверно нужно заполнить массив тел ksBodyCollection, чтобы было с чем выполнять операцию.

Темира

может все таки есть какой нибудь пример?....а то ничего не получается(

Получите указатель на интерфейс массива тел ksAggregateDefinition.BodyCollection, добавьте в него тела над которыми производите операцию и создайте булеву операцию entity->Create();, а примера у меня нет.

tyan.evgeniy@gmail.com

void CreateBoolean( ksDocument3D& doc )
{
   // У нас документ doc должен быть сборкой, иначе не загрузятся детали
   
   // получим компонент самой сборки, в ней будем создавать все операции
   // т.е. все операции будут принадлежать непосредственно сборке,
   // иначе нужно редактировать загруженные сборки
   part = doc.GetPart( pTop_Part );

   // загрузим детали
   ksPart firstDetail = doc.GetPart(pNew_Part);
   BOOL isFirstDetailLoaded = doc.SetPartFromFile("d:\\projects\\1.m3d", firstDetail, true);
   ksPart secondDetail = doc.GetPart(pNew_Part);
   BOOL isSecondDetailLoaded = doc.SetPartFromFile("d:\\projects\\2.m3d", secondDetail, true);

   // проверим загрузку
   if(!isFirstDetailLoaded || !isSecondDetailLoaded)
      return; // тут сообщение об ошибке, отсутствии файла, т.п.

   // здесь можно изменить положение деталей в сборке
   firstDetail.SetPlacement(part.GetPlacement());
   secondDetail.SetPlacement(part.GetPlacement());
   firstDetail.UpdatePlacement();
   secondDetail.UpdatePlacement();
   

   ksBodyCollection firstDetailBodies = firstDetail.BodyCollection();
   ksBodyCollection secondDetailBodies = secondDetail.BodyCollection();
   
   if(firstDetailBodies.GetCount() < 1 || secondDetailBodies.GetCount() < 1)
      return; // тут сообщение об ошибке, отсутствии файла, т.п.

   // создадим булеву операцию
   ksEntity boolOperation = part.NewEntity(o3d_aggregate);
   
   // получим описание операции
   ksAggregateDefinition boolOperationDef(boolOperation.GetDefinition());
   
   // зададим тип - вычитание
   // порядок вычитания определяется порядком передачи тел
   // в коллекцию для операции: т.е. из первого переданного тела вычитаются остальные переданные
   boolOperationDef.SetBooleanType(ksDifference);

   // зададим тела для операции, вычитаем из тела первой детали тело второй детали
   ksBodyCollection bodiesForBoolOp(boolOperationDef.BodyCollection());
   bodiesForBoolOp.Add(firstDetailBodies.GetByIndex(0)); // тут можно порядком вызова менять что из чего вычитается
   bodiesForBoolOp.Add(secondDetailBodies.GetByIndex(0)); // тут можно порядком вызова менять что из чего вычитается   

   // создаем операцию
   boolOperation.Create();
}
+ Благодарностей: 1