Jdi na navigaci předmětu

Programová manipulace s STL

Motivace

Kromě ručního zpracování meshe v programech, jako je netfabb Studio, 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 jsem na Fakultě informačních technologií, byla by škoda tento přístup neprozkoumat.

ADMesh

ADMesh je open-source program, který umožňuje manipulovat s STL meshí z příkazové řádky. Kromě rozhraní pro příkazový řádek je k dispozici také knihovní API.

Zde 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í.

#include <stdlib.h>
#include <admesh/stl.h>

int main(void) {
  stl_file stl_in;
  char *filename = "model.stl";

  printf("Opening %s\n", filename);
  stl_open(&stl_in, filename);
  stl_exit_on_error(&stl_in);

  if (stl_in.stats.type == binary) {
    printf("Writing ASCII file %s\n", filename);
    stl_write_ascii(&stl_in, filename, "ADMesh");
    stl_exit_on_error(&stl_in);
  } else {
    printf("Writing binary file %s\n", filename);
    stl_write_binary(&stl_in, filename, "ADMesh");
    stl_exit_on_error(&stl_in);
  }

  stl_close(&stl_in);
  return EXIT_SUCCESS;
}

Všimněte si, že:

  • funkce přijímají jako první argument ukazatel na strukturu stl_file
  • po každém volání funkce je korektní volat stl_exit_on_error(), jinak můžete dostat SEGFAULT
  • na konci se sluší volat stl_close()

Program se kompiluje pomocí:

gcc source.c -ladmesh -o myapp

Případně, pokud nemáte amdesh ve standardních cestách:

gcc -L/cesta/k/adresáři/knihovnou -I/cesta/k/adresáři/s/hlavičkovým/souborem source.c -ladmesh -o myapp

Výsledný program spustíte příkazem:

./myapp

Na některých systémech musíte použít:

LD_LIBRARY_PATH=/usr/local/lib ./myapp

Pro ty méně šťastné z vás, používající Windows, bohužel oficiální instrukce neznáme, máme ale nějaké screenshoty pro NetBeany od studentů.

Jednotlivé funkce a struktury najdete v souboru admesh/stl.h. Velkou dokumentací knihovna bohužel neoplývá.

Úkol

Za tři body na cvičení naprogramujte program v jazyce C, C++, Python nebo Ruby, který pro zadaný STL soubor (první argument volání programu) najde nejvhodnější rotaci kolem osy Z tak, aby plocha obdélníkové podstavy pomyslného opsaného hranolu objektu byla co nejmenší - hrany pomyslného opsaného hranolu jsou rovnoběžné s osami X, Y nebo Z.

Pokud chcete použít Python na školním počítači, musíte udělat (případně použít virtualenv):

pip3 install --user admesh

Ilustrační obrázek z netfabbu ukazující opsaný hranol s obdélníkovou podstavou:

hranol

Program vypíše do terminálu úhel otočení (ve stupních), obsah postavy opsaného hranolu, a do souboru zadaného druhým argumentem (z příkazové řádky) uloží orotovaný soubor v takovém formátu (ASCII/binary), v jakém byl načten vstupní soubor.

Pro ukázku můžete použít následující STL, ale program musí umět pracovat s jakýmkoliv STL.

Vhodný úhel nalezněte bruteforce metodou pro úhly otočení v násobcích 5° (5°, 10°, 15°, …​).

Vhodné funkce a údaje:

  • stl_rotate_z(&stl_in, angle_in_degrees) - rotuje kolem osy Z, o dany pocet stupnu
  • <stl_file>.stats.number_of_facets je počet trojúhelníků v STL
  • <stl_file>.facet_start je ukazatel na první trojúhelník (a jde k němu přistupovat jako k poli)
  • trojúhelníky jsou uloženy v strukturách stl_facet obsahující v trojprvkovém poli vertex tři vrcholy (struktura stl_vertex obsahující tři floaty x, y a z)
  • zajímavé údaje jsou uloženy i ve stl_file.stats