Archive

Posts Tagged ‘panelizacja’

Parametryczny dach w GC

June 29th, 2010 2 comments

parametryczny_dach_viz3

Kontynuując poprzedni wątek tworzenia parametrycznych modeli, przejdźmy do zasad budowania kolejnych elementów w Generative Components. W tym rozdziale zapoznamy się  z budowaniem powierzchni krzywoliniowych, replikacji oraz panelizacji, a także z przygotowywaniem elementów do maszynowego wycinania.

Zanim jednak zbudujemy dach, zapoznajmy się z kilkoma podstawami za pomocą ćwiczeń :-)

W poprzednim odcinku skończyliśmy tworząc prostą krzywą BSpline, opartą na czterech punktach kontrolnych. Aby zrozumieć lepiej jak tworzyć więcej krzywych, na których np. możemy zbudować dach, musimy poznać replikację i zasady tworzenia kolekcji.

Otwórzmy więc GC i stwórzmy element (feature) za pomocą ikonki ‘Create Feature’ w górnym menu narzędzi. Po rozwinięciu pozycji ‘Point’ ukaże się nam mnóstwo metod, spośród których wybierzmy najprostszą – ByCartesianCoordinates. Rozwijając ją przyciskiem ‘+’ po lewej stronie, zobaczymy pola do wypełnienia :

CoordinateSystem : baseCS (to nasz podstawowy układ współrzędnych – ale możemy tutaj też wpisać inny, który wcześniej stworzymy).

XTranslation, YTranslation, ZTranslation : przesunięcie w osi X, Y i Z

Origin : opcjonalny parametr (punkt), przesuwający kartezjański środek układu współrzędnych w inne miejsce. Standardowo pole powinno pokazywać wartość null.

Normalnie, w pola te wpisujemy współrzędne, czyli np. X=1,Y= 5 , Z=8 itp. Możemy jednak zamiast współrzędnej podać funkcję , taką jak Series lub SeriesByCount(o tym za chwilę), lub grupę współrzędnych. Spowodują one zreplikowanie punktu i nie będzie on już tylko pojedynczym elementem, ale tzw. kolekcją. Istota pracy w GC opiera się na replikacji i kolekcjach, dzięki czemu możemy przeprowadzać operacje na wielu elementach w taki sam sposób, jak na jednym elemencie.

Jeśli w którymkolwiek momencie zamiast podawać jeden parametr, chcemy podać kilka, zamykamy je w klamrowych nawiasach { } , i stają się one kolekcją.

Przykład : stwórzmy nowy punkt metodą ByCartesianCoordinates

układ współrzędnych : baseCS

XTranslation : 1

YTranslation : 2

ZTranslation : {3,5,8}

Origin : null

po naciśnięciu OK otrzymamy.. trzy punkty ! To ilustruje ideę prostej replikacji. Co więcej, jeśli za YTranslation podamy {9,10,11} , współrzędne Y będą korespondować z wcześniej podaną kolekcją współrzędnych Z , czyli dostaniemy trzy punkty : {1,9,3}, {1,10,5} oraz {1,11,8}.

Warto wspomnieć, że można też te grupy współrzędnych skorelować w inny sposób. Poniższy ekran pokazuje jak odsłonić ‘ukryte’ właściwości elementu.

show settings

Po włączeniu opcji ‘show settings properties’ pojawi się nam mnóstwo dodatkowych właściwości naszego punktu, których zazwyczaj nie będziemy używać, oprócz jednej, bardzo ważnej : Replication. To pole przyjmować może dwie wartości ReplicationOption.CorrespondingIndexing albo ReplicationOption.AllCombinations.

Jak łatwo się domyślić, pierwsza opcja stworzy trzy punkty, z każdego zestawu trzech współrzędnych. Jeśli mamy trzy współrzędne w polu X, i trzy współrzędne w polu Y, dostaniemy 3 punkty. Jeśli wpiszemy po trzy różne współrzędne w polach X, Y i Z – też dostaniemy 3 punkty. Jeśli wpiszemy 3 współrzędne w polu X i Y, a cztery w Z – dostaniemy… też trzy punkty! (ponieważ dodatkowa, czwarta współrzędna w polu Z nie koresponduje z żadną inną w pozostałych polach).

Druga opcja działa zupełnie inaczej – jako wynik produkuje wszystkie kombinacje danych współrzędnych. Czyli wpisując trzy różne współrzędne do pola X (na przykład {9,10,11} ) i trzy współrzędne do pola Y {3,5,8} , dostaniemy 9 punktów. Jeśli do pola Z wpiszemy też 3 współrzędne, np. {1,2,3} , dostaniemy 27 punktów.

Obie opcje można też włączyć edytując transakcję ‘ręcznie’ (prawy klik, ‘edit transaction’) i dopisując linię Replication = ReplicationOption.AllCombinations; albo ReplicationOption.CorrespondingIndexing;)

Bardzo ważną rzeczą w tworzeniu kolekcji, szczególnie za pomocą drugiej omówionej powyżej opcji jest indeksowanie. Jeśli wybierzemy z menu ikonę ‘edit feature’ (dłoń wskazująca na kwadrat) i najedziemy nad stworzony obiekt (tutaj punkt), wyświetli nam się nazwa obiektu oraz jego pozycja w kolekcji.

indexing

(tutaj wskaźnik pokazuje punkt [2][1] z kolekcji punktów point01). Tak jak wspominałem powyżej, całą kolekcję można traktować jako jeden punkt. Zilustrujmy to tworząc linię od układu współrzędnych baseCS do kolekcji point01 :

(>> Create Feature >> Line >> ByPoints,  jako StartPoint wybieramy baseCS – najlepiej umieszczając kursor w tym polu a potem najeżdżając na baseCS z naciśniętym CTRL. Jako EndPoint wybieramy point01 – kasując indeksy w kwadratowych nawiasach, tak żeby pole zawierało tylko point01)

(na tym etapie wyłączmy wspomnianą wcześniej opcję ‘show settings properties’, żeby uniknąć niepotrzebnego zamieszania)

lines

Jako parametry wejściowe wpisaliśmy baseCS (pierwszy punkt), i point01 (drugi punkt), a w rezultacie dostaliśmy.. grupę linii ! Tak właśnie działa replikacja.

——————————–

Ok, czas przejść do czegoś, co przyspieszy nam trochę pracę nad kolekcjami.. przyjrzyjmy się funkcji Series i SeriesByCount.

Series (start, limit, increment) – tworzy kolekcję wartości liczbowych będących łańcuchem. Łańcuch zaczyna się od wartości start, i wypełnia się kolejnymi wartościami stopniowo zwiększanymi o increment, aż osiągnie limit). Przykład  : Series(1, 3, 0.4) to to samo co {1, 1.4, 1.8, 2.2, 2.6, 3.0}

SeriesByCount(start, final, count) – tworzy kolekcję wartości liczbowych zaczynających się od start, kończących na final, wypełnioną pośrednimi wartościami, w count krokach). Przykład: SeriesByCount(1, 15, 2) to to samo co {1,3,5,7,9,11,13,15}

Powyższe funkcje można wykorzystywać jako argumenty wejściowe do innych funkcji, np sinusoidy (Sin). SeriesByCount(0, 720, 50) stworzy łańcuch wartości wędrujący od zera do 720 w 50-ciu krokach.

Aby narysować w przestrzeni ciekawą krzywą bazującą na replikacji punktów, stwórzmy nowy skrypt, i nowy punkt ByCartesianCoordinates.

CoordinateSystem : baseCS

XTranslation : Sin(SeriesByCount(0,720,50))

(w GC argumenty wejściowe do funkcji Sin podajemy w stopniach, nie radianach)

YTranslation : Cos(SeriesByCount(0,720,50))

ZTranslation : SeriesByCount(0, 5, 50)

a potem dodajmy krzywą BSpline, stworzoną metodą ByPoints

Points : point01

MakePeriodic : false

Replikacja punktów

Rezultat : Krzywa spiralna (może np posłużyć jako baza do schodów!)

Dla dociekliwych : Możemy zreplikować stworzoną właśnie krzywą poprzez skopiowanie jej do kolekcji układów współrzędnych. Najpierw tworzymy jakąś grupę układów współrzędnych, np metodą BySphericalCoordinates (CoordinateSystem : baseCS,  Radius : 5 ,  Theta  : SeriesByCount(0,360,20),   Phi : -30 ), a potem tworzymy nową krzywą BSpline metodą CopyTransformGeometricContents ( CopyFrom : baseCS,    CopyTo : coordinateSystem01,  FeatureToCopy  : bsplineCurve01), kopiując spiralę do dziesięciu nowych orientacji. Rezultat poniżej :

spirals

——————————————

Po tej krótkiej demonstracji przejdźmy do czegoś bardziej zaawansowanego geometrycznie, czyli do powierzchni BSplineSurface. Powierzchnie BSpline są skonstruowane podobnie do krzywych BSpline (np. w tym sensie, że posiadają punkty kontrolne), przy czym oczywiście w sensie parametrycznym są dwuwymiarowe. Żeby nanieść na krzywą bspline punkt, wystarczy podać jeden parametr, w zakresie od 0 do 1. Żeby nanieść taki sam punkt (lub punkty) na powierzchnię BSplineSurface , należy podać dwa parametry – U i V. Oba przyjmują wartości od 0 do 1.

Stwórzmy nowy plik ( File >> New Transaction File ) i wybierając narzędzie ‘Create Point’ (żółta ikonka) stwórzmy cztery punkty.

Następnie stwórzmy element BSplineCurve metodą ByPoles (nie ByPoints!), wpisując w pole ‘Poles’ kolejno nazwy poszczególnych punktów. Najłatwiej jest to zrobić umieszczając w nim kursor i klikając w kolejne punkty z przyciśniętym klawiszem CTRL. W polu powinno się pojawić coś jak poniżej

{point01,point02,point03,point04,}

Resztę pól zostawmy ze standardowymi wartościami. Klikając ‘OK’ stworzymy krzywą jak poniżej :

bsplinecurve01

Krzywa została stworzona na płaszczyźnie XY (to znaczy że jest płaska), więc możemy teraz poprzemieszczać punkty w przestrzeni, tak, aby nadać krzywej pożądaną formę. Sposoby manipulowania uchwytami punktów pokazuje poniższa ilustracja :

manipulacje

Mając pierwszą krzywą w odpowiedniej konfiguracji przestrzennej dodajmy kolejne dwie krzywe, postępując w ten sam sposób (cztery punkty w przestrzeni, nowa krzywa BSpline metodą ByPoles, klikamy punkty z CTRL w polu ‘Poles’) i modelujemy je na kształt dachu.

krzyweBSpline

W wyniku powyższych operacji powinniśmy mieć teraz trzy krzywe : bsplineCurve01, bsplineCurve02 i bsplineCurve03. Zbudowane one są odpowiednio z punktów {point01,point02,point03,point04}, {point05,point06,point07,point08} i {point09,point10,point11,point12}.

Powierzchnie BSpline można budować na wiele sposobów, my użyjemy tutaj metody LoftCurves. Jako ‘Curves’ wprowadźmy trzy krzywe {bsplineCurve01,bsplineCurve02,bsplineCurve03}  (nawias klamerkowy wskazuje na to, że jest to kolekcja). Pole ‘Order’ powinno mieć wartość 4 lub 3.

powierzchnia

.. i w rezultacie otrzymujemy parametryczny dach!

Teraz nadszedł dobry moment na to, żeby zastanowić się nad formą. Na tym etapie można bowiem manipulować punktami kontrolnymi i oceniać bezpośrednio skutki tych manipulacji w czasie rzeczywistym. Sugeruję poobracać model z każdej strony i modelować kształt dopóki nie będziemy z niego zadowoleni :-)

(w ikonkach na górze okna po kliknięciu drugiego narzędzia od lewej możemy zmienić tryb graficzny wyświetlania na Illustration bądź Smooth – to pomaga w estetycznej ocenie rozwiązania!)

—————————————–

Panelizacja

Oczywiście w takiej formie dach może istnieć tylko wirtualnie, ponieważ wytworzenie każdej powierzchni podwójnie zakrzywionej to nie lada wyzwanie. Aby to uprościć, spróbujmy go spanelizować – czyli podzielić na mniejsze komponenty, nadające się do wycięcia i fabrykacji.

Aby to zrobić musimy wypełnić dach punktami, które następnie posłużą jako wierzchołki czworokątów. Jak się za to zabrać ? Zacznijmy od pojedynczego punktu :

>> Create Feature >> Point >> ByUVParametersOnSurface (ta metoda umieści punkt na powierzchni używając parametrów U i V).

Surface : bsplineSurface01 (nasza powierzchnia)

U : 0.2

V : 0.4

Zmieniając wartości U i V możemy umieścić punkt w każdym miejscu powierzchni (pamiętając o tym, że muszą one być pomiędzy 0 i 1)

Jak stworzyć więcej punktów ? Oczywiście używając replikacji i funkcji Series() bądź SeriesByCount().

Wyedytujmy teraz transakcję tworzącą punkt (jeśli jej nie widzimy na liście transakcji, kliknijmy przycisk ‘Save’, żeby zapisać skrypt na dysku). W wyedytowanej transakcji zastąpmy linie definiujące wartości U i V następującymi wyrażeniami :

U = SeriesByCount(0, 1, 50);

V = SeriesByCount(0, 1, 25);

i dopiszmy dodatkowo :

Replication = ReplicationOption.AllCombinations;

W rezultacie, zamiast pojedynczego punktu, zobaczymy matrycę jak poniżej :

siatkaPunktow

(wygląda trochę na to, że punktów jest za dużo, więc sugeruję zmniejszyć ilość kroków w SeriesByCount do 25 i 12)

Zanim zabierzemy się za panelizację, ukryjmy naszą powierzchnię BSpline, żeby nie przeszkadzała w wizualnej ocenie paneli (inaczej będzie je trochę zasłaniać). Aby to zrobić, wybieramy narzędzie ‘Toggle Visibility’ (czarno-szara ikonka z ukośnymi kreskami toggle_visibility), najeżdżamy na powierzchnię (aż wyświetli się bsplineSurface01) i klikamy. Alternatywnie, możemy też kliknąć na nią w widoku symbolicznym.

Stworzenie siatki paneli mogłoby być dość skomplikowane, ale ratują nas tutaj twórcy GC, którzy przewidzieli popularność panelizacji, i stworzyli do tego specjalną metodę. Znajduje się ona w elemencie Polygon. Wybierzmy narzędzie ‘Create New Feature’, następnie ‘Polygon’ a potem ‘ByPointGrid’.

Points: point13 (albo poprostu nazwa punktu na powierzchni – może być inna. Zwróćmy uwagę, żeby po kliknięciu na punkt z CTRL usunąć nawiasy kwadratowe i klamerki – bo podajemy całą kolekcję, a nie jej część).

resztę pól pozostawiamy ze standardowymi wartościami,

Wynik to podzielony na panele uproszczony model krzywoliniowego dachu :

panelizacja

I tak oto otrzymaliśmy naszą panelizację!

Jak łatwo zauważyć przyglądając się dokładniej panelom, większość z nich będzie powyginana w różnych kierunkach (będą wyglądać jak ramki z elastyczną tkaniną w środku). Aby wymusić ‘płaskość’ paneli należy użyć podczas tworzenia opcji FacetOption.ForcePlanarQuads lub FacetOption.Triangulation.. W pierwszym przypadku panele ‘wyskoczą’ trochę z powierzchni i pojawią się między nimi luki – ale to normalne, tak jak w dachu Smithsonian Institute. Aby tego uniknąć należy zgłębić tajniki teselacji powierzchni krzywoliniowych.. ale to już temat na inny post :-)

Ciekawy efekt można też uzyskać wybierając opcję FacetOption.Diamond

panelizacja2

aby zmienić właściwości elementu, np. sposób teselacji, nie trzeba cofać transakcji i tworzyć jej od początku – zamiast tego użyj opcji edit feature edit_feature, i zmień odpowiedni parametr.

————————————–

Rozwijanie elementów na płaszczyznę

Aby przygotować elementy do fabrykacji, musimy stworzyć element o typie ‘FabricationPlanning’. Ten typ elementu zazwyczaj służy do takiego rozplanowania elementów na płaszczyźnie, aby były zupełnie płaskie i aby przy np. drukowaniu lub wycinaniu laserowym zachowały identyczne wymiary i kształt do oryginałów. Normalnie nie jest to proste, bo elementy są obrócone wokół kilku osi w przestrzeni, i aby umieścić je w płaszczyźnie poziomej, należy dokonać kilku obrotów.. wykonanie tego na kilkuset elementach nie należy na pewno do zadań  łatwych :-)

W naszym przypadku możemy użyć dwóch metod tworzenia FabricationPlanning : LayoutPolygons, oraz UnfoldPolygonsIntoPlanarStrips.

LayoutPolygons rozkłada każdy element osobno, w równych odstępach. Może to się przydać przy wielokątach umieszczonych w dziwnych konfiguracjach, lub niestykających się krawędziami. Przykładowe wartości do wypełnienia w polach to

CoordinateSystem : baseCS

Polygons : polygon01 (bez nawiasów klamrowych ani kwadratowych, tylko nazwa kolekcji wielokątów)

Xspacing : 1 (odstępy w rozłożonych wielokątach)

Yspacing : 1

UnfoldPolygonsIntoPlanarStrips rozkłada wielokąty w pasach, połączone krawędziami, co czyni je dużo łatwiejszymi do późniejszego montażu (np przy tworzeniu fizycznego modelu). Przykładowe wartości do wpisania w pola :

CoordinateSystem : baseCS (w którym układzie współrzędnych następuje umieszczenie płaskich elementów)

Polygons : polygon01 (jak poprzednio, bez klamerek i nawiasów)

BoundaryEdgeColor : 3 (kolor zewnętrznej obwódki – ma to znaczenie np przy przygotowaniu do wycinania laserowego, gdzie zewnętrzny obwód jest cięty, a wewnętrzne krawędzie tylko lekko nacinane)

InternalEdgeColor : 2 (zielony)

InterRowDistance : 1 (odstępy pomiędzy rozwiniętymi pasami, w metrach)

rozwiniecie

Tak oto otrzymujemy techniczny rysunek będący bezpośrednio podstawą do stworzenia zaprojektowanego dachu.

——————————————————————–

Oczywiście jest to dopiero początek, ponieważ samo wycięcie paneli nie jest zazwyczaj wystarczające. Oprócz szkła lub innego materiału potrzebujemy także strukturę, ramy, metalowe łączniki i inne detale. O tym jednak innym razem ;-)

Przykładowy przybliżony model z detalami i całą resztą mógłby wyglądać tak :

parametryczny_dach_viz1_

lub tak:

parametryczny_dach_viz2_

————————————————————————————————————