Wykonywanie skryptów w języku Python w węzłach Zero-Touch (C#)
Wykonywanie skryptów w języku Python w węzłach Zero-Touch (C#)
Jeśli użytkownik potrafi pisać skrypty w języku Python i chce uzupełnić węzły standardowe dodatku w języku Python Dynamo o więcej funkcji, może utworzyć własny za pomocą funkcji Zero-Touch. Zacznijmy od prostego przykładu umożliwiającego przekazanie skryptu w języku Python jako ciągu do węzła Zero-Touch, w którym wykonywany jest skrypt i zwracany jest wynik. Ta analiza przypadku jest oparta na przewodnikach i przykładach z sekcji „Pierwsze kroki”. Użytkownicy dopiero zaczynający tworzenie węzłów Zero-Touch powinni się z nimi zapoznać.
Węzeł Zero-Touch wykonujący ciąg skryptu w języku Python
Silnik języka Python
PythonNet3 jest teraz domyślnym silnikiem, który zapewnia płynniejsze działanie w przypadku migracji z CPython. Wszystkie nowe węzły w języku Python tworzone w dodatku Dynamo od wersji 4.0 są uruchamiane przy użyciu silnika PythonNet3.
Ten węzeł bazuje na wystąpieniu silnika skryptów IronPython. Aby to obsłużyć, należy utworzyć odwołanie do kilku dodatkowych zespołów. Wykonaj poniższe czynności, aby skonfigurować szablon podstawowy w programie Visual Studio:
Tworzenie nowego projektu klasy programu Visual Studio
Dodaj odwołanie do pliku
IronPython.dllznajdującego się tutaj:C:\Program Files (x86)\IronPython 2.7\IronPython.dllDodaj odwołanie do pliku
Microsoft.Scripting.dllznajdującego się tutaj:C:\Program Files (x86)\IronPython 2.7\Platforms\Net40\Microsoft.Scripting.dllDołącz do tej klasy instrukcje
IronPython.HostingiMicrosoft.Scripting.HostingusingDodaj pusty konstruktor prywatny, aby zapobiec dodaniu dodatkowego węzła do biblioteki Dynamo wraz z pakietem
Utwórz nową metodę, która przyjmuje pojedynczy ciąg jako parametr wejściowy
W ramach tej metody utworzymy wystąpienie nowego silnika języka Python i utworzymy pusty zakres skryptu. Ten zakres można sobie wyobrazić jako zmienne globalne w wystąpieniu interpretera języka Python
Następnie wywołaj operację
Executedla silnika, przekazując ciąg wejściowy i zakres jako parametryNa koniec pobierz i zwróć wyniki skryptu, wywołując operację
GetVariabledla zakresu i przekazując nazwę zmiennej ze skryptu w języku Python zawierającą wartość, którą próbujesz zwrócić. (Więcej informacji znajduje się w poniższym przykładzie)
Poniższy kod stanowi przykład kroku opisanego powyżej. Skompilowanie rozwiązania spowoduje utworzenie nowego pliku .dll znajdującego się w folderze bin projektu. Ten plik .dll można teraz zaimportować do dodatku Dynamo jako część pakietu lub przechodząc do polecenia File < Import Library...
Skrypt w języku Python zwraca zmienną output, co oznacza, że w skrypcie w języku Python będzie potrzebna zmienna output. Użyj tego skryptu przykładowego, aby przetestować węzeł w dodatku Dynamo. Jeśli ten węzeł języka Python był kiedykolwiek używany w dodatku Dynamo, poniższe czynności powinny wyglądać znajomo. Aby uzyskać więcej informacji, zobacz sekcję dotyczącą języka Python w przewodniku.
Wiele pozycji danych wyjściowych
Jednym z ograniczeń standardowych węzłów języka Python jest to, że mają one tylko jeden port wyjściowy. Jeśli więc chcemy zwrócić wiele obiektów, musimy utworzyć listę i umieścić na niej poszczególne obiekty. Jeśli zmodyfikujemy powyższy przykład tak, aby zwracał słownik, możemy dodać dowolną liczbę portów wyjściowych. Więcej informacji na temat słowników znajduje się w temacie „Dalsze kroki z Zero-Touch” w sekcji dotyczącej zwracania wielu wartości.
Ten węzeł umożliwia zwrócenie zarówno objętości prostopadłościanu, jak i jego centroidy.
Zmodyfikujmy poprzedni przykład, wykonując następujące czynności:
Dodaj odwołanie do pliku
DynamoServices.dllz Menedżera pakietów NuGetOprócz poprzednich zespołów dołącz zespoły
System.Collections.GenericiAutodesk.DesignScript.RuntimeZmień typ zwracany w metodzie, aby zwracać słownik, który będzie zawierał dane wyjściowe
Każda pozycja wyjściowa musi zostać osobno pobrana z zakresu (dla większych zestawów danych wyjściowych rozważ skonfigurowanie prostej pętli)
Do tego przykładowego skryptu w języku Python dodaliśmy również dodatkową zmienną wyjściową (output2). Należy pamiętać, że te zmienne mogą używać dowolnych konwencji nazewnictwa języka Python, dlatego określenia „output” (dane wyjściowe) użyto wyłącznie w celu zachowania przejrzystości w tym przykładzie.
Znane ograniczenia silnika PythonNet3 i ich obejścia
Poniżej przedstawiono kilka znanych ograniczeń występujących podczas korzystania z silnika PythonNet3 i ich obejść.
Kolekcje .NET nie są automatycznie konwertowane na listy języka Python
Przed użyciem
len(), indeksowania lub iteracji należy jawnie przekonwertować tablice lub kolekcje.NETprzy użyciulist(...).
Ogólne metody platformy .NET mogą wymagać jawnych parametrów typu
Niektóre metody (np.
GroupBy) zakończą się niepowodzeniem, chyba że ręcznie określisz typy ogólne, zamiast polegać na automatycznym wnioskowaniu.
Metody rozszerzeń nie są wykrywalne za pomocą
dir()czy automatycznego uzupełnianiaMetody rozszerzeń mogą nadal działać, gdy są wywoływane jawnie, ale nie pojawiają się podczas introspekcji ani uzupełniania kodu.
Metody rozszerzeń DataTable nie są obsługiwane
Importowanie
System.Data.DataTableExtensionskończy się niepowodzeniem. Te metody pomocnicze nie mogą być używane bezpośrednio.
Niektóre metody podstawowe dodatku Dynamo zachowują się inaczej w silniku PythonNet3
Niektóre funkcje (np. spłaszczanie listy) mogą nie działać zgodnie z oczekiwaniami z powodu bardziej rygorystycznej obsługi kolekcji.
Klas języka Python nie można przekazywać między węzłami, jeśli dziedziczą z typów .NET
Klas pochodnych od interfejsów ani typów .NET nie można bezpiecznie przenosić między węzłami języka Python.
Funkcja
set()języka Python nie akceptuje niektórych obiektów .NETObiekty takie jak
InvalidElementIdmuszą być odfiltrowywane lub obsługiwane przy użyciu kolekcji .NET.
Częste wywołania
print()mogą powodować wzrost użycia pamięciNależy unikać częstego używania
print()w pętlach lub długotrwałych skryptach.
Zgodność operacyjna słowników między dodatkiem Dynamo i językiem Python jest ograniczona
Słowniki dodatku Dynamo i języka Python nie są w pełni zamienne i mogą wymagać ręcznej konwersji.
Metoda
Marshal.GetActiveObject()pobierania uruchomionego wystąpienia COM określonego obiektu nie jest już dostępnaUżyj
BindToMoniker, jeśli znasz ścieżkę używanego pliku.Koduj bibliotekę w języku C# przy użyciu struktury klas
Marshal.GetActiveObject()
Migracja z silnika CPython3 do silnika PythonNet3
Dodatek Dynamo automatycznie przeprowadzi migrację węzłów silnika CPython do silnika PythonNet 3. Oto co się dzieje:
Kopia zapasowa oryginalnego pliku jest tworzona automatycznie.
Wszystkie węzły silnika CPython (w tym węzły niestandardowe używające silnika CPython) są konwertowane na węzły silnika PythonNet3.
Wyskakujące powiadomienie informuje o liczbie węzłów poddanych migracji.
Podczas zapisywania zostanie wyświetlone przypomnienie, że węzły w języku Python będą teraz używać silnika PythonNet3. Ponownie powtarzamy, że nie trzeba martwić się o zgodność obliczeniową ze starszymi wersjami: użytkownicy pracujący w środowiskach z wieloma wersjami (np. Revit lub Civil 3D 2025/2026) powinni zainstalować pakiet silnika PythonNet3 w dodatku Dynamo 3.3–3.6, aby zachować zgodność.
Migracja z silnika IronPython2 do silnika PythonNet3
Jeśli wykres korzysta z silnika IronPython, automatyczna migracja nie zostaje przeprowadzona.
Jeśli jest zainstalowany zgodny pakiet silnika IronPython, wykres będzie działał normalnie. Jeśli go brakuje, w rozszerzeniu Odniesienia obszaru roboczego zostanie wyświetlone ostrzeżenie o zależności z prośbą o pobranie pakietu. Możesz dalej korzystać z silnika IronPython, ponownie instalując pakiet. Ponieważ jednak silnik IronPython nie był aktualizowany od lat, a środowisko Dynamo nie obsługuje aktywnie tych silników w dodatku Dynamo już od dłuższego czasu, zdecydowanie zalecamy migrację do silnika PythonNet3, aby zapewnić, że wykresy będą działać niezawodnie w przyszłości. Komponenty DynamoIronPython2.7 i DynamoIronPython3 pozostaną dostępne jako pakiety w Menedżerze pakietów Dynamo, ale nie będą już obsługiwane przez zespół Dynamo.
W tym przypadku dostępna jest opcja migracji poszczególnych węzłów z użyciem asystenta migracji (Migration Assistant) dostępnego w edytorze języka Python.
Więcej informacji na temat migracji można znaleźć w tym wpisie w blogu
Last updated