S mou OpenSCAD knihovnou A2D jste se na tomto blogu naposledy potkali ve verzi 1.1.0, ve které jsem přidal podporu pro práci s textem. Teď je venku verze 1.4.0 a s ní pár užitečných triků.

Kontrola verze

Doporučený kód pro použití knihovny vypadá takto:

include <A2D.scad>; // https://github.com/ridercz/A2D
assert(a2d_required([1, 4, 0]), "Please upgrade A2D library to version 1.4.0 or higher.");

Využívá funkci a2d_required, která vrací true, pokud je linkovaná knihovna stejné nebo vyšší verze, než jak je specifikováno. Je určena k využití v rámci nového příkazu assert, který umožní vyhodit chybu, pokud není splněna zadaná podmínka.

Aktuální verzi knihovny můžete získat jako konstantu a2d_version. Stejně jako v případě argumentu funkce a2d_required se jedná o seznam o třech položkách, jehož formát je [major, minor, revision].

Změna logiky vector_point

Změnil jsem logiku funkce vector_point, která se nyní řídí pravidlem pravé ruky, stejně jako transformace rotate v OpenSCADu a všechny ostatní funkce v knihovně A2D. Je to breaking change, ale je to IMHO nutné pro konzistenci a doufám, že tolik lidi ještě knihovnu A2D nepoužívá, aby jim to způsobilo podstatné problémy.

Nové tvary

Přidal jsem podporu pro vroubkované (knurled) kruhy - knurled_circle. Jejich typické použití je, když chcete udělat ovládací kolečko, kterým má někdo točit. Hladký okraj není příliš vhodný, protože klouže. Pročež je lepší po obvodu udělat vroubky, za které se prsty zachytí.

Výtečně je to vidět na příkladu KnurledKnob.scad, což je univerzální parametrický knoflík na osu s čtvercovým průřezem. Potřeboval jsem držák na elektrorozvodnou skříň v domě, ježto mě rozčilovalo, že je pořád otevřená. Fuck that, I'll just print it!

Také jsem přidal modul pro vytvoření kruhové výseče (pie, neboli koláč). Jako argumenty si bere průměr (d) a počáteční a koncový úhel a1 a a2. Když mluvím o novinkách v OpenSCADU 2019.05, asi nejhůře pochopitelné jsou list generators, tedy funkce pro generování seznamů. Modul Pie obsahuje jeden takový typický. Pojďme se podívat na její zdroják, je jednoduchý:

module pie(d, a1, a2) {
    assert(d > 0);

    mask_points = [
        [0, 0],
        for(i = [0:4]) vector_point(((4 - i) * a1 + i * a2) / 4, d)
    ];

    intersection() {
        circle(d = d);
        polygon(mask_points);
    }
}

Výseč vytvářím tak, že provedu intersection mezi kruhem (circle) a polygonem, který je spočítán na základě zadaných úhlů. Pokud bych se mohl spolehnout na to, že začátek a konec výseče bude v jednom kvadrantu, bylo by to jednoduché. Stačilo by vytvořit trojúhelník, jehož souřadnice by byly následující:

mask_points = [
    [0, 0],                     // střed
    [cos(a1) * d, sin(a1) * d], // počáteční úhel
    [cos(a2) * d, sin(a2) * d], // koncový úhel
];

Mohu si to ještě zjednodušit, protože pro projekci bodu na základě úhlu a vzdálenosti mám dříve zmíněnou funkci vector_point:

mask_points = [
    [0, 0],                     // střed
    vector_point(a1, d),        // počáteční úhel
    vector_point(a2, d),        // koncový úhel
];

Nicméně, pokud se úhly a1 a a2 nenacházejí v témže kvadrantu, nehezky se nám to komplikuje. Nestačí trojúhelník, ale je nutné udělat něco jako několik segmentů deštníku, v závislosti na tom, jak velký úhel je. Nejvyšší nutný počet segmentů je 4. Prostě vezmu úhel, který rozdělím na čtvrtiny a vytvořím odpovídající polygon.

Mohu to samozřejmě udělat ručně, jako třeba uživatel nophead na OpenSCAD fóru. Post je z roku 2012, takže mu nic jiného nezbylo, ale dnes máme možnost používat generátory seznamů, takže seznam bodů polygonu vygenerujeme takto:

mask_points = [
    [0, 0],
    for(i = [0:4]) vector_point(((4 - i) * a1 + i * a2) / 4, d)
];

První bod je určen staticky, jako střed souřadnicového systému. Ostatních pět je vygenerováno pomocí cyklu for v roli generátoru.

Tolik k dnešním novinkám. Úplnou a aktuální dokumentaci najdete vždy na wiki.