2013-08-29 4 views
0

Я пытаюсь сохранить некоторые данные в виде файла STL для использования на 3D-принтере. Файл STL имеет две формы: ASCII и Binary. Формат ASCII относительно прост для понимания и создания, но большинство услуг 3D-печати требуют, чтобы он был в двоичном формате.Сохранение двоичного файла STL в Java

Информация о СТЛ Binary объясняется на странице Википедии здесь: http://en.wikipedia.org/wiki/STL_(file_format)

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

код я до сих пор просто сохраняет пустой массив байтов:

byte[] bytes = null; 
FileOutputStream stream = new FileOutputStream("test.stl"); 
    try { 
     stream.write(bytes); 
    } finally { 
     stream.close(); 
} 

ответ

1

Если начать новый проект на уточненный Java версии, вы не должны хлопот с OutputStreams. Вместо этого используйте каналы и ByteBuffers.

try(FileChannel ch=new RandomAccessFile("test.stl", "rw").getChannel()) 
{ 
    ByteBuffer bb=ByteBuffer.allocate(10000).order(ByteOrder.LITTLE_ENDIAN); 
    // ... 
    // e.g. store a vertex: 
    bb.putFloat(0.0f).putFloat(1.0f).putFloat(42); 
    bb.flip(); 
    ch.write(bb); 
    bb.clear(); 
    // ... 
} 

Это единственный API, обеспечивающий минимально-ориентированную поддержку по мере необходимости. Тогда совпадают типы данных: UINT8 означает байты без знака, UInt32 означает неподписанные Int, REAL32 означает поплавок, UInt16 означает беззнаковый короткий, REAL32 [3] означает, что три поплавков (т.е. массив)

Вы не имеете беспокоиться о неподписанном характере типов данных, если вы не превысите максимальные значения соответствующих подписанных типов Java.

+0

Спасибо. Поэтому, если я правильно понял, это может быть заголовок и треугольник: 'String title =" testing "; \t \t \t bb.put (title.getBytes ("UTF-16")); // Заголовок (80 байт) \t \t \t bb.putInt (32); // Число треугольников (UINT32) ' –

+0

И это может быть использовано для каждого треугольника:' bb.putFloat (0) .putFloat (0) .putFloat (0); \t \t \t bb.putFloat (0) .putFloat (0) .putFloat (0); \t \t \t bb.putFloat (0) .putFloat (0) .putFloat (0); \t \t \t bb.putFloat (0) .putFloat (0) .putFloat (0); \t \t \t bb.putShort ((short) 12); ' –

+0

Я понял это. Я забыл сделать заголовок фиксированным байтом [80]. –

0

Вы должны генерировать этот файл в ASCII и использовать ASCII в двоичный STL конвертер.

Если вы не можете ответить на этот вопрос самостоятельно, это, вероятно, будет проще сделать это сначала в ascii.

http://www.thingiverse.com/thing:39655

+0

Я хотел бы узнать, как это сделать. Я ищу некоторые общие советы и руководства по этой теме - я не просто ищу решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^