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

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

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

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

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

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

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

Является ли ребро окружностью

Автор lizard000, 06.02.14, 10:51:09

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

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

lizard000

Компас 14sp1. Задача - найти в указанной грани ребра, являющиеся окружностью. Пример детали во вложении.


   // открыть файл
   IKompasAPIObjectPtr p_app7 = m_kompas->ksGetApplication7();
   IKompasDocumentPtr p_doc = p_app7->GetApplication()->Documents->Open(L"D:\\Болт.m3d",VARIANT_TRUE,VARIANT_FALSE);
   ksDocument3DPtr p_doc5 = m_kompas->TransferInterface(p_doc,ksAPI5Auto,0);
   ksPartPtr p_part = p_doc5->GetPart(pTop_Part);

   // найти зеленую цилиндрическую грань в которой требуется определить круглое ребро
   ksFaceDefinitionPtr p_greenface;
   ksBodyCollectionPtr p_bodies = p_part->BodyCollection();
   if (p_bodies==NULL)
      return;
   ksBodyPtr p_body = p_bodies->First();
   while (p_body!=NULL)
   {
      ksFaceCollectionPtr p_faces = p_body->FaceCollection();
      if (p_faces==NULL)
      {
         p_body = p_bodies->Next();
         continue;
      }
      ksFaceDefinitionPtr p_face = p_faces->First();
      while (p_face!=NULL)
      {
         double h, r;
         if ((!p_face->IsCylinder())&&(!p_face->IsCone()))
         {
            p_face = p_faces->Next();
            continue;
         }
         ksEntityPtr p_ent = p_face->GetEntity();
         ksColorParamPtr p_color = p_ent->ColorParam();
         long clr = p_color->color;
         if ((GetRValue(clr)<100)&&(GetGValue(clr)>150)&&(GetBValue(clr)<100))
            p_greenface = p_face;
         p_face = p_faces->Next();
      }
      p_body = p_bodies->Next();
   }

   // перебрать все ребра грани и определить первое попавшееся, которое является окружностью
   ksEdgeCollectionPtr p_edges = p_greenface->EdgeCollection();
   if (p_edges==NULL)
      return;
   ksEdgeDefinitionPtr p_edge = p_edges->First();
   ksEdgeDefinitionPtr p_circle;
   while (p_edge!=NULL)
   {
      ksCurve3DPtr p_curve = p_edge->GetCurve3D();
      if (p_curve!=NULL)
      {
         VARIANT_BOOL b = p_curve->IsArc();
         b = p_curve->IsCircle();
         b = p_curve->IsClosed();
         b = p_curve->IsDegenerate();
         b = p_curve->IsEllipse();
         b = p_curve->IsLineSeg();
         b = p_curve->IsNurbs();
         b = p_curve->IsPeriodic();
         b = p_curve->IsPlanar();
      }
      p_edge = p_edges->Next();
   }


В приатаченном файле у зеленого цилиндра два ребра, оба являются окружностью, но TRUE выдается только для p_curve->IsClosed() и p_curve->IsPeriodic(). p_curve->IsCircle()=FALSE. Это такая ошибка в API или я что-то не понимаю?

Попробуйте сразу проверить p_edge->IsCircle без ksCurve3D, должно работать.

lizard000

Пробовал, результат тот же

У меня нормально возвращает, но я использую API7.
+ Благодарностей: 1