Нарезка непосредственно из данных, не связанных с сеткой?

Это немного странный вопрос, и я полагаю, что ответ может быть просто "нет". Но все равно продолжим:

Я пишу код, который генерирует фигуры для 3D-печати с помощью "неявных поверхностей", то есть математической функции f(x,y, z), которая положительна внутри фигуры и отрицательна снаружи. Это довольно хорошо подходит для создания фигур, которые я хочу напечатать, но проблема в том, что превратить неявную поверхность в хорошую сетку сложно - есть некоторые библиотеки, которые могут это сделать, но они довольно привередливы, и вам нужно много играть с параметрами, чтобы заставить ее хорошо работать.

Но я подумал: единственная причина, по которой мне в первую очередь нужна сетка, - это отправить ее в срез, который в конечном итоге выбросит сетку и превратит ее в gcode. Мой план состоял в том, чтобы сделать

неявная функция --> Файл STL -->> gcode>>

но мне интересно, есть ли какие-нибудь слайсеры, которые позволят мне пропустить промежуточный шаг и позволят мне просто сделать

неявная функция --> gcode>

вместо этого. То есть мой код будет содержать 3D-сетку вокселов, содержащую значение функции в каждой 3D-точке, и срез создаст g-код из нее, а не из файла STL.

Похоже, что у Shapeways есть приятный и простой формат под названием SVX, который именно таков, но, насколько я могу судить, он поддерживается только Shapeways, а не каким-либо программным обеспечением для нарезки FDM.

Другим вариантом для моего кода было бы предоставить последовательность 2D-полигонов, по одному для каждого слоя печатной модели, чтобы последовательность была

неявная функция --> большой список срезов -->> gcode>>

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

Я полагаю, вопрос в том, существует ли существующий формат САПР, который поддерживает любой из этих вариантов, который также поддерживается существующим программным обеспечением slicer? Если это так, то я могу просто написать свой код для вывода в этом формате, и он должен просто работать.

, 👍4

Обсуждение

Вы смотрели "Математику"? Он будет выполнять параметрические графики, а также экспортировать STL-файлы. Версия 12 будет работать на Raspberry Pi (включая последнюю версию) и доступна бесплатно., @Mick

Этот последний подход вызвал у меня колокольчики OpenSCAD. Вы должны иметь возможность импортировать каждый слой в виде файла .dxf и сделать так, чтобы он отображал файл .stl из этого файла. Может быть, вы даже сможете реализовать эти функции непосредственно в OpenSCAD?, @towe

@towe Я мог бы импортировать каждый слой, но тогда как превратить его в сетку? Если бы мои формы были выпуклыми, я мог бы просто использовать " корпус ()", но обычно это не так. (Я большой поклонник OpenSCAD, но он напрямую не поддерживает неявные поверхности.), @Nathaniel

@Mick Mathematica очень **не** бесплатна. Вы можете получить бесплатный краткосрочный демо-пакет бесплатно, а в некоторых случаях можете получить его бесплатно, пока вы учитесь в участвующем колледже, но никогда полное приложение., @Carl Witthoft

@Натаниэль, не могли бы вы "linear_extrude", а затем "перевести" каждый срез на соответствующую высоту? Затем отрисовайте / экспортируйте как обычно., @towe

@towe это сработало бы, но тогда в модель были бы встроены линии слоев! (Опять же, если я удостоверюсь, что они имеют ту же высоту, что и слои на фактическом отпечатке, это может не иметь значения. Я мог бы поиграть с этим некоторое время, чтобы посмотреть, смогу ли я заставить его работать.), @Nathaniel

Вы видели ImplicitCAD http://kalli1.faikvm.com/ImplicitCAD/Stable (через https://hackaday.com/2016/04/18/implicitcad-programmatic-cad-built-with-3d-printing-in-mind/ ) ?, @David Cary

@DavidCary да. На самом деле, причина, по которой я этого хочу, заключается в том, что у меня есть собственная реализация неявного пакета САПР, аналогичного ImplicitCAD, за исключением того, что это Python вместо Haskell и имеет несколько иной набор функций, более соответствующий моим потребностям. (Возможно, однажды я его выпущу.) У ImplicitCAD та же проблема, что и у меня: прежде чем печатать его неявные функции, он должен сначала превратить их в сетки, что трудно сделать хорошо. ImplicitCAD использует вариацию алгоритма марширующих кубов, поэтому его сетки далеки от совершенства. Я надеюсь найти способ пропустить этот шаг., @Nathaniel

(В настоящее время я использую библиотеку C++ под названием CGAL для создания сеток, которая является той же библиотекой, которую использует OpenSCAD. Он генерирует гораздо лучшие сетки, чем марширующие кубы, и работает быстро, но, к сожалению, его неявная функция создания сетки немного нестабильна - вам приходится играть с большим количеством числовых параметров, и если вы ошибаетесь, это просто случайно не работает, или создает неправильный файл сетки, или иногда просто вылетает. Это делает его непригодным для публичного выпуска, что является одной из причин, по которой требуется лучшая альтернатива.), @Nathaniel


3 ответа


2

Нет, не изначально

На данный момент все часто используемые срезы используют какую-то 3D-модель с явными поверхностями, чтобы разрезать на срезы, а затем решить функции пути для создания G-кода. Модель может быть в STL или OBJ или в каком-либо другом формате, в зависимости от слайсера, но на данный момент (ноябрь 2019 года) ни одна программа нарезки, о которой я знаю, не поддерживает прямую математику в качестве ввода.

Может быть, сделать его самому?

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

Одним из программных средств, которые могут образовать базу, может быть Cura, которая позволяет писать плагины, поэтому может быть способ, чтобы Cura автоматически решала формулу поверхности, а затем подключала ее к нарезке без хранения промежуточных данных в виде STL.

Slic3r также может работать в качестве базы, так как весь исходный код открыт. Это была бы такая же попытка, как модификация Куры.


,

Спасибо, это полезная информация. Я бы не хотел сам писать целый слайсер - не составило бы труда решить уравнение, чтобы разрезать модель на кусочки, но в слайсере есть нечто большее, чем это, например, вычисление оптимального пути, создание опор, точная настройка температурных профилей и т. Д., Что, Вероятно, потребует многих лет работы, Чтобы разобраться. API Cura, похоже, недокументирован, поэтому трудно сказать, смогу ли я делать то, что хочу, написав плагин, но я рассмотрю его дальше. Для Slic3r, похоже, мне придется изменить саму базу кода, но это может быть проще, чем изменение Cura., @Nathaniel


1

Это частичный ответ, который я мог бы превратить в полный ответ, если продолжу его позже. (Я публикую сообщение на случай, если у кого-то еще есть тот же вопрос, и в этом случае это может быть полезно, несмотря на то, что оно неполное.)

Похоже, что формат 3mf имеет расширение среза, которое делает почти то, что я хочу - оно позволяет указать модель в виде серии полигонов, представляющих срезы, а не 3D-сетку. Поэтому в принципе я мог бы просто вывести файл 3mf, содержащий данные среза, и загрузить его в любой слайсер, поддерживающий это расширение.

К сожалению, это означало бы изучение того, что кажется довольно сложным форматом файла на основе XML, и я не уверен, какие слайсеры в настоящее время поддерживают расширение slice. Это, по-видимому, совсем недавняя вещь, и это может быть случай ожидания до тех пор, пока не будет доступна лучшая поддержка с точки зрения библиотек Python для записи файлов 3mf, а также поддержки slicer. (Существуют привязки Python для lib3mf, но их документация в настоящее время состоит из одного слова - "TODO".)

Существует также требование в спецификации, что любой файл 3mf, содержащий данные среза, также должен содержать сеточное представление объекта. Это раздражает, потому что весь смысл этой идеи заключается в том, чтобы избежать создания сетки. Я полагаю, что я мог бы просто вывести ограничивающую рамку или что-то еще вместо этого.

,

1

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

Я получил полезную подсказку от разработчика Cura BagelOrb в трекере проблем Cura:

Обратите внимание, что создание сетки не обязательно должно быть таким сложным делом, как вы думаете. Вам не нужно соединять слои вместе, вам нужно только придать вашим ломтикам высоту, чтобы Cura нарезала каждый слой точно там, где вы хотите.

Просто сгенерируйте 2D - полигоны, а затем вытяните каждый сегмент линии в два идеально вертикальных треугольника с той же высотой, что и предполагаемая высота слоя, - и БАЦ! ты получил то, что хотел.

Это похоже на предложение @towe, сделанное в комментариях к этому вопросу, но самое классное, что вам не нужно утруждать себя рендерингом верхней и нижней поверхности каждого среза, потому что слайсер все равно их просто проигнорирует. Это потому, что,по словам Бублика,

Первое, что делает CuraEngine, - это разрезает 3D-модель на полигоны, а остальная обработка использует только эти полигоны. 3D - модель используется только для вычисления площадей каждого слоя, а все остальные операции являются операциями над полигонами.

Ваша сетка не обязательно должна быть многообразной; только каждый срез должен быть замкнутым многоугольником.

Этап нарезки в CuraEngine состоит из 2 этапов:

  • для каждого треугольника сгенерируйте отрезки линий для каждого слоя с которым он пересекается
  • для каждого слоя стич все отрезки линии вместе в полигоны

Ваша модель может выглядеть так:

Это здорово, потому что верхнюю и нижнюю поверхности очень сложно сделать правильно. Это можно сделать в OpenSCAD с помощью linear_extrude, но объединение всех слоев вместе занимает чрезвычайно много времени. Таким образом, мой код может просто бросить все треугольники в STL-файл, и он будет правильно нарезан без каких-либо проблем.

Другая полезная информация в этом потоке заключается в том, что Cura будет разрезать модель посередине каждого слоя. Так вот где я должен нарезать свою собственную неявную модель поверхности для максимальной точности.

Я сделал быстрое доказательство концепции, и это, кажется, работает до сих пор. Я вручную создал файл ASCII STL, содержащий стороны куба размером 1 см без верхней или нижней поверхности. В режиме "подготовка" Cura видит его как пустотелую модель:

Но при нарезке он игнорирует отсутствующие грани и добавляет верхний и нижний слои и заливку, как и ожидалось:

Я, вероятно, отредактирую этот ответ еще раз, как только все будет готово и запущено.

,

Open SCAD может экспортировать данные в STL или другой формат, соответствующий источнику. Экспортированные файлы затем могут быть импортированы в такие программы, как blender, которые также уважают источник. Затем накопленные элементы могут быть экспортированы как один STL с несколькими оболочками., @Trish

@Триш, это, конечно, правда, и я бы подумал об этом. Тем не менее, я очень рад, что у меня есть этот метод, при котором мой код может просто создавать файл STL для печати напрямую, без каких-либо дополнительных действий., @Nathaniel

Отредактируйте и покажите нам результат этого ответа при его печати, @FarO

@FarO подойдет. (Это может занять некоторое время, потому что в данный момент я в отпуске.) Я сделал быстрое доказательство концепции и добавил несколько скриншотов, чтобы показать, что он действительно игнорирует отсутствующие лица., @Nathaniel

Вы пробовали установить верхний и нижний слои равными 0 в сочетании с этим?, @Trish