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

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

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

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

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

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

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

Изменение позиции 3D объекта в пространстве

Автор MrBarry, 11.09.23, 07:18:36

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

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

MrBarry

В процессе создания объектов возник вопрос - а каким способом я могу передвинуть свой объект в интересующее место в пространстве? К примеру, прямоугольный параллелепипед, созданный из эскиза выдавливанием.
Первая идея в том, чтобы расположить эскиз на собственноручно заданной плоскости под любым углом и в любом месте. Тогда объект из эскиза тоже окажется там где нужно. Однако метод ksSketchDefinitionPtr->SetPlane() упорно принимает на вход исключительно базовые плоскости (как GetDefaultEntity(o3d_planeXOY)). При попытке передать собственноручно созданную плоскость (например через 3 точки) ничего не происходит.
Вторая идея в передвижении эскиза/детали куда захочется. Для этого вроде бы есть метод SetPlacement у ksPart. Однако я так и не понял какой объект объявлять, какие параметры изменять и что куда.
Возможно, есть ещё варианты, но я пока не дотумкал.

Код:
// Функция честно спи... украдена и доработана, и она работает, проверено
IPoint3DPtr createPoint(KompasObjectPtr& kompas,
 ksPartPtr& part, double x, double y, double z) {
  ksEntityPtr p = part->NewEntity(o3d_point3D);
  p->Create();

  IPoint3DPtr p7 = kompas->TransferInterface(p, ksAPI7Dual, 0);

  p7->X = x;
  p7->Y = y;
  p7->Z = z;
  p7->_Update();
  return p;
}
. . .
// Создание эскиза
ksEntityPtr cuboidSketch = part->NewEntity(o3d_sketch);
// Параметры эскиза
ksSketchDefinitionPtr sketchParam = cuboidSketch->GetDefinition();

// Своя плоскость
ksEntityPtr plane = part->NewEntity(o3d_plane3Points);
ksPlane3PointsDefinitionPtr planeParams = plane->GetDefinition();
planeParams->SetPoint(1, createPoint(kompas, part, -10, -10, -10));
planeParams->SetPoint(2, createPoint(kompas, part, 10, , 20));
planeParams->SetPoint(3, createPoint(kompas, part, -50, -10, 10));
plane->_Update();

// Вот это не работает, даже в компасе эскиза не будет видно, а значит и фигур из него.
// Единственное, будут видны точки от createPoint()
//sketchParam->SetPlane(plane);

// А вот это спокойно сработает
sketchParam->SetPlane(part->GetDefaultEntity(o3d_planeXOZ));

cuboidSketch->Create();


Lapin

Вы свою ошибку, ещё не нашли?
PS. Она настолько очевидная, даже искать не нужно.

MrBarry

Для этого и нужен форум. Свежий взгляд может помочь найти ошибку, который мой замыленный и за неделю не увидит. Я вон неделю самые изощрённые способы решения искал, когда надо было просто написать одну строчку Application->Initialize()
Короче, мне интересно где эта очевидная ошибка)

MrBarry

Кстати, дополнение: после сессии дебага первый вариант с собственной плоскостью локализован в "как создать эту самую плоскость". Тут всё весьма непонятно, потому что среди примеров в SDK Kompas лежит идентичная функция создания плоскости по 3 точкам. Я сначала сверился со своей - ошибок не нашёл у себя, потом вообще скопировал и запустил - ничего не происходит. Значит, проблема не в коде. Но где, я, честно говоря, уже не могу сказать...

Nipal

Верю, проблема не в коде.
PS. Настолько простая.