Существует ли простой способ разделения моделей в OpenSCAD?

Мне интересно, могу ли я взять один объект OpenSCAD и разрезать/соединить/разделить его на два разных объекта, которыми затем можно управлять независимо?

Один из подходов состоит в том, чтобы дублировать объект, сравнивать его по границе разреза с 3-м объектом, а затем сравнивать результат с самим собой. Это кажется слишком сложным, и я подозреваю, что что-то упускаю

PS - суть в том, что у меня есть красиво оформленная часть, в которой мне нужно создать блокировку. Я хочу сначала разрезать деталь пополам, а затем создать какой-то механизм блокировки

, 👍8


1 ответ


8

Вместо того, чтобы отделять копию объекта от самой себя, которая подвержена числовой нестабильности, выберите коробку ("куб" в терминологии OpenSCAD) и пересеките ее с одной копией объекта, а затем отличите ее от другой копии объекта. Это все просто, если вы используете модули для инкапсуляции своих деталей, а также это работает с импортированными файлами STL.

В частности, это должно выглядеть примерно так:

module mycut() {
    translate([x,y,z]) cube([w,l,h]);
}

difference() {
    myobject();
    mycut();
}

translate([u,v,w])
intersection() {
    myobject();
    mycut();
}

,

есть ли какой-нибудь способ создать полигон, соединяющий разделенные объекты? от первой ограненной грани ко второй?, @eri

как корпус, но с использованием ближайших точек, @eri

@eri: Вы могли бы сделать это с помощью "linear_extrude" из "проекции", но это очень медленно и связано с неприятными проблемами числовой стабильности., @R.. GitHub STOP HELPING ICE

мне нужны одинаковые размеры в 3 файлах stl, поэтому поворот в XY и обратно не подходит., @eri

@eri: Почему поворот на 90 ° может все испортить?, @R.. GitHub STOP HELPING ICE

Может быть. Постараюсь, @eri

Я считаю, что числовая нестабильность не является проблемой в OpenSCAD, по крайней мере, в этом случае, поскольку базовая библиотека использует символьную алгебру (рациональные числа) с неограниченной точностью. Точность вступает в игру только при экспорте (и повторном импорте) или при вычислении нерациональных функций, таких как косинус и синус, хотя результаты гарантированно будут согласованными (что хорошо при сопоставлении частей). Тем не менее, вычитание объекта из самого себя, вероятно, требует больших вычислительных затрат, поэтому этот подход хорош, поскольку использует блоки., @Real

@Real: Я не знаю подробностей, но OpenSCAD не совсем точен внутри. Он использует ужасную мешанину различных математических вычислений, о которых, вероятно, лучше не спрашивать., @R.. GitHub STOP HELPING ICE

См. эту цитату: «Оказывается, OpenSCAD использует Библиотеку алгоритмов вычислительной геометрии (CGAL) для своих операций CSG. Эта удивительная библиотека позволяет использовать полностью общие числовые типы, а тип, который использует OpenSCAD, представляет собой какую-то магическую «точную» цифру вуду. тип на основе арифметической библиотеки множественной точности GNU (GMP).» с [этой страницы](https://ochafik.com/jekyll/update/2022/02/09/openscad-fast-csg-contibution.html) указывает точное использование рациональных чисел для объединений (и, я думаю, пересечений тоже)., @Real

Подробнее о CGAL см. [здесь](https://www.cgal.org/exact.html): «CGAL дает правильные результаты, несмотря на промежуточные ошибки округления. Если три линии встречаются в одной точке, они сделают это в CGAL. а также, и если четвертая строка пропускает эту точку на 1.0e-380, то она также пропускает ее и в CGAL. Ситуации, которые иногда помечаются как «вырожденные» (например, набор трехмерных точек, фактически живущих в двухмерной плоскости). ) правильно обрабатываются CGAL. Говоря простыми словами, это называется парадигмой точных вычислений, и в конечном итоге она опирается на вычисления с числами произвольной точности»., @Real

@Real: Как я уже говорил вам, OpenSCAD использует сочетание различных типов геометрических вычислений и уходит от CGAL, потому что он медленный и потому что предлагаемая им точность на самом деле ничего вам не дает из-за неточности на других уровнях., @R.. GitHub STOP HELPING ICE