Изменение командной строки и упрощение инструментов

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

Размер необработанного файла перед обработкой составляет ~4,9 ГБ.

Я в настоящее время пытается это на моем домашнем ПК (16 ГБ оперативной памяти, процессор AMD FX9590, двойной RX480s - так не сутулиться, как ни крути), но в настоящее время я наблюдал за ходом (не быстро), и оперативной памяти тревожно близко к 16 ГБ сейчас, причем около 40% из расчета до сих пор в ходу.

Я использую децимацию квадратичного коллапса ребер MeshLab, чтобы уменьшить примерно на 60%, так как существует много внутренних вершин избыточности и т. Д., И печать уже будет довольно сложной даже при небольшом количестве граней.

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

Первый пост на этой странице, так что приношу извинения, если это относится к другому месту.

, 👍8


1 ответ


6

Netfabb выдвинул ряд предложений, которые я нашел. Взгляните на 3D-печать в Arch Linux, где предлагается ряд решений для Linux, в том числе:

  • OpenSCAD
  • FreeCAD
  • Блендер
  • НетФабб
  • Slic3r

Нетфабб

В разделе о Netfabb:

netfabb Private предоставит вам полный набор инструментов для всего этого и многого другого:

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

Установка:

netfabb отсутствует в официальном репозитории, поэтому его необходимо установить из AUR. с помощью Yaourt

$ yaourt netfabb-basic
$ netfabb-basic

Однако неясно, существует ли линейный интерфейс cmd. Возможно, стоит прочитать Проблема в командной строке Netfabb выполнение и в частности документацию по Автоматизация Netfabb — хотя это, похоже, предполагает, что функции командной строки доступны только пользователям с подпиской Ultimate, а не Basic:< /p>

Автоматизация Netfabb

От Уменьшение размера файла STL для загрузки в shapeways, в этом сообщении (#10) говорится:

Вы также можете легко уничтожить модель в Netfabb: щелкните правой кнопкой мыши > Уровень детализации > выберите что-то вроде 50%... или больше или меньше в зависимости от требуемого уровня детализации.

Хотя это недоступно в подписке Basic, по крайней мере, так написано сообщение №12.


Meshmixer

Я также столкнулся с этой опцией, не связанной с командной строкой.

Из Как уменьшить файл Размер 3D-моделей .STL и .OBJ

Например, вы можете попробовать бесплатную программу 3D-моделирования Meshmixer. Выберите инструмент «Выбор» в меню справа, затем дважды щелкните модель (это выделит всю сетку). Затем нажмите «Изменить…» и выберите «Уменьшить».

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

Доступно для Windows и OS X.

От Уменьшение размера файла STL для загрузки в shapeways, в этом сообщении (#8) говорится:

Учебник meshlab — это именно то, что вам нужно: описанные параметры помогают сохранить общую геометрию модели, уменьшение количества полигонов. Начните с цели в 150 000 полигонов и работайте до тех пор, пока не сохранится желаемая детализация, помня о пригодности для печати, о которой я упоминал выше.

Кроме того, с помощью Quora Как уменьшить размер файла STL? Влияет ли это на координаты САПР для 3D-печати?, я также нашел это руководство по Meshmixer: Простое руководство по восстановлению файлов .STL. В разделе Проблема 4: размер файла слишком велик для 3D-печати приведены следующие шаги:

Последняя проблема, с которой вы можете столкнуться, особенно объекты становятся больше, а их сложность возрастает, заключается в том, что результирующий размер файла .stl слишком велик для вашего 3D-принтера или 3D-принтера. типография на выбор. Сторонние службы печати, такие как i.materialise или Shapeways имеют ограничения на загрузку поэтому вам, возможно, придется измените размер файла (100 МБ для imaterialise и 64 МБ для Шейпвейс). Важно уменьшить размер сетки, не жертвуя качество, которое я должен сказать в самом начале, лучше всего сделать на начальном этапе экспортировать из вашего программного обеспечения САПР, чтобы свести к минимуму любые искажения. Мой номер один быстро Совет - убедитесь в настройках экспорта, что ваше сохранение в «Двоичный» формат, а не «ASCII» — это значительно более компактный файл. формат для .stl без потери качества). Однако если это не вариант, Meshmixer может быть очень полезен для быстрого уменьшения размера файла и визуализируйте, как это повлияет на качество ваших поверхностей.

Для этого примера я собираюсь вернуться к листу из Задачи 1, который в виде файла .stl составляет 30,757 МБ — довольно много для такого маленького дизайна и определенно превышает лимит для чьей-то электронной почты, если я хочу отправить ее. Итак, давайте посмотрим, как мы можем уменьшить его размер до 10 МБ.

  1. Выберите всю модель, нажав Ctrl + A на клавиатуре, чтобы выбрать все.
  2. Перейдите к Редактировать>Уменьшить, чтобы вызвать параметры для уменьшения сетки. По сути, размер файла .stl напрямую связан с числом многоугольников (треугольников), составляющих все поверхности. Мы будем использовать инструмент Уменьшить, чтобы уменьшить количество полигонов, тем самым уменьшая размер файла.
  3. Меню предлагает ряд вариантов уменьшения размера файла. Самый простой — использовать параметр «Процент» по умолчанию, позволяя вам определить окончательный размер файла, который вы хотите, а не необходимо точно знать, сколько треугольников будет использовано для составления файл. В этом случае я рассчитал, что для того, чтобы получить исходный .stl меньше 10 МБ, мне нужно уменьшить его на 70 % или больше. Как ты отрегулируйте значения, вы получите предварительный просмотр того, как будет выглядеть ваша модель как, позволяя вам контролировать, насколько сокращение вы используете до модель становится слишком искаженной и «пиксельной».

Уменьшить диалог

  1. Когда вы будете довольны и примете изменения, вы можете нажать кнопку «Экспорт» или перейти к Файл>Экспорт, чтобы сохранить этот новый сокращенный .stl. файл. Как видно из приведенного ниже сравнения, почти нет ощутимая разница в качестве файла размером 30,757 МБ по сравнению с с окончательной уменьшенной версией размером 9,362 МБ. Я просто увеличил размер треугольников, сводя к минимуму количество, необходимое для создания такой же объем. Ваш обычный 3D-принтер или даже высокоточный SLS принтер никогда даже не узнает разницу в таком изменении. Только если вы действительно сойдете с ума от сокращения файлов, которые вы могли бы начать замечать их в вашем окончательном отпечатке (и на самом деле многие из можно производить низкополигональные модели, популярные на Pinshape используя эту технику - начните с подробного .stl объекта, который вы хотите, а затем просто продолжайте уменьшать количество треугольников!).

Уменьшение размера файла

Блендер

От Уменьшение размера файла STL для загрузки в shapeways, в этом сообщении (#8) говорится:

Другой вариант — импортировать модель в Blender, а затем использовать модификаторы Remesh или Decimate. Поначалу освоить Blender может быть сложно, но на YouTube есть множество вводных руководств, которые помогут вам.

Blender предлагает интерфейс командной строки (CLI), см. Аргументы командной строки:

Использование: blender [аргументы …] [файл] [аргументы …]

Однако, похоже, нет вариантов для Remesh или Decimate. Хотя взгляните на Можно ли уничтожить или пересоздать через интерфейс командной строки?:

Вы можете указать сценарий Python для запуска, см. параметры Python. раздел документации, на которую вы ссылаетесь. В этом скрипте вы можете импортировать модель, добавлять модификаторы, применять их и экспортировать результат.

Связано — является возможно ли автоматически упростить геометрию в блендере без потери формы объекта?, который имеет этот комментарий:

Есть ли способ выполнить этот модификатор из командной строки и экспортировать результат?

что затем приводит к Могут ли модификаторы быть вычисляется и применяется из командной строки?

Вы должны использовать bpy. ops.object.modifier_apply, например

import bpy

for obj in bpy.context.scene.objects:
    bpy.context.scene.objects.active = obj
    count = 1
    length = len(obj.modifiers)
    while obj.modifiers:
        name = obj.modifiers[0].name
        print("%s: Applying %s (%d/%d)" % (obj, name, count, length))
        bpy.ops.object.modifier_apply(modifier=name)
        count += 1
print("All done.")

Информацию о том, как запустить вышеуказанное, см. здесь.< /p>

Сетка

Поскольку вы уже используете Meshlab, возможно, стоит прочитать Выполнение meshlab из командной строки итеративным уменьшением граней сетки (awesomebytes/reduce_faces.py)

#!/usr/bin/env python

import sys
import os
import subprocess

# Script taken from doing the needed operation
# (Filters > Remeshing, Simplification and Reconstruction >
# Quadric Edge Collapse Decimation, with parameters:
# 0.9 percentage reduction (10%), 0.3 Quality threshold (70%)
# Target number of faces is ignored with those parameters
# conserving face normals, planar simplification and
# post-simplimfication cleaning)
# And going to Filter > Show current filter script
filter_script_mlx = """<!DOCTYPE FilterScript>
<FilterScript>
 <filter name="Quadric Edge Collapse Decimation">
  <Param type="RichInt" value="1448" name="TargetFaceNum"/>
  <Param type="RichFloat" value="0.9" name="TargetPerc"/>
  <Param type="RichFloat" value="0.3" name="QualityThr"/>
  <Param type="RichBool" value="false" name="PreserveBoundary"/>
  <Param type="RichFloat" value="1" name="BoundaryWeight"/>
  <Param type="RichBool" value="true" name="PreserveNormal"/>
  <Param type="RichBool" value="false" name="PreserveTopology"/>
  <Param type="RichBool" value="false" name="OptimalPlacement"/>
  <Param type="RichBool" value="true" name="PlanarQuadric"/>
  <Param type="RichBool" value="false" name="QualityWeight"/>
  <Param type="RichBool" value="true" name="AutoClean"/>
  <Param type="RichBool" value="false" name="Selected"/>
 </filter>
</FilterScript>
"""


def create_tmp_filter_file(filename='filter_file_tmp.mlx'):
    with open('/tmp/' + filename, 'w') as f:
        f.write(filter_script_mlx)
    return '/tmp/' + filename


def reduce_faces(in_file, out_file,
                 filter_script_path=create_tmp_filter_file()):
    # Add input mesh
    command = "meshlabserver -i " + in_file
    # Add the filter script
    command += " -s " + filter_script_path
    # Add the output filename and output flags
    command += " -o " + out_file + " -om vn fn"
    # Execute command
    print "Going to execute: " + command
    output = subprocess.check_output(command, shell=True)
    last_line = output.splitlines()[-1]
    print
    print "Done:"
    print in_file + " > " + out_file + ": " + last_line


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print "Usage:"
        print sys.argv[0] + " /path/to/input_mesh num_iterations"
        print "For example, reduce 10 times:"
        print sys.argv[0] + " /home/myuser/mymesh.dae 10"
        exit(0)

    in_mesh = sys.argv[1]
    filename = in_mesh.split('/')[-1]
    num_iterations = int(sys.argv[2])

    folder_name = filename.replace('.', '_')
    tmp_folder_name = '/tmp/' + folder_name + '_meshes/'

    print "Input mesh: " + in_mesh + " (filename: " + filename + ")"
    print "Num iterations: " + str(num_iterations)
    print "Output folder: " + tmp_folder_name
    try:
        os.mkdir(tmp_folder_name)
    except OSError as e:
        print >> sys.stderr, "Exception creating folder for meshes: " + str(e)
        exit(0)
    for it in range(1, num_iterations):
        if it == 1:
            out_mesh = tmp_folder_name + folder_name + "_it" + str(it) + ".dae"
            reduce_faces(in_mesh, out_mesh)
        else:
            out_mesh = tmp_folder_name + folder_name + "_it" + str(it) + ".dae"
            reduce_faces(last_out_mesh, out_mesh)
        last_out_mesh = out_mesh

    print
print "Done reducing, find the files at: " + tmp_folder_name

Также

вот некоторые обновления для Python 3.6.2: https://gist.github.com/tylerlindell/7435ca2261e7c404ccc1241f18e483aa


,

Это полезно спасибо! Я просто добавлю, что впоследствии я обнаружил, что в Meshlab есть CLI-инструмент meshlab-server, установленный вместе с GUI-инструментом. Я еще не проверял это, но теоретически это должно быть так же просто, как выяснить синтаксис/команду командной строки, чтобы вызвать что-то вроде квадратичного прореживания и т. д., @Joe Healey

А, молодец @JoeHealey, это превосходно. Может быть, вы могли бы опубликовать ответ, как только вы это поняли? Вероятно, это поможет другим с той же проблемой. Я сам был бы заинтересован в таком решении., @Greenonline

обязательно сделаю. Мне пришлось отложить печать на потом, пока я заканчиваю писать диссертацию, но я намерен вернуться к ней, когда у меня будет больше свободного времени :), @Joe Healey