PŘÍPRAVA 3D SOUBORU NA CNC LASER CUTTER



Author:

Categories: Tutorials

Tagged with: | | | | | |


Jako téma své semestrální práce z předmětu CAD3 jsem si vybral přípravu podkladů na CNC laser ze 3D souboru. Tento nápad jsem dostal během noci strávené nad ručním upravování, prodlužováním a zkracováním hran 3D modelu svého návrhu, který jsem potřeboval rychle odeslat na laser. Snažím se tedy reagovat na absenci takového scriptu a zároveň na svou vlastní potřebu si práci zjednodušit. Mým cílem bylo vytvoření základů pro skript, jenž by dokázal řešit zkracování a prodlužování hran na prostorových tělesech s kolmými 6 a více stěnami a jejich následné přenesení na desku.

NÁVOD K POUŽITÍ SKRIPTU

Vstupními hodnotami jsou 3 vektory, samotný 3D model a tloušťka desky.

  1. 3 vektory určují, jaký směr je pro nás „důležitý“ či „méně důležitý“. V 1. směru nebudou hrany zkráceny vůbec, ve 2. směru budou zkráceny pouze boční hrany stěn, ve 3. směru budou zkráceny všechny hrany. Kdybychom třeba měli model domu v proluce, budeme chtít, aby fasáda byla kolmo na 1. směr, střecha na 2. a zdi, které nebudou vidět, bychom nechali kolmé na 3. směr. Vektory musí být rovnoběžné s hranami modelu a žádný směr se nesmí opakovat.
  2. Nastavíme požadovanou tloušťku desky a do Brep vybereme model
  3. Zkontrolujeme správnost ořezu. Pokud zjišťujeme chyby, je potřeba podívat se do zadní části skriptu na světle modrou skupinu s jednotlivými stěnami. Zde najdeme nesprávně fungující stěnu a v její části skriptu přepneme dvojklikem červené tlačítko označené „oprava“.
  4. Na konci skriptu jsou ořezané stěny zarovnané na desku 1000 x 590.

PRINCIP

Celý skript je postavený na postupném vyvolávání jednotlivých částí prostorového tělesa na základě jejich unikátních vlastností a postavení vůči zbytku 3d objektu.

Na začátku dochází k rozdělení na 2 klíčové situace – stěny a hrany, které jsou vnější (konvexní), se budou zkracovat podle jiného pravidla než hrany vnitřní (konkávní). Toto rozdělení se dá docílit pomocí komponentu convex edges, který vyhodí konkávní hrany a pro zachování správné datové struktury tyto hrany porovnám přes jejich prostřední bod se všemi hranami, čímž mohu rovnou vybrat stěny, které konkávní hrany neobsahují.

Konvexní stěny jsem si rozdělil přes porovnání úhlu normály na 3 typy – kolmé na 1. směr, 2. směr a 3. směr:

U 1. směru jsem vybral hrany stěn a spojil je do polyline – zde nebylo třeba žádného zkracování

U 2. směru jsem potřeboval vybrat hrany, které jsou rovnoběžné s 1. směrem a zkrátit je. Zároveň bylo potřeba vzít stěny kolmé na 1. směr, posunout je proti směru jejich normál a sestrojit průsečnici posunutých stěn a stěn kolmých na 2. směr.

U 3. směru bylo potřeba hrany odsadit dovnitř o tloušťku desky

Složitější postup nastal u konkávních hran a stěn. Konkávní hrany stěn kolmých na 2. vektor se totiž museli posunout dovnitř útvaru. Nakonec jsem tento problém vyřešil přes DataTree – musel jsem si vhodně strukturovat data tak, abych mohl vždy přenášet informaci o tom, jaká hrana patří jaké stěně. Díky tomu jsem byl schopný najít právě tu stěnu, které je sousedící se stěnou 1. vektoru a zároveň jejíž hrana je právě ta konkávní. Výběrem takovéto stěny jsem mohl posunout konkávní hrany proti jejich normále. Složitost DataTree v této chvíli však zapříčinila, že jsem nedokázal problém vyřešit, kdybych měl vybírat více takových stěn, tudíž při aplikování tohoto postupu na objekty s vysokým počtem stěn by postup pravděpodobně selhal.

Stěny, jež měly otočenou normálu se mi podařilo navzájem rozlišit úhlem s rovnoběžným vektorem – normála v jednom směru má úhel s rovnoběžným vektorem 0, kdežto opačná normála má úhel Pi. Někdy jsem potřeboval vybrat obojí, někdy jen jedno.

Z důvodu přesného výběru konkávních hran a jejich specifické manipulaci se skript v mnoha částech opakuje a jde v podstatě o stále stejné procesy – výběr hrany dané roviny tak, aby byla rovnoběžná se směrem, či již zmíněné určení směru posunu. Často jsem potřeboval pracovat s průnikem nebo sjednocením dat, což vždy vyžadovalo, stejně jako porovnávání hran a stěn, převést daný objekt na body a nazpátek.

Hrany konkávních stěn rovnoběžné s 1. vektorem jsem potřeboval zkrátit, avšak u některých mělo dojít k prodloužení. Problém řeším až při vytváření polyline změněné stěny – hrany indexuju podle nejbližších hran původní stěny, které jsou odsazeny buď dovnitř nebo ven podle toho, jestli je tlačítko aktivní nebo ne. Změnou vektorů se občas stává, že je potřeba změnit i znaménko odsazení, které určuje právě směr odsazení (dovnitř/ven). Proto jsem tlačítka nechal ve skriptu a pojmenoval jsem je “oprava”.

Po dokončení všech částí a spojení do polyline je spojuju do jednoho listu, každou křivku srovnám s xy plane, rozložím je, zjednoduším jejich tvar, aby nebylo složité s nimi počítat a zarovnám je vedle sebe na desku pomocí pluginu OpenNest. Hodnota spacing určuje mezery mezi křivkami.

DO BUDOUCNA

Mnou vytvořený skript si dokáže dobře poradit s jednoduchou geometrií. Dá se používat na zjednodušení práce, pokud bychom měli jednoduché domy nebo okolí, avšak je zde samozřejmě i velké množství nedostatků. Dalo by se ho doladit do podoby, kde by se jen přepínalo mezi jednotlivými konfiguracemi vektorů a k tomu by se přepínaly automaticky i spínače s opravou. Hlavním problémem celého tématu je jedinečnost každého modelu a jeho jedinečná indexace v prostoru. Rhinoceros objekty a jejich části indexuje totiž podle toho, jak vznikly, nedá se proto na indexy spoléhat. Do hry pak přichází různá důvtipná porovnávání geometrie a jejího umístění v prostoru vůči jiným prvkům. Například už samotné seřazení hran podle nejbližších hran původní stěny může být v některých případech zavádějící a nefunční, někde však naopak ne. Další vylepśení by mohlo zahrnovat i předměty, které nejsou jen pravoúhlé.

Thanks petrasvestartas for plugin OpenNest