Chytré modelování s KWA - dynamický výběr features
Publikováno: 11. února 2018 | Zobrazeno: 3689x
Dnes bych se s vámi rád podělil o zkušenost, kterou jsem získal při řešení neobvyklého "modelovacího" požadavku kolegy.
Zadání bylo následující - vymyslet takový způsob modelování pružiny, resp.její osy, aby bylo možné v zadaném geometrickém setu libovolně přidávat a ubírat části osy (wireframe feature) tak, aby se neustále dynamicky vytvářela jedna spojená křivka. (Pozor - ne spojitá, spojitost by v každém případě kontroloval konstruktér)
Na obrázku vidíme záměr - části pružiny jako samostatné křivky, navíc každá je vytvořena jinou funkcí (sketch, line, extrapol, helix). Jsou v samostatném setu Spring parts a dohromady mají tvořit osu pružiny.
První myšlenka padla logicky na funkci Join, do které by se jako vstup vybral přímo geometrický set. Tím by se elegantně vyřešilo automatické přidávání - stačilo by, aby se nová feature vytvořila v tomto setu. To sice na první pohled zdánlivě zafunguje, ale místo celého setu se do seznamu elementů ke spojení jen načte celý obsah setu. Set jako takový nelze do Joinu vybrat. Tudy cesta nepovede...
Poznámka: Automatické odebrání už není tak složité, pokud zůstaneme u Joinu, stačí feature smazat - pokud to není poslední a jediná feature v Joinu, tak to Join nijak neovlivní.
I když to vypadá na první pohled celkem složitě, řešení je jednoduché. Na celý trik stačí k jen jeden parametr a jedna formule - všechno ostatní už jsou běžné modelovací funkce, které jen "uhladí" výsledek.
Křivka jako parametr
Začneme vytvořením křivky - vytvoříme nový parametr typu
Funkce Constructors
Pro tvorbu geometrie pomocí formulí slouží speciální skupiny funkcí, které jsou ve formula editoru skryty pod názvem constructors. V našem případě nebudeme křivku vytvářet na základě referencí, ale skládat ji z již existujících částí. K tomu použijeme funkci assemble, která je dostupná ve skupině funkcí
Z nápovědy k syntaxi použití je zřejmé, že parametrem funkce je jedna nebo více křivek (oddělené čárkami). Jak ale zajistit, aby se do seznamu automaticky vkládaly všechny křivky v setu? Poměrně jednoduše.
Metoda Query
Seznam křivek můžeme nahradit objektem, který je u programátorů známý jako pole (array), v EKL jazyce se místo toho používá objekt
De facto říkáme CATIA "vytvoř křivku, která je spojením všech elementů v geometrickém setu, jejichž topologie odpovídá křivce". Metoda Query má dva parametry - v prvním určujeme typ hledaného objektu, ve druhém pak ještě můžeme výběr omezit na konkrétní vlastnosti hledaného objektu (např. při výběru kružnic omezit jejich největší poloměr apod.)
Takto vytvořená křivka bohužel není spojitá - chová se sice jako jedna feature, ale je tzv. non-connex. Abychom z ní udělali spojitou křivku, stačí použít již zmíněný Join. A je hotovo - tedy alespoň na první pohled. Pokud nyní zkusíme do setu přidat další křivku tak, aby navazovala na začátek nebo konec křivky stávající, nebo naopak některou z krajních částí stávající křivky odebrat, výsledek bude vždy jedna křivka bez nutnosti editace Joinu.
Jenže tohle bude fungovat jen do chvíle, než použijeme pro konstrukci line definovanou jako "with point and direction". Dotaz Query totiž nějakým "nedopatřením" vyhledá i onen direction a vloží ho do výsledku jako úsečku vektoru dané line *). Tím se výsledná křivka stane nespojitou, Join zakřičí, že výsledek není connex ani manifold, a je jasné, že se bude muset formule ještě trochu vylepšit
*) délka line odpovídá normovanému vektoru - 1mm - a na první pohled není vůbec vidět, takže jsem se dlouho trápil s tím, že Join pak tuto line nechtěl akceptovat
Úprava Query
Nebude to nijak složité, jen se Query použije vícekrát pro jednotlivé typy features, konkrétně na ty, které hodláme při konstrukci používat. V našem případě to budou
Přesné názvy typů lze nalézt v object browseru ve formula editoru. Pokud se použije jen line, bude do výsledku opět zahrnuto i Direction.
A aby to nebylo málo, rozšíříme každý dotaz Query o druhý parametr, kterým řekneme, že se mají vybírat jen aktivní features. Celou formuli si můžete prohlédnout na obrázku.
Zaoblení netangentních přechodů
Teď už to konečně funguje tak jak chceme, tedy téměř funguje - osa pružiny by měla být bez ostrých hran. Na zaoblení můžeme s výhodou použít funkci Corner s volbou 3D Corner (bohužel funguje až s licencí GSD), která automaticky zaoblí všechny ostré přechody se zadaným rádiusem.
Po takto vytvořené ose již stačí protáhnout požadovaný profil pružiny (ideálně Sweep - circle and radius) a pomocí Close surface získat objemové těleso.
Inteligentní pružina je hotová a můžeme si s ní začít hrát. Zkuste si deaktivovat krajní features na obou stranách - pružina se o tyto elementy okamžitě zkrátí bez jakékoliv chyby. Stejně tak si můžete do setu Spring parts přidat další část (samozřejmě musí navazovat na začátek nebo konec osy a nesmí dojít k zacyklení) a pružina opět ihned sama poporoste.
Formule by se určitě dala ještě vylepšit, např. deaktivací fce Corner v případech, kdy bude Join tangentní po celé délce, fantazii se meze nekladou.
Autor článku: Jan Cinert
Zadání bylo následující - vymyslet takový způsob modelování pružiny, resp.její osy, aby bylo možné v zadaném geometrickém setu libovolně přidávat a ubírat části osy (wireframe feature) tak, aby se neustále dynamicky vytvářela jedna spojená křivka. (Pozor - ne spojitá, spojitost by v každém případě kontroloval konstruktér)
Na obrázku vidíme záměr - části pružiny jako samostatné křivky, navíc každá je vytvořena jinou funkcí (sketch, line, extrapol, helix). Jsou v samostatném setu Spring parts a dohromady mají tvořit osu pružiny.
První myšlenka padla logicky na funkci Join, do které by se jako vstup vybral přímo geometrický set. Tím by se elegantně vyřešilo automatické přidávání - stačilo by, aby se nová feature vytvořila v tomto setu. To sice na první pohled zdánlivě zafunguje, ale místo celého setu se do seznamu elementů ke spojení jen načte celý obsah setu. Set jako takový nelze do Joinu vybrat. Tudy cesta nepovede...
Poznámka: Automatické odebrání už není tak složité, pokud zůstaneme u Joinu, stačí feature smazat - pokud to není poslední a jediná feature v Joinu, tak to Join nijak neovlivní.
Použití KWA
Jelikož standardní modelovací funkce zde nestačí, uchýlil jsem se k jednoduchému programování v KWA. V podstatě bylo třeba jen přijít na to, jak vytvořit křivku, která se bude vždy skládat ze všech wireframe elementů ve vybraném geometrickém setu. Přidáním dalšího elementu či odebráním existujícího musí okamžitě dojít ke změně.I když to vypadá na první pohled celkem složitě, řešení je jednoduché. Na celý trik stačí k jen jeden parametr a jedna formule - všechno ostatní už jsou běžné modelovací funkce, které jen "uhladí" výsledek.
Křivka jako parametr
Začneme vytvořením křivky - vytvoříme nový parametr typu
curve
(ano, opravdu tam takový typ je, skoro úplně na konci) a po vytvoření mu hned přiřadíme formuli. Jak to udělat popisovat nebudu, o tom už se tu mnohokrát psalo. Otázka je, co bude v těle formule.
Funkce Constructors
Pro tvorbu geometrie pomocí formulí slouží speciální skupiny funkcí, které jsou ve formula editoru skryty pod názvem constructors. V našem případě nebudeme křivku vytvářet na základě referencí, ale skládat ji z již existujících částí. K tomu použijeme funkci assemble, která je dostupná ve skupině funkcí
Operations Constructors
.
Z nápovědy k syntaxi použití je zřejmé, že parametrem funkce je jedna nebo více křivek (oddělené čárkami). Jak ale zajistit, aby se do seznamu automaticky vkládaly všechny křivky v setu? Poměrně jednoduše.
Metoda Query
Seznam křivek můžeme nahradit objektem, který je u programátorů známý jako pole (array), v EKL jazyce se místo toho používá objekt
lis
t (seznam). Ten vytvoříme opět poměrně jednoduše použitím metody Query
, což je víceméně vyhledávací dotaz. Celá základní formule tedy bude vypadat následovně:
assemble('Geometrical set' -> Query("curve","")
De facto říkáme CATIA "vytvoř křivku, která je spojením všech elementů v geometrickém setu, jejichž topologie odpovídá křivce". Metoda Query má dva parametry - v prvním určujeme typ hledaného objektu, ve druhém pak ještě můžeme výběr omezit na konkrétní vlastnosti hledaného objektu (např. při výběru kružnic omezit jejich největší poloměr apod.)
Takto vytvořená křivka bohužel není spojitá - chová se sice jako jedna feature, ale je tzv. non-connex. Abychom z ní udělali spojitou křivku, stačí použít již zmíněný Join. A je hotovo - tedy alespoň na první pohled. Pokud nyní zkusíme do setu přidat další křivku tak, aby navazovala na začátek nebo konec křivky stávající, nebo naopak některou z krajních částí stávající křivky odebrat, výsledek bude vždy jedna křivka bez nutnosti editace Joinu.
Jenže tohle bude fungovat jen do chvíle, než použijeme pro konstrukci line definovanou jako "with point and direction". Dotaz Query totiž nějakým "nedopatřením" vyhledá i onen direction a vloží ho do výsledku jako úsečku vektoru dané line *). Tím se výsledná křivka stane nespojitou, Join zakřičí, že výsledek není connex ani manifold, a je jasné, že se bude muset formule ještě trochu vylepšit
*) délka line odpovídá normovanému vektoru - 1mm - a na první pohled není vůbec vidět, takže jsem se dlouho trápil s tím, že Join pak tuto line nechtěl akceptovat
Úprava Query
Nebude to nijak složité, jen se Query použije vícekrát pro jednotlivé typy features, konkrétně na ty, které hodláme při konstrukci používat. V našem případě to budou
sketch, GSMline, GSMcircle, GSMhelix a GSMextrapol
. Jednotlivé dotazy lze mezi sebou jednoduše sčítat pomocí operátoru +.
Přesné názvy typů lze nalézt v object browseru ve formula editoru. Pokud se použije jen line, bude do výsledku opět zahrnuto i Direction.
A aby to nebylo málo, rozšíříme každý dotaz Query o druhý parametr, kterým řekneme, že se mají vybírat jen aktivní features. Celou formuli si můžete prohlédnout na obrázku.
Zaoblení netangentních přechodů
Teď už to konečně funguje tak jak chceme, tedy téměř funguje - osa pružiny by měla být bez ostrých hran. Na zaoblení můžeme s výhodou použít funkci Corner s volbou 3D Corner (bohužel funguje až s licencí GSD), která automaticky zaoblí všechny ostré přechody se zadaným rádiusem.
Po takto vytvořené ose již stačí protáhnout požadovaný profil pružiny (ideálně Sweep - circle and radius) a pomocí Close surface získat objemové těleso.
Inteligentní pružina je hotová a můžeme si s ní začít hrát. Zkuste si deaktivovat krajní features na obou stranách - pružina se o tyto elementy okamžitě zkrátí bez jakékoliv chyby. Stejně tak si můžete do setu Spring parts přidat další část (samozřejmě musí navazovat na začátek nebo konec osy a nesmí dojít k zacyklení) a pružina opět ihned sama poporoste.
Závěr
A to je celé. Velice efektivní a poměrně jednoduchá cesta, jak mít permanentní a dynamický výběr features sloučených do jednoho objektu. Že jde to samé udělat i s plochami snad není třeba říkat.Formule by se určitě dala ještě vylepšit, např. deaktivací fce Corner v případech, kdy bude Join tangentní po celé délce, fantazii se meze nekladou.
Autor článku: Jan Cinert