All pages
Powered by GitBook
1 of 3

Loading...

Loading...

Loading...

Tematy zaawansowane

Z czasem może okazać się konieczne wyjście poza podstawy i dokładniejsze zapoznanie się z działaniem dodatku Dynamo. Strony w tej sekcji pozwalają zapoznać się z zaawansowanymi funkcjami w dodatku Dynamo for Civil 3D, dzięki którym można przenieść wykresy na wyższy poziom.

Wiązanie obiektów

Dodatek Dynamo for Civil 3D zawiera bardzo wydajny mechanizm „zapamiętywania” obiektów tworzonych przez poszczególne węzły. Ten mechanizm jest nazywany wiązaniem obiektów i umożliwia wykresowi Dynamo generowanie spójnych wyników przy każdym jego uruchomieniu w tym samym dokumencie. Jest to bardzo pożądane w wielu sytuacjach, ale w pewnych innych sytuacjach użytkownik może chcieć mieć większą kontrolę nad zachowaniem dodatku Dynamo. W tej sekcji opisano działanie wiązania obiektów i sposoby jego wykorzystywania.

Przykład

Rozważmy ten wykres, który tworzy okrąg w obszarze modelu na bieżącej warstwie.

Prosty wykres do tworzenia okręgu

Zwróćmy uwagę, co się dzieje, gdy promień zostanie zmieniony.

To jest wiązanie obiektów w działaniu. Domyślnym zachowaniem dodatku Dynamo jest zmodyfikowanie promienia okręgu, a nie utworzenie nowego okręgu przy każdej zmianie danych wejściowych promienia. Dzieje się tak, ponieważ węzeł Object.ByGeometry „pamięta”, że utworzył ten konkretny okrąg przy każdym uruchomieniu wykresu. Ponadto dodatek Dynamo zapisze te informacje, tak aby po następnym otwarciu dokumentu programu Civil 3D i uruchomieniu wykresu dodatek zachowywał się dokładnie tak samo.

Inny przykład

Przyjrzyjmy się przykładowi, w którym można zmienić domyślne zachowanie dodatku Dynamo w zakresie wiązania obiektów. Załóżmy, że chcemy utworzyć wykres, w którym w środku okręgu jest umieszczany tekst. Celem tego wykresu jest możliwość wielokrotnego uruchamiania go i za każdym razem umieszczania nowego tekstu w wybranym okręgu. Oto jak może wyglądać wykres.

Jednak faktyczne działanie po wybraniu innego okręgu wygląda tak.

Wygląda na to, że wraz z każdym uruchomieniem wykresu tekst zostaje usunięty i ponownie utworzony. W rzeczywistości położenie tekstu jest modyfikowane w zależności od wybranego okręgu. To ten sam tekst — tylko w innym miejscu. Aby za każdym razem tworzyć nowy tekst, należy zmodyfikować ustawienia wiązania obiektów dodatku Dynamo, tak aby nie były zachowywane żadne dane powiązań (patrz poniżej).

Po wprowadzeniu tej zmiany otrzymujemy zachowanie, o które chodziło.

Ustawienia wiązań

Dodatek Dynamo for Civil 3D umożliwia modyfikowanie domyślnego zachowania wiązania obiektów za pomocą ustawień Przechowywanie danych powiązania w menu dodatku Dynamo.

Należy pamiętać, że opcje przechowywania danych powiązania są dostępne w programie Civil 3D 2022.1 i w nowszych wersjach.

Wszystkie opcje są domyślnie włączone. Poniżej podsumowano funkcje poszczególnych opcji.

Opcja 1. Nie zachowano danych powiązań

Gdy ta opcja jest włączona, dodatek Dynamo „zapomina” o obiektach, które utworzył podczas ostatniego uruchomienia wykresu. Wykres może być więc uruchamiany na dowolnym rysunku w dowolnej sytuacji i za każdym razem utworzy nowe obiekty.

Zastosowanie

Używaj tej opcji, aby dodatek Dynamo „zapominał” o tym, co robił w poprzednich uruchomieniach, i za każdym razem tworzył nowe obiekty.

Opcja 2. Przechowuj w wykresie dla dodatku Dynamo

Ta opcja oznacza, że metadane wiązania obiektów są serializowane do wykresu (pliku .dyn) podczas jego zapisywania. Jeśli wykres zostanie zamknięty/ponownie otwarty i uruchomiony na tym samym rysunku, wszystko powinno działać tak samo, jak działało ostatnio. Jeśli wykres zostanie uruchomiony na innym rysunku, dane powiązania zostaną usunięte z wykresu i zostaną utworzone nowe obiekty. Oznacza to, że po otwarciu oryginalnego rysunku i ponownym uruchomieniu wykresu oprócz starych obiektów zostaną utworzone nowe obiekty.

Zastosowanie

Używaj tej opcji, aby dodatek Dynamo „pamiętał” obiekty, które utworzył podczas ostatniego uruchomienia na określonym rysunku.

Ta opcja jest najodpowiedniejsza w sytuacjach, gdy możliwe jest zachowanie relacji 1:1 między konkretnym rysunkiem a wykresem Dynamo. W przypadku wykresów przeznaczonych do uruchamiania na wielu rysunkach lepsze są opcje 1 i 3.

Opcja 3. Przechowuj w rysunku dla dodatku Dynamo

Ta opcja działa podobnie do opcji 2, ale w tym przypadku dane wiązania obiektów są serializowane na rysunku, a nie na wykresie (w pliku .dyn). Jeśli wykres zostanie zamknięty/ponownie otwarty i uruchomiony na tym samym rysunku, wszystko powinno działać tak samo, jak działało ostatnio. Jeśli wykres zostanie uruchomiony na innym rysunku, dane powiązania nadal będą zachowane na oryginalnym rysunku, ponieważ są zapisywane w rysunku, a nie w wykresie.

Zastosowanie

Używaj tej opcji, aby móc użyć tego samego wykresu na wielu rysunkach i aby dodatek Dynamo „pamiętał”, co robił na każdym z nich.

Opcja 4. Przechowuj w rysunku dla Odtwarzacza Dynamo

Po pierwsze: ta opcja nie ma wpływu na interakcje wykresu z rysunkiem w przypadku uruchamiania wykresu za pomocą głównego interfejsu dodatku Dynamo. Ta opcja ma zastosowanie tylko w przypadku, gdy wykres jest uruchamiany za pomocą Odtwarzacza Dynamo.

Jeśli nie znasz jeszcze Odtwarzacza Dynamo Player, skorzystaj z sekcji .

Jeśli wykres zostanie uruchomiony za pomocą interfejsu głównego dodatku Dynamo, a następnie zostanie zamknięty i uruchomiony za pomocą Odtwarzacza Dynamo, obok obiektów utworzonych wcześniej zostaną utworzone nowe obiekty. Jednak po jednokrotnym wykonaniu wykresu przez Odtwarzacz Dynamo dane wiązania obiektów zostaną zserializowane do rysunku. Jeśli więc wykres jest uruchamiany wielokrotnie za pomocą Odtwarzacza Dynamo, zamiast tworzenia obiektów, zostają zaktualizowane istniejące obiekty. Jeśli wykres zostanie uruchomiony za pomocą Odtwarzacza Dynamo na innym rysunku, dane powiązania nadal będą zachowane na oryginalnym rysunku, ponieważ są zapisywane w rysunku, a nie w wykresie.

Zastosowanie

Używaj tej opcji, aby móc uruchamiać wykres za pomocą Odtwarzacza Dynamo na wielu rysunkach i aby dodatek Dynamo „pamiętał”, co robił na każdym z nich

Odtwarzacz Dynamo (Dynamo Player)
Modyfikowanie danych wejściowych promienia w dodatku Dynamo
Prosty wykres, który umieszcza tekst w środku wybranego okręgu
Domyślne zachowanie dodatku Dynamo w przypadku wybrania nowego okręgu
Ustawienia wiązania obiektów
Zachowanie z wyłączonym wiązaniem obiektów
Wiązanie obiektów

Język Python i program Civil 3D

Dodatek Dynamo daje niezwykłe możliwości jako narzędzie do programowania wizualnego. Można jednak pominąć węzły i przewody, aby pisać kod w postaci tekstowej. Można to zrobić na dwa sposoby:

  1. Pisanie kodu DesignScript za pomocą węzła Code Block

  2. Pisanie kodu Python za pomocą węzła Python

W tej sekcji omówiono używanie języka Python w środowisku programu Civil 3D w celu wykorzystywania interfejsów API .NET programów AutoCAD i Civil 3D.

Aby uzyskać bardziej ogólne informacje na temat używania języka Python w dodatku Dynamo, skorzystaj z sekcji .

Dokumentacja interfejsu API

Dla programów AutoCAD i Civil 3D jest dostępnych po kilka interfejsów API, które umożliwiają programistom rozszerzanie produktu podstawowego o funkcje niestandardowe. W kontekście dodatku Dynamo istotne są interfejsy API kodu zarządzanego .NET. Poniższe łącza prowadzą do informacji niezbędnych do zrozumienia struktury tych interfejsów API i sposobu ich działania.

Podczas zapoznawania się z tą sekcją możesz zetknąć się z pewnymi nowymi dla Ciebie pojęciami, takimi jak bazy danych, transakcje, metody, właściwości itp. Wiele z tych pojęć należy do podstaw pracy z interfejsami API .NET i nie są one charakterystyczne ani dla dodatku Dynamo, ani dla języka Python. Szczegółowe omówienie tych elementów wykracza poza zakres tej sekcji przewodnika Primer, dlatego zaleca się częste korzystanie z informacji, do których prowadzą powyższe łącza.

Szablon kodu

Podczas pierwszej edycji nowego węzła w języku Python jest on wstępnie wypełniany kodem-szablonem, aby przyspieszyć rozpoczęcie pracy. Oto podział szablonu z objaśnieniami dotyczącymi każdego bloku.

  1. Importuje moduły sys i clr, które są niezbędne do poprawnego działania interpretera języka Python. W szczególności moduł clr umożliwia traktowanie przestrzeni nazw .NET jako pakietów Python.

  2. Wczytuje standardowe zespoły (np. pliki DLL) do pracy z interfejsami API kodu zarządzanego .NET dla programów AutoCAD i Civil 3D.

Chcesz wprowadzić dostosowania? Domyślny szablon w języku Python można zmodyfikować, edytując plik PythonTemplate.py znajdujący się w folderze C:\ProgramData\Autodesk\C3D <version>\Dynamo.

Przykład

Przeanalizujmy przykład, aby zademonstrować niektóre z najważniejszych pojęć dotyczących pisania skryptów w języku Python w dodatku Dynamo for Civil 3D.

Cel

🎯 Pobieranie geometrii obwiedni wszystkich zlewni na rysunku.

Zestaw danych

Poniżej przedstawiono przykładowe pliki, z których można korzystać w trakcie tego ćwiczenia.

Przegląd rozwiązania

Poniżej przedstawiono przegląd logiki na tym wykresie.

  1. Zapoznaj się z dokumentacją interfejsu API programu Civil 3D

  2. Wybranie wszystkich zlewni w dokumencie na podstawie nazwy warstwy

  3. „Odpakowanie” obiektów Dynamo, aby uzyskać dostęp do wewnętrznych składników interfejsu API programu Civil 3D

Zacznijmy!

Przegląd dokumentacji interfejsu API

Przed rozpoczęciem tworzenia wykresu i pisania kodu warto zapoznać się z dokumentacją interfejsu API programu Civil 3D i dowiedzieć się, co udostępnia ten interfejs API. W tym przypadku istnieje , która zwraca punkty obwiedni zlewni. Ta właściwość zwraca obiekt Point3dCollection, którego dodatek Dynamo nie jest w stanie domyślnie obsługiwać. Oznacza to, że nie można utworzyć krzywej PolyCurve z obiektu Point3dCollection, więc konieczne będzie przekształcenie wszystkiego w punkty dodatku Dynamo. Więcej informacji na ten temat podamy w dalszej części.

Pobranie wszystkich zlewni

Teraz możemy zacząć tworzyć logikę wykresu. Pierwszą czynnością, którą należy wykonać, jest pobranie listy wszystkich zlewni w dokumencie. Dostępne są węzły do obsługi tej operacji, więc nie trzeba uwzględniać jej w skrypcie w języku Python. Używanie węzłów zapewnia lepszą przejrzystość dla innych osób czytających wykres (w przeciwieństwie do używania dużej ilości kodu w skrypcie w języku Python) i pozwala skupić się w kodzie w języku Python na jednej rzeczy: zwróceniu punktów obwiedni zlewni.

Warto zwrócić uwagę, że wyjście z węzła All Objects on Layer jest listą obiektów programu Civil (CivilObject). Jest to spowodowane tym, że dodatek Dynamo for Civil 3D nie zawiera obecnie żadnych węzłów do pracy ze zlewniami. Dlatego właśnie należy uzyskać dostęp do interfejsu API za pośrednictwem języka Python.

Odpakowywanie obiektów

Zanim przejdziemy dalej, musimy krótko odnieść się do ważnego pojęcia. W sekcji omówiono powiązania obiektów i obiektów programu Civil (CivilObject). Bardziej szczegółowo można powiedzieć, że obiekt Dynamo jest opakowaniem dla elementu programu AutoCAD. Podobnie obiekt programu Civil w dodatku Dynamo (CivilObject) jest opakowaniem dla elementu programu Civil 3D. Można „odpakować” obiekt, uzyskując dostęp do jego właściwości InternalDBObject lub InternalObjectId.

Typ dodatku Dynamo
Opakowania

Ogólnie bezpieczniej jest uzyskać identyfikator obiektu za pomocą właściwości InternalObjectId, a następnie uzyskać dostęp do opakowanego obiektu w transakcji. Wynika to z tego, że właściwość InternalDBObject zwraca obiekt DBObject programu AutoCAD, który nie jest w stanie zapisywalnym.

Skrypt w języku Python

Oto pełny skrypt w języku Python, który wykonuje operacje polegające na uzyskaniu dostępu do wewnętrznych obiektów zlewni i pobraniu ich punktów obwiedni. Wyróżnione wiersze to te zmodyfikowane lub dodane w domyślnym kodzie-szablonie.

Klikaj podkreślony tekst w skrypcie, aby uzyskać wyjaśnienia dotyczące poszczególnych wierszy.

Ogólnie najlepszą praktyką jest umieszczenie większości kodu logiki skryptu wewnątrz transakcji. Zapewnia to bezpieczny dostęp do obiektów, które są odczytywane/zapisywane przez skrypt. W wielu przypadkach pominięcie transakcji może spowodować błąd krytyczny.

Tworzenie krzywych PolyCurve

Na tym etapie skrypt w języku Python powinien zwrócić listę punktów dodatku Dynamo, które można wyświetlić w podglądzie w tle. Ostatnią czynnością jest utworzenie krzywych PolyCurve na podstawie punktów. Warto zauważyć, że można to również zrobić bezpośrednio w skrypcie w języku Python. Jednak celowo umieściliśmy tę operację poza skryptem w węźle, aby była bardziej widoczna. Oto ostateczny wykres.

Wynik

Oto ostateczna geometria dodatku Dynamo.

🎉 Misja wykonana!

IronPython a CPython

Zanim zakończymy tę część, omówmy jeszcze jedną kwestię. W zależności od używanej wersji programu Civil 3D węzeł w języku Python może być skonfigurowany w określony sposób. W programach Civil 3D 2020 i 2021 dodatek Dynamo używał narzędzia o nazwie IronPython do przenoszenia danych między obiektami .NET a skryptami w języku Python. Jednak w programie Civil 3D 2022 dodatek Dynamo używa standardowego natywnego interpretera języka Python (znanego jako CPython), w którym jest używany język Python 3. Korzyści płynące z przejścia na nowy model obejmują dostęp do popularnych nowoczesnych bibliotek i nowych funkcji platformy, niezbędne poprawki konserwacyjne i poprawki zabezpieczeń.

Więcej informacji na temat tego przejścia i uaktualniania starszych skryptów można znaleźć w . Aby nadal używać mechanizmu IronPython, wystarczy zainstalować pakiet DynamoIronPython2.7 za pomocą Menedżera pakietów Dynamo.

Dodaje odniesienia do standardowych przestrzeni nazw programów AutoCAD i Civil 3D. Są one równoważne z dyrektywami using lub Imports odpowiednio w języku C# i w języku VB.NET.
  • Dostęp do portów wejściowych węzła można uzyskać za pomocą wstępnie zdefiniowanej listy o nazwie IN. Dostęp do danych w określonym porcie można uzyskać, używając numeru indeksu, na przykład dataInFirstPort = IN[0].

  • Pobiera aktywny dokument i edytor.

  • Blokuje dokument i inicjuje transakcję bazy danych.

  • W tym miejscu należy umieścić większość kodu logiki skryptu.

  • Usuń oznaczenie komentarza tego wiersza, aby zatwierdzić transakcję po zakończeniu głównej pracy.

  • Aby zapisać dane wyjściowe węzła, należy przypisać je do zmiennej OUT na końcu skryptu.

  • Utworzenie punktów dodatku Dynamo na podstawie punktów programu AutoCAD
  • Utworzenie krzywych PolyCurve z punktów

  • Obiekt Autodesk.AutoCAD.DynamoNodes.Object

    Element Autodesk.AutoCAD.DatabaseServices.Entity

    CivilObject Autodesk.Civil.DynamoNodes.CivilObject

    Element Autodesk.Civil.DatabaseServices.Entity

    Python
    Podręcznik programisty interfejsu API .NET dla programu AutoCAD
    Podręcznik użytkownika interfejsu API .NET dla programu AutoCAD
    Podręcznik programisty interfejsu API .NET dla programu Civil 3D
    Podręcznik użytkownika interfejsu API .NET dla programu Civil 3D
    15KB
    Python_Catchments.dyn
    Open
    961KB
    Python_Catchments.dwg
    Open
    właściwość w klasie zlewni (Catchment)
    Biblioteka węzłów
    blogu dotyczącym dodatku Dynamo
    Domyślny szablon węzła w języku Python w programie Civil 3D
    Pobieranie wszystkich zlewni w dokumencie na podstawie warstwy
    Ostateczny wykres
    Wynikowe krzywe PolyCurve dodatku Dynamo dla obwiedni zlewni
    # Wczytywanie bibliotek standardowych języka Python i bibliotek języka DesignScript
    import sys
    import clr
    
    # Dodawanie zespołów dla programów AutoCAD i Civil 3D
    clr.AddReference('AcMgd')
    clr.AddReference('AcCoreMgd')
    clr.AddReference('AcDbMgd')
    clr.AddReference('AecBaseMgd')
    clr.AddReference('AecPropDataMgd')
    clr.AddReference('AeccDbMgd')
    
    clr.AddReference('ProtoGeometry')
    
    # Importowanie odniesień z programu AutoCAD
    from Autodesk.AutoCAD.Runtime import *
    from Autodesk.AutoCAD.ApplicationServices import *
    from Autodesk.AutoCAD.EditorInput import *
    from Autodesk.AutoCAD.DatabaseServices import *
    from Autodesk.AutoCAD.Geometry import *
    
    # Importowanie odniesień z programu Civil 3D
    from Autodesk.Civil.ApplicationServices import *
    from Autodesk.Civil.DatabaseServices import *
    
    from Autodesk.DesignScript.Geometry import Point as DynPoint
    
    # Dane wejściowe tego węzła będą przechowywane jako lista w zmiennych IN.
    objs = IN[0]
    
    output = [] 
    
    if objs is None:
        sys.exit("Dane wejściowe są puste lub mają wartość null.")
    
    if not isinstance(objs, list):
        objs = [objs]
        
    adoc = Application.DocumentManager.MdiActiveDocument
    editor = adoc.Editor
    
    with adoc.LockDocument():
        with adoc.Database as db:
            
            with db.TransactionManager.StartTransaction() as t:
                for obj in objs:              
                    id = obj.InternalObjectId
                    aeccObj = t.GetObject(id, OpenMode.ForRead)                
                    if isinstance(aeccObj, Catchment):
                        catchment = aeccObj
                        acPnts = catchment.BoundaryPolyline3d                    
                        dynPnts = []
                        for acPnt in acPnts:
                            pnt = DynPoint.ByCoordinates(acPnt.X, acPnt.Y, acPnt.Z)
                            dynPnts.append(pnt)
                        output.append(dynPnts)
                
                # Zatwierdzenie przed zakończeniem transakcji
                t.Commit()
                pass
                
    # Przypisanie danych wyjściowych do zmiennej OUT.
    OUT = output