30.08.2022 • C3D Solver

Развитие C3D Solver: оффсетные кривые в 2D и интервальные размеры в 3D

В этой заметке мы хотим сосредоточиться на основных новинках параметрического решателя C3D Solver 2022 и продемонстрировать примеры его использования. Напоминаем, что он включает в себя двумерный и трехмерный решатели, позволяющие накладывать различные виды ограничений на тела как в двумерном, так и трехмерном пространствах. Дополнительно стоит отметить, что для трехмерного решателя мы теперь поставляем C# интерфейсы. Ранее они предоставлялись только для двумерного решателя.

Solver 2D. Эквидистантные кривые

Главной новинкой двумерного параметрического решателя являются оффсетные или эквидистантные кривые. Такие кривые представлены множеством точек, находящихся на некотором расстоянии d от базовой кривой.

Развитие C3D Solver: оффсетные кривые в 2D и интервальные размеры в 3D, фото 1

Развитие C3D Solver: оффсетные кривые в 2D и интервальные размеры в 3D, фото 2

Для нового типа кривых в решателе реализована поддержка следующих ограничений:

  • фиксация эквидистантной кривой
  • инцидентность точки и эквидистантной кривой
  • касание
  • симметрия
  • расстояние от эквидистантной кривой до точки, прямой, отрезка, окружности и другой эквидистантной кривой.
Развитие C3D Solver: оффсетные кривые в 2D и интервальные размеры в 3D, фото 3

Помимо упомянутых выше ограничений, в случаях, когда оффсетные кривые строятся на основе линейных кривых, для таких эквидистант также доступны все ограничения линейных объектов: параллельность, перпендикулярность, горизонтальность, вертикальность и угловые размеры.

Для работы с новыми кривыми для пользователей решателя реализовано несколько методов API C3D Solver. Один из таких методов позволяет регистрировать эквидистанту в решателе, принимая в качестве параметров ее базовую кривую и величину ее смещения (отступ).

// Добавить эквидистантную кривую
geom_item GCE_AddOffsetCurve( GCE_system, geom_item curve, double offset );

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

// Зафиксировать смещение эквидистантной кривой
geom_item GCE_FixOffset( GCE_system, geom_item curve );

Благодаря еще одному методу доступна возможность приравнивания отступов двух разных эквидистант.

// Приравнять смещения эквидистантных кривых
geom_item GCE_AddEqualOffset( GCE_system, geom_item curve1, geom_item curve2 );

Ниже представлен фрагмент кода (С++), демонстрирующий создание и добавление эквидистантных кривых для линейного сегмента и его точек:

// Создание системы ограничений
auto solver = GCE_CreateSystem();
 
// Объявление точки GCE_point p_
GCE_point p_;
p_.x = 1.; p_.y = 0.;
auto p1 = GCE_AddPoint(solver, p_);
p_.x = 3.; p_.y = 0.;
auto p2 = GCE_AddPoint(solver, p_);
geom_item pnts[] = { p1, p2 };
 
// Добавление линейного сегмента по двум точкам
auto lseg = GCE_AddLineSeg(solver, pnts);
// Создание 1-й оффсетной линии сегмента
auto offsetLSeg1 = GCE_AddOffsetCurve(solver, lseg, 5.);
// Создание 2-й оффсетной линии сегмента
auto offsetLSeg2 = GCE_AddOffsetCurve(solver, lseg, -4.);
// Создание 1-й оффсетной окружности точки p1
auto offsetPoint1 = GCE_AddOffsetCurve(solver, GCE_PointOf(solver, lseg, GCE_FIRST_END), 4.5);
// Создание 2-й оффсетной окружности точки p2
auto offsetPoint2 = GCE_AddOffsetCurve(solver, GCE_PointOf(solver, lseg, GCE_SECOND_END), 5.5);
 
// Приравнивание оффсетных кривых
GCE_AddEqualOffset(solver, offsetLSeg1, offsetPoint2);
GCE_AddEqualOffset(solver, offsetPoint2, offsetLSeg2);
GCE_AddEqualOffset(solver, offsetLSeg2, offsetPoint1);
// Фиксация смещения 1-й оффсетной линии сегмента
GCE_FixOffset(solver, offsetLSeg1);
// Решение системы
GCE_Evaluate(solver);
GCE_GetCoordValue(solver, offsetLSeg1, GCE_OFFSET);
 
// Удаление системы
GCE_RemoveSystem(solver);

Что касается сферы применения оффсетных кривых, то с их помощью есть возможность, в первую очередь, строить эквидистантные контуры, например, маршрут фрезы станка ЧПУ.

Solver 3D. Интервальные размеры

Среди методов трехмерного решателя теперь присутствует функционал линейных интервальных размеров (ограничение Диапазон). Ограничение представляет размер, величина которого изменяется в некотором интервале, и который может быть наложен между двумя разными телами или частями одного тела.

Развитие C3D Solver: оффсетные кривые в 2D и интервальные размеры в 3D, фото 4

Важной особенностью новинки является то, что диапазон допустимых значений совпадает с аналогичным у управляющих размеров. Так, например, в приложении при необходимости можно реализовать гладкое переключение между интервальными размерами и аналогичными управляющими размерами. Кроме того, интервальные размеры можно накладывать между всеми типами объектов, для которых применимы аналогичные управляющие размеры.

Использовать новый функционал возможно также через дополненное API решателя. Ранее существовавшая его функция GCM_constraint GCM_AddDistance(...) для добавления управляющего размера была перегружена с изменением четвертого параметра.

// Задать интервальный линейный размер
GCM_constraint GCM_AddDistance( GCM_system, GCM_geom g1, GCM_geom g2, const GCM_interval &, GCM_alignment );

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

// Интервал допустимых значений интервального размера
struct GCM_interval { double lBnd, rBnd; };

Ниже представлен фрагмент кода (С++), демонстрирующий создание и добавление интервального размера между двумя телами:

// Создание системы ограничений
auto solver = GCM_CreateSystem();
 
// Добавление тела 1 в систему
auto box1 = GCM_AddGeom(solver, GCM_SolidLCS(MbCartPoint3D::origin, MbVector3D::zAxis, MbVector3D::xAxis));
auto box1XY = GCM_SubGeom(solver, box1, GCM_Plane(MbCartPoint3D::origin, MbVector3D::zAxis));
 
// Добавление тела 2 в систему
auto box2 = GCM_AddGeom(solver, GCM_SolidLCS(MbCartPoint3D::origin, MbVector3D::zAxis, MbVector3D::xAxis));
auto box2XY = GCM_SubGeom(solver, box2, GCM_Plane(MbCartPoint3D::origin, MbVector3D::zAxis));
 
// Инициализация структуры интервала граничными значениями
GCM_interval interval{ 1.5, 7.5 };
// Добавление размера
auto itrvlDist = GCM_AddDistance(solver, box1XY, box2XY, interval);
// Решение системы
auto result = GCM_Evaluate(solver);
 
// Удаление системы
GCM_RemoveSystem(solver);

В планах у нас реализация еще одной группы интервальных размеров — угловых размеров. После мы планируем добавить обе группы интервальных размеров и в двумерный решатель.


Поделиться материалом
Вверх