Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Krzywe są pierwszym z opisanych typów danych geometrycznych, które mają bardziej znany zestaw właściwości opisujących kształt: jak bardzo są zakrzywione lub proste? Jak są długie lub krótkie? Należy też pamiętać, że punkty są nadal blokami konstrukcyjnymi służącymi do definiowania dowolnego elementu — od linii do splajnu oraz wszystkich typów krzywych.
Linia
Polilinia
Łuk
Okrąg
Elipsa
Krzywa NURBS
Krzywa PolyCurve
NURBS to model używany do dokładnego przedstawiania krzywych i powierzchni. Krzywa sinusoidalna w dodatku Dynamo utworzona za pomocą dwóch różnych metod tworzenia krzywych NURBS w celu porównania wyników.
Węzeł NurbsCurve.ByControlPoints używa listy punktów jako punktów kontrolnych
Węzeł NurbsCurve.ByPoints rysuje krzywą przechodzącą przez listę punktów
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Termin Krzywa obejmuje zazwyczaj wszystkie różne kształty zakrzywione (nawet jeśli są proste). Krzywa jako taka to nadrzędna kategoryzacja wszystkich tych typów kształtów — linii, okręgów, splajnów itp. Określając to bardziej technicznie: krzywa opisuje każdy możliwy punkt, który można znaleźć przez wprowadzenie „t” do kolekcji funkcji — od funkcji prostych (x = -1.26*t, y = t
) po funkcje wymagające przeprowadzenia złożonych obliczeń. Niezależnie od tego, z jakiego rodzaju krzywą pracujemy, ten parametr o nazwie „t” jest właściwością, którą można ocenić. Ponadto niezależnie od wyglądu kształtu wszystkie krzywe mają także punkt początkowy i punkt końcowy, które zbiegają się z minimalnymi i maksymalnymi wartościami „t” użytymi do utworzenia krzywej. Pomaga to również zrozumieć jej kierunkowość.
Ważne: dodatek Dynamo zakłada, że domena wartości „t” dla krzywej jest rozumiana jako 0,0 do 1,0.
Wszystkie krzywe posiadają również wiele właściwości lub cech, których można używać do ich opisania lub analizy. Gdy odległość między punktem początkowym a końcowym wynosi zero, krzywa jest „zamknięta”. Ponadto każda krzywa ma wiele punktów kontrolnych, a jeśli wszystkie te punkty znajdują się w tej samej płaszczyźnie, krzywa jest „płaska”. Niektóre właściwości mają zastosowanie do całej krzywej, natomiast inne mają zastosowanie tylko do określonych punktów wzdłuż krzywej. Na przykład płaskość stanowi właściwość globalną, a wektor styczny dla danej wartości „t” stanowi właściwość lokalną.
Linie są najprostszą postacią krzywych. Mogą nie wyglądać na zakrzywione, ale w rzeczywistości są krzywymi — bez krzywizny. Istnieje kilka różnych sposobów tworzenia linii. Najbardziej intuicyjna to pociągnięcie jej od punktu A do punktu B. Kształt linii AB zostanie narysowany między punktami, z matematycznego punktu widzenia będzie się ona rozciągać w nieskończoność w obu kierunkach.
Po połączeniu dwóch linii uzyskujemy polilinię. Tutaj mamy prostą reprezentację punktu kontrolnego. Edycja dowolnego z tych punktów spowoduje zmianę kształtu polilinii. Jeśli polilinia jest zamknięta, mamy do czynienia z wielobokiem. Jeśli długości krawędzi wieloboku są równe, określamy go jako regularny.
Wraz ze wzrostem złożoności funkcji parametrycznych definiujących kształt możemy pójść o krok dalej od linii, aby utworzyć łuk, okrąg, łuk eliptyczny lub elipsę, opisując jeden lub dwa promienie. Różnice między łukiem a okręgiem lub elipsą polegają tylko na tym, czy kształt jest zamknięty.
NURBS (niejednorodne wymierne splajny podstawowe) to reprezentacje matematyczne, które mogą dokładnie modelować dowolne kształty — od prostej dwuwymiarowej linii, okręgu, łuku lub prostokąta po najbardziej złożoną trójwymiarową swobodną krzywą organiczną. Ze względu na swoją elastyczność (stosunkowo niewiele punktów kontrolnych, a przy tym gładką interpolację opartą na ustawieniach stopni) i precyzję (związanie przez solidną matematykę) modele NURBS mogą być używane w każdym procesie: od ilustracji i animacji po produkcję.
Stopień: stopień krzywej określa zakres wpływu, jaki punkty kontrolne mają na krzywą; im większy stopień, tym większy ten zakres. Stopień jest dodatnią liczbę całkowitą. Liczba ta wynosi zazwyczaj 1, 2, 3 lub 5, ale może być dowolną dodatnią liczbą całkowitą. Linie NURBS i polilinie mają zazwyczaj stopień 1, a większość krzywych swobodnych ma stopień 3 lub 5.
Punkty kontrolne: punkty kontrolne to lista punktów o długości co najmniej stopnień+1. Jedną z najprostszych metod zmiany kształtu krzywej NURBS jest przesunięcie jej punktów kontrolnych.
Waga: punkty kontrolne mają skojarzoną liczbę zwaną wagą. Wagi są zazwyczaj liczbami dodatnimi. Gdy wszystkie punkty kontrolne krzywej mają tę samą wagę (zwykle 1), krzywa jest nazywana niewymierną. W przeciwnym razie krzywa jest nazywana wymierną. Większość krzywych NURBS jest niewymiernych.
Węzły: węzły są listą liczb (stopień+N-1), gdzie N jest liczbą punktów kontrolnych. Węzły są używane razem z wagami do sterowania wpływem punktów kontrolnych na wynikową krzywą. Jeden z nich służy do tworzenia punktów podziału w niektórych punktach krzywej.
Stopień = 1
Stopień = 2
Stopień = 3
Należy zauważyć, że im większa wartość stopnia, tym więcej punktów kontrolnych jest używanych do interpolacji wynikowej krzywej.
Linia składa się z zestawu punktów; każda linia ma co najmniej 2 punkty. Jednym z najpopularniejszych sposobów tworzenia linii w dodatku Dynamo jest użycie Line.ByStartPointEndPoint
w celu utworzenia linii w dodatku Dynamo.
Ta część zawiera wprowadzenie do podstawowych węzłów dostępnych w bibliotece dodatku Dynamo, które pomogą w profesjonalnym tworzeniu własnego programu wizualnego.
Geometria do projektowania obliczeniowego: jak pracować z elementami geometrycznymi w dodatku Dynamo? Poznaj wiele sposobów tworzenia prostych lub złożonych geometrii z obiektów elementarnych.
Składniki programów: co to są „dane” i jakie są podstawowe typy, z których można korzystać w programach? Dowiedz się więcej na temat włączania operacji matematycznych i logicznych do procesu roboczego projektowania.
Projektowanie z użyciem list: jak zarządzać strukturami danych i je koordynować? Dowiedz się więcej na temat pojęcia listy i wykorzystaj ją do efektywnego zarządzania danymi projektowymi.
Słowniki w dodatku Dynamo: czym są słowniki? Dowiedz się, jak używać słowników do wyszukiwania określonych danych i wartości z istniejących wyników.
Dodatek Dynamo, jako środowisko programowania wizualnego, umożliwia określenie sposobu, w jaki dane są przetwarzane. Dane są liczbami lub tekstem, ale także geometrią. Geometria — nazywana czasami geometrią obliczeniową — jest w ujęciu komputerowym danymi, za pomocą których można tworzyć piękne, zawiłe lub sterowane wydajnością modele. Aby móc to robić, należy zrozumieć szczegóły poszczególnych typów geometrii, których można używać.
używa się w modelu do reprezentowania obiektów, które widzimy w trójwymiarowym świecie. Chociaż krzywe nie zawsze są płaskie, mogą być na przykład trójwymiarowe, definiowana przez nie przestrzeń jest zawsze związana z jednym wymiarem. Powierzchnie dają nam kolejny wymiar oraz zbiór dodatkowych właściwości, które możemy wykorzystać w ramach innych operacji modelowania.
Zaimportuj i oszacuj powierzchnię przy danym parametrze w dodatku Dynamo, aby zobaczyć, jakie informacje możemy wyodrębnić.
Surface.PointAtParameter — zwraca punkt przy danej współrzędnej UV
Surface.NormalAtParameter — zwraca wektor normalny przy danej współrzędnej UV
Surface.GetIsoline — zwraca krzywą izoparametryczną przy danej współrzędnej U lub V (zwróć uwagę na wejście isoDirection).
Pobierz pliki przykładowe, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Powierzchnia stanowi kształt matematyczny zdefiniowany przez funkcję i dwa parametry. Zamiast t
używanego w przypadku krzywych używa się U
i V
, aby opisać odpowiednią przestrzeń parametrów. Oznacza to, że mamy więcej danych geometrycznych, z których można korzystać podczas pracy z tym typem geometrii. Na przykład krzywe mają wektory styczne i płaszczyzny normalne (które mogą obracać się lub skręcać wzdłuż długości krzywej), natomiast powierzchnie mają wektory normalne i płaszczyzny styczne, które są spójne z ich orientacją.
Powierzchnia
Krzywa izometryczna U
Krzywa izometryczna V
Współrzędna UV
Płaszczyzna prostopadła
Wektor normalny
Domena powierzchni: domena powierzchni jest zdefiniowana jako zakres parametrów (U,V), które dają w wyniku punkt trójwymiarowy na tej powierzchni. Domena w każdym wymiarze (U lub V) jest zazwyczaj określana jako dwie liczby (od min. U do maks. U) i (od min. V do maks. V).
Mimo że kształt powierzchni może nie wyglądać „prostokątnie” i może ona mieć lokalnie ściślejszy lub luźniejszy zestaw krzywych izometrycznych, „przestrzeń”definiowana przez jej domenę zawsze jest dwuwymiarowa. W dodatku Dynamo zawsze zakłada się, że powierzchnie mają domeny zdefiniowane przez minimum o wartości 0,0 i maksimum o wartości 1,0 w obu kierunkach U i V. Powierzchnie płaskie lub przycięte mogą mieć inne domeny.
Krzywa izometryczna (lub krzywa izoparametryczna): krzywa zdefiniowana przez stałą wartość U lub V na powierzchni i domenę wartości dla odpowiedniego kierunku U lub V.
Współrzędna UV: punkt w przestrzeni parametrów UV zdefiniowany przez U, V, a czasem W.
Płaszczyzna prostopadła: płaszczyzna, która jest prostopadła do obu krzywych izometrycznych U i V przy danej współrzędnej UV.
Wektor normalny: wektor definiujący kierunek „w górę” względem płaszczyzny prostopadłej.
Powierzchnie NURBS są bardzo podobne do krzywych NURBS. Powierzchnie NURBS można traktować jako siatkę krzywych NURBS, które biegną w dwóch kierunkach. Kształt powierzchni NURBS jest definiowany przez wiele punktów kontrolnych i stopień tej powierzchni w kierunkach U i V. Te same algorytmy służą do obliczania kształtu, normalnych, stycznych, krzywizn i innych właściwości za pomocą punktów kontrolnych, wag i stopnia.
W przypadku powierzchni NURBS istnieją dwa kierunki oznaczone geometrią, ponieważ powierzchnie NURBS są (niezależnie od kształtu, jaki widzimy) prostokątnymi siatkami punktów kontrolnych. Mimo że te kierunki są często arbitralne względem globalnego układu współrzędnych, często używa się ich do analizy modeli lub generowania innej geometrii na podstawie danej powierzchni.
Stopień (U,V) = (3, 3)
Stopień (U,V) = (3, 1)
Stopień (U,V) = (1, 2)
Stopień (U,V) = (1, 1)
Polipowierzchnie (PolySurface) składają się z powierzchni połączonych wzdłuż krawędzi. Polipowierzchnie zapewniają więcej możliwości niż dwuwymiarowa definicja UV, ponieważ teraz można poruszać się po połączonych kształtach za pomocą ich topologii.
Chociaż „topologia” zazwyczaj opisuje to, w jaki sposób części są połączone i/lub powiązane, topologia w dodatku Dynamo jest także typem geometrii. Konkretnie jest to kategoria nadrzędna dla powierzchni, polipowierzchni i brył.
Łączenie powierzchni w ten sposób (czasem jest to nazywane płatami) pozwala tworzyć bardziej złożone kształty, jak również definiować szczegóły wzdłuż spoiny. W ten sposób można zastosować zaokrąglenie lub fazowanie do krawędzi polipowierzchni.
W dziedzinie modelowania obliczeniowego siatki są jedną z najbardziej rozpowszechnionych form reprezentowania geometrii 3D. Geometria siatki jest zazwyczaj zbudowana z kolekcji czworokątów lub trójkątów. Może ona być uproszczoną i elastyczną alternatywą dla pracy z obiektami NURBS. Siatki są używane we wszystkich zastosowaniach — od renderowania i wizualizacji po cyfrowe wytwarzanie i drukowanie 3D.
Dodatek Dynamo definiuje siatki za pomocą struktury danych wierzchołek-powierzchnia. Na najbardziej podstawowym poziomie struktura ta stanowi po prostu zbiór punktów, które są pogrupowane w wieloboki. Punkty siatki są nazywane wierzchołkami, natomiast wieloboki podobne do powierzchni nazywane są powierzchniami.
Aby utworzyć siatkę, potrzebna jest lista wierzchołków i system grupowania tych wierzchołków w powierzchnie zwany grupą indeksów.
Lista wierzchołków
Lista grup indeksów do zdefiniowania powierzchni
Możliwości tworzenia siatki w dodatku Dynamo można rozszerzyć, instalując pakiet Mesh Toolkit. Zestaw Dynamo Mesh Toolkit zawiera narzędzia do importowania siatek z zewnętrznych formatów plików, tworzenia siatki z obiektów geometrii Dynamo oraz ręcznego tworzenia siatek na podstawie wierzchołków i indeksów.
Ta biblioteka zawiera również narzędzia do modyfikowania siatek, naprawiania siatek i wyodrębniania warstw poziomych do użycia w produkcji.
Odwiedź stronę analiz przypadków pakietu Mesh Toolkit, aby zapoznać się z przykładem korzystania z tego pakietu.
Siatka jest zbiorem czworokątów i trójkątów reprezentujących geometrię powierzchni lub bryły. Podobnie jak w przypadku brył, struktura obiektu siatki zawiera wierzchołki, krawędzie i powierzchnie. Istnieją dodatkowe właściwości, dzięki którym siatki są niepowtarzalne, jak na przykład normalne.
Wierzchołki siatki
Krawędzie siatki *Krawędzie z tylko jedną przylegającą powierzchnią są nazywane „nagimi”. Pozostałe krawędzie są „obleczone”
Powierzchnie siatki
Wierzchołki siatki są po prostu listą punktów. Indeks wierzchołków jest bardzo ważny podczas tworzenia siatki oraz uzyskiwania informacji o strukturze siatki. Dla każdego wierzchołka istnieje również odpowiadająca mu normalna wierzchołka (wektor), która opisuje średni kierunek dołączonych powierzchni i pomaga zrozumieć orientację „do wewnątrz” i „na zewnątrz” siatki.
Wierzchołki
Normalne wierzchołków
Powierzchnia stanowi uporządkowaną listę trzech lub czterech wierzchołków. Reprezentacja „powierzchni” siatki jest więc wnioskowana na podstawie położenia indeksowanych wierzchołków. Mamy już listę wierzchołków tworzących siatkę, więc zamiast udostępniać pojedyncze punkty w celu zdefiniowania powierzchni, wystarczy użyć indeksu wierzchołków. Dzięki temu możemy użyć tego samego wierzchołka w więcej niż jednej powierzchni.
Czworokątna powierzchnia utworzona z indeksami 0, 1, 2 i 3
Trójkątna powierzchnia utworzona z indeksami 1, 4 i 2 Uwaga: grupy indeksów mogą być przesunięte w kolejności — o ile kolejność jest ustawiona w kierunku przeciwnym do ruchu wskazówek zegara, powierzchnia zostanie zdefiniowana poprawnie
Czym różni się geometria siatki od geometrii NURBS? Kiedy można użyć jednej zamiast drugiej?
W poprzednim rozdziale pokazano, że powierzchnie NURBS są definiowane przez serię krzywych NURBS biegnących w dwóch kierunkach. Kierunki te są oznaczone jako U
i V
. Umożliwiają parametryzowanie powierzchni NURBS zgodnie z domeną powierzchni dwuwymiarowej. Same krzywe są przechowywane w postaci równań w komputerze, dzięki czemu wynikowe powierzchnie mogą być obliczane z dowolnym stopniem dokładności. Łączenie wielu powierzchni NURBS może być jednak trudne. Połączenie dwóch powierzchni NURBS spowoduje utworzenie polipowierzchni, w której różne przekroje geometrii będą miały różne parametry UV i definicje krzywych.
Powierzchnia
Krzywa izoparametryczna
Punkt kontrolny powierzchni
Wielobok kontrolny powierzchni
Punkt izoparametryczny
Ramka powierzchni
Siatka
Naga krawędź
Sieć siatki
Krawędzie siatki
Normalna wierzchołka
Powierzchnia siatki/Normalna powierzchni siatki
Natomiast siatki składają się z określonej liczby dokładnie zdefiniowanych wierzchołków i powierzchni. Sieć wierzchołków nie może być ogólnie zdefiniowana przez proste współrzędne UV
, a ponieważ liczba powierzchni jest określona, stopień dokładności jest wbudowany w siatkę. Można go zmienić tylko przez uściślenie siatki i dodanie większej liczby powierzchni. Brak opisów matematycznych pozwala na elastyczniejszą obsługę złożonych geometrii za pomocą jednej siatki.
Inną ważną różnicą jest zakres, w jakim zmiana lokalna w geometrii siatki lub NURBS wpływa na całą formę. Przesunięcie jednego wierzchołka siatki ma wpływ tylko na powierzchnie, które przylegają do tego wierzchołka. W powierzchniach NURBS stopień wpływu jest bardziej skomplikowany i zależy od stopnia powierzchni, jak również od wag i węzłów punktów kontrolnych. Jednak przesunięcie pojedynczego punktu kontrolnego w powierzchni NURBS powoduje gładsze, bardziej rozległe zmiany w geometrii.
Powierzchnia NURBS — przesunięcie punktu kontrolnego ma wpływ, który rozciąga się na całą powierzchnię kształtu
Geometria siatki — przesunięcie wierzchołka ma wpływ tylko na sąsiednie elementy
Jedną z analogii, która może być pomocna, jest porównanie obrazu wektorowego (składającego się z linii i krzywych) z obrazem rastrowym (składającym się z poszczególnych pikseli). Po powiększeniu obrazu wektorowego krzywe pozostają wyraźne i przejrzyste. Natomiast powiększenie obrazu rastrowego powoduje, że poszczególne piksele stają się większe. W tej analogii powierzchnie NURBS odpowiadają obrazowi wektorowemu, ponieważ istnieje gładka zależność matematyczna. Natomiast siatka zachowuje się podobnie do obrazu rastrowego z ustawioną rozdzielczością.
Gdy będziemy już gotowi, aby bardziej szczegółowo zająć się tworzeniem programów wizualnych, będziemy potrzebować lepszego zrozumienia używanych składników. W tym rozdziale przedstawiono podstawowe pojęcia dotyczące danych — czyli tego, co przepływa przez przewody programu dodatku Dynamo.
Geometria to język projektowania. Kiedy rdzeń środowiska lub języka programowania ma jądro geometryczne, daje to olbrzymie możliwości w zakresie projektowania precyzyjnych i wydajnych modeli, automatyzacji procedur projektowania oraz generowania iteracji projektowych za pomocą algorytmów.
Zrozumienie typów geometrii i ich zależności pozwala na nawigację w kolekcji Węzły geometrii dostępnej w bibliotece. Węzły geometrii są uporządkowane alfabetycznie (nie hierarchicznie) — tutaj są one wyświetlane podobnie do ich układu w interfejsie dodatku Dynamo.
Ponadto tworzenie modeli w dodatku Dynamo i łączenie podglądu elementów widocznych w podglądzie tła z przepływem danych na wykresie powinno stawać się w miarę upływu czasu bardziej intuicyjne.
Zwróć uwagę na zakładany układ współrzędnych renderowany przez siatkę i kolorowe osie
Wybrane węzły spowodują renderowanie odpowiedniej geometrii (jeśli dany węzeł tworzy geometrię) w tle w kolorze wyróżnienia
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Geometria, definiowana tradycyjnie, stanowi analizę kształtu, rozmiaru, względnego położenia figur i właściwości przestrzeni. Ta dziedzina ma bogatą historię obejmującą tysiące lat. Wraz z nadejściem i popularyzacją komputerów zyskaliśmy potężne narzędzie do definiowania, badania i generowania geometrii. Obecnie obliczenie wyniku złożonych interakcji geometrycznych jest tak łatwe, że nawet nie zauważamy, gdy to robimy.
Aby przekonać się, jak zróżnicowana i złożona może być geometria tworzona za pomocą komputera, szybko wyszukaj w Internecie królika Stanford — model kanoniczny używany do testowania algorytmów.
Zrozumienie geometrii w kontekście algorytmów, obliczeń i złożoności może wydawać się prawdziwym wyzwaniem. Istnieje jednak kilka kluczowych i stosunkowo prostych zasad stanowiących podstawy do rozpoczęcia tworzenia bardziej zaawansowanych aplikacji:
Geometria to dane — zarówno dla komputera, jak i dla dodatku Dynamo królik nie różni się zbytnio od liczby.
Geometria bazuje na abstrakcji — zasadniczo elementy geometryczne są opisywane przez liczby, zależności i wzory w ramach danego przestrzennego układu współrzędnych
Geometria ma hierarchię — punkty łączą się, tworząc linie, linie stykają się ze sobą, tworząc powierzchnie itd.
Geometria jednocześnie opisuje część i całość — kiedy mamy daną krzywą, jest to zarówno kształt, jak i wszystkie możliwe punkty wzdłuż niej
W praktyce zasady te oznaczają, że musimy mieć świadomość tego, z czym pracujemy (jaki to typ geometrii, jak został utworzony itd.), aby móc płynnie składać, rozkładać i ponownie składać różne geometrie, opracowując bardziej złożone modele.
Przyjrzyjmy się zależności między abstrakcyjnym a hierarchicznym opisem geometrii. Ponieważ te dwie koncepcje są powiązane, ale nie zawsze są od razu oczywiste, już zaraz po rozpoczęciu tworzenia bardziej złożonych procesów roboczych lub modeli można natrafić na problemy związane z pojęciami. Na początek użyjmy wymiarowości jako łatwego deskryptora „przedmiotów”, które modelujemy. Liczba wymiarów wymaganych do opisania kształtu daje nam pogląd na hierarchiczne uporządkowanie geometrii.
Punkt (definiowany przez współrzędne) nie ma wymiarów — to tylko liczby opisujące poszczególne współrzędne
Linia (definiowana przez dwa punkty) ma jeden wymiar — po linii można podróżować do przodu (kierunek dodatni) lub do tyłu (kierunek ujemny)
Płaszczyzna (zdefiniowana przez dwie linie) ma dwa wymiary — można po niej podróżować bardziej w lewo lub bardziej w prawo
Prostopadłościan (zdefiniowany przez dwie płaszczyzny) ma trzy wymiary — można zdefiniować położenie względem góry lub dołu
Wymiarowość jest wygodnym sposobem rozpoczęcia kategoryzowania geometrii, ale niekoniecznie jest najlepszym rozwiązaniem. W końcu nie modelujemy tylko za pomocą punktów, linii, płaszczyzn i prostopadłościanów — co jeśli chcemy użyć czegoś zakrzywionego? Ponadto istnieje cała inna kategoria typów geometrycznych, które są całkowicie abstrakcyjne. Oznacza to, że definiują one właściwości, takie jak orientacja, objętość lub zależności między częściami. Nie możemy dosłownie uchwycić wektora, więc jak zdefiniować go względem tego, co widzimy w przestrzeni? Bardziej szczegółowa kategoryzacja hierarchii geometrycznej powinna uwzględniać różnicę między typami abstrakcyjnymi („pomocniczymi”), które można pogrupować według tego, co pomagają osiągnąć, a typami, które pomagają opisać kształt elementów modelu.
Tworzenie modeli w dodatku Dynamo nie ogranicza się do tego, co można wygenerować za pomocą węzłów. Poniżej przedstawiono kilka najważniejszych sposobów, w jakie można przenieść proces na następny poziom za pomocą geometrii:
Dodatek Dynamo umożliwia importowanie plików — spróbuj użyć pliku CSV dla chmur punktów lub pliku SAT w celu dołączenia powierzchni
W przypadku pracy z programem Revit można odwoływać się do elementów programu Revit, aby używać ich w dodatku Dynamo
Menedżer pakietów Dynamo udostępnia dodatkowe funkcje dla rozszerzonych operacji i typów geometrii — sprawdź pakiet Mesh Toolkit
Dane są niezbędnym elementem programów. Podróżują przez przewody, trafiając na wejścia węzłów, w których są przetwarzane i przekształcane do nowej postaci — danych wyjściowych. Przeanalizujmy definicję danych, ich strukturę i rozpocznijmy korzystanie z nich w dodatku Dynamo.
Dane to zestaw wartości zmiennych jakościowych lub ilościowych. Najprostszą formą danych są liczby, takie jak 0
, 3.14
lub 17
. Jednak dane mogą być wielu innych typów, jak na przykład zmienna reprezentująca zmieniające się liczby (height
), znaki (myName
), geometria (Circle
) lub lista elementów danych (1,2,3,5,8,13,...
).
W dodatku Dynamo dodaje się/przekazuje się dane do portów wejściowych węzłów — można mieć dane bez operacji, ale aby przetworzyć operacje reprezentowane przez węzły, dane są niezbędne. Po dodaniu węzła do obszaru roboczego, jeśli nie ma on żadnych wejść, wynik będzie funkcją, a nie wynikiem samej operacji.
Proste dane
Pomyślne wykonanie danych i operacji (węzeł A)
Operacja (węzeł A) bez danych wejściowych zwraca funkcję ogólną
Uwaga: typ 'null'
„null” reprezentuje brak danych. Chociaż jest to pojęcie abstrakcyjne, często można się z nim spotkać podczas pracy z programowaniem wizualnym. Jeśli operacja nie utworzy poprawnego wyniku, węzeł zwróci wartość null.
Testowanie pod kątem wartości null i usuwanie ich ze struktury danych jest kluczową częścią tworzenia skutecznych programów.
Programowanie wizualne umożliwia bardzo szybkie generowanie dużej ilości danych, co może wymagać metod zarządzania ich hierarchią. Taka właśnie jest rola struktur danych, schematów organizacyjnych, w których przechowujemy dane. Specyfika struktur danych i sposób ich używania zależą od konkretnego języka programowania.
W dodatku Dynamo dodajemy hierarchię do danych za pomocą list. Przeanalizujemy to szczegółowo w kolejnych rozdziałach, ale na początek możemy po prostu stwierdzić, że:
Lista reprezentuje kolekcję elementów umieszczonych w jednej strukturze danych:
Mam pięć palców (elementy) dłoni (lista).
Na mojej ulicy (lista) jest dziesięć domów (elementy).
Węzeł Number Sequence definiuje listę liczb za pomocą wejść start, amount i step. Za pomocą tych węzłów utworzyliśmy dwie oddzielne listy dziesięciu liczb, jedna z nich obejmuje liczby 100–109, a druga — 0–9.
Węzeł List.GetItemAtIndex wybiera element z listy o określonym indeksie. W przypadku wybrania indeksu 0 pobieramy pierwszy element z listy (w tym przypadku 100).
Stosując ten sam proces do drugiej listy, otrzymujemy wartość 0, czyli pierwszy element na liście.
Teraz scalamy dwie listy w jedną, używając węzła List.Create. Warto zauważyć, że węzeł tworzy listę list. Powoduje to zmianę struktury danych.
Teraz gdy ponownie użyjemy węzła List.GetItemAtIndex z indeksem 0, pobierzemy pierwszą listę na liście list. Oznacza to, że lista jest traktowana jak element — stanowi to pewną różnicę w porównaniu z innymi językami skryptowymi. W kolejnych rozdziałach bardziej szczegółowo zajmiemy się manipulowaniem listami i strukturami danych.
Kluczowe pojęcie hierarchii danych w dodatku Dynamo, które należy zrozumieć: w odniesieniu do struktury danych listy są traktowane jak elementy. Innymi słowy, analizując strukturę danych, dodatek Dynamo stosuje proces „od góry do dołu”. Co to oznacza? Przeanalizujmy to na przykładzie.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W pierwszym przykładzie złożymy walec z powłoką, stosując hierarchię geometrii opisaną w tej sekcji.
1. Dodaj węzeł Point.ByCoordinates. Po dodaniu węzła do obszaru rysunku widać punkt w początku siatki podglądu dodatku Dynamo. Domyślne wartości wejść x, y i z to 0,0, co daje punkt w tym położeniu.
2. Plane.ByOriginNormal — następny krok w hierarchii geometrii to płaszczyzna. Istnieje kilka sposobów skonstruowania płaszczyzny — użyjemy dla wejścia pozycji origin i normal. Origin (początek) to węzeł punktu utworzony w poprzednim kroku.
Vector.ZAxis — jest to wektor jednostkowy w kierunku z. Warto zwrócić uwagę, że nie ma wejść, tylko wektor o wartości [0,0,1]. Użyjemy go jako wejścia normal dla węzła Plane.ByOriginNormal. Pozwala to uzyskać prostokątną płaszczyznę w podglądzie dodatku Dynamo.
3. Circle.ByPlaneRadius — dodając następny etap w hierarchii, tworzymy teraz krzywą z płaszczyzny w poprzednim kroku. Po utworzeniu podłączenia do węzła uzyskujemy okrąg w początku. Domyślna wartość promienia (radius) węzła wynosi 1.
4. Curve.Extrude — teraz dodamy temu elementowi wyrazu, nadając mu głębię i dodając trzeci wymiar. Ten węzeł tworzy powierzchnię z krzywej poprzez jej wyciągnięcie. Domyślna odległość w węźle wynosi 1, a w rzutni powinien być widoczny walec.
5. Surface.Thicken — ten węzeł umożliwia uzyskanie zamkniętej bryły przez odsunięcie powierzchni o określoną odległość i zamknięcie formy. Domyślna wartość grubości wynosi 1, a w rzutni widoczny jest walec z powłoką, zgodny z tymi wartościami.
6. Number Slider — zamiast używać domyślnych wartości dla wszystkich tych wejść, dodajmy do modelu kontrolę parametryczną.
Domain Edit — po dodaniu do obszaru rysunku węzła Number Slider kliknij daszek w lewym górnym rogu, aby wyświetlić opcje domeny.
Min/Max/Step — zmień wartości min, max i step na odpowiednio 0, 2 i 0,01. Umożliwia to sterowanie wielkością całkowitej geometrii.
7. Węzły Number Slider — we wszystkich domyślnych wejściach skopiujmy i wklejmy kilka razy ten suwak liczby (wybierz suwak, naciśnij klawisze Ctrl+C, a następnie klawisze Ctrl+V), tak aby wszystkie wejścia z domyślnymi wartościami miały zamiast nich suwaki. Niektóre z wartości suwaka muszą być większe od zera, aby definicja działała (na przykład potrzebna jest głębokość wyciągnięcia w celu pogrubienia powierzchni).
8. Za pomocą tych suwaków utworzyliśmy teraz parametryczny walec z powłoką. Spróbuj zmieniać niektóre z tych parametrów i obserwuj, jak geometria jest aktualizowana dynamicznie w rzutni dodatku Dynamo.
Węzły Number Slider — w ramach kontynuacji dodaliśmy wiele suwaków do obszaru rysunku i musimy oczyścić interfejs właśnie utworzonego narzędzia. Kliknij prawym przyciskiem myszy jeden suwak, wybierz polecenie „Zmień nazwę” i zmień nazwę każdego suwaka na odpowiednią dla danego parametru (thickness — „grubość”, Radius — „promień”, Height — „wysokość” itp.).
9. W tym momencie mamy już utworzony wspaniały walec z pogrubieniem. Obecnie jest to jeden obiekt. Przyjrzyjmy się temu, jak utworzyć szyk walców pozostających dynamicznie połączonych. W tym celu utworzymy listę walców, zamiast pracować z pojedynczym elementem.
Dodawanie (+) — naszym celem jest dodanie wiersza walców obok utworzonego walca. Aby dodać jeden walec przylegający do bieżącego, musimy uwzględnić zarówno promień walca, jak i grubość jego powłoki. Uzyskamy tę liczbę przez dodanie dwóch wartości suwaków.
10. Ten krok jest trudniejszy, więc przeanalizujmy go powoli: celem końcowym jest utworzenie listy liczb definiujących położenie każdego walca w wierszu.
a. Mnożenie — najpierw pomnożymy wartość z poprzedniego kroku przez 2. Wartość z poprzedniego kroku reprezentuje promień. Chcemy przesunąć walec o pełną średnicę.
b. Number Sequence — za pomocą tego węzła tworzymy szyk liczb. Pierwsze wejście to węzeł mnożenia (multiplication) z poprzedniego kroku skierowany do wartości step. Wartość start można ustawić na 0,0 za pomocą węzła number.
c. Integer Slider — w przypadku wartości amount połączymy suwak liczby całkowitej. Określi to liczbę utworzonych walców.
d. Output — na tej liście znajduje się przesunięcie każdego walca w szyku i jest ona parametrycznie sterowana przez oryginalne suwaki.
11. Ten krok jest prosty — podłącz sekwencję zdefiniowaną w poprzednim kroku do wejścia x oryginalnego węzła Point.ByCoordinates. Spowoduje to zastąpienie suwaka pointX, który można usunąć. Teraz widzimy szyk walców w rzutni (upewnij się, że suwak liczby całkowitej ma wartość większą niż 0).
12. Łańcuch cylindrów jest nadal dynamicznie połączony ze wszystkimi suwakami. Zmieniaj wartości poszczególnych suwaków i obserwuj aktualizację definicji.
Formalnie ciąg jest sekwencją znaków reprezentujących stałą literową lub pewnego typu zmienną. Nieformalnie ciąg (string) to programistyczne określenie tekstu. Pracowaliśmy już z liczbami, zarówno z liczbami całkowitymi, jak i z liczbami dziesiętnymi, aby sterować parametrami. Tak samo możemy pracować z tekstem.
Ciągi mogą być używane w wielu zastosowaniach, w tym do definiowania parametrów niestandardowych, opisywania zestawów dokumentacji i analizowania zestawów danych tekstowych. Węzeł string (ciąg) znajduje się w kategorii Podstawowe > Kategoria wejściowa.
Przykładowe węzły powyżej są ciągami. Liczba może być przedstawiona jako ciąg, podobnie jak litera lub cały szyk tekstu.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Można szybko analizować duże ilości danych, stosując zapytania do ciągów. Omówimy niektóre podstawowe operacje, które przyspieszają proces roboczy i ułatwiają współdziałanie oprogramowania.
Na poniższej ilustracji przedstawiono ciąg danych pochodzących z zewnętrznego arkusza kalkulacyjnego. Ciąg reprezentuje wierzchołki prostokąta na płaszczyźnie XY. Przeanalizujmy niektóre operacje dzielenia ciągów w miniaturowym ćwiczeniu:
Separator „;” oddziela każdy wierzchołek prostokąta. Powoduje to utworzenie listy z 3 elementami dla każdego wierzchołka.
Naciśnięcie klawisza „+” w środku węzła powoduje utworzenie nowego separatora.
Dodaj ciąg „,” do obszaru rysunku i utwórz podłączenie do nowego wejścia separatora.
Wynik stanowi teraz listę dziesięciu elementów. Węzeł wykonuje dzielenie najpierw na podstawie separatora separator0, a następnie na podstawie separatora separator1.
Powyższa lista elementów może wyglądać jak liczby, ale nadal są one traktowane w dodatku Dynamo jak pojedyncze ciągi. Aby można było utworzyć punkty, ich typ danych musi zostać przekształcony z ciągu w liczbę. Jest to wykonywane za pomocą węzła String.ToNumber
Ten węzeł jest prosty. Podłącz wyniki węzła String.Split do wejścia. Wynik nie wygląda inaczej, ale typ danych to teraz number (liczba), a nie string (ciąg).
Po wykonaniu pewnych dodatkowych podstawowych operacji mamy teraz trójkąt narysowany w punkcie początkowym na podstawie oryginalnego wejścia string.
Ponieważ ciąg jest ogólnym obiektem tekstowym, zakres jego zastosowań jest szeroki. Przyjrzyjmy się niektórym istotnym operacjom w obszarze Podstawowe > Kategoria ciągu w dodatku Dynamo:
Jest to metoda łączenia dwóch ciągów w kolejności. Powoduje pobranie każdego ciągu literalnego z listy i utworzenie jednego scalonego ciągu.
Poniżej przedstawiono scalanie trzech ciągów:
Aby dodać lub odjąć ciągi w scaleniu, można kliknąć przyciski +/- w środku węzła.
Wynikiem jest jeden scalony ciąg ze spacjami i interpunkcją.
Metoda łączenia jest bardzo podobna do scalania, ale zawiera dodatkową warstwę interpunkcji.
Osoby pracujące w programie Excel prawdopodobnie miały już do czynienia z plikami CSV. Są to pliki z wartościami rozdzielonymi przecinkami. Można użyć przecinka (lub, jak w tym przypadku, dwóch kresek) jako separatora z węzłem String.Join, aby utworzyć podobną strukturę danych.
Poniższa ilustracja przedstawia łączenie dwóch ciągów:
Wejście separatora umożliwia utworzenie ciągu rozdzielającego łączone ciągi.
Zacznijmy od podstawowego podziału ciągu zwrotki. Na początku należy zauważyć, że zapis jest sformatowany za pomocą przecinków. Użyjemy tego formatu, aby rozdzielić wiersze na poszczególne elementy.
Ciąg podstawowy zostaje wklejony do węzła String.
Do oznaczenia separatora używany jest inny węzeł String. W tym przypadku używamy przecinka.
Do obszaru rysunku zostaje dodany węzeł String.Split. Zostaje on połączony z tymi dwoma ciągami.
Wynik na wyjściu to wiersze będące osobnymi elementami.
Przejdźmy teraz do interesującej części wiersza: ostatnich dwóch wierszy. Oryginalna zwrotka była jednym elementem danych. Dane te zostały rozdzielone na poszczególne elementy w pierwszym kroku. Teraz musimy wyszukać tekst, który próbujemy znaleźć. Mimo że możemy to zrobić, wybierając dwa ostatnie elementy listy, to jednak jeśli byłaby to cała książka, nie chcielibyśmy czytać wszystkiego i ręcznie wyodrębniać elementów.
Zamiast ręcznego wyszukiwania używamy węzła String.Contains, aby wyszukać zestaw znaków. Jest to podobne do wykonywania polecenia „Znajdź” w edytorze tekstu. W tym przypadku zostanie zwrócona wartość „true” lub „false”, jeśli ten ciąg podrzędny zostanie znaleziony w elemencie.
W wejściu searchFor definiujemy ciąg podrzędny, którego szukamy w zwrotce. Użyjmy węzła String z tekstem „And miles”.
Zwrócony wynik zawiera listę pozycji false i true. Użyjemy tych wartości logicznych, aby przefiltrować elementy w następnym kroku.
List.FilterByBoolMask jest węzłem, za pomocą którego wyodrębnimy pozycje odpowiadające wartościom false i true. Wyjście „in” zwraca frazy z wejściem „mask” równym „true”, a wyjście „out” — te odpowiadające wartości „false”.
Wyniki na wyjściu „in” są zgodne z oczekiwaniami, czyli zwracają dwa ostatnie wiersze zwrotki.
Chcemy teraz podkreślić powtórzenie w tej zwrotce, scalając te dwa wiersze. Przeglądając wyniki na wyjściu w poprzednim kroku, łatwo zauważyć, że na liście znajdują się dwa elementy:
Za pomocą dwóch węzłów List.GetItemAtIndex można wyodrębnić te elementy, używając wartości 0 i 1 jako wejścia indeksu.
Na wyjściu każdego z tych węzłów pojawiają się dwa ostatnie wiersze — w kolejności.
Aby scalić te dwa elementy w jeden, użyjemy węzła String.Join:
Po dodaniu węzła String.Join widać, że potrzebny jest separator.
Aby utworzyć separator, dodamy węzeł String do obszaru rysunku i wpiszemy przecinek.
Ostatnie wyjście scala dwa ostatnie elementy w jeden.
Może to wydawać się dużą ilością pracy w celu wyodrębnienia dwóch ostatnich wierszy i to prawda — operacje na ciągach często wymagają pewnych początkowych nakładów pracy na. Ale są one skalowalne i mogą być względnie łatwo stosowane do dużych zestawów danych. Podczas pracy z zastosowaniem parametrów z arkuszami kalkulacyjnymi i funkcjami współdziałania należy pamiętać o operacjach na ciągach.
Logika, a w szczególności logika warunkowa, pozwala określić operację lub zestaw operacji na podstawie testu. Przez oszacowanie testu uzyskamy wartość logiczną reprezentującą prawdę (True
) lub fałsz (False
), za pomocą której można sterować przepływem programu.
Zmienne liczbowe mogą przechowywać liczby z szerokiego zakresu. Zmienne logiczne mogą przechowywać tylko dwie wartości, nazywane Prawda lub Fałsz, Tak lub Nie albo 1 lub 0. Rzadko stosuje się operacje logiczne do wykonywania obliczeń z powodu ich ograniczonego zakresu.
Instrukcja „If” (jeśli) stanowi kluczowe pojęcie w programowaniu: „Jeśli to jest prawdą, wtedy tak się stanie, w przeciwnym razie stanie się coś innego”. Wynikowa operacja tej instrukcji zależy od wartości logicznej. Istnieje wiele sposobów definiowania instrukcji „If” w dodatku Dynamo:
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Przeanalizujmy krótki przykład dotyczący działania każdego z tych trzech węzłów z użyciem instrukcji warunkowej „If”.
Na tej ilustracji wartość logiczna jest ustawiona na true, co oznacza, że wynik jest ciągiem: „this is the result if true” (to jest wynik, jeśli prawda). Trzy węzły tworzące instrukcję If działają tu w ten sam sposób.
Węzły działają identycznie. Jeśli wartość logiczna zostanie zmieniona na false, wynik będzie liczbą Pi, jak to zdefiniowano w oryginalnej instrukcji If.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Użyjmy logiki, aby rozdzielić listę liczb na listę liczb parzystych i listę liczb nieparzystych.
a. Number Range — dodaj zakres liczb do obszaru rysunku.
b. Number — dodaj trzy number liczb do obszaru rysunku. Wartość dla każdego węzła number powinna wynosić: 0,0 dla start, 10,0 dla end i 1,0 dla step.
c. Wyjście — wynik wyjściowy to lista 11 liczb w zakresie od 0 do 10.
d. Modulo (%) — węzeł Number Range do x i 2,0 do y. Spowoduje to obliczenie reszty z dzielenia przez 2 dla każdej liczby na liście. Wynik z tej listy to lista wartości 0 i 1.
e. Test równości (==) — dodaj test równości do obszaru rysunku. Podłącz wyjście modulo do wejścia x i wartość 0,0 do wejścia y.
f. Watch — wynik testu równości jest listą wartości logicznych true i false. Są to wartości używane do oddzielenia elementów na liście. 0 (lub true) reprezentuje liczby parzyste, a 1 (lub false) reprezentuje liczby nieparzyste.
g. List.FilterByBoolMask — ten węzeł filtruje wartości na dwie różne listy w oparciu o wejściową wartość logiczną. Podłącz oryginalny węzeł Number Range do wejścia list oraz wyjście equality test do wejścia mask. Wyjście in reprezentuje wartości true, podczas gdy wyjście out reprezentuje wartości false.
h. Watch — w wyniku tego mamy teraz listę liczb parzystych i listę liczb nieparzystych. Użyliśmy operatorów logicznych do rozdzielenia list na wzory.
Bazując na logice ustanowionej w pierwszym ćwiczeniu, zastosujmy tę konfigurację do operacji modelowania.
2. Oprzemy się na poprzednim ćwiczeniu z tymi samymi węzłami. Jedyne wyjątki to (oprócz zmiany formatu):
a. Użyj węzła Sequence z tymi wartościami wejściowymi.
b. Odłączyliśmy wejście list in od węzła List.FilterByBoolMask. Na razie odłożymy te węzły na bok, ale później w tym ćwiczeniu się przydadzą.
3. Zacznijmy od utworzenia oddzielnej grupy wykresu, jak pokazano na ilustracji powyżej. Ta grupa węzłów reprezentuje równanie parametryczne definiujące krzywą liniową. Kilka uwag:
a. Pierwszy suwak Number Slider reprezentuje częstotliwość fali. Powinien mieć wartość min. 1, maks. 4 i krok 0,01.
b. Drugi Number Slider reprezentuje amplitudę fali. Powinien mieć wartość min. 0, maks. 1 i krok równy 0,01.
c. PolyCurve.ByPoints — jeśli zostanie skopiowany powyższy wykres węzłów, wynikiem będzie krzywa sinusoidalna w rzutni podglądu Dynamo.
Metoda stosowana tutaj dla wejść: użyj węzłów number dla bardziej statycznych właściwości i węzłów Number Slider dla właściwości bardziej elastycznych. Chcemy zachować oryginalny węzeł Number Range definiowany na początku tego kroku. Jednak tworzona tutaj krzywa sinusoidalna powinna mieć pewną elastyczność. Możemy przesunąć te suwaki, aby obserwować, jak aktualizowane są częstotliwość i amplituda krzywej.
4. Będziemy analizować definicję nie po kolei, więc spójrzmy na wynik końcowy, aby móc się odwoływać do tego, do czego dążymy. Pierwsze dwa kroki są wykonywane oddzielnie, chcemy je teraz połączyć. Użyjemy bazowej krzywej sinusoidalnej do sterowania położeniem komponentów zamka, a za pomocą logiki prawdy/fałszu będziemy przełączać się między małymi i większymi kostkami.
a. Math.RemapRange — za pomocą sekwencji liczb utworzonej w kroku 02 utwórzmy nową serię liczb poprzez ponowne odwzorowanie zakresu. Oryginalne liczby z zakresu od 0 do 100 z kroku 01. Te liczby mieszczą się w zakresie od 0 do 1 dla odpowiednio wejść newMin i newMax.
5. Utwórz węzeł Curve.PointAtParameter, a następnie połącz wyjście Math.RemapRange z kroku 04 jako wejście param.
W tym kroku tworzone są punkty wzdłuż krzywej. Ponownie odwzorowaliśmy liczby na wartości od 0 do 1, ponieważ wejście param szuka wartości w tym zakresie. Wartość 0 reprezentuje punkt początkowy, a wartość 1 reprezentuje punkty końcowe. Wszystkie liczby między nimi są odwzorowane na wartości z zakresu [0,1].
6. Połącz wyjście z węzła Curve.PointAtParameter z węzłem List.FilterByBoolMask, aby rozdzielić listę indeksów nieparzystych i nieparzystych.
a. List.FilterByBoolMask — podłącz węzeł Curve.PointAtParameter z poprzedniego kroku do wejścia list.
b. Watch — węzeł obserwacyjny dla in i węzeł obserwacyjny dla out pokazują, że mamy dwie listy reprezentujące indeksy parzyste i nieparzyste. Punkty te są uporządkowane w ten sam sposób na krzywej, co przedstawimy w następnym kroku.
7. Następnie użyjemy wyjścia z węzła List.FilterByBoolMask w kroku 05, aby wygenerować geometrie o rozmiarach zgodnych z indeksami.
Cuboid.ByLengths — ponownie utwórz połączenia widoczne na ilustracji powyżej, aby uzyskać zamek wzdłuż krzywej sinusoidalnej. Prostopadłościan jest tutaj tylko kostką. Definiujemy jego rozmiar na podstawie punktu krzywej w środku kostki. Logika podziału na wartości parzyste/nieparzyste powinna być teraz czytelna w modelu.
a. Lista prostopadłościanów przy indeksach parzystych.
b. Lista prostopadłościanów przy indeksach nieparzystych.
Gotowe! Właśnie zaprogramowano proces definiowania wymiarów geometrii zgodnie z operacją logiczną przedstawioną w tym ćwiczeniu.
Ikona | Nazwa/składnia | Dane wejściowe | Dane wyjściowe |
---|
W tym ćwiczeniu użyjemy metod wykonywania zapytań i manipulowania ciągami w celu zdekonstruowania ostatniej zwrotki wiersza (Przystając pod lasem w śnieżny wieczór) autorstwa Roberta Frosta. Nie jest to najpraktyczniejsze zastosowanie, ale pomoże nam zrozumieć koncepcje operacji na ciągach podczas stosowania ich do czytelnych wierszy z rytmem i rymem.
Object.IsNull | obj | bool |
Jeśli (If) | test, prawda, fałsz | wynik |
Formuła (IF(x,y,z)) | x, y, z | wynik |
Code Block ((x?y:z);) | x? y, z | wynik |
Jeśli najprostszą formą danych są liczby, najprostszym sposobem powiązywania tych liczb jest matematyka. Od prostych operatorów, takich jak dzielenie czy funkcje trygonometryczne, po bardziej złożone formuły — matematyka stanowi doskonały sposób na rozpoczęcie badania zależności i wzorców między liczbami.
Operatory to zestaw komponentów, w których używane są funkcje algebraiczne z dwiema wejściowymi wartościami liczbowymi dającymi jedną wartość wyjściową (dodawanie, odejmowanie, mnożenie, dzielenie itp.). Można je znaleźć w obszarze Operatory > Operacje.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|---|---|---|
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Połącz operatory i zmienne, aby utworzyć bardziej złożone zależności za pomocą formuł. Użyj suwaków, aby utworzyć formułę, którą można sterować za pomocą parametrów wejściowych.
1. Utwórz sekwencję liczb reprezentującą „t” w równaniu parametrycznym. Lista powinna być wystarczająco duża, aby można było zdefiniować spiralę.
Number Sequence: zdefiniuj sekwencję liczb w oparciu o trzy wejścia: start, amount i step.
2. W powyższym kroku utworzono listę liczb definiujących dziedzinę parametryczną. Następnie utwórz grupę węzłów reprezentujących równanie złotej spirali.
Złota spirala jest zdefiniowana jako równanie:
Poniższa ilustracja przedstawia złotą spiralę w postaci programowania wizualnego. Podczas przechodzenia przez grupę węzłów należy zwrócić uwagę na analogię pomiędzy programem wizualnym a równaniem pisemnym.
a. Number Slider: dodaj dwa suwaki liczb do obszaru rysunku. Suwaki te reprezentują zmienne a i b równania parametrycznego. Te elementy reprezentują stałą, która jest elastyczna, lub parametry, które można dostosować do żądanego wyniku.
b. Multiplication (*): węzeł mnożenia jest reprezentowany przez gwiazdkę. Użyjemy tego wielokrotnie, aby połączyć zmienne mnożenia.
c. Math.RadiansToDegrees: wartości „t” muszą zostać przekształcone w stopnie w celu ich oszacowania w funkcjach trygonometrycznych. Należy pamiętać, że podczas szacowania tych funkcji dodatek Dynamo domyślnie obsługuje wartości w stopniach.
d. Math.Pow: jako funkcja wartości „t” i liczby „e” tworzy to ciąg Fibonacciego.
e. Math.Cos i Math.Sin: te dwie funkcje trygonometryczne będą różnicować współrzędną x i współrzędną y każdego punktu parametrycznego.
f. Watch: teraz widzimy, że wynik to dwie listy — współrzędne x i y punktów użytych do wygenerowania spirali.
Teraz zestaw węzłów z poprzedniego kroku będzie działać poprawnie, ale to sporo pracy. Aby utworzyć wydajniejszy proces roboczy, zapoznaj się z częścią DesignScript w celu definiowania ciągu wyrażeń Dynamo w jednym węźle. W następnej serii kroków przeanalizujemy używanie równania parametrycznego do rysowania spirali Fibonacciego.
Point.ByCoordinates: połącz górny węzeł multiplication z wejściem „x”, a dolny — z wejściem „y”. Na ekranie pojawi się spirala parametryczna punktów.
Polycurve.ByPoints: połącz węzeł Point.ByCoordinates z poprzedniego kroku z węzłem points. Węzeł connectLastToFirst możemy pozostawić bez wejścia, ponieważ nie tworzymy krzywej zamkniętej. Spowoduje to utworzenie spirali przechodzącej przez każdy punkt zdefiniowany w poprzednim kroku.
Mamy gotową spiralę Fibonacciego. Przekształcimy to jeszcze bardziej w dwóch osobnych ćwiczeniach, tworząc kształty nautilusa i słonecznika. Są to abstrakcje systemów naturalnych, ale zapewni to dobrą reprezentację tych dwóch różnych zastosowań spirali Fibonacciego.
Circle.ByCenterPointRadius: użyjemy tutaj węzła circle z tymi samymi wejściami co w poprzednim kroku. Domyślną wartością promienia jest 1,0, dlatego natychmiast widoczne będą wyniki okręgów. Od razu staje się jasne, w jaki sposób te punkty odbiegają dalej od początku.
Number Sequence: jest to oryginalny szyk „t”. Przez połączenie tej pozycji z wartością Circle.ByCenterPointRadius środki okręgów wciąż odbiegają dalej od początku, ale promień okręgów rośnie, tworząc interesujący wykres okręgów Fibonacciego.
Jeszcze lepiej, jeśli uda Ci się przekształcić go w wykres 3D.
Mamy już powłokę nautilusa — przejdźmy do siatek parametrycznych. Użyjemy podstawowego obrotu na spirali Fibonacciego, aby utworzyć siatkę Fibonacciego, a wynik zostanie wymodelowany na wzór rosnących nasion słonecznika.
Punktem wyjścia będzie ten sam krok co w poprzednim ćwiczeniu: utworzenie szyku spirali punktów za pomocą węzła Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Następnie wykonaj te minikroki, aby wygenerować serię spiral o różnych obrotach.
a. Geometry.Rotate: dostępnych jest kilka opcji Geometry.Rotate. Należy pamiętać, aby wybrać węzeł z wejściami geometry, basePlane i degrees. Połącz węzeł Point.ByCoordinates z wejściem geometry. Kliknij prawym przyciskiem myszy ten węzeł i upewnij się, że skratowanie jest ustawione na Iloczyn wektorowy
b. Plane.XY: połącz z wejściem basePlane. Wykonamy obrót wokół początku, który ma to samo położenie co podstawa spirali.
c. Number Range: na potrzeby wartości wejściowej w stopniach utworzymy wiele obrotów. Można to zrobić szybko za pomocą węzła Number Range. Połącz to z wejściem degrees.
d. Number: aby zdefiniować zakres liczb, dodaj trzy węzły number do obszaru rysunku w kolejności pionowej. Od góry do dołu przypisz odpowiednio wartości 0,0, 360,0 i 120,0. Sterują one obrotem spirali. Zwróć uwagę na wyniki z wyjścia węzła Number Range po połączeniu trzech węzłów number z tym węzłem.
Nasz wynik zaczyna przypominać wir. Dostosuj niektóre parametry węzła Number Range i obserwuj, jak zmieniają się wyniki.
Zmień rozmiar kroku (step) węzła Number Range z 120,0 na 36,0. Zwróć uwagę, że w ten sposób powstaje więcej obrotów, co zapewnia gęstszą siatkę.
Zmień rozmiar kroku (step) węzła Number Range z 36,0 na 3,6. Daje to teraz dużo gęstszą siatkę, a kierunkowość spirali jest niejasna. W ten sposób utworzyliśmy słonecznik.
Jeśli chcemy tworzyć bardziej złożone modele, których nie można utworzyć z pojedynczej powierzchni, lub jeśli chcemy zdefiniować dokładną objętość, musimy teraz omówić bryły (i powierzchnie PolySurface). Nawet prosty sześcian jest wystarczająco złożony, aby wymagać sześciu powierzchni — po jednej na ścianę. Bryły zapewniają dostęp do dwóch kluczowych pojęć, które nie istnieją w przypadku powierzchni — bardziej szczegółowego opisu topologicznego (powierzchni, krawędzi, wierzchołków) i operacji logicznych.
Do modyfikowania brył można używać operacji logicznych. Użyjmy kilku operacji logicznych, by utworzyć kolczastą kulę.
Sphere.ByCenterPointRadius: utwórz bryłę bazową.
Topology.Faces, Face.SurfaceGeometry: wykonaj zapytanie dotyczące powierzchni bryły i przekształć w geometrię powierzchni — w tym przypadku sfera ma tylko jedną powierzchnię.
Cone.ByPointsRadii: utwórz stożki przy użyciu punktów na powierzchni.
Solid.UnionAll: zsumuj stożki i sferę.
Topology.Edges: wykonaj zapytanie dotyczące krawędzi nowej bryły.
Solid.Fillet: dodaj do krawędzi kolczastej kuli zaokrąglenia.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Operacje logiczne są złożone i ich obliczanie może być powolne. Za pomocą funkcji „blokowania” można wstrzymać wykonywanie wybranych węzłów i zależnych od nich węzłów na dalszym etapie przepływu.
1. Użyj menu kontekstowego wyświetlanego po kliknięciu prawym przyciskiem myszy, aby zablokować operację sumowania brył
2. Wybrany węzeł i wszystkie węzły na dalszym etapie przepływu będą wyświetlane w podglądzie z jasnoszarym cieniowaniem, a zależne przewody będą wyświetlane jako linie kreskowane. Także zależny podgląd geometrii będzie cieniowany. Teraz można zmienić wartości na wcześniejszym etapie przepływu bez obliczania sumy logicznej.
3. Aby odblokować węzły, kliknij prawym przyciskiem myszy i wyczyść pole wyboru Zablokuj.
4. Wszystkie zależne węzły i skojarzone podglądy geometrii zostaną zaktualizowane i wrócą do standardowego trybu podglądu.
Więcej informacji na temat blokowania węzłów można znaleźć w sekcji Węzły i przewody.
Bryły składają się z jednej lub większej liczby powierzchni, które obejmują objętość w ramach zamkniętej obwiedni definiującej kierunek „do wewnątrz” lub „na zewnątrz”. Niezależnie od tego, ile jest tych powierzchni, muszą one tworzyć „szczelną” objętość, aby można było je uważać za bryłę. Bryły można tworzyć przez połączenie powierzchni lub polipowierzchni albo za pomocą operacji, takich jak wyciągnięcie złożone, przeciągnięcie i obrót. Obiekty elementarne takie jak sfera, sześcian, stożek i walec są również bryłami. Sześcian z usuniętą co najmniej jedną powierzchnią to polipowierzchnia, która ma podobne właściwości, ale nie jest bryłą.
Płaszczyzna składa się z pojedynczej powierzchni i nie jest bryłą.
Sfera składa się z pojedynczej powierzchni, ale jest bryłą.
Stożek składa się z dwóch połączonych ze sobą powierzchni tworzących bryłę.
Walec składa się z trzech połączonych ze sobą powierzchni tworzących bryłę.
Sześcian składa się z sześciu połączonych ze sobą powierzchni tworzących bryłę.
Bryły składają się z trzech typów elementów: wierzchołków, krawędzi i ścian. Ściany to powierzchnie tworzące bryłę. Krawędziami są krzywe definiujące połączenie pomiędzy przyległymi ścianami, a wierzchołki to punkty początkowe i końcowe tych krzywych. Te elementy mogą być przywoływane za pomocą węzłów topologii.
Powierzchnie
Krawędzie
Wierzchołki
Bryły można modyfikować przez zaokrąglenie lub fazowanie ich krawędzi w celu wyeliminowania ostrych narożników i kątów. Operacja fazowania tworzy powierzchnię prostokreślną między dwiema ścianami, natomiast zaokrąglenie łączy ściany, aby zachować styczność.
Sześcian bryłowy
Sześcian z fazowaniem
Sześcian z zaokrągleniami
Operacje logiczne na bryłach są metodami łączenia dwóch lub większej liczby brył. Pojedyncza operacja logiczna oznacza właściwie wykonanie czterech operacji:
Przecięcie dwóch lub większej liczby obiektów.
Podzielenie ich w punktach przecięcia.
Usunięcie niepotrzebnych części geometrii.
Połączenie wszystkiego z powrotem.
Union (suma): usuń nakładające się części brył i połącz je w jedną bryłę.
Difference (różnica): odejmij jedną bryłę od drugiej. Bryła odejmowana jest określana jako narzędzie. Warto zauważyć, że można zamienić bryłę wskazaną jako narzędzie, aby zachować odwrotną objętość.
Intersection (przecięcie): zachowaj tylko przecinającą się objętość dwóch brył.
UnionAll: operacja sumy ze sferą i stożkami skierowanymi na zewnątrz
DifferenceAll: operacja różnicy ze sferą i stożkami skierowanymi do wewnątrz
Dodajmy jeszcze jeden poziom do hierarchii. Jeśli weźmiemy talię kart z pierwszego przykładu i utworzymy pudełko z wieloma taliami, to pudełko reprezentuje listę talii, a każda talia reprezentuje listę kart. Tak działa lista list. Na potrzeby porównania w tej sekcji zakładamy, że ilustracja poniżej zawiera listę rolek monet, a każda rolka zawiera listę monet pensów.
Zdjęcie autorstwa Dori.
Jakie zapytania możemy utworzyć względem listy list? Umożliwia to dostęp do istniejących właściwości.
Ile jest typów monet? 2.
Jakie są wartości typów monet? 0,01 USD i 0,25 USD.
Z czego składają się monety 0,25 USD? 75% miedzi i 25% niklu.
Z czego składają się monety 0,01 USD? 97,5% cynku i 2,5% miedzi.
Jakie działania możemy wykonać na liście list? Lista list ulegnie zmianie zależnie od zadanej operacji.
Wybranie określonego stosu monet 0,25 lub 0,01 USD.
Wybranie określonej monety.
Zmiana kolejności stosów monet 0,25 i 0,01 USD.
Wymieszanie stosów.
Dodatek Dynamo zawiera węzeł odpowiadający każdej z powyższych operacji. Pracujemy na danych abstrakcyjnych, a nie obiektach fizycznych, dlatego jest potrzebny zestaw reguł dotyczących poruszania się w hierarchii danych.
W przypadku list list dane są złożone i znajdują się na wielu warstwach. Taka reprezentacja pozwala wykonywać wiele przydatnych operacji parametrycznych. W poniższych lekcjach omówimy podstawy tego systemu i jeszcze kilka operacji.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Najważniejsze założenie wynikające z tej sekcji jest takie, że dodatek Dynamo traktuje każdą listę jako obiekt. Taka hierarchia jest przydatna w przypadku programowania obiektowego. Zamiast wybierać elementy podrzędne przy użyciu poleceń takich jak List.GetItemAtIndex, dodatek Dynamo wybierze ten indeks na głównej liście struktury danych. Pod tym indeksem znajduje się kolejna lista. Przeanalizujemy ten mechanizm na przykładowej ilustracji:
W węźle Code Block zdefiniowaliśmy dwa zakresy:
0..2; 0..3;
Te zakresy są połączone z węzłem Point.ByCoordinates, gdzie skratowanie ustawiono na Iloczyn wektorowy. Powstaje w ten sposób siatka punktów, a na wyjściu jest generowana lista list.
Węzeł Watch wskazuje, że na każdej liście znajdują się 3 listy po 4 elementy.
W przypadku użycia węzła List.GetItemAtIndex z indeksem 0 dodatek Dynamo wybierze pierwszą listę z całą jej zawartością. Inne programy mogą wybrać pierwszy element każdej z list w strukturze danych, ale w dodatku Dynamo jest stosowana hierarchiczna obsługa danych.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł Flatten usuwa wszystkie poziomy ze struktury danych. Jest to przydatne, gdy hierarchia danych nie jest potrzebna w danej operacji, ale też ryzykowne, gdyż powoduje usunięcie informacji. Poniższy przykład ilustruje skutek spłaszczenia listy danych.
Wstaw wiersz kodu, aby zdefiniować zakres w węźle Code Block:
-250..-150..#4;
Połączymy węzeł Code Block z danymi wejściowymi x i y węzła Point.ByCoordinates i ustawimy skratowanie na Iloczyn wektorowy, aby usunąć siatkę punktów.
Węzeł Watch wskazuje, że powstała lista list.
Węzeł PolyCurve.ByPoints będzie odnosił się do każdej z listy i utworzy odpowiadające im krzywe złożone. W podglądzie dodatku Dynamo widać, że istnieją cztery krzywe złożone (polycurve) reprezentujące poszczególne wiersze siatki.
Wstawiając funkcję Flatten (spłaszczenia) przed węzłem krzywej złożonej, utworzyliśmy pojedynczą listę zawierającą wszystkie punkty. Węzeł PolyCurve.ByPoints odnosi się do listy, aby utworzyć jedną krzywą. Ponieważ wszystkie punkty są na liście, uzyskujemy jedną, skomplikowaną krzywą złożoną zawierającą te punkty.
Można również spłaszczyć wybrane poziomy danych. Węzeł List.Flatten pozwala zdefiniować zestaw tych poziomów danych w hierarchii, które mają zostać spłaszczone. Jest to bardzo przydatne narzędzie podczas przetwarzania złożonych struktur danych, które nie są bezpośrednio powiązane z bieżącym procesem roboczym. Oprócz tego można użyć węzła spłaszczania jako funkcji węzła List.Map. Poniżej przedstawiono więcej informacji na temat węzła List.Map.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Gdy model jest oparty na parametrach, czasami trzeba zmodyfikować strukturę danych istniejącej listy. Można to zrobić przy użyciu różnych węzłów, a węzeł podziału oferuje najprostszy mechanizm. Pozwala on podzielić listę na listy podrzędne o określonej liczbie elementów.
Polecenie Chop dzieli listy zależnie od długości listy wejściowej. W pewnym sensie dzielenie jest operacją odwrotną do spłaszczania: zamiast redukować strukturę danych, generuje nowe poziomy. Jest to przydatne narzędzie podczas pracy nad geometrią, tak jak na poniższym przykładzie.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.Map/Combine stosuje zadaną funkcję do listy wejściowej, ale o jeden poziom niżej w hierarchii. Kombinacje działają analogicznie do map, ale mają wiele wejść odpowiadających wejściu zadanej funkcji.
Uwaga: to ćwiczenie utworzono we wcześniejszej wersji dodatku Dynamo. Wiele funkcji węzła List.Map przestało być potrzebnych po wprowadzeniu funkcji List@Level. Więcej informacji można znaleźć w sekcji List@Level poniżej.
Na wstępie przyjrzymy się węzłowi List.Count z poprzedniej sekcji.
Węzeł List.Count liczy wszystkie elementy na liście. Użyjemy go, aby zademonstrować działanie węzła List.Map.
Wstaw dwa wiersze kodu do węzła Code Block:
-50..50..#Nx; -50..50..#Ny;
Po wpisaniu tego kodu blok będzie tworzył dwie dane wejściowe: Nx i Ny.
Korzystając z dwóch suwaków Integer Slider, zdefiniuj wartości Nx i Ny przez połączenie ich z węzłem Code Block.
Połącz poszczególne wiersze węzła Code Block odpowiednio z danymi wejściowymi X i Y węzła Point.ByCoordinates. Kliknij węzeł prawym przyciskiem myszy, wybierz opcję Skratowanie i wybierz pozycję Iloczyn wektorowy. Zostanie utworzona siatka punktów. Ustawiliśmy zakres od –50 do 50, dlatego odpowiada to domyślnej siatce dodatku Dynamo.
Węzeł Watch ujawnia utworzone punkty. Przyjrzyjmy się strukturze danych. Powstała lista list. Każda lista odpowiada wierszowi punktów siatki.
Połącz węzeł List.Count z wyjściem węzła obserwacyjnego z poprzedniego kroku.
Połącz węzeł Watch z wyjściem węzła List.Count.
Węzeł List.Count generuje wartość 5. Jest to równe zmiennej Nx zdefiniowanej w bloku kodu. Dlaczego tak jest?
Najpierw węzeł Point.ByCoordinates używa wejścia „x” jako głównej wartości wejściowej podczas tworzenia list. Gdy wartość Nx wynosi 5, a Ny wynosi 3, powstaje lista 5 list po 3 elementy.
Dodatek Dynamo traktuje listy jako obiekty, dlatego węzeł List.Count jest stosowany do listy głównej w hierarchii. Daje to wynik 5, czyli liczbę list na liście głównej.
Przy użyciu węzła List.Map przejdziemy niżej w hierarchii i wykonamy pewną funkcję na tym poziomie.
Węzeł List.Count nie ma żadnych wejść. Jest używany jako funkcja. Oznacza to, że węzeł List.Count jest stosowany do każdej z listy na niższym poziomie w hierarchii. Puste wejście węzła List.Count odpowiada liście wyjściowej węzła List.Map.
Jako wynik węzła List.Count otrzymujemy teraz listę 5 elementów, każdy o wartości 3. Odpowiada to długości poszczególnych podlist.
Uwaga: to ćwiczenie utworzono we wcześniejszej wersji dodatku Dynamo. Wiele funkcji węzła List.Combine przestało być potrzebnych po wprowadzeniu funkcji List@Level. Więcej informacji można znaleźć w sekcji List@Level poniżej.
W tym ćwiczeniu użyjemy węzła List.Combine, aby zademonstrować, jak można użyć go do zastosowania funkcji w oddzielnych listach obiektów.
Zacznij od przygotowania dwóch list punktów.
Użyj węzła Sequence, aby wygenerować 10 wartości, z których każda będzie miała przyrost 10-krokowy.
Połącz wynik z wejściem x węzła Point.ByCoordinates. Spowoduje to utworzenie listy punktów w dodatku Dynamo.
Dodaj drugi węzeł Point.ByCoordinates do obszaru roboczego, użyj tego samego wyjścia Sequence co w przypadku wejścia x, ale jako wejścia y użyj Interger Slider i ustaw jego wartość na 31 (może to być dowolna wartość, o ile nie będzie zachodzić na pierwszy zestaw punktów), tak aby 2 zestawy punktów nie nakładały się na siebie.
Następnie użyjemy węzła List.Combine, aby zastosować funkcję do obiektów na 2 osobnych listach. W tym przypadku będzie to prosta funkcja rysowania linii.
Dodaj węzeł List.Combine do obszaru roboczego i połącz 2 zestawy punktów jako wejścia list0 i list1.
Użyj Line.ByStartPointEndPoint jako funkcji wejściowej dla węzła List.Combine.
Po zakończeniu te 2 zestawy punktów są spakowane/sparowane za pomocą funkcji Line.ByStartPointEndPoint i powodują zwrócenie 10 linii w dodatku Dynamo.
Zapoznaj się z ćwiczeniem w części dotyczącej list n-wymiarowych, aby zobaczyć inny przykład użycia węzła List.Combine.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Funkcja List@Level jest preferowana względem węzła List.Map. Umożliwia ona bezpośrednie wybranie poziomu listy, który ma być przetwarzany — wprost na porcie wejściowym węzła. Tę funkcję można zastosować do dowolnego wejścia przychodzącego węzła, aby uzyskać dostęp do poziomów list szybciej i łatwiej niż w przypadku innych metod. Wystarczy wskazać węzłowi, który poziom listy ma być używany jako wejście, a węzeł zrobi resztę.
W tym ćwiczeniu użyjemy funkcji List@Level, aby odizolować określony poziom danych.
Zaczniemy od prostej trójwymiarowej siatki punktów.
Siatka jest tworzona przy użyciu zakresów X, Y i Z, dlatego wiemy, że struktura danych ma trzy poziomy: listy X, Y i Z.
Dane istnieją na różnych poziomach. Poziomy są wskazywane u dołu podglądu. Kolumny poziomów list odpowiadają danym na powyższych listach, co ułatwia identyfikację poziomu, który ma być przetwarzany.
Lista poziomów jest uporządkowana w odwrotnej kolejności — najniższy poziom danych na niej to zawsze poziom L1. Gwarantuje to odpowiednie działanie wykresów, nawet jeśli zostaną zmienione w przyszłości.
Aby użyć funkcji List@Level, kliknij przycisk >. W tym menu znajdują się dwa pola wyboru.
Użyj poziomów — powoduje to włączenie funkcji List@Level. Po kliknięciu tej opcji można klikać, aby wybierać poziomy list wejściowych, których ma używać węzeł. To menu pozwala szybko wypróbować różne opcje dotyczące poziomów, klikając strzałki w górę lub w dół.
Zachowaj strukturę listy — gdy ta opcja jest włączona, można zachować strukturę poziomów danych wejściowych. Czasami dane są celowo uporządkowane na podlistach. Zaznaczenie tej opcji pozwala zachować porządek list i uniknąć utraty informacji.
Dzięki prostej siatce 3D można otwierać i wizualizować strukturę list, przełączając różne poziomy list. Każda kombinacja poziomu list i indeksu zwraca inny zestaw punktów z oryginalnego zestawu 3D.
Filtr „@L2” w kodzie DesignScript umożliwia wybranie samej listy na poziomie 2. Lista na poziomie 2 z indeksem 0 zawiera tylko pierwszy zestaw punktów Y — zwracana jest siatka na płaszczyźnie XZ.
Jeśli zmienimy filtr poziomów na „L1”, uzyskamy dostęp do wszystkich danych na pierwszym poziomie list. Lista na poziomie 1 z indeksem 0 jest płaską listą z wszystkimi punktami 3D.
Filtr „L3” udostępnia tylko punkty z trzeciego poziomu list. Lista na poziomie 3 z indeksem 0 zawiera tylko pierwszy zestaw punktów Z — zwracana jest siatka na płaszczyźnie XY.
Filtr „L4” udostępnia tylko punkty z trzeciego poziomu list. Lista na poziomie 4 z indeksem 0 zawiera tylko pierwszy zestaw punktów X — zwracana jest siatka na płaszczyźnie YZ.
Choć dane z tego przykładu można uzyskać przy użyciu węzła List.Map, funkcja List@Level zdecydowanie upraszcza te interakcje, przez co ułatwia dostęp do danych węzła. Poniżej przedstawiono porównanie metod List.Map i List@Level:
Choć obie metody pozwalają uzyskać dostęp do tych samych punktów, funkcja List@Level ułatwia wybranie odpowiednich warstw danych w jednym węźle.
Aby użyć siatki punktów za pomocą węzła List.Map, trzeba użyć węzła List.GetItemAtIndex w połączeniu z węzłem List.Map. Każde przejście na niższy poziom listy wymaga użycia dodatkowego węzła List.Map. Zależnie od złożoności używanych list uzyskanie dostępu do odpowiednich informacji może wymagać dodania wielu węzłów List.Map do wykresu.
W tym przykładzie węzeł List.GetItemAtIndex połączony z węzłem List.Map zwraca ten sam zestaw punktów z tą samą strukturą list co węzeł List.GetItemAtIndex z wybraną opcją „@L3”.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Transpozycja jest podstawową funkcją obsługi list zawierających listy. Podobnie jak w arkuszach kalkulacyjnych, transpozycja polega na zamianie węzłów z kolumnami w strukturze danych. Zademonstrujemy to na prostej macierzy poniżej. W kolejnej sekcji przedstawimy sposób tworzenia relacji geometrycznych przy użyciu transpozycji.
Usuniemy węzły List.Count z poprzednich ćwiczeń i przeniesiemy je do geometrii, aby sprawdzić strukturę danych.
Połącz węzeł PolyCurve.ByPoints z wyjściem węzła obserwacyjnego węzła Point.ByCoordinates.
Wyjście wskazuje 5 krzywych złożonych i widzimy te krzywe w podglądzie dodatku Dynamo. Węzeł Dynamo wyszukuje listę punktów (w tym przypadku jest to lista list punktów) i tworzy z nich pojedynczą krzywą złożoną. Każda z tych list jest konwertowana na krzywą w strukturze danych.
Węzeł List.Transpose zamieni wszystkie elementy z wszystkimi listami na liście list. Choć brzmi to jak złożona operacja, działa tak samo jak transpozycja w programie Microsoft Excel: zamienia kolumny z wierszami w strukturze danych.
Wynik abstrakcyjny: Transpozycja zmieniła strukturę listy. Zamiast 5 list po 3 elementy otrzymujemy 3 listy po 5 elementów.
Wynik geometryczny: przy użyciu węzła PolyCurve.ByPoints otrzymujemy 3 krzywe złożone biegnące prostopadle do oryginalnych krzywych.
W kodzie bloku można użyć zapisu „[]”, aby utworzyć listę. Jest to szybsze i wygodniejsze niż użycie węzła List.Create. Węzeł Code Block jest bardziej szczegółowo opisany w rozdziale Węzły Code Block i DesignScript. Na poniższej ilustracji przedstawiono, jak zdefiniować w bloku kodu listę zawierającą wiele wyrażeń.
W węźle Code Block można użyć zapisu „[]”, aby szybko wybrać określone elementy ze złożonej struktury danych. Węzły Code Block są bardziej szczegółowo opisane w rozdziale Węzły Code Block i DesignScript. Na poniższej ilustracji przedstawiono, jak w bloku kodu uzyskać dostęp do listy zawierającej wiele typów danych.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W tym ćwiczeniu zmienimy powierzchnię przy użyciu logiki zdefiniowanej w poprzednim ćwiczeniu. Tutaj nasz cel jest intuicyjny, ale nawigacja w strukturze danych wymaga więcej uwagi. Chcemy poruszyć powierzchnią, przesuwając punkt kontrolny.
Zacznij od powyższego ciągu węzłów. Tworzymy prostą powierzchnię obejmującą domyślą siatkę dodatku Dynamo.
Przy użyciu węzła Code Block wstaw te dwa wiersze kodu i połącz blok z wejściami u i v węzła Surface.PointAtParameter:
-50..50..#3;
-50..50..#5;
Pamiętaj, aby ustawić skratowanie węzła Surface.PointAtParameter na Iloczyn wektorowy.
Węzeł Watch wskazuje, że powstały 3 listy po 5 elementów.
W tym kroku chcemy pobrać punkt środkowy utworzonej siatki. Aby to zrobić, wybierzemy środkowy punkt środkowej listy. To naprawdę proste.
Aby upewnić się, że to właściwy punkt, można też klikać w węźle Watch, aby sprawdzić, czy używamy odpowiedniego elementu.
Przy użyciu węzła Code Block napiszemy prosty kod pobierający listę list:
points[1][2];
Przy użyciu węzła Geometry.Translate przesuniemy wybrany punkt w kierunku Z o 20 jednostek.
Wybierzmy też środkowy wiersz punktów, używając węzła List.GetItemAtIndex. Uwaga: podobnie jak w poprzednim kroku, możemy pobrać elementy listy przy użyciu węzła Code Block zawierającego wiersz
points[1];
Pobraliśmy punkt środkowy i przesunęliśmy go w górę. Teraz chcemy wstawić przesunięty punkt z powrotem do struktury danych.
Najpierw chcemy zastąpić odizolowany w poprzednim kroku element listy.
Zastąpimy środkowy element przy użyciu węzła List.ReplaceItemAtIndex. Użyjemy indeksu 2, a zastępujący go element będzie połączony z przesuniętym punktem (Geometry.Translate).
W danych wyjściowych widzimy, że wprowadziliśmy przesunięty punkt jako środkowy element listy.
Mając zmodyfikowaną listę, musimy wstawić ją z powrotem do oryginalnej struktury danych: listy list.
W analogiczny sposób użyjemy węzła List.ReplaceItemAtIndex, aby wstawić naszą listę w miejsce środkowej listy.
Węzły Code Block definiujące indeks tych dwóch węzłów mają numery 1 i 2, co odpowiada oryginalnemu zapytaniu w węźle Code Block (points[1][2]).
Po wybraniu listy o indeksie 1 zobaczymy tę strukturę danych podświetloną w podglądzie dodatku Dynamo. Pomyślnie scaliliśmy przesunięty punkt z oryginalną strukturą danych.
Istnieją różne sposoby uzyskania powierzchni z tego zestawu punktów. W tym przypadku utworzymy ją przez wyciągnięcie połączonych krzywych.
Utwórz węzeł NurbsCurve.ByPoints i połącz z nim nową strukturę danych, aby utworzyć trzy krzywe NURBS.
Połącz węzeł Surface.ByLoft z wyjściem węzła NurbsCurve.ByPoints. Otrzymaliśmy zmodyfikowaną powierzchnię. Możemy zmienić oryginalną wartość Z geometrii. Użyj translacji i zobacz, jak zostanie zaktualizowana geometria.
Ten indeks zawiera dodatkowe informacje o wszystkich węzłach zawartych w tym elementarzu, a także o pozostałych składnikach, które mogą być przydatne. Podano w nim tylko część z około 500 węzłów dostępnych w programie Dynamo.
**Innymi słowy: jeśli utworzysz długość szerokości prostopadłościanu (na osi X) równą 10 i przekształcisz go, stosując układ współrzędnych z 2-krotnym skalowaniem na osi X, szerokość nadal będzie wynosić 10. ASM nie pozwala wyodrębnić wierzchołków bryły w przewidywalnej kolejności, dlatego nie można określić wymiarów po przekształceniu.
Ustaliliśmy już, czym jest lista. Omówmy teraz operacje, które możemy na niej wykonać. Wyobraź sobie listę jako talię kart do gry. Talia jest listą, a każda karta reprezentuje element.
Jakie zapytania możemy wykonać z poziomu listy? Umożliwia to dostęp do istniejących właściwości.
Liczba kart w talii? 52.
Liczba kolorów? 4.
Materiał? Papier.
Długość? 3,5" lub 89 mm.
Szerokość? 2,5" lub 64 mm.
Jakie działania możemy wykonać na liście list? Umożliwia to zmianę listy w oparciu o daną operację.
Możemy potasować talię.
Możemy posortować talię według wartości.
Możemy posortować talię według kolorów.
Możemy podzielić talię.
Możemy rozdać karty w talii.
Możemy wybrać określoną kartę w talii.
Dla wszystkich operacji wymienionych powyżej istnieją analogiczne węzły Dynamo do pracy z listami danych ogólnych. W poniższych lekcjach przedstawiono niektóre z podstawowych operacji, które można wykonywać na listach.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Poniższy rysunek przedstawia wykres bazowy, na którym rysujemy linie między dwoma okręgami, aby przedstawić podstawowe operacje na listach. Przeanalizujemy sposób zarządzania danymi na liście i przedstawimy wyniki wizualne za pomocą poniższych operacji na liście.
Rozpocznij od węzła Code Block o wartości
500;
Połącz wejście x z węzłem Point.ByCoordinates.
Podłącz węzeł z poprzedniego kroku do wejścia origin węzła Plane.ByOriginNormal.
Za pomocą węzła Circle.ByPlaneRadius podłącz węzeł z poprzedniego kroku do wejścia plane.
Używając węzła Code Block, oznacz wartość
50;
dla pozycji radius. To pierwszy okrąg, który utworzymy.Za pomocą węzła Geometry.Translate przesuń okrąg w górę o 100 jednostek w kierunku Z.
Za pomocą węzła Code Block zdefiniuj zakres dziesięciu liczb z zakresu od 0 do 1 przy użyciu tego wiersza kodu:
0..1..#10;
Wstaw blok kodu z poprzedniego kroku do wejścia param dwóch węzłów Curve.PointAtParameter. Podłącz węzeł Circle.ByPlaneRadius do wejścia curve górnego węzła i węzeł Geometry.Translate do wejścia curve węzła poniżej.
Za pomocą węzła Line.ByStartPointEndPoint połącz dwa węzły Curve.PointAtParameter.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.Count jest prosty: zlicza wartości na liście i zwraca ich liczbę. Jego działanie jest nieco bardziej złożone podczas pracy z listami list, ale zilustrujemy to w późniejszych sekcjach.
Węzeł **List.Count ****** zwraca liczbę linii w węźle Line.ByStartPointEndPoint. W tym przypadku wynosi ona 10, co odpowiada liczbie punktów utworzonych z oryginalnego węzła Code Block.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.GetItemAtIndex zapewnia podstawowy sposób stosowania zapytania dotyczącego elementu listy.
Najpierw kliknij prawym przyciskiem myszy węzeł Line.ByStartPointEndPoint, aby wyłączyć jego podgląd.
Za pomocą węzła List.GetItemAtIndex wybieramy indeks „0”, czyli pierwszy element na liście linii.
Zmień wartość suwaka na od 0 do 9, aby wybrać inny element za pomocą węzła List.GetItemAtIndex.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.Reverse odwraca kolejność wszystkich elementów na liście.
Aby poprawnie zwizualizować odwróconą listę linii, utwórz więcej linii, zmieniając węzeł Code Block na
0..1..#50;
Powiel węzeł Line.ByStartPointEndPoint oraz wstaw węzeł List.Reverse między węzłem Curve.PointAtParameter i drugim węzłem Line.ByStartPointEndPoint
Użyj węzłów Watch3D, aby wyświetlić podgląd dwóch różnych wyników. Pierwszy pokazuje wynik bez odwróconej listy. Linie łączą się pionowo z sąsiednimi punktami. Natomiast odwrócona lista powoduje połączenie wszystkich punktów w kolejności odwrotnej na drugiej liście.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.ShiftIndices jest dobrym narzędziem do tworzenia skrętów lub wzorców śrubowych albo do innych podobnych manipulacji danymi. Ten węzeł przesuwa elementy na liście o podaną wartość indeksu.
W tym samym procesie, w którym występuje odwrócona lista, wstaw węzeł List.ShiftIndices do węzłów Curve.PointAtParameter i Line.ByStartPointEndPoint.
Używając węzła Code Block, określ wartość „1”, aby przesunąć listę o jeden indeks.
Zauważmy, że zmiana jest subtelna, ale wszystkie linie w dolnym węźle Watch3D przesunęły się o jeden indeks podczas łączenia się z drugim zestawem punktów.
Po zmianie wartości w węźle Code Block na większą, na przykład „30”, zauważamy znaczną różnicę w liniach ukośnych. W tym przypadku przesunięcie działa jak obiektyw aparatu, tworząc skręt w oryginalnej formie walcowej.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Węzeł List.FilterByBooleanMask usuwa niektóre elementy w oparciu o listę wartości logicznych lub wartości odczytywanych jako „true” lub „false”.
Aby utworzyć listę wartości odczytywanych jako „true” lub „false”, musimy wykonać nieco więcej pracy.
Używając węzła Code Block, zdefiniuj wyrażenie ze składnią:
0..List.Count(list);
. Połącz węzeł Curve.PointAtParameter z wejściem list. Przeanalizujemy tę konfiguracje dokładniej w rozdziale dotyczącym węzła Code Block, ale wiersz kodu w tym przypadku tworzy listę reprezentującą każdy indeks węzła Curve.PointAtParameter.Używając węzła %** (moduł)**, połącz wyjście węzła Code Block z wejściem x oraz wartość 4 z wejściem y. Spowoduje to zwrócenie reszty z dzielenia listy indeksów przez 4. Węzeł modułu jest bardzo przydatny podczas tworzenia szyku. Wszystkie wartości będą odczytywane jako możliwe reszty z dzielenia przez 4, czyli 0, 1, 2 i 3.
Na podstawie węzła %** (moduł)** wiemy, że wartość 0 oznacza, iż indeks jest podzielny przez 4 (0, 4, 8 itd...). Za pomocą węzła == możemy sprawdzić tę dzielność, testując tę pozycję pod kątem wartości „0”.
Węzeł Watch pokazuje tylko, że mamy wzorzec true/false, który wygląda następująco: true,false,false,false....
Używając tego wzorca true/false, utwórz połączenie z wejściem mask dwóch węzłów List.FilterByBooleanMask.
Połącz węzeł Curve.PointAtParameter z każdym wejściem list węzła List.FilterByBooleanMask.
Wyjścia węzła Filter.ByBooleanMask to „in” oraz „out”. Wyjście „in” reprezentuje wartości, które miały wartość maski „true”, a wyjście „out” — wartość maski „false”. Podłączając wyjścia „in” do wejść startPoint i endPoint węzła Line.ByStartPointEndPoint, utworzyliśmy przefiltrowaną listę linii.
Węzeł Watch3D pokazuje, że mamy mniej linii niż punktów. Wybraliśmy tylko 25% węzłów, filtrując tylko wartości true.
Dodatek Dynamo 2.0 udostępnia różne węzły słownika do wykorzystania. Obejmuje to węzły tworzenia, operacji i zapytań.
1. Węzeł Dictionary.ByKeysValues
tworzy słownik z określonymi wartościami i kluczami. (Liczba pozycji będzie zgodna z liczbą pozycji na najkrótszej liście wejściowej)
2. Węzeł Dictionary.Components
tworzy składniki słownika wejściowego. (Jest to operacja odwrotna do operacji węzła tworzenia).
3. Węzeł Dictionary.RemoveKeys
tworzy nowy obiekt słownika z usuniętymi kluczami wejściowymi.
4. Węzeł Dictionary.SetValueAtKeys
tworzy nowy słownik na podstawie wejściowych kluczy i wartości zastępujących bieżące wartości dla odpowiednich kluczy.
5. Węzeł Dictionary.ValueAtKey
zwraca wartość dla klucza wejściowego.
6. Węzeł Dictionary.Count
zwraca liczbę par wartości i kluczy w słowniku.
7. Węzeł Dictionary.Keys
zwraca aktualnie przechowywane w słowniku klucze.
8. Węzeł Dictionary.Values
zwraca aktualnie przechowywane w słowniku wartości.
Ogólnie powiązywanie danych ze słownikami stanowi świetną alternatywę dla starej metody pracy z indeksami i listami.
Listy są sposobem organizowania danych. W systemie operacyjnym komputera dostępne są pliki i foldery. W dodatku Dynamo można je traktować jako odpowiednio elementy i listy. Podobnie jak w systemie operacyjnym, istnieje wiele sposobów tworzenia, modyfikowania i przywoływania danych. W tym rozdziale omówimy sposób zarządzania listami w dodatku Dynamo.
jest zdefiniowany przez tylko jedną wartość lub tylko kilka wartości nazywanych współrzędnymi. Liczba wartości współrzędnych potrzebnych do zdefiniowania punktu zależy od układu współrzędnych lub kontekstu, w którym się on znajduje.
Najczęściej używany typ punktu w dodatku Dynamo istnieje w trójwymiarowym globalnym układzie współrzędnych i ma trzy współrzędne [X,Y,Z] (w dodatku Dynamo jest to punkt 3D).
Punkt 2D w dodatku Dynamo ma dwie współrzędne [X,Y].
Parametry dla krzywych i powierzchni są ciągłe i rozciągają się poza krawędź danej geometrii. Ponieważ kształty definiujące przestrzeń parametryczną znajdują się w trójwymiarowym globalnym układzie współrzędnych, zawsze można przekształcić współrzędną parametryczną we współrzędną „globalną”. Na przykład punkt [0,2, 0,5] na powierzchni jest taki sam jak punkt [1,8, 2,0, 4,1] we współrzędnych globalnych.
Punkt w zakładanych współrzędnych globalnych XYZ
Punkt względem danego układu współrzędnych (walcowego)
Punkt jako współrzędne UV na powierzchni
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Jeśli geometria jest językiem modelu, punkty są alfabetem. Punkty są podstawą tworzenia całej geometrii — do utworzenia krzywej potrzebne są co najmniej dwa punkty, do utworzenia wieloboku lub powierzchni siatki potrzebne są co najmniej trzy punkty itd. Zdefiniowanie położenia, kolejności i relacji między punktami (np. funkcji sinus) umożliwia zdefiniowanie geometrii wyższego rzędu, takich jak elementy rozpoznawane przez użytkownika jako okręgi lub krzywe.
Okrąg na podstawie funkcji
x=r*cos(t)
iy=r*sin(t)
Krzywa sinusoidalna na podstawie funkcji
x=(t)
iy=r*sin(t)
Punkty mogą również występować w dwuwymiarowym układzie współrzędnych. Konwencja wskazuje różne notacje literowe w zależności od tego, z którym typem przestrzeni pracujemy — możemy używać [X,Y] na płaszczyźnie lub [U,V] na powierzchni.
Punkt w euklidesowym układzie współrzędnych: [X,Y,Z]
Punkt w układzie współrzędnych z parametrem krzywej: [t]
Punkt w układzie współrzędnych z parametrami powierzchni: [U,V]
jest reprezentacją wielkości i kierunku. Można go interpretować jako strzałkę zmierzającą w określonym kierunku z daną prędkością. Jest to kluczowy element modeli w dodatku Dynamo. Ponieważ należą one do kategorii abstrakcyjnych „elementów pomocniczych”, gdy utworzymy wektor, nie zobaczymy niczego w podglądzie tła.
Można użyć linii jako symbolu zastępczego dla podglądu wektora.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Chociaż płaszczyzny są abstrakcyjne, mają początek, więc można je umieścić w przestrzeni.
W dodatku Dynamo płaszczyzny są renderowane w podglądzie tła.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Chociaż układy współrzędnych są abstrakcyjne, mają początek, więc można je umieścić w przestrzeni.
W dodatku Dynamo układy współrzędnych są renderowane w podglądzie tła jako punkt (początek) oraz linie definiujące osie (oś X jest czerwona, oś Y — zielona, a oś Z — niebieska, zgodnie z konwencją).
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Wektory, płaszczyzny i układy współrzędnych tworzą podstawową grupę abstrakcyjnych typów geometrii. Pomagają definiować położenie, orientację i kontekst przestrzenny dla innych typów geometrii, które opisują kształty. Jeśli stwierdzam, że jestem w Nowym Jorku przy 42-tej ulicy oraz Broadwayu (układ współrzędnych), stoję na poziomie ulicy (płaszczyzna) i patrzę na północ (wektor), używam tych „elementów pomocniczych”, by określić, gdzie jestem. To samo dotyczy produktu takiego jak etui telefonu czy drapacza chmur — potrzebujemy tego kontekstu do opracowania modelu.
Wektor jest wielkością geometryczną opisującą kierunek i wartość. Wektory są abstrakcyjne. To znaczy, że reprezentują wielkość, a nie element geometryczny. Wektory można łatwo pomylić z punktami, ponieważ i jedne, i drugie zawierają listę wartości. Istnieje jednak zasadnicza różnica: punkty opisują położenie w danym układzie współrzędnych, natomiast wektory opisują względną różnicę w pozycji, która odpowiada pojęciu „kierunku”.
Jeśli pojęcie względnej różnicy jest niejasne, o wektorze AB można myśleć w ten sposób: „stoję w punkcie A, patrząc w kierunku punktu B”. Kierunek, stąd (A) dotąd (B), jest wektorem.
Dalsze rozbicie wektorów na ich części przy użyciu tej samej notacji AB:
Punkt początkowy wektora nosi nazwę punktu zaczepienia.
**Punkt końcowy **wektora nazywamy wierzchołkiem lub zwrotem.
Wektor AB nie jest taki sam jak wektor BA, który wskazuje w przeciwnym kierunku.
Z wektorów i ich abstrakcyjnej definicji można się pośmiać, oglądając klasyczną komedię „Czy leci z nami pilot?”:
Zrozumiałem, zrozumiałem. Jaki jest nasz wektor, Victor?
Płaszczyzny to dwuwymiarowe abstrakcyjne „elementy pomocnicze”. Mówiąc konkretniej, płaszczyzny są „płaskie” i rozciągają się w dwóch kierunkach w nieskończoność. Zazwyczaj są one renderowane jako mniejsze prostokąty w pobliżu ich początku.
W tym momencie zapewne myślisz sobie: „Chwileczkę! Początek? Brzmi to jak układ współrzędnych... Taki jak używany do modelowania w oprogramowaniu CAD”!
I masz rację. Większość programów do modelowania wykorzystuje płaszczyzny konstrukcyjne lub „poziomy” do definiowania lokalnego kontekstu dwuwymiarowego, w którym odbywa się szkicowanie. Bardziej znajomo mogą brzmieć określenia XY, XZ, YZ — lub — północ, południowy wschód czy rzut. Wszystkie one to płaszczyzny definiujące nieskończony „płaski” kontekst. Płaszczyzny nie mają głębokości, ale również pomagają w opisie kierunku —
Jeśli pojęcie płaszczyzny jest już dla nas jasne, zrozumienie układów współrzędnych jest już o krok od tego. Płaszczyzna ma te same części co układ współrzędnych pod warunkiem, że mamy na myśli standardowy układ współrzędnych — „euklidesowy” lub „XYZ”.
Istnieją jednak inne, alternatywne układy współrzędnych, takie jak walcowy lub sferyczny. Jak zostanie to przedstawione w kolejnych sekcjach, układy współrzędnych można również stosować do innych typów geometrii w celu zdefiniowania położenia w ramach takiej geometrii.
Dodawanie alternatywnych układów współrzędnych — walcowego, sferycznego
Idąc dalej, możemy dodać jeszcze więcej poziomów do hierarchii. Struktura danych może znacznie wykraczać poza dwuwymiarową listę list. Ponieważ same listy również są elementami w dodatku Dynamo, możemy tworzyć dane z dowolnie dużą liczbą wymiarów.
Można to porównać do rosyjskich matrioszek. Każdą listę można traktować jako jeden pojemnik zawierający wiele elementów. Każda lista ma określone właściwości i sama w sobie jest traktowana jako obiekt.
Zestaw matrioszek (autor zdjęcia: ) to dobra analogia dla list n-wymiarowych. Każda warstwa oznacza listę, a każda lista zawiera elementy. W dodatku Dynamo każdy pojemnik może zawierać wiele pojemników (elementów listy).
Listy n-wymiarowe trudno przedstawić wizualnie, ale w tym rozdziale przygotowaliśmy kilka ćwiczeń dotyczących pracy z listami wykraczającymi poza dwa wymiary.
Odwzorowywanie to zdecydowanie najbardziej złożona część zarządzania danymi w programie Dynamo, szczególnie istotna podczas pracy ze złożonymi hierarchiami list. W poniższych ćwiczeniach pokazano, kiedy używać odwzorowywania i kombinacji podczas pracy z wielowymiarowymi danymi.
Wstępne informacje o węzłach List.Map i List.Combine można znaleźć w poprzedniej sekcji. W ostatnim ćwiczeniu użyjemy tych węzłów w złożonej strukturze danych.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
To pierwsze z serii trzech ćwiczeń, które skupia się na artykulacji zaimportowanej geometrii. W każdej części tej serii ćwiczeń zwiększy się złożoność struktury danych.
Zacznijmy od pliku .sat w folderze plików ćwiczeniowych. Można przechwycić ten plik za pomocą węzła File Path.
Za pomocą węzła Geometry.ImportFromSAT geometria jest importowana do podglądu dodatku Dynamo jako dwie powierzchnie.
Aby uprościć to ćwiczenie, będziemy pracować z jedną z tych powierzchni.
Wybierzmy indeks 1, aby przechwycić górną powierzchnię. Służy do tego węzeł List.GetItemAtIndex.
Wyłącz podgląd geometrii w podglądzie Geometry.ImportFromSAT.
Kolejnym etapem jest podzielenie powierzchni na siatkę punktów.
1. Za pomocą węzła Code Block wstaw następujące dwa wiersze kodu:
0..1..#10;
0..1..#5;
2. W węźle Surface.PointAtParameter połącz te dwie wartości z węzła Code Block z elementami u i v. Zmień opcję skratowania tego węzła na „Iloczyn wektorowy”.
3. Wynik pokazuje strukturę danych, która jest również widoczna w podglądzie dodatku Dynamo.
Następnie użyto punktów z ostatniego kroku, aby wygenerować dziesięć krzywych wzdłuż powierzchni.
Aby zobaczyć, jak zorganizowana jest struktura danych, połączmy węzeł NurbsCurve.ByPoints z elementem wyjściowym węzła Surface.PointAtParameter.
Podgląd można na razie wyłączyć z poziomu węzła List.GetItemAtIndex, aby uzyskać bardziej czytelny wynik.
Podstawowa funkcja List.Transpose spowoduje zamianę kolumn i wierszy listy list.
Po połączeniu elementu wyjściowego węzła List.Transpose z węzłem NurbsCurve.ByPoints powstanie pięć krzywych biegnących poziomo na powierzchni.
Podgląd można wyłączyć z poziomu węzła NurbsCurve.ByPoints w poprzednim kroku, aby uzyskać ten sam wynik na obrazie.
Teraz zwiększmy złożoność. Załóżmy, że chcemy wykonać operację na krzywych utworzonych w poprzednim ćwiczeniu. Możemy na przykład powiązać te krzywe z inną powierzchnią i wykonać pomiędzy nimi wyciągnięcie. To wymaga zwrócenia większej uwagi na strukturę danych, ale podstawowa logika jest taka sama.
Rozpocznij od kroku z poprzedniego ćwiczenia, w którym wyizolowaliśmy górną powierzchnię zaimportowanej geometrii za pomocą węzła List.GetItemAtIndex.
Używając węzła Surface.Offset, odsuń tę powierzchnię o wartość 10.
Tak samo jak w poprzednim ćwiczeniu, zdefiniuj węzeł Code Block zawierający te dwa wiersze kodu:
0..1..#10;
0..1..#5;
Połącz te dane wyjściowe z dwoma węzłami Surface.PointAtParameter, każdy z opcją skratowania ustawioną na „Iloczyn wektorowy”. Jeden z tych węzłów jest połączony z pierwotną powierzchnią, a drugi z powierzchnią odsuniętą.
Wyłącz podgląd tych powierzchni.
Tak samo jak w poprzednim ćwiczeniu, połącz elementy wyjściowe z dwoma węzłami NurbsCurve.ByPoints. Wynik pokazuje krzywe odpowiadające dwóm powierzchniom.
Używając węzła List.Create, można połączyć oba zestawy krzywych w jedną listę list.
Jak widać w wyniku, otrzymaliśmy dwie listy zawierające po dziesięć elementów, odpowiadające obu połączonym zestawom krzywych NURBS.
Wykonując operację Surface.ByLoft, możemy wizualnie zinterpretować tę strukturę danych. Ten węzeł wyciąga wszystkie krzywe na każdej podliście.
Wyłącz podgląd z poziomu węzła Surface.ByLoft w poprzednim kroku.
Jak pamiętamy, używając węzła List.Transpose, zamieniamy wszystkie kolumny i wiersze. Ten węzeł umożliwia przekształcenie dwóch list po dziesięć krzywych w dziesięć list po dwie krzywe. Teraz każda krzywa NURBS jest powiązana z sąsiednią krzywą na drugiej powierzchni.
Po użyciu węzła Surface.ByLoft otrzymujemy żebrowaną strukturę.
Następnie zademonstrujemy alternatywny proces pozwalający osiągnąć ten wynik
Przed rozpoczęciem należy wyłączyć podgląd węzła Surface.ByLoft w poprzednim kroku, aby uniknąć pomyłek.
Alternatywą dla węzła List.Transpose jest użycie węzła List.Combine. Spowoduje to zastosowanie „kombinatora” do każdej podlisty.
W tym przypadku używamy węzła List.Create jako „kombinatora” w celu utworzenia listy dla każdego elementu na podlistach.
Po użyciu węzła Surface.ByLoft otrzymujemy takie same powierzchnie, jak w poprzednim kroku. W tym przypadku łatwiej jest użyć węzła Transpose, ale jeśli struktura danych jest jeszcze bardziej złożona, węzeł List.Combine będzie bardziej niezawodny.
Cofając się o kilka kroków, aby zmienić orientację krzywych w żebrowanej strukturze, należy użyć węzła List.Transpose przed połączeniem z węzłem NurbsCurve.ByPoints. Spowoduje to zamianę kolumn i wierszy, dając 5 poziomych żeber.
Teraz pójdziemy o krok dalej. W tym ćwiczeniu będziemy pracować z obiema zaimportowanymi powierzchniami, tworząc złożoną hierarchię danych. Będziemy jednak wykonywać tę samą operację z tą samą logiką.
Rozpocznij od zaimportowanego pliku z poprzedniego ćwiczenia.
Tak samo jak w poprzednim ćwiczeniu, użyj węzła Surface.Offset, aby wykonać odsunięcie o wartość 10.
Jak pokazuje wynik, przy użyciu węzła Offset utworzyliśmy dwie powierzchnie.
Tak samo jak w poprzednim ćwiczeniu, zdefiniuj węzeł Code Block zawierający te dwa wiersze kodu:
0..1..#20;
0..1..#20;
Połącz te dane wyjściowe z dwoma węzłami Surface.PointAtParameter, każdy z opcją skratowania ustawioną na „Iloczyn wektorowy”. Jeden z tych węzłów jest połączony z pierwotnymi powierzchniami, a drugi z powierzchniami odsuniętymi.
Tak samo jak w poprzednim ćwiczeniu, połącz elementy wyjściowe z dwoma węzłami NurbsCurve.ByPoints.
W danych wyjściowych węzła NurbsCurve.ByPoints widzimy, że jest to lista dwóch list, czyli bardziej złożona struktura niż w poprzednim ćwiczeniu. Dane są kategoryzowane według bazowej powierzchni, a więc dodaliśmy do struktury danych kolejny poziom.
Należy zauważyć, że sytuacja w węźle Surface.PointAtParameter się skomplikowała. Mamy już listę list list.
Przed przejściem dalej wyłącz podgląd z istniejących powierzchni.
Za pomocą węzła List.Create scalamy krzywe NURBS w jedną strukturę danych, tworząc listę list list.
Połączenie z węzłem Surface.ByLoft powoduje utworzenie nowej wersji pierwotnych powierzchni, z których każda pozostaje na osobnej liście utworzonej na podstawie początkowej struktury danych.
W poprzednim ćwiczeniu można było użyć węzła List.Transpose, aby utworzyć żebrowaną strukturę. W tym przypadku to nie zadziała. Transpozycję można stosować do listy dwuwymiarowej, a ponieważ mamy listę trójwymiarową, nie można tak łatwo „zamienić kolumn i wierszy”. Należy pamiętać, że listy to obiekty, a więc węzeł List.Transpose spowodowałby zamianę list z podlistami, ale nie zamianę krzywych NURBS na kolejnym poziomie hierarchii list.
W tym przypadku lepiej będzie działać węzeł List.Combine. Przechodząc do bardziej złożonych struktur danych, używamy węzłów List.Map i List.Combine.
Używając węzła List.Create jako „kombinatora”, tworzymy strukturę danych, która będzie lepiej przystosowana do naszego celu.
Struktura danych wymaga jeszcze transpozycji na niższym poziomie hierarchii. W tym celu użyjemy węzła List.Map. Działa on podobnie jak węzeł List.Combine, ale wymaga jednej listy wejściowej, a nie dwóch lub więcej.
Do węzła List.Map zastosujemy funkcję List.Transpose, która spowoduje zamianę kolumn i wierszy podlist na głównej liście.
Na koniec możemy wyciągnąć krzywe NURBS wraz z odpowiednią hierarchią danych, co daje żebrowaną strukturę.
Teraz dodamy głębię do tej geometrii za pomocą węzła Surface.Thicken z pokazanymi ustawieniami wejść.
Dobrze będzie dodać powierzchnię pokrywającą się z tą strukturą, dlatego dodaj kolejny węzeł Surface.ByLoft i jako wejścia użyj pierwszego wyjścia węzła NurbsCurve.ByPoints z wcześniejszego kroku.
Gdy podgląd staje się coraz mniej czytelny, wyłącz podgląd dla tych węzłów, klikając prawym przyciskiem myszy każdy z nich i anulując wybór pola podglądu („preview”), aby wyniki były czytelniejsze.
Po pogrubieniu wybranych powierzchni artykulacja jest gotowa.
Nie jest to może najwygodniejszy fotel bujany, ale zawiera dużo danych.
Na ostatnim etapie odwrócimy kierunek prążków. W poprzednim ćwiczeniu stosowaliśmy transpozycję. Tu zrobimy coś podobnego.
Ponieważ hierarchia ma jeszcze jeden poziom, należy użyć węzła List.Map z funkcją List.Transpose, aby zmienić kierunek krzywych NURBS.
Jeśli chcemy zwiększyć liczbę stopni, możemy zmienić węzeł Code Block następująco:
0..1..#20;
0..1..#30;
Pierwsza wersja fotela bujanego była bardziej elegancka, a nasz drugi model to wersja dla miłośników sportów ekstremalnych.
Lista to zbiór elementów. Weźmy na przykład kiść bananów. Każdy banan jest elementem listy (czyli kiści). Łatwiej jest chwycić kiść bananów niż zbierać pojedyncze banany — i tak samo jest w przypadku grupowania elementów według zależności parametrycznych w strukturze danych.
Robiąc zakupy, wkładamy wszystkie kupione artykuły do torby. Taka torba również jest listą. Jeśli chcemy upiec chleb bananowy, potrzebujemy 3 kiści bananów (robimy dużo chleba bananowego). Torba to lista kiści bananów, a każda kiść to lista bananów. Torba jest więc listą list (dwuwymiarową), a kiść bananów jest listą (jednowymiarową).
W dodatku Dynamo dane list są uporządkowane, a pierwszy element na każdej liście ma indeks „0”. Poniżej omówiono sposób definiowania list w dodatku Dynamo oraz to, jak listy wiążą się ze sobą nawzajem.
Jedno, co może z początku wydawać się dziwne, to fakt, że pierwszy indeks listy zawsze ma wartość 0, a nie 1. Gdy zatem mówimy o pierwszym elemencie listy, oznacza to tak naprawdę element odpowiadający indeksowi 0.
Jeśli na przykład liczymy palce prawej dłoni, najprawdopodobniej ponumerujemy je od 1 do 5. Gdybyśmy jednak umieścili te palce na liście, w dodatku Dynamo otrzymałyby indeksy od 0 do 4. Chociaż początkującym programistom może się to wydawać trochę dziwne, indeksowanie od zera stanowi standardową praktykę w większości systemów obliczeniowych.
Należy pamiętać, że lista wciąż zawiera 5 elementów, po prostu korzystamy z systemu liczenia od zera. Elementy na liście nie muszą być liczbami. Mogą to być dane dowolnego typu obsługiwanego przez dodatek Dynamo, takie jak punkty, krzywe, powierzchnie, rodziny itp.
a. Indeks
b. Punkt
c. Element
Często najprostszym sposobem na sprawdzenie typu danych przechowywanych na liście jest połączenie węzła Watch z elementem wyjściowym innego węzła. Domyślnie węzeł Watch automatycznie wyświetla wszystkie indeksy po lewej stronie listy, a elementy danych po prawej stronie.
Indeksy są kluczowym elementem podczas pracy z listami.
W odniesieniu do list dane wejściowe i wyjściowe różnią się w zależności od używanego węzła Dynamo. Możemy na przykład użyć listy 5 punktów i połączyć jej elementy wyjściowe z dwoma różnymi węzłami Dynamo, PolyCurve.ByPoints i Circle.ByCenterPointRadius:
Element wejściowy points węzła PolyCurve.ByPoints wyszukuje wartości „Point[]”. Reprezentuje listę punktów.
Elementem wyjściowym węzła PolyCurve.ByPoints jest jedna krzywa PolyCurve utworzona na podstawie listy pięciu punktów.
Element wejściowy centerPoint węzła Circle.ByCenterPointRadius wymaga wartości „Point”.
Elementem wyjściowym węzła Circle.ByCenterPointRadius jest lista pięciu okręgów, których środki odpowiadają pierwotnej liście punktów.
Dane wejściowe dla węzłów PolyCurve.ByPoints i Circle.ByCenterPointRadius są takie same, ale węzeł Polycurve.ByPoints pozwala uzyskać jedną krzywą PolyCurve, a węzeł Circle.ByCenterPointRadius — 5 okręgów ze środkami w poszczególnych punktach. Jest to intuicyjnie zrozumiałe: krzywa PolyCurve jest rysowana jako łuk łączący 5 punktów, a okręgi tworzone są w każdym punkcie osobno. Co zatem dzieje się z danymi?
Po ustawieniu kursora myszy na elemencie wejściowym points węzła Polycurve.ByPoints widzimy, że wyszukuje on wartości „Point[]”. Zwróć uwagę na nawiasy na końcu. To oznacza listę punktów, a do utworzenia krzywej PolyCurve potrzebne są dane wejściowe w postaci listy. Ten węzeł będzie więc sumował każdą listę w jedną krzywą PolyCurve.
Natomiast element wejściowy centerPoint węzła Circle.ByCenterPointRadius wymaga wartości „Point”. W tym węźle wyszukiwany jest jeden punkt, czyli element, w celu zdefiniowania środka okręgu. Dlatego otrzymujemy pięć okręgów z danych wejściowych. Zrozumienie tej różnicy w danych wejściowych w dodatku Dynamo pomaga lepiej zrozumieć działanie węzłów podczas zarządzania danymi.
Dopasowywanie danych stanowi problem bez idealnego rozwiązania. Ma on miejsce, gdy węzeł ma dostęp do danych wejściowych o różnych rozmiarach. Zmiana algorytmu dopasowywania danych może prowadzić do uzyskania całkiem różnych wyników.
Wyobraź sobie węzeł służący do tworzenia odcinków między punktami (Line.ByStartPointEndPoint). Ma on dwa parametry wejściowe, określające współrzędne obu punktów:
Najprostszym sposobem jest łączenie elementów wejściowych pojedynczo, aż jeden ze strumieni się wyczerpie. Jest to tak zwany algorytm „najkrótszej listy”. Jest to domyślne działanie węzłów Dynamo:
Algorytm „najdłuższa lista” kontynuuje łączenie elementów wejściowych i ponownie używa elementów do momentu, aż wszystkie strumienie się wyczerpią:
Metoda iloczynu wektorowego służy do wykonania wszystkich możliwych połączeń:
Jak widać, istnieją różne sposoby rysowania linii między tymi zbiorami punktów. Opcje skratowania można znaleźć, klikając prawym przyciskiem myszy środek węzła i wybierając menu „Skratowanie”.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Aby zademonstrować poniżej operacje skratowania, użyjemy tego pliku bazowego do zdefiniowania najkrótszej listy, najdłuższej listy i iloczynu wektorowego.
Zmienimy skratowanie w węźle Point.ByCoordinates, ale nie zmienimy żadnych innych elementów na wykresie powyżej.
Wybierając opcję najkrótsza lista jako opcję skratowania (jest to również opcja domyślna), otrzymujemy podstawową linię ukośną złożoną z pięciu punktów. Pięć punktów to długość krótszej listy, a więc skratowanie według najkrótszej listy zatrzymuje się po dotarciu do końca tej listy.
Po zmianie skratowania na opcję najdłuższa lista otrzymujemy linię ukośną, która dalej przebiega pionowo. Tak samo jak na diagramie koncepcyjnym, ostatni element z listy 5 elementów będzie używany ponownie do momentu osiągnięcia długości dłuższej listy.
Po zmianie opcji skratowania na iloczyn wektorowy otrzymujemy wszystkie kombinacje wszystkich list, co daje siatkę punktów 5x10. Jest to struktura danych równoważna iloczynowi wektorowemu pokazanemu na powyższym diagramie koncepcyjnym, z tą różnicą, że dane stanowią teraz listę list. Po połączeniu w krzywą PolyCurve widzimy, że każda lista jest zdefiniowana przez wartość X, co daje rząd pionowych linii.
Słownik reprezentuje zbiór danych powiązanych z innym elementem danych znanym jako klucz. Słowniki umożliwiają wyszukiwanie, usuwanie i wstawianie danych do kolekcji.
Słownik jest zasadniczo świetnym narzędziem do sprawdzania informacji.
Choć funkcje słowników były dostępne w dodatku Dynamo już od jakiegoś czasu, w dodatku Dynamo 2.0 wprowadzono nowy sposób zarządzania tym typem danych.
Czy kiedykolwiek zdarzyło Ci się wyszukiwać coś w programie Revit za pomocą zawartych w nim danych?
W takim przypadku zwykle robi się to jak w poniższym przykładzie.
Na poniższej ilustracji zbieramy wszystkie pomieszczenia w modelu programu Revit, uzyskujemy indeks żądanego pomieszczenia (według numeru pomieszczenia), a następnie pobieramy pomieszczenie o danym indeksie.
Zbierz wszystkie pomieszczenia w modelu.
Numer pomieszczenia do znalezienia.
Pobierz numer pomieszczenia i znajdź indeks, w którym się ono znajduje.
Uzyskaj pomieszczenie o określonym indeksie.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Teraz odtwórzmy ten pomysł, używając słowników. Najpierw musimy zebrać wszystkie pomieszczenia w modelu programu Revit.
Wybieramy kategorię programu Revit, z którą chcemy pracować (w tym przypadku pracujemy z pomieszczeniami).
Zlecamy dodatkowi Dynamo zebranie wszystkich tych elementów.
Dane, których użyjemy, to numer pomieszczenia.
Teraz utworzymy słownik z danymi kluczami i elementami.
Węzeł Dictionary.ByKeysValues utworzy słownik na podstawie odpowiednich danych wejściowych.
Keys
muszą być ciągami, avalues
mogą być różnymi typami obiektów.
Na koniec możemy pobrać pomieszczenie ze słownika za pomocą jego numeru.
String
będzie kluczem, który jest używany do wyszukania obiektu w słowniku.Teraz węzeł Dictionary.ValueAtKey pobierze obiekt ze słownika.
Używając tej samej logiki słowników, można także tworzyć słowniki ze zgrupowanymi obiektami. Jeśli chcemy wyszukać wszystkie pomieszczenia na danym poziomie, możemy zmienić powyższy wykres w następujący sposób.
Zamiast używać jako klucza numeru pomieszczenia, możemy teraz użyć wartości parametru (w tym przypadku użyjemy poziomu).
Teraz możemy pogrupować pomieszczenia według poziomu, na którym się znajdują.
Po pogrupowaniu elementów według poziomów możemy używać wspólnych (niepowtarzalnych) kluczy jako kluczy w słowniku, a list pomieszczeń jako elementów.
Na koniec, korzystając z poziomów w modelu programu Revit, możemy sprawdzić w słowniku, które pomieszczenia znajdują się na danym poziomie. Węzeł
Dictionary.ValueAtKey
pobierze nazwę poziomu i zwróci obiekty pomieszczeń na tym poziomie.
Możliwości zastosowań słowników są naprawdę nieograniczone. Już sama możliwość powiązywania danych BIM w programie Revit z elementem zapewnia wiele różnych przypadków zastosowań.
Kolor to doskonały typ danych do tworzenia atrakcyjnych wizualizacji, a także do przedstawiania różnic w danych wyjściowych programu wizualnego. Podczas pracy z abstrakcyjnymi danymi i różnymi liczbami czasami trudno jest dostrzec, co się zmienia i w jakim stopniu. To doskonała sytuacja do zastosowania kolorów.
Kolory w dodatku Dynamo są tworzone przy użyciu danych wejściowych ARGB. Odpowiadają one kanałom alfa, czerwonemu, zielonemu i niebieskiemu. Alfa określa przezroczystość koloru, natomiast pozostałe trzy kanały są używane jako kolory podstawowe, łączone w celu generowania całego spektrum barw.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Kolory w poniższej tabeli umożliwiają wykonywanie zapytań o właściwości użyte do zdefiniowania koloru: alfa, czerwony, zielony i niebieski. Należy zauważyć, że węzeł Color.Components zawiera wszystkie cztery elementy wyjściowe, a więc jest zalecany do wykonywania zapytań o właściwości koloru.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Kolory w poniższej tabeli odpowiadają przestrzeni kolorów HSB. Podział koloru na barwę, nasycenie i jasność jest bardziej intuicyjny pod względem interpretacji kolorów: jaki to kolor? Jak bardzo jest intensywny? Jak bardzo jest jasny lub ciemny? To właśnie podział na barwę, nasycenie i jasność.
Ikona | Nazwa (składnia) | Dane wejściowe | Dane wyjściowe |
---|
Węzeł Color Range jest podobny do węzła Remap Range z ćwiczenia: ponownie odwzorowuje listę liczb w innej dziedzinie. Zamiast jednak odwzorowywać je w dziedzinie liczb, odwzorowuje je jako gradient kolorów na podstawie liczb wejściowych z zakresu od 0 do 1.
Ten węzeł działa dobrze, ale osiągnięcie właściwego efektu za pierwszym razem może być trudne. Najlepszym sposobem na poznanie gradientu kolorów jest przetestowanie go przez interakcję. Wykonamy szybkie ćwiczenie, aby poznać sposób konfigurowania gradientu, w którym kolory wyjściowe odpowiadają liczbom.
Zdefiniuj trzy kolory: za pomocą węzła Code Block zdefiniuj kolory red, green i blue (czerwony, zielony i niebieski), podłączając odpowiednie kombinacje wartości 0 i 255.
Utwórz listę: scal trzy kolory w jedną listę.
Zdefiniuj indeksy: utwórz listę, aby zdefiniować położenie uchwytów każdego koloru (w zakresie od 0 do 1). Zwróć uwagę na wartość 0,75 dla koloru zielonego. Spowoduje to umieszczenie koloru zielonego w 3/4 linii poziomej gradientu na suwaku zakresu kolorów.
Węzeł Code Block: wartości wejściowe (z zakresu od 0 do 1) do przekształcenia na kolory.
Węzeł Display.ByGeometry umożliwia pokolorowanie geometrii w rzutni dodatku Dynamo. To umożliwia rozdzielanie różnych typów geometrii, przedstawianie koncepcji parametrycznych, czy definiowanie legendy analizy na potrzeby symulacji. Elementy wejściowe są proste: „geometry” i „color”. Aby utworzyć gradient taki, jak na powyższym rysunku, należy połączyć element wejściowy „color” z węzłem Color Range.
Węzeł Display.BySurfaceColors umożliwia odwzorowywanie danych na powierzchni za pomocą koloru. Ta funkcja wprowadza wiele ciekawych możliwości wizualizacji danych uzyskanych metodą analizy dyskretnej, na przykład światła słonecznego, energii i bliskości. Stosowanie koloru do powierzchni w dodatku Dynamo przebiega podobnie do stosowania tekstury do materiału w innych środowiskach CAD. W krótkim ćwiczeniu poniżej pokazano, jak używać tego narzędzia.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
W tym ćwiczeniu skupiono się na parametrycznym sterowaniu kolorem równolegle do geometrii. Geometria to podstawowa helisa, zdefiniowana poniżej przy użyciu węzła Code Block. To szybki i łatwy sposób tworzenia funkcji parametrycznej. Ponieważ skupiamy się na kolorze (a nie na geometrii), używamy bloku kodu, aby sprawnie utworzyć helisę bez nadmiernego zajmowania obszaru rysunku. Będziemy używać bloków kodu częściej, gdy przejdziemy do bardziej zaawansowanych zagadnień.
Węzeł Code Block: zdefiniuj dwa węzły Code Block, używając powyższych formuł. To szybka metoda parametrycznego tworzenia spirali.
Węzeł Point.ByCoordinates: połącz trzy elementy wyjściowe z węzła Code Block ze współrzędnymi tego węzła.
Teraz widzimy szyk punktów tworzących helisę. Kolejnym etapem jest utworzenie krzywej przechodzącej przez te punkty, aby można było zwizualizować helisę.
Węzeł PolyCurve.ByPoints: połącz element wyjściowy węzła Point.ByCoordinates z elementem wejściowym points tego węzła. Otrzymujemy krzywą o kształcie helisy.
Węzeł Curve.PointAtParameter: połącz element wyjściowy węzła PolyCurve.ByPoints z elementem wejściowym curve. Celem tego kroku jest utworzenie parametrycznego punktu przyciągania, który przesuwa się wzdłuż krzywej. Ponieważ punkt na krzywej jest obliczany na podstawie parametru, należy wprowadzić wartość param z zakresu od 0 do 1.
Węzeł Number Slider: po dodaniu do obszaru rysunku zmień wartość min na 0,0, wartość max na 1,0, a wartość step na 0,01. Połącz element wyjściowy suwaka z elementem wejściowym param węzła Curve.PointAtParameter. Teraz widzimy punkt na helisie, któremu odpowiada wartość procentowa na suwaku (0 w punkcie początkowym, 1 w punkcie końcowym).
Po utworzeniu punktu odniesienia możemy porównać odległość punktu odniesienia od punktów pierwotnie definiujących helisę. Wartość odległości będzie określać zarówno geometrię, jak i kolor.
Węzeł Geometry.DistanceTo: połącz element wyjściowy węzła Curve.PointAtParameter z elementem input. Połącz węzeł Point.ByCoordinates z wejściem geometry.
Węzeł Watch: wynik pokazuje listę odległości każdego punktu na helisie od punktu odniesienia na krzywej.
Kolejnym etapem jest sterowanie parametrami za pomocą listy odległości punktów na helisie od punktu odniesienia. Tych wartości odległości użyjemy do zdefiniowania promieni szeregu sfer wzdłuż krzywej. Aby zachować odpowiednie rozmiary sfer, należy ponownie odwzorować wartości odległości.
Węzeł Math.RemapRange: połącz element wyjściowy węzła Geometry.DistanceTo z elementem wejściowym „numbers”.
Węzeł Code Block: połącz blok kodu zawierający wartość 0,01 z elementem wejściowym newMin, a blok kodu zawierający wartość 1 z elementem wejściowym newMax.
Węzeł Watch: połącz element wyjściowy węzła Math.RemapRange z jednym węzłem, a element wyjściowy węzła Geometry.DistanceTo z drugim. Porównaj wyniki.
W tym kroku ponownie odwzorowano listę odległości w mniejszym zakresie. Wartości newMin i newMax można dowolnie edytować. Wartości zostaną ponownie odwzorowane i będą miały ten sam współczynnik rozkładu w całej dziedzinie.
Węzeł Sphere.ByCenterPointRadius: połącz element wyjściowy węzła Math.RemapRange z elementem wejściowym radius, a pierwotny element wyjściowy węzła Point.ByCoordinates z elementem wejściowym centerPoint.
Zmień wartość na suwaku i obserwuj, jak zmienia się rozmiar sfer. Otrzymaliśmy uchwyt parametryczny
Rozmiar sfer przedstawia szyk parametryczny zdefiniowany przez punkt odniesienia na krzywej. Użyjemy teraz tej samej koncepcji, której użyliśmy do określenia promienia sfer, aby sterować ich kolorem.
Węzeł Color Range: dodaj do obszaru rysunku. Po ustawieniu kursora na elemencie wejściowym value zobaczymy, że wymagane są liczby z zakresu od 0 do 1. Należy ponownie odwzorować liczby wyjściowe z węzła Geometry.DistanceTo, aby były zgodne z tą dziedziną.
Węzeł Sphere.ByCenterPointRadius: tymczasowo wyłączymy podgląd tego węzła (kliknij prawym przyciskiem myszy > Podgląd)
Węzeł Math.RemapRange: ten proces powinien być już znajomy. Połącz element wyjściowy węzła Geometry.DistanceTo z elementem wejściowym „numbers”.
Węzeł Code Block: podobnie jak wcześniej utwórz wartość 0 dla elementu wejściowego newMin i wartość 1 dla elementu wejściowego newMax. W tym przypadku możemy zdefiniować dwie wartości wyjściowe z jednego bloku kodu.
Węzeł Color Range: połącz element wyjściowy węzła Math.RemapRange z elementem wejściowym value.
Węzeł Color.ByARGB: to za jego pomocą utworzymy dwa kolory. Choć to rozwiązanie może wydawać się nieporęczne, jest identyczne z używaniem kolorów RGB w innym programie, z tym że po prostu stosujemy tu programowanie wizualne.
Węzeł Code Block: utwórz dwie wartości, 0 i 255. Połącz te dwie wartości wyjściowe z dwoma elementami wejściowymi węzła Color.ByARGB zgodnie z powyższą ilustracją (lub wybierz swoje dwa ulubione kolory).
Węzeł Color Range: element wejściowy colors wymaga listy kolorów. Musimy utworzyć tę listę z dwóch kolorów utworzonych w poprzednim kroku.
Węzeł List.Create: scal dwa kolory w jedną listę. Połącz wynik z elementem wejściowym colors węzła Color Range.
Węzeł Display.ByGeometryColor: połącz węzeł Sphere.ByCenterPointRadius z elementem wejściowym geometry, a węzeł Color Range z elementem wejściowym color. Otrzymaliśmy płynny gradient w całej dziedzinie krzywej.
Jeśli zmienimy wcześniej zdefiniowaną wartość za pomocą węzła Number Slider, kolory i rozmiary zostaną zaktualizowane. W tym przypadku kolor i promień są bezpośrednio powiązane: otrzymaliśmy wizualne połączenie między dwoma parametrami.
Pobierz plik przykładowy, klikając poniższe łącze.
Pełna lista plików przykładowych znajduje się w załączniku.
Najpierw należy utworzyć powierzchnię (lub odniesienie do niej), która będzie używana jako dane wejściowe dla węzła Display.BySurfaceColors. W tym przykładzie wyciągamy powierzchnię między krzywą sinusoidalną a krzywą cosinusoidalną.
Ta grupa węzłów służy do utworzenia punktów wzdłuż osi Z, a następnie przesunięcia ich na podstawie funkcji sinus i cosinus. Następnie dwie listy punktów zostaną użyte do wygenerowania krzywych NURBS.
Węzeł Surface.ByLoft: wygeneruj interpolowaną powierzchnię między listą krzywych NURBS.
Węzeł File Path: wybierz plik obrazu, z którego na dalszym etapie będą próbkowane dane pikseli.
Użyj węzła File.FromPath, aby przekonwertować ścieżkę pliku na plik, a następnie przekaż go do węzła Image.ReadFromFile, aby utworzyć obraz wyjściowy na potrzeby próbkowania.
Węzeł Image.Pixels: wprowadź obraz i podaj liczbę próbek, która będzie używana w wymiarach x i y obrazu.
Węzeł Slider: podaj wartości liczby próbek dla węzła Image.Pixels.
Węzeł Display.BySurfaceColors: odwzoruj szyk wartości kolorów na powierzchni, odpowiednio wzdłuż osi X i Y.
Podgląd powierzchni wyjściowej w powiększeniu, z rozdzielczością 400x300 próbek.
W dodatku Dynamo 2.0 wprowadzono nie tylko wcześniej omówione węzły dotyczące słowników — wprowadzono w nim również nowe związane z nimi funkcje w blokach kodów.
Można używać składni podobnej do poniższej lub reprezentacji węzłów opartej na języku DesignScript.
Ponieważ słownik jest typem obiektu w dodatku Dynamo, można na nim wykonywać następujące operacje.
Obsługa tego rodzaju interakcji staje się szczególnie przydatna w przypadku kojarzenia danych programu Revit z ciągami. Następnie przyjrzymy się niektórym przypadkom zastosowań związanym z programem Revit.
W dodatku Dynamo 2.0 wprowadzono oddzielenie typu danych słownika od typu danych listy. Ta modyfikacja może spowodować istotne zmiany w sposobie tworzenia i pracy z danymi w procesach roboczych. Przed wersją 2.0 słowniki i listy stanowiły jeden typ danych. W skrócie: listy były w rzeczywistości słownikami z kluczami w formie liczb całkowitych.
Słownik jest typem danych składającym się z kolekcji par wartości i kluczy, przy czym każdy klucz jest niepowtarzalny w danej kolekcji. Słownik nie jest uporządkowany i zasadniczo można „wyszukiwać elementy”, używając klucza zamiast wartości indeksu — jak w przypadku listy. W dodatku Dynamo 2.0 klucze mogą być tylko ciągami.
Lista jest typem danych składającym się z kolekcji uporządkowanych wartości. W dodatku Dynamo indeksy listy są liczbami całkowitymi.
Rozdzielenie słowników od list sprawia, że słowniki stają się pierwszoligowym narzędziem, którego można używać do szybkiego i łatwego przechowywania i wyszukiwania wartości bez konieczności zapamiętywania wartości indeksu ani utrzymywania ścisłej struktury listy w całym procesie roboczym. Podczas testowania u użytkowników dostrzegliśmy znaczne zmniejszenie rozmiaru wykresu, gdy używano słowników zamiast kilku węzłów GetItemAtIndex
.
Wprowadzono zmiany w składni w zakresie inicjalizacji słowników i list w węzłach Code Block oraz pracy z nimi.
W przypadku słowników używana jest następująca składnia: {key:value}
Listy mają następującą składnię [value,value,value]
W bibliotece wprowadzono nowe węzły, aby ułatwić tworzenie i modyfikowanie słowników oraz stosowanie do nich zapytań.
Listy tworzone w węzłach Code Block w wersji 1.x będą automatycznie migrowane po wczytaniu skryptu do nowej składni listy, w której są używane nawiasy kwadratowe [ ]
zamiast nawiasów klamrowych { }
\
W informatyce słowniki — tak jak listy — to kolekcje obiektów. Listy mają określony porządek, natomiast słowniki są kolekcjami nieuporządkowanymi. Nie są one zależne od sekwencji liczby (indeksów). Wykorzystuje się w nich klucze.
Na poniższej ilustracji pokazano potencjalny przypadek zastosowania słownika. Często słowniki są używane do powiązania dwóch fragmentów danych, które mogą nie mieć bezpośredniej korelacji. W naszym przypadku połączymy hiszpańską wersję słowa z angielską do późniejszego wyszukania.
Utwórz słownik, aby powiązać te dwa elementy danych.
Pobierz wartość związaną z podanym kluczem.
Dzięki temu operacje logiczne na bryłach są zaawansowanym i oszczędzającym czas procesem. Istnieją trzy operacje logiczne na bryłach rozróżniające, które części geometrii zostają zachowane.
Oprócz tych trzech operacji dodatek Dynamo udostępnia też węzły Solid.DifferenceAll i Solid.UnionAll, które umożliwiają wykonywanie operacji różnicy i sumy dla wielu brył.
Autor zdjęcia:
jest powierzchnią dwuwymiarową. Można ją interpretować jako płaską powierzchnię, która rozciąga się w nieskończoność. Każda płaszczyzna ma początek, kierunek X, kierunek Y i kierunek Z (w górę).
jest układem określającym położenie punktów lub innych elementów geometrycznych. Na poniższym rysunku wyjaśniono, jak to wygląda w dodatku Dynamo i co reprezentuje każdy kolor.
Autor zdjęcia: .
Obraz oryginalny za zgodą:
Następnie musimy zdecydować, jakich kluczy użyjemy do wyszukiwania tych danych. (Informacje na temat kluczy można znaleźć w sekcji ).
TWORZENIE |
Color.ByARGB Tworzy kolor według składowych: alfa (alpha), czerwony (red), zielony (green) i niebieski (blue). |
Zakres kolorów Pobiera kolor z gradientu między kolorem początkowym i końcowym. |
DZIAŁANIA |
Color.Brightness Pobiera wartość jasności tego koloru. |
Color.Components Wyświetla listę składowych koloru w następującej kolejności: alfa, czerwony, zielony, niebieski. |
Color.Saturation Pobiera wartość nasycenia tego koloru. |
Color.Hue Pobiera wartość barwy tego koloru. |
ZAPYTANIE |
Color.Alpha Znajduje składową alfa koloru, od 0 do 255. |
Color.Blue Znajduje niebieską składową koloru, od 0 do 255. |
Color.Green Znajduje zieloną składową koloru, od 0 do 255. |
Color.Red Znajduje czerwoną składową koloru, od 0 do 255. |
TWORZENIE |
GeometryColor.ByGeometryColor Wyświetla geometrię za pomocą koloru. |
DZIAŁANIA |
View.Watch Wizualizuje dane wyjściowe węzła. |
View.Watch 3D Wyświetla dynamiczny podgląd geometrii. |
DZIAŁANIA |
Boolean Wybór między true i false. |
Code Block Umożliwia bezpośrednie utworzenie kodu DesignScript. |
Directory Path Umożliwia wybranie katalogu w systemie, aby pobrać jego ścieżkę. |
File Path Umożliwia wybranie pliku w systemie, aby pobrać jego nazwę |
Integer Slider Suwak, który generuje wartości całkowite. |
Liczba Tworzy liczbę. |
Number Slider Suwak pozwalający uzyskać wartości liczbowe. |
Ciąg znaków Tworzy ciąg. |
Object.IsNull Określa, czy podany obiekt ma wartość null. |
TWORZENIE |
List.Create Tworzy nową listę z określonych danych wejściowych. |
List.Combine Stosuje kombinator do każdego elementu w dwóch sekwencjach. |
Number Range Tworzy sekwencję liczb w określonym zakresie |
Number Sequence Tworzy sekwencję liczb. |
DZIAŁANIA |
List.Chop Dzieli listę na zestaw list, z których każdy zawiera zadaną liczbę elementów. |
List.Count Zwraca liczbę elementów przechowywanych w danej liście. |
List.Flatten Zrównuje zagnieżdżony wykaz list o określoną wartość. |
List.FilterByBoolMask Filtruje sekwencję, sprawdzając odpowiadające indeksy w osobnej liście wartości logicznych. |
List.GetItemAtIndex Pobiera element z danej listy, który znajduje się w określonym indeksie. |
List.Map Stosuje funkcję do wszystkich elementów listy, generując z wyników nową listę. |
List.Reverse Tworzy nową listę zawierającą elementy z danej listy, ale w odwrotnej kolejności. |
List.ReplaceItemAtIndex Zastępuje element z danej listy, który znajduje się w określonym indeksie. |
List.ShiftIndices Przesuwa indeksy na liście w prawo o podaną wartość. |
List.TakeEveryNthItem Pobiera elementy z danej listy w indeksach, które są wielokrotnością danej wartości, po uwzględnieniu podanego odsunięcia. |
List.Transpose Zamienia wiersze z kolumnami na liście list. Jeśli niektóre wiersze są krótsze niż inne, w tablicy wynikowej są wstawiane wartości null jako elementy zastępcze, tak aby zawsze uzyskać prostokąt. |
DZIAŁANIA |
If Instrukcja warunkowa. Sprawdza wartość logiczną danych wejściowych przekazanych do sprawdzenia. Jeśli dane wejściowe są prawdziwe, generuje wartość wyjściową true. W przeciwnym razie generuje wartość wyjściową false. |
DZIAŁANIA |
Math.Cos Oblicza cosinus kąta. |
Math.DegreesToRadians Konwertuje wartość kąta w stopniach na wartość w radianach. |
Math.Pow Podnosi liczbę do określonej potęgi. |
Math.RadiansToDegrees Konwertuje wartość kąta w radianach na wartość w stopniach. |
Math.RemapRange Dostosowuje zakres listy liczb, zachowując współczynnik rozkładu. |
Math.Sin Oblicza sinus kąta. |
Wzór Oblicza wartość wzoru matematycznego. Korzysta z funkcji NCalc. Zobacz sekcję http://ncalc.codeplex.com |
Mapowanie Przypisuje wartość do zakresu danych wejściowych. |
DZIAŁANIA |
String.Concat Łączy wiele ciągów w jeden. |
String.Contains Określa, czy dany ciąg zawiera dany podciąg. |
String.Join Łączy wiele ciągów w jeden, wstawiając podany separator między poszczególnymi ciągami. |
String.Split Dzieli pojedynczy ciąg na listę ciągów, z podziałami wyznaczanymi przez podane ciągi — separatory. |
String.ToNumber Konwertuje ciąg na liczbę całkowitą lub zmiennoprzecinkową o podwójnej dokładności. |
TWORZENIE |
Circle.ByCenterPointRadius Tworzy okrąg ze środkiem i promieniem wejściowym w płaszczyźnie globalnej XY, ze współrzędną globalną Z jako normalną. |
Circle.ByPlaneRadius Tworzy okrąg ze środkiem w początku płaszczyzny wejściowej (głównym), leżący w płaszczyźnie wejściowej, o podanym promieniu. |
TWORZENIE |
CoordinateSystem.ByOrigin Tworzy układ współrzędnych z początkiem w punkcie wejściowym, z osiami X i Y ustawionymi jako osie X i Y GUW. |
CoordinateSystem.ByCyclindricalCoordinates Tworzy układ współrzędnych o określonych parametrach współrzędnych walcowych względem określonego układu współrzędnych. |
TWORZENIE |
Cuboid.ByLengths Utwórz prostopadłościan wyśrodkowany na początku GUW, z określoną szerokością, długością i wysokością. |
Cuboid.ByLengths (origin) Utwórz prostopadłościan wyśrodkowany w punkcie wejściowym, z określoną szerokością, długością i wysokością. |
Cuboid.ByLengths (coordinateSystem) Utwórz prostopadłościan wyśrodkowany na początku GUW, z określoną szerokością, długością i wysokością. |
Cuboid.ByCorners Utwórz prostopadłościan łączący punkt niski z punktem wysokim. |
Cuboid.Length Zwraca wymiary wejściowe prostopadłościanu, NIE rzeczywiste wymiary przestrzeni globalnej**. |
Cuboid.Width Zwraca wymiary wejściowe prostopadłościanu, NIE rzeczywiste wymiary przestrzeni globalnej**. |
Cuboid.Height Zwraca wymiary wejściowe prostopadłościanu, NIE rzeczywiste wymiary przestrzeni globalnej**. |
BoundingBox.ToCuboid Pobierz ramkę ograniczającą jako prostopadłościan bryłowy |
DZIAŁANIA |
Curve.Extrude (distance) Wyciąga krzywą w kierunku wektora normalnego. |
Curve.PointAtParameter Pobiera punkt na krzywej o określonym parametrze między StartParameter() a EndParameter(). |
DZIAŁANIA |
Geometry.DistanceTo Wyznacza odległość od tej geometrii do innej. |
Geometry.Explode Rozdziela złożone (nierozdzielone) elementy na części składowe. |
Geometry.ImportFromSAT Lista zaimportowanych geometrii. |
Geometry.Rotate (basePlane) Obraca obiekt wokół początku układu współrzędnych i wektora normalnego o kąt określony w stopniach. |
Geometry.Translate Przekształca geometrię dowolnego typu o podaną odległość w podanym kierunku. |
TWORZENIE |
Line.ByBestFitThroughPoints Tworzy linię najdokładniej przybliżającą do wykresu punktowego punktów. |
Line.ByStartPointDirectionLength Tworzy linię prostą, zaczynając od punktu początkowego i wydłużając w kierunku wektora o określoną długość. |
Line.ByStartPointEndPoint Tworzy linię prostą między dwoma punktami wejściowymi. |
Line.ByTangency Tworzy linię styczną do krzywej wejściowej, umieszczoną w punkcie parametru krzywej wejściowej. |
ZAPYTANIE |
Line.Direction Kierunek krzywej. |
Tworzenie |
NurbsCurve.ByControlPoints Tworzy obiekt BSplineCurve przy użyciu jawnie podanych punktów sterujących. |
NurbsCurve.ByPoints Tworzy obiekt BSplineCurve przez interpolację między punktami. |
Tworzenie |
NurbsSurface.ByControlPoints Tworzy powierzchnię NURBS przy użyciu jawnie podanych punktów sterujących oraz kątów U i V podanych w stopniach. |
NurbsSurface.ByPoints Tworzy powierzchnię NURBS przy użyciu interpolacji podanych punktów oraz kątów U i V podanych w stopniach. Powierzchnia wynikowa przecina wszystkie te punkty. |
TWORZENIE |
Plane.ByOriginNormal Tworzy płaszczyznę wyśrodkowaną w punkcie głównym i mającą wejściowy wektor normalny. |
Plane.XY Tworzy płaszczyznę w globalnej płaszczyźnie XY. |
TWORZENIE |
Point.ByCartesianCoordinates Tworzy punkt w podanym układzie współrzędnych z trzema współrzędnymi kartezjańskimi. |
Point.ByCoordinates (2d) Tworzy punkt na płaszczyźnie XY zadanej przez dwie współrzędne kartezjańskie. Składnik Z wynosi 0. |
Point.ByCoordinates (3d) Tworzy punkt na podstawie trzech współrzędnych kartezjańskich. |
Point.Origin Pobiera punkt początku układu współrzędnych (0,0,0). |
DZIAŁANIA |
Point.Add Dodaje wektor do punktu. Działa podobnie do Translate (Vector). |
ZAPYTANIE |
Point.X Pobiera składową X punktu. |
Point.Y Pobiera składową Y punktu. |
Point.Z Pobiera składową Z punktu. |
TWORZENIE |
Polycurve.ByPoints Tworzy krzywą złożoną z sekwencji linii łączących punkty. Aby powstała krzywa zamknięta, ostatni punkt powinien być w tym samym miejscu co punkt początkowy. |
TWORZENIE |
Rectangle.ByWidthLength (Plane) Tworzy prostokąt ze środkiem w głównym punkcie na płaszczyźnie wejściowej, o szerokości wejściowej (długość osi X) i długości (długość osi Y). |
TWORZENIE |
Sphere.ByCenterPointRadius Tworzy bryłę sferyczną ze środkiem w punkcie wejściowym, o podanym promieniu. |
TWORZENIE |
Surface.ByLoft Tworzy powierzchnię przez wyciągnięcie między krzywymi wejściowymi przekroju poprzecznego. |
Surface.ByPatch Tworzy powierzchnię przez wypełnienie wnętrza zamkniętej obwiedni określonej przez krzywe wejściowe. |
DZIAŁANIA |
Surface.Offset Odsuwa powierzchnię w kierunku normalnej powierzchni o określoną odległość. |
Surface.PointAtParameter Zwraca punkt dla określonych parametrów U i V. |
Surface.Thicken Pogrubia powierzchnię w celu utworzenia bryły, wyciągając w kierunku normalnych powierzchni po obu stronach powierzchni. |
TWORZENIE |
UV.ByCoordinates Tworzy UV z dwóch wartości podwojonych. |
TWORZENIE |
Vector.ByCoordinates Tworzy wektor z trzech współrzędnych euklidesowych. |
Vector.XAxis Pobiera kanoniczny wektor osi X (1,0,0). |
Vector.YAxis Pobiera kanoniczny wektor osi Y (0,1,0). |
Vector.ZAxis Pobiera kanoniczny wektor osi Z (0,0,1). |
DZIAŁANIA |
Vector.Normalized Pobiera znormalizowaną wersję wektora. |
TWORZENIE |
CoordinateSystem.ByOrigin Tworzy układ współrzędnych z początkiem w punkcie wejściowym, z osiami X i Y ustawionymi jako osie X i Y GUW. |
CoordinateSystem.ByCyclindricalCoordinates Tworzy układ współrzędnych o określonych parametrach współrzędnych walcowych względem określonego układu współrzędnych. |
+ Dodawanie |
- Odejmowanie |
* Mnożenie |
/ Dzielenie |
% Dzielenie modulo. Oblicza resztę z dzielenia pierwszej wartości wejściowej przez drugą. |
< Mniejsze niż |
> Większe niż |
== Test równości między dwiema wartościami. |
Kolor ARGB (Color.ByARGB) | A, R, G, B | color |
Alpha (Color.Alpha) | color | A |
Red (Color.Red) | color | R |
Green (Color.Green) | color | G |
Blue (Color.Blue) | color | B |
Components (Color.Components) | color | A, R, G, B |
Hue (Color.Hue) | color | Hue |
Saturation (Color.Saturation) | color | Saturation |
Brightness (Color.Brightness) | color | Brightness |
Dodawanie (+)
var[]...[], var[]...[]
var[]...[]
Odejmowanie (-)
var[]...[], var[]...[]
var[]...[]
Mnożenie (*)
var[]...[], var[]...[]
var[]...[]
Dzielenie (/)
var[]...[], var[]...[]
var[]...[]