Václav Černík

Blog o moderních technologiích Algoritmické 3D modelování – OpenSCAD (a ChatGPT)

3D modely lze kromě běžných 3D modelovacích nástrojů vytvořit i pomocí algoritmu. Pro některé modely, zejména kde je nějaký vzorec opakování, je využití algoritmů ideální. V tomto článku využijeme OpenSCAD, ve kterém algoritmus píšeme pomocí kódu. V jednom příkladu si pomůžeme také umělou inteligencí.

Algoritmické 3D modelování – OpenSCAD (a ChatGPT)

Úvod

OpenSCAD je open-source modelovací nástroj, stáhnout si jej můžete zdarma na https://openscad.org/

Do levé části píšeme kód (algoritmus) – pokud chceme vytvořit kvádr, jednoduše napíšeme příkaz cube([5,10,15]); a stiskneme klávesu F5 (nebo příslušné tlačítko v horní liště). V pravé části se objeví výsledek algoritmu – vytvořený kvádr.

OpenSCAD

Základní syntaxe odpovídá následujícímu obrázku. Typickou akcí může být vytváření objektů (kvádr, koule, válec, atd.), typickým operátorem může být posun, rotace, sjednocení, rozdíl apod. Všimněte si umístění závorek a středníků.

Základní syntaxe

Ukázka – kvádříky s krátkým textem

Typickým úkolem pro algoritmické modelování je vytvoření modelu (nebo sady modelů), kdy se něco opakuje, případně drobně vzájemně liší. Pokud chcete vytisknout spoustu destiček s různým textem (definovaným na začátku kódu), můžete použít následující kód:

// Definice textů
items=["Ge","Ni", "U", "S"];

// Cyklus, který prochází všechny texty a vytváří z nich destičky
for(i=[0:len(items)-1]){
    translate([11*i,0,0]){
        linear_extrude(1){
            text(items[i],size=5,halign="center", valign="center" );
        }
        cube([10,10,1],center=true);
    }
}

Krátký popis: každý text (příkaz text) je obalován příkazem linear_extrude, který z textu vytvoří 3D objekt. Následně je k textu přidán kvádr (příkaz cube), který slouží jako podstavec. Podstavec a text jsou posunuty do správné pozice pomocí příkazu translate. Cyklus for prochází všechny texty a vytváří z nich destičky. Výsledkem je sada destiček s textem.

A zde je výsledek: (Následně můžete exportovat soubor ve formátu STL, ve kterém jsou všechny části.)

Kvádříky s textem

Ukázka – štítky s pořadovým číslem

Tento příklad vychází z praxe, kdy jeden pan učitel chtěl vytvořit štítky, které bude moct zapíchnout do květináčů a které budou mít pořadové číslo.

Pro běžné modelování raději sáhnu po parametrickém modelování (např. Onshape nebo Fusion 360), práce mi přijde intuitivnější a rychlejší. Následující štítek jsem proto modeloval v Onshape.

Štítek

Následuje úkol: vzít co nejvíce štítků, narovnat je vedle sebe tak, aby se vešly na tiskovou plochu a na každý štítek napsat pořadové číslo. Samozřejmě by to šlo postupně přímo v Onshape, šlo by to také v PrusaSliceru, ale při větším množství se již může vyplatit algoritmus v OpenSCADu.

A že neumíte programovat? Zkuste využít AI. Následující kód totiž vygeneroval model ChatGPT 4o (s předchozími verzemi ChatGPT jsem nebyl tolik úspěšný, aktuální verze je již velmi dobře použitelná, produkuje funkční a hezký kód s dostatkem komentářů).

Prompt: Mám ve formátu STL štítek (destičku) (stitek.stl) o rozměru 15x100 mm. Potřebuji jich vedle sebe (s drobným odstupem) narovnat co nejvíce tak, aby se celek vešel na tiskovou plochu Průša MK4. Na každém štítku navíc vygeneruj pořadové číslo od 1. Využívám OpenSCAD, napiš mi vhodný kód.

Funkční kód, který napsal ChatGPT (s drobným manuálním zásahem):

// Definice rozměrů
stitek_length = 15;
stitek_width = 100;
tiskova_plocha_length = 250;
tiskova_plocha_width = 210;
odstup = 2; // Odstup mezi štítky

// Vypočítání maximálního počtu štítků na plochu
max_pocet_v_radku = floor((tiskova_plocha_length + odstup) / (stitek_length + odstup));
max_pocet_v_sloupci = floor((tiskova_plocha_width + odstup) / (stitek_width + odstup));

module stitek(text_num) {
    import("stitek.stl");
    translate([0, stitek_width/2, 2])
    linear_extrude(height = 1)
        text(str(text_num), size = 5, valign = "center", halign = "center");
}

for (i = [0:max_pocet_v_radku-1]) {
    for (j = [0:max_pocet_v_sloupci-1]) {
        translate([(stitek_length + odstup) * i, (stitek_width + odstup) * j, 0])
            stitek(i * max_pocet_v_sloupci + j + 1);
    }
}

Tento kód je principiálně podobný předchozí ukázce. Základem je funkce import, která načte model ve formátu STL. Následně je model zopakován a na každý štítek je napsáno pořadové číslo. Každý štítek je posunut do správné pozice pomocí příkazu translate. Cyklus for prochází všechny možné pozice štítků na tiskové ploše a vytváří z nich štítky s pořadovým číslem.

ChatGPT tedy může být velmi dobrým pomocníkem při psaní algoritmů pro OpenSCAD. Pozitivně mě překvapila čistota kódu, definice proměnných a komentáře. A hlavně, že to funguje :-)

Štítky Štítky - MK4

Užitečné odkazy

Algoritmy nemusíte tvořit od začátku sami, můžete využít již hotových knihoven:



Algoritmické 3D modelování – OpenSCAD (a ChatGPT)

Autor: Václav Černík
Napsáno 13. 6. 2024

Témata:
Algoritmizace
3D modelování a 3D tisk

Líbil se vám článek? Sdílejte ho!
➡️ Sdílet na Facebook

Přejít na seznam všech článků.

Nabídka školení
Nabízím školení, která poskytnou všechny potřebné znalosti a dovednosti k ovládnutí 3D tisku a 3D modelování.

➡️ 3D tisk a 3D modelování – dvoudenní kurz jen za 1395 Kč

➡️ 3D tisk a 3D modelování: základní kurz

➡️ 3D tisk a 3D modelování: pro pokročilé

Více informací o školeních

Novinky na Váš e-mail

Zajímají vás novinky ze světa 3D tisku, algoritmizace, programování nebo výuky (pomocí) moderních technologií?
Zadejte Váš e-mail a já Vám pošlu zajímavé informace (maximálně jednou měsíčně).