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

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

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

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

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

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

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

Проблема при создании дуги IArc3D

Автор ural_su, 31.10.13, 16:50:42

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

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

ural_su

Вобщем суть проблемы создаю 3х мерную дугу по радиусу и центру
Код:
IArc3DPtr Create3DArc(IKompasDocumentPtr & doc, IPoint3DPtr point_1,IPoint3DPtr point_2, double radius, IModelObjectPtr plane_ent)
{
   IArc3DPtr arc3D = NULL;
   // Получаем 3D документ
   IKompasDocument3DPtr doc3D(doc);
   IPart7Ptr part ( doc3D->TopPart );
   if (part)
   {
      IAuxiliaryGeomContainerPtr auxCont(GetAuxiliaryGeomContainer(doc));
      if (auxCont)
      {
         
         IArcs3DPtr arcsCol(auxCont->GetArcs3D());
         arc3D = arcsCol->Add();
         if (arc3D)
         {   
            if(point_1 && point_2 && plane_ent)
            {
               arc3D->PutBuildingType( ksArc3DByCentre);
               arc3D->PutBuildingObject(plane_ent);
               arc3D->PutAssociationObject(ksArc3DCenter, part->GetDefaultObject(o3d_pointCS));
               arc3D->PutAssociationObject(ksArc3DPoint1, point_1);
               arc3D->PutAssociationObject(ksArc3DPoint2, point_2);
               arc3D->PutDirection(false);
               arc3D->put_Radius(radius);
               arc3D->Update();
            }
         }
      }
   }
   return arc3D;
}

В итоге точка 2 определяется с нулевым углом и дуга рисуется неправильно. Что я делаю не так?

Судя из кода должно быть ksArc3DByPoints - по трем точкам, а у Вас ksArc3DByCentre - по центру, углам и плоскости.

ural_su

А как можно получить угол по точке(В сферической системе координат)? Грубо говоря две точки лежат на сфере их надо соедеинить дугой с радиусом сферы. И вроде в перечислении ksArc3DPoint1 = 1, что соответствует первому углу, а ksArc3DPoint2 = 2 второму.

А Вы не пробовали построить, по двум точкам и направлению.
arc3D->PutBuildingType(ksArc3DByDirrection);
arc3D->PutAssociationObject(ksArc3DPoint1, point_1);
arc3D->PutAssociationObject(ksArc3DPoint2, point_2);
arc3D->PutDirection(false);
arc3D->put_Radius(radius);
arc3D->Update();

Углам соответствуют свойства Angle1 и Angle2.


ural_su

Нет не пробовал, завтра попробую.
Судя по перечислению
ksArc3DParameterEnum
{
    ksArc3DCenter = 0,
    ksArc3DPoint1 = 1,
    ksArc3DPoint2 = 2,
    ksArc3DPoint3 = 3,
    ksArc3DAngle1 = 1,
    ksArc3DAngle2 = 2,
    ksArc3DRadius = 3
};
это одно и то же

Лучше использовать свойства напрямую, без буфера.
Хотя у Вас arc3D->PutAssociationObject(ksArc3DPoint1, point_1);, а должно быть
arc3D->PutAssociationObject(ksArc3DAngle1, point_1);, тогда, если я логику правильно понимаю, Компас считает угол сам, между центром и точкой.
+ Благодарностей: 1

ural_su

arc3D->PutAssociationObject(ksArc3DAngle1, point_1); что arc3D->PutAssociationObject(ksArc3DPoint1, point_1); если я правильно понимаю в функцию передастся arc3D->PutAssociationObject(ksArc3DParameterEnum(1), point_1); так что особой разницы не вижу


ural_su

завтра попробую ваш вариант о результатах напишу. Еще вопрос как можно указать 3D точку как центр эскиза? Или просто получить координаты 3х мерной точки в координатах эскиза?

Если можно, картинку прикрепите, чтобы видеть с чего нужно информацию получить.

ural_su

вот картинки проблемы, не цепляет точку заданную arc3D->PutAssociationObject( ksArc3DAngle1 , point_1);
Причем если задаешь просто значениями углов то все нормально строит а объект цеплять не хочет.

ural_su

вот параметры созданной дуги

А можно посмотреть, как Вы получаете point_1?

ural_su

IPoint3DPtr CreatePoint( IKompasDocumentPtr & doc, double a, double b, double r, wstring name = NULL )
{
  IPoint3DPtr newPoint = NULL;
  // Получаем 3D документ
  IKompasDocument3DPtr doc3D(doc);
  IPart7Ptr part ( doc3D->TopPart );
  if(part)
  {
    // Получаем контейнер модельных объектов
    IModelContainerPtr modelCont( GetModelContainer(doc) );

    if ( modelCont )
    {
      // Получаем коллекцию точек
      IPoints3DPtr pointsColl( modelCont->GetPoints3D() );

      if ( pointsColl )
      {
        // Добавляем новую точку
        newPoint = pointsColl->Add();

        if ( newPoint )
        {
          // Задаем параметры точки
        newPoint->put_Name((BSTR)name.c_str());
          newPoint->Symbol = ksDotPoint;
        newPoint->ParameterType = ksPSphericCoord;
        IPoint3DParamBySpherePtr param = newPoint->Parameters;
        param->A = a;
        param->B = b;
        param->R = r;
          newPoint->Update();
        }
      }   
    }
  }
  return newPoint;

ural_su

пробовал передавать в первый угол вторую точку а во второй первую. Все равно первый угол не подцепляет.

Установить опорный объект для вершины - PutAssociationObject.
Тип данных: указатель на интерфейс IModelObject.
У Вас point_1 - IPoint3D, разницу улавливаете, Вам необходимо IPoint3D преобразовать в IModelObject.
ModelObject:=Point3D as IModelObject;

ural_su

ну а почему тогда вторую точку подцепляет?

Показывайте окно отладчика, чтобы видеть, на виртуальный вопрос я ответить не смогу, откуда я знаю, что у Вас в коде поменялось.

ural_su

Причем при построении дуги  по двум точкам и направлению или по трем точкам дуги строятся корректно. Причем класс IPoint3D наследуется от IModelObject
struct __declspec(uuid("d71aedbe-01d4-4c7d-96dc-94981f2a1c37"))
IPoint3D : IModelObject
хотя может я и неправ

01.11.13, 17:44:00 #19 Последнее редактирование: 01.11.13, 18:08:23 от Sabahs
Смотрим разницу.
IModelObject - Базовый интерфейс для всех модельных объектов, его размер в памяти меньше, чем интерфейс который его наследует.