Programová manipulace s STL soubory
Kromě ručního zpracování meshe v programech, jako je Netfabb Basic, je možné mesh zpracovávat i programově – tedy vytvářet programy, které s meshí něco více či méně zajímavého provádějí. Protože jsme na Fakultě informačních technologií, byla by škoda tento přístup neprozkoumat.
Možnosti zpracování meshe ve formátu STL
Formát STL je velmi jednoduchý. Jeho popis najdete ve cvičení, které se věnuje meshi a chybám v ní. Načítat a ukládat soubory ve formátu STL není tedy žádná raketová věda, ale jedná se o poměrně nudné programování.
Naštěstí již existují hotové open-source knihovny, které toto řeší za nás.
Knihoven je celá řada, najít vhodnou knihovnu pro vás oblíbený jazyk je otázka několika vteřin vyhledávání na internetu. Zde namátkou zmíníme:
- numpy-stl pro Python + NumPy
- STLdotNET pro C#
- STL-Loader pro Javu
- …
My budeme používat knihovnu ADMesh, která je napsaná v jazyce C, dá se jednoduše použít v jazyce C++, existují bindingy pro jazyky Python a Ruby.
ADMesh
ADMesh je open-source program, který umožňuje manipulovat s STL meshí z příkazové řádky. Kromě rozhraní pro příkazovou řádku je k dispozici také knihovní API, které ale původně nevzniklo s úmyslem znovupoužitelnosti, takže je mnohdy jeho použití neintuitivní.
Instalace knihovny
Pro použití knihovny ADMesh je třeba nejprve knihovnu nainstalovat.
Pokud používáte Linux, můžete prozkoumat balíčky vaší distribuce,
zajímají vás balíček devel
nebo dev
, abyste dostali hlavičkové
soubory a jiné věci potřebné pro kompilaci programů využívajících ADMesh.
V distribuci Fedora tedy chcete balíček admesh-devel
,
v distribuci Debian pak libadmesh-dev
.
V každém případě potřebujete verzi 0.98.x,
starší verze obsahují pouze program pro příkazovou řádku.
Pro macOS můžete využít homebrew.
Pro operační systém Windows pak existují předkompilované archivy dostupné na GitHubu.
Na všech podporovaných systémech můžete knihovnu zkompilovat sami ze zdrojových kódů.
Vlastní sestavení na Linuxu
Po stažení admesh-0.98.5.tar.gz a rozbalení:
Pro kompilaci zdrojového kódu do programu je třeba linkeru říct, že chceme použít knihovnu ADMesh, a předat kompilátoru cestu k hlavičkovému souboru a knihovně:
Instalace a kompilace ADMesh na macOS
Pro instalaci využijeme Homebrew. Pokud nemáte nainstalovaný, nainstalujte ho podle návodu na https://brew.sh/
Pro kompilaci zdrojového kódu do programu je třeba linkeru říct, že chceme použít knihovnu ADMesh, a předat kompilátoru cestu k hlavičkovému souboru a knihovně:
Základní použití
Pro použití knihovny stačí naincludovat hlavičkový soubor admesh/stl.h
:
V knihovně existuje sada struktur a funkcí, které můžete využít pro základní manipulaci s STL modely.
Načtení modelu ze souboru
Nejprve je třeba soubor načíst z disku do struktury stl_file
.
Kompilace programu
Pro kompilaci zdrojového kódu do programu je třeba linkeru říct, že chceme použít knihovnu ADMesh:
Případně, pokud nemáte ADMesh nainstalovaný ve standardních cestách, je třeba nastavit absolutní cesty ke knihovně i hlavičkovému souboru:
stl_file
Práce se strukturou Po načtení souboru do paměti je možné se strukturou stl_file
nadále jakkoliv
pracovat. Například prohlížet nebo měnit data.
Struktura již není datově svázána se souborem na disku a všechna data jsou v paměti programu.
Pro prohlížení jednotlivých facetů je možné použít ukazatel (pole) facet_start
.
V poli jsou uloženy facety ve formě struktur stl_facet
,
které obsahují normálu – atribut normal
(struktura typu stl_normal
obsahující 3 floaty (x
, y
, z
)),
tři vertexy – atribut vertex
(pole tří struktur typu stl_vertex
každá obsahující 3 floaty (x
, y
, z
)) a atribut extra
, který můžete ignorovat.
Abyste mohli procházet všechny facety, potřebujte nejprve vědět, kolik jich je.
Tyto informace najdete v atributu stats
, který obsahuje strukturu se spoustou
užitečných dat, většinou čísel.
Jedním z nich je number_of_facets
, tedy počet facetů.
Ve statistikách (stats
) najdete další informace,
jejichž přehled je v definici struktury stl_stats
v souboru stl.h
nebo v nepříliš dobré dokumentaci.
Zde je na ukázku krátký program, který načte STL soubor model.stl
(binární nebo ASCII) a zapíše jej jako ASCII nebo binární STL do
stejného souboru – z binárních dělá ASCII a z ASCII dělá binární.
Data můžete libovolně prohlížet a měnit. Pokud chcete například model zvětšit, teoreticky stačí provést patřičnou matematickou operaci se všemi souřadnicemi všech vertexů všech facetů.
Většinu základních operací ale již autoři programu pokryli.
Funkce pro manipulaci s modelem
Pro „typické“ operace s 3D modelem existují předpřipravené funkce. V knihovně tak naleznete funkce na otáčení, škálování, přesouvání…
Většinou se stačí podívat na jejich seznam v hlavičkovém souboru.
Mezi ty zajímavé patří:
void stl_translate(stl_file *stl, float x, float y, float z)
void stl_translate_relative(stl_file *stl, float x, float y, float z)
void stl_scale_versor(stl_file *stl, float versor[3])
void stl_scale(stl_file *stl, float factor)
void stl_rotate_x(stl_file *stl, float angle)
(úhel ve stupních)void stl_rotate_y(stl_file *stl, float angle)
(úhel ve stupních)void stl_rotate_z(stl_file *stl, float angle)
(úhel ve stupních)void stl_mirror_xy(stl_file *stl)
void stl_mirror_yz(stl_file *stl)
void stl_mirror_xz(stl_file *stl)
Varování:
Veškeré funkce pracují přímo nad zadaným modelem (in place) a nic nevrací. Pokud tedy například třikrát naškálujete model na dvojnásobek, bude osmkrát tak veliký, než na začátku.
Funkce pro zapsaní modelu do souboru
Po skončení práce s modelem je často třeba model opět zapsat na disk (vyexportovat).
K zapsání modelu ve formátu STL slouží funkce stl_write_ascii()
a stl_write_binary()
,
které se liší ve výsledném formátu: zapisují ASCII STL, respektive binární STL.
Obě funkce berou tři argumenty:
- referenci na strukturu
stl_file
, - cestu na disku (kam soubor zapsat),
- jméno meshe.
Jméno meshe nesouvisí z názvem souboru,
ale jde pouze o textovou informaci uloženou v STL souboru.
Tato informace není v praxi využívána a často se nahrazuje názvem programu,
který mesh vytvořil.
Například modely z programu OpenSCAD se jmenují vždy OpenSCAD_Model
.
Varování:
Po zavolání funkce je třeba ošetřit případnou chybu, stejně jako v případě načtení souboru!
Ukázka programu pro převod ASCII/binárního STL
Pro ukázku kompletní program pro převod ASCII STL souboru do binární formy (nebo obráceně).
Další informace
Jednotlivé funkce a struktury knihovny najdete v souboru
admesh/stl.h
.
Velkou dokumentací knihovna bohužel neoplývá, i když něco vzniká na
admesh.readthedocs.io.