Конструкция profile() является расширением языка OpenSCAD, введённым в BCad для определения 2D-профилей, которые затем могут быть использованы для создания 3D-геометрии с помощью таких операций, как linear_extrude(), rotate_extrude() и других.
В отличие от OpenSCAD, где 2D-формы определяются через polygon(), square(), circle() и автоматически объединяются, profile() предоставляет специализированный контекст для построения 2D-контуров из последовательности примитивов. В этом контексте примитивы не создают отдельные 2D-фигуры, а формируют единую непрерывную проволочную структуру (wire).
Общие принципы
- Контекст 2D-рисования: Все примитивы внутри блока
profile()обрабатываются как элементы 2D-контура. - Последовательное добавление: Примитивы добавляются в порядке их следования, формируя список рёбер.
- Автоматическая сборка: По завершении блока
profile()из списка рёбер автоматически формируетсяTopoDS_Wire(проволока) OpenCASCADE, которая затем используется родительской операцией (например,linear_extrude). - Состояние (current_pos): Профиль запоминает текущую позицию пера. Примитивы
line,arc,splineобновляют её. - Отсутствие неявного Union: Внутри
profile()не применяется неявное объединение геометрии, так как концепция Union не применима к построению последовательного 2D-контура.
Примитивы профиля
move(point)
Устанавливает текущую позицию пера (pen up) без рисования отрезка.
point: 2D-точка[x, y].
Также задаёт начальную точку контура для последующего замыкания через close().
Пример:
profile() {
move([0, 0]);
line([10, 0]); // от (0,0) до (10,0)
line([10, 10]); // от (10,0) до (10,10)
}
line(point_start, point_end) / line(point_end)
Рисует прямой отрезок. Может вызываться с одним или двумя аргументами.
- Два аргумента: явные начальная и конечная точки (игнорирует
current_pos). - Один аргумент: отрезок от
current_posдо заданной точки.
Пример:
profile() {
move([0, 0]);
line([10, 0]); // от (0,0) до (10,0)
line([10, 10]); // от (10,0) до (10,10)
line([10, 10], [0, 10]); // явный отрезок
}
arc(center, angle)
Рисует дугу окружности от текущей позиции вокруг заданного центра на заданный угол.
center: 2D-точка центра окружности[x, y].angle: Угол поворота в градусах. Положительное значение — против часовой стрелки (CCW), отрицательное — по часовой стрелке (CW). Может быть больше 360°.
Пример:
profile() {
move([10, 0]);
arc(center=[0, 0], angle=90); // дуга от (10,0) на 90° CCW вокруг (0,0)
line([0, 10]); // продолжение от конечной точки дуги
}
fillet(radius)
Создаёт дугу скругления между предыдущим и следующим рёбрами.
radius: Радиус скругления.
Должен располагаться между двумя примитивами. Если fillet стоит после последнего ребра, он скругляет стык последнего ребра с первым (замыкание).
Пример:
profile() {
move([0, 0]);
line([10, 0]); fillet(2);
line([10, 10]); fillet(2);
line([0, 10]); fillet(2);
close(fillet=2); // замыкает + скругляет последний угол
}
spline(points)
Рисует гладкую интерполяционную B-сплайн кривую, проходящую через заданный массив 2D-точек. Первая точка массива соединяется с текущей позицией current_pos.
points: Массив 2D-точек[[x1,y1], [x2,y2], ...], через которые строится кривая.
Пример:
profile() {
move([0, 0]);
spline([[3, 5], [7, 4], [10, 10]]);
line([15, 10]);
}
close(fillet=Noval)
Замыкает контур: рисует отрезок от current_pos обратно к начальной точке (заданной через move или первым вызовом line).
fillet: Если задан, на стыке замыкания создаётся скругление указанного радиуса.
Пример:
profile() {
move([0, 0]);
line([10, 0]);
line([0, 10]);
close(fillet=2); // замыкает со скруглением
}
Полный пример: скруглённый квадрат
profile() {
move([0, 0]);
line([10, 0]); fillet(2);
line([10, 10]); fillet(2);
line([0, 10]); fillet(2);
close(fillet=2);
}