Формат STL


Формат STL был разработан для нужд стереолитографии и предназначен для представления трёхмерных моделей. Он включает в себя описание треугольников из которых состоит поверхность объекта. Основное его достоинство - это простота по сравнению с другими форматами. Сокращение STL применяется и в других смыслах: в С++ ( стандартная библиотека шаблонов ), в Windows ( список доверия сертификатов ). Есть два типа STL-форматов: текстовый (ASCII) и бинарный. Бинарный вариант файла занимает меньше места, чем текстовый. В свою очередь текстовый вариант можно переносить на компьютор с другим представлением чисел и числа могут иметь произвольное к-во знаков.

Текстовый STL-файл должен начинаться ключевым словом solid и заканчиваться endsolid. После слова solid ( в этой же строке ) можно поместить комментарий ( что за объект, кто его сделал и т.д. ). Далее идут описания треугольников. Описание каждого треугольника включает описание единичного вектора нормали и трёхмерные координаты вершин. Все координаты представлены в декартовой системе координат и записаны в виде чисел с плавающей точкой:

solid < комментарий >
...
facet normal 0.319575 -0.175216 -0.93122
outer loop
vertex 2.22934 -0.992723 -0.862826
vertex 2.41037 -0.777999 -0.841105
vertex 2.40731 -0.97498 -0.805091
endloop
endfacet
...
endsolid
Бинарный STL-файл условно можно изобразить следующим образом:
struct facet
{
    float normal[3];     // 12 байт
    float vertex[3][3];  // 36 байт
    unsigned short attr; // 2 байта
};

struct stl_file
{
    char   head[80]; // комментарий   - 80 байт
    unsigned long n; // к-во граней   - 4  байта
    facet    arr[n]; // массив граней - n * 50 байт
};

Здесь всё понятно за исключением поля attr в структуре facet. В спецификации написано, что его значение не задокументировано и поэтому равно 0.

В файле fileSTL.cpp находятся 4 функции чтения-записи в STL-файл:

typedef unsigned int nat;

bool loadSTLA ( IReadSeekFile & file, nat & ntext, char * text, Poly3gon<Vector3f, Vector3f> & poly );
bool loadSTLB ( IReadFile & file, nat & ntext, char * text, Poly3gon<Vector3f, Vector3f> & poly );

bool saveSTLA ( IWriteFile & file, nat ntext, const char * text, const Poly3gon<Vector3f, Vector3f> & poly, nat prec );
bool saveSTLB ( IWriteFile & file, nat ntext, const char * text, const Poly3gon<Vector3f, Vector3f> & poly );

Здесь ntext - количество знаков в текстовом сообщении, text - указатель на массив с текстовым сообщением, prec - количество знаков после запятой для представления чисел.

Небольшая коллекция STL-файлов находится здесь. Их можно посмотреть при помощи приложения DEMO или GraphViewer.

О классах IReadFile и IWriteFile смотрите здесь.

О шаблоне Poly3gon смотрите здесь.

Наверх