arrow-left

All pages
gitbookPowered by GitBook
1 of 4

Loading...

Loading...

Loading...

Loading...

Python

​Python je široce používaný programovací jazyk, jehož popularita souvisí s jeho stylem syntaxe. Je velmi čitelný, a proto je snazší se ho naučit v porovnání s mnoha jinými jazyky. Python podporuje moduly a balíčky a může být začleněn do existujících aplikací. Dobrým zdrojem informací o tom, jak začít pracovat s jazykem Python, je část na stránce .

„Getting Started“arrow-up-right
Python.orgarrow-up-right

Python a Revit

hashtag
Python a Revit

Nyní, když jsme ukázali, jak používat skripty jazyka Python v aplikaci Dynamo, podívejme se na připojení knihoven aplikace Revit do prostředí skriptování. Pamatujte, importovali jsme standardní knihovny jazyka Python a hlavní uzly aplikace Dynamo pomocí prvních čtyř řádků v níže uvedeném bloku kódu. Chcete-li importovat uzly aplikace Revit, prvky aplikace Revit a správce dokumentů aplikace Revit, stačí přidat pouze několik dalších řádků:

To nám poskytuje přístup k rozhraní API aplikace Revit a nabízí vlastní skriptování pro libovolnou úlohu aplikace Revit. Díky kombinaci procesu vizuálního programování se skriptováním rozhraní API aplikace Revit se spolupráce a vývoj nástrojů výrazně zlepšují. Například správce BIM i konstruktér schémat mohou spolupracovat na stejném grafu. Při této spolupráci mohou zlepšit návrh a provedení modelu.

hashtag
Rozhraní API pro konkrétní platformu

Plán projektu aplikace Dynamo spočívá v rozšíření rozsahu implementace platformy. Protože aplikace Dynamo přidává další programy do objektu docket, uživatelé budou mít přístup k programům API specifickým pro platformu z prostředí skriptování v jazyce Python. Zatímco v aplikaci Revit se jedná o případovou studii, můžeme předvídat další kapitoly v budoucnosti nabízející komplexní výukové programy zaměřené na skriptování v jiných platformách. Navíc je nyní k dispozici mnoho knihoven , které lze importovat do aplikace Dynamo.

Níže uvedené příklady ukazují způsoby implementace operací specifických pro aplikaci Revit z aplikace Dynamo pomocí jazyka Python. Podrobnější informace o vztahu jazyka Python s aplikacemi Dynamo a Revit naleznete na . Dalším užitečným zdrojem pro aplikace Python a Revit je projekt aplikace Revit.

hashtag
Cvičení 1

Vytvořte nový projekt aplikace Revit.

Kliknutím na odkaz níže si stáhněte vzorový soubor.

Úplný seznam vzorových souborů najdete v dodatku.

V těchto cvičeních prozkoumáme základní skripty jazyka Python v rozhraní Dynamo pro aplikaci Revit. Toto cvičení se zaměří na práci se soubory a prvky aplikace Revit a také na komunikaci mezi aplikacemi Revit a Dynamo.

Jedná se o jednoduchou metodu získávání souborů doc, uiapp a app aplikace Revit připojených k vaší relaci Dynamo. Programátoři, kteří předtím pracovali v rozhraní API aplikace Revit, si mohou všimnout položek v seznamu sledovaných položek. Pokud se vám to nezdá povědomé, tak to nevadí. Použijeme další příklady ve cvičeních níže.

Zde je způsob importu služeb aplikace Revit a získání dat dokumentu v aplikaci Dynamo.

Podívejte se na uzel Python v aplikaci Dynamo. Kód můžete také najít níže:

hashtag
Cvičení 2

Kliknutím na odkaz níže si stáhněte vzorový soubor.

Úplný seznam vzorových souborů najdete v dodatku.

V tomto cvičení vytvoříme pomocí uzlu Python aplikace Dynamo jednoduchou křivku modelu v aplikaci Revit.

Začněte vytvořením nové rodiny Koncepční objem v aplikaci Revit.

Otevřete složku rodiny Koncepční objem a použijte soubor šablony Metric Mass.rft.

V aplikaci Revit pomocí klávesové zkratky un vyvolejte nastavení jednotek projektu a změňte jednotku délky na metry.

Spusťte aplikaci Dynamo a vytvořte sadu uzlů jako na obrázku níže. Nejprve vytvoříme dva referenční body v aplikaci Revit z uzlů aplikace Dynamo.

  1. Vytvořte blok kódu a zadejte hodnotu "0;".

  2. Tuto hodnotu připojte ke vstupům X, Y a Z uzlu ReferencePoint.ByCoordinates.

  3. Vytvořte tři posuvníky v rozsahu od -100 do 100 s velikostí kroku 1.

Podívejte se na uzel Python v aplikaci Dynamo. Celý kód najdete níže.

  1. System.Array: Aplikace Revit vyžaduje jako vstup systémové pole (místo seznamu jazyka Python). Jedná se pouze o jeden další řádek kódu, ale zohlednění typů argumentů usnadní programování v aplikaci Revit v jazyce Python.

V aplikaci Dynamo jsme pomocí jazyka Python vytvořili dva referenční body a čáru, která je spojuje. V dalším cvičení zkusíme něco složitějšího.

hashtag
Cvičení 3

Kliknutím na odkaz níže si stáhněte vzorový soubor.

Úplný seznam vzorových souborů najdete v dodatku.

Toto cvičení vysvětluje témata připojení dat a geometrie z aplikace Revit do aplikace Dynamo a zpět. Začneme otevřením souboru Revit-StructuralFraming.rvt. Po otevření spusťte aplikaci Dynamo a otevřete soubor Revit-StructuralFraming.dyn.

Tento soubor aplikace Revit je jeden z nejzákladnějších. Dvě referenční křivky: jedna nakreslená na Podlaží 1 a druhá na Podlaží 2. Chceme tyto křivky dostat do aplikace Dynamo a zachovat živé propojení.

V tomto souboru máme sadu uzlů zapojených do pěti vstupů uzlu Python.

  1. Uzly Select Model Element: Klikněte na tlačítko Vybrat pro každý prvek a vyberte odpovídající křivku v aplikaci Revit.

  2. Uzel Code Block: Pomocí syntaxe 0..1..#x;, připojte posuvník celého čísla v rozsahu od 0 do 20 ke vstupu x. Označuje počet nosníků, které se mají kreslit mezi dvěma křivkami.

Tento kód v jazyce Python je trochu hustší, ale komentáře v kódu popisují, co se v procesu děje.

V aplikaci Revit je k dispozici pole nosníků, které pokrývají dvě křivky jako konstrukční prvky. Poznámka: Toto není realistický příklad... Konstrukční prvky se používají jako příklad pro nativní instance aplikace Revit vytvořené z aplikace Dynamo.

Výsledky jsou v aplikaci Dynamo zobrazeny také. Nosníky v uzlu Watch3D odkazují na geometrii dotazovanou z prvků aplikace Revit.

Všimněte si, že máme nepřetržitý proces převodu dat z prostředí aplikace Revit do prostředí aplikace Dynamo. Toto je souhrn průběhu procesu:

  1. Vybrat prvek aplikace Revit

  2. Převést prvek aplikace Revit na křivku aplikace Dynamo

  3. Rozdělit křivku aplikace Dynamo na řadu bodů aplikace Dynamo

Může to znít složitě, ale díky skriptu je to stejně jednoduché jako úprava křivky v aplikaci Revit a opětovné spuštění řešiče (i když je možné, že při tom budete muset odstranit předchozí nosníky). Důvodem je skutečnost, že nosníky umísťujeme do jazyka Python, a tím porušujeme asociaci uzlů OOTB.

Pomocí aktualizace referenčních křivek v aplikaci Revit získáte nové pole nosníků.

import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import RevitNodes
clr.AddReference("RevitNodes")
import Revit

# Import Revit elements
from Revit.Elements import *

# Import DocumentManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager

import System
  • Připojte všechny posuvníky k uzlu ReferencePoint.ByCoordinates.

  • Přidejte do pracovního prostoru uzel Python, kliknutím na tlačítko „+“ v uzlu přidejte další vstup a připojte dva referenční body, jeden ke každému vstupu. Otevřete uzel Python.

  • Uzel Structural Framing Types: Zde vybereme v rozevírací nabídce výchozí nosník W12x26.
  • Uzel Levels: Vyberte možnost Podlaží 1.

  • Vytvořit čáry aplikace Dynamo pomocí bodů aplikace Dynamo mezi dvěma křivkami
  • Vytvořit nosníky aplikace Revit pomocí odkazů na čáry aplikace Dynamo

  • Vytvořit výstup povrchů aplikace Dynamo pomocí dotazů na geometrii nosníků aplikace Revit

  • IronPythonarrow-up-right
    stránce Wiki k aplikaci Dynamoarrow-up-right
    prostředí Python Shellarrow-up-right
    file-download
    2KB
    Revit-Doc.dyn
    arrow-up-right-from-squareOpen
    file-download
    10KB
    Revit-ReferenceCurve.dyn
    arrow-up-right-from-squareOpen
    file-archive
    3MB
    Revit-StructuralFraming.zip
    archive
    arrow-up-right-from-squareOpen
    # Load the Python Standard and DesignScript Libraries
    import sys
    import clr
    
    #Import DocumentManager
    clr.AddReference("RevitServices")
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    
    #Place your code below this line
    doc = DocumentManager.Instance.CurrentDBDocument
    uiapp = DocumentManager.Instance.CurrentUIApplication
    app = uiapp.Application
    
    #Assign your output to the OUT variable
    OUT = [doc,uiapp,app]
    import sys
    import clr
    
    # Import RevitNodes
    clr.AddReference("RevitNodes")
    import Revit
    #Import Revit elements
    from Revit.Elements import *
    import System
    
    #define inputs
    startRefPt = IN[0]
    endRefPt = IN[1]
    
    #define system array to match with required inputs
    refPtArray = System.Array[ReferencePoint]([startRefPt, endRefPt])
    
    #create curve by reference points in Revit
    OUT = CurveByPoints.ByReferencePoints(refPtArray)
    import clr
    #import Dynamo Geometry
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    # Import RevitNodes
    clr.AddReference("RevitNodes")
    import Revit
    # Import Revit elements
    from Revit.Elements import *
    import System
    
    #Query Revit elements and convert them to Dynamo Curves
    crvA=IN[0].Curves[0]
    crvB=IN[1].Curves[0]
    
    #Define input Parameters
    framingType=IN[3]
    designLevel=IN[4]
    
    #Define "out" as a list
    OUT=[]
    
    for val in IN[2]:
    	#Define Dynamo Points on each curve
    	ptA=Curve.PointAtParameter(crvA,val)
    	ptB=Curve.PointAtParameter(crvB,val)
    	#Create Dynamo line
    	beamCrv=Line.ByStartPointEndPoint(ptA,ptB)
    	#create Revit Element from Dynamo Curves
    	beam = StructuralFraming.BeamByCurve(beamCrv,designLevel,framingType)
    	#convert Revit Element into list of Dynamo Surfaces
    	OUT.append(beam.Faces)

    Nastavení vlastní šablony jazyka Python

    V aplikaci Dynamo 2.0 je možné určit výchozí šablonu (.py extension), která se použije při prvním otevření okna jazyka Python. Tato funkce byla dlouho požadována, protože urychluje používání jazyka Python v aplikaci Dynamo. Díky šabloně je možné při vývoji vlastního skriptu v jazyce Python mít připraveny veškeré importy.

    Šablona se nachází v umístění APPDATA instalace aplikace Dynamo.

    Obvykle je to následující umístění: ( %appdata%\Dynamo\Dynamo Core\{version}\ ).

    hashtag
    Nastavení šablony

    Aby bylo možné tuto funkci používat, je nutné přidat do souboru DynamoSettings.xml následující řádek. (Upravte v poznámkovém bloku)

    Řetězec <PythonTemplateFilePath /> je možné jednoduše nahradit následujícím řetězcem:

    circle-exclamation

    Poznámka: Nahraďte proměnnou CURRENTUSER svým uživatelským jménem.

    Dále je nutné vytvořit šablonu s funkcemi, které má obsahovat. V tomto případě do ní zahrneme importy související s aplikací Revit a další položky, které se s aplikací Revit obvykle používají.

    Otevřete prázdný dokument v poznámkovém bloku a vložte do něj následující kód:

    Poté tento soubor uložte pod názvem PythonTemplate.py do umístění APPDATA.

    hashtag
    Chování skriptu jazyka Python

    Po definování šablony jazyka Python aplikace Dynamo tuto šablonu vyhledá při každém vložení uzlu jazyka Python. Pokud ji nenajde, okno jazyka Python bude vypadat jako ve výchozím nastavení.

    Pokud se podaří šablonu jazyka Python nalézt (například náš skript pro aplikaci Revit), zobrazí se všechny položky, které obsahuje.

    Další informace o této skvělé nové funkci (autor: Radu Gidei) naleznete zde: https://github.com/DynamoDS/Dynamo/pull/8122

    <PythonTemplateFilePath>
    <string>C:\Users\CURRENTUSER\AppData\Roaming\Dynamo\Dynamo Core\2.0\PythonTemplate.py</string>
    </PythonTemplateFilePath>
    import clr
    
    clr.AddReference('RevitAPI')
    from Autodesk.Revit.DB import *
    from Autodesk.Revit.DB.Structure import *
    
    clr.AddReference('RevitAPIUI')
    from Autodesk.Revit.UI import *
    
    clr.AddReference('System')
    from System.Collections.Generic import List
    
    clr.AddReference('RevitNodes')
    import Revit
    clr.ImportExtensions(Revit.GeometryConversion)
    clr.ImportExtensions(Revit.Elements)
    
    clr.AddReference('RevitServices')
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager
    
    doc = DocumentManager.Instance.CurrentDBDocument
    uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    
    #Preparing input from dynamo to revit
    element = UnwrapElement(IN[0])
    
    #Do some action in a Transaction
    TransactionManager.Instance.EnsureInTransaction(doc)
    
    TransactionManager.Instance.TransactionTaskDone()
    
    OUT = element

    Uzly jazyka Python

    Proč byste měli používat textové programování ve vizuálním programovacím prostředí aplikace Dynamo? Vizuální programování má mnoho výhod. Umožňuje vytvářet programy bez použití speciální syntaxe v intuitivním vizuálním rozhraní. Vizuální program však může být nepřehledný a v některých případech může mít menší funkčnost. Například jazyk Python nabízí mnohem jednodušší metody pro zápis podmínek (if/then) a cyklů. Python je výkonný nástroj, který umožňuje rozšířit možnosti aplikace Dynamo a umožňuje nahradit mnoho uzlů několika stručnými řádky kódů.

    Vizuální program:

    Textový program:

    hashtag
    Uzel Python

    Stejně jako bloky kódu jsou uzly Python skriptovacím rozhraním v prostředí vizuálního programování. Uzel jazyka Python naleznete v knihovně v části Script > Editor > Python Script.

    Dvojitým kliknutím na uzel otevřete editor skriptů jazyka Python (můžete také kliknout pravým tlačítkem na uzel a vybrat možnost Upravit). Všimněte si, že se v horní části nachází výchozí text, který vám má pomoci odkazovat na knihovny, které budete potřebovat. Vstupy jsou uloženy v poli IN. Hodnoty se vrátí do aplikace Dynamo jejich přiřazením k proměnné OUT.

    Knihovna Autodesk.DesignScript.Geometry umožňuje použití tečkové notace podobné blokům kódů. Další informace o syntaxi aplikace Dynamo naleznete v části a také v příručce . (Chcete-li stáhnout tento dokument PDF, klikněte pravým tlačítkem na odkaz a vyberte možnost Uložit odkaz jako.) Zadáním typu geometrie, například „Point.“, zobrazíte seznam metod vytváření a dotazování bodů.

    Metody zahrnují konstruktory, například ByCoordinates, akce, například Add, a dotazy, například souřadnice X, Y a Z.

    hashtag
    Cvičení: Vlastní uzel se skriptem jazyka Python k vytváření vzorů z modulu tělesa

    hashtag
    Část I: Nastavení skriptu jazyka Python

    Kliknutím na odkaz níže si stáhněte vzorový soubor.

    Úplný seznam vzorových souborů najdete v dodatku.

    V tomto příkladu napíšeme skript jazyka Python, který vytvoří vzory z modulu tělesa a převede je na vlastní uzel. Nejprve vytvoříme náš modul tělesa pomocí uzlů aplikace Dynamo.

    1. Rectangle.ByWidthLength: Vytvořte obdélník, který bude základem našeho tělesa.

    2. Surface.ByPatch: Spojte obdélník se vstupem closedCurve a vytvořte tak dolní povrch.

    1. Geometry.Translate: Připojte obdélník ke vstupu geometrie, aby se posunul nahoru pomocí bloku kódu, který určuje základní tloušťku našeho tělesa.

    2. Polygon.Points: Pomocí dotazu na převedený obdélník extrahujte rohové body.

    3. Geometry.Translate:

    Nyní, když máme horní a dolní povrch, vytvoříme boky tělesa šablonováním mezi dvěma profily.

    1. List.Create: Spojte dolní obdélník a horní polygon se vstupy indexu.

    2. Surface.ByLoft: Šablonováním dvou profilů vytvořte strany tělesa.

    3. List.Create: Připojte horní, boční a dolní povrchy ke vstupům indexu a vytvořte tak seznam povrchů.

    Nyní, když máme naše těleso, přetáhneme do pracovního prostoru uzel skriptu jazyka Python.

    1. Chcete-li do uzlu přidat další vstupy, klikněte na ikonu + v uzlu. Vstupy jsou pojmenovány IN[0], IN[1] atd., což označuje, že představují položky v seznamu.

    Začneme definováním našich vstupů a výstupu. Dvojitým kliknutím na uzel otevřete editor jazyka Python. Při úpravách kódu v editoru postupujte podle kódu uvedeného níže.

    Tento kód začne dávat větší smysl, jak budeme cvičením procházet. Dále musíme přemýšlet o tom, jaké informace jsou potřeba k vytvoření pole našeho modulu tělesa. Nejprve je nutné znát rozměry tělesa, abychom mohli určit vzdálenost posunutí. Kvůli chybě ohraničujícího kvádru bude nutné k jeho vytvoření použít geometrii křivky hrany.

    Podívejte se na uzel Python v aplikaci Dynamo. Všimněte si, že používáme stejnou syntaxi, jakou vidíme v názvech uzlů v aplikaci Dynamo. Prohlédněte si níže uvedený kód s komentáři.

    Protože budeme převádět i otáčet moduly těles, použijeme operaci Geometry.Transform. Při pohledu na uzel Geometry.Transform zjistíme, že k transformaci tělesa budeme potřebovat zdrojový souřadnicový systém a cílový souřadnicový systém. Zdroj je kontextový souřadnicový systém našeho tělesa, zatímco cíl bude odlišný souřadnicový systém pro každý modul v poli. To znamená, že bude nutné projít hodnoty X a Y a transformovat souřadnicový systém pokaždé jinak.

    Klikněte na tlačítko Spustit a poté uložte kód. Připojte uzel jazyka Python k existujícímu skriptu níže uvedeným způsobem.

    1. Připojte výstup z uzlu Solid.ByConnectedSurfaces jako první vstup uzlu jazyka Python a pomocí uzlu CodeBlock definujte ostatní vstupy.

    2. Vytvořte uzel Topology.Edge a jako vstup použijte výstup z uzlu jazyka Python.

    3. Nakonec vytvořte uzel Edge.CurveGeometry a jako vstup použijte výstup z uzlu Topology.Edge.

    Zkuste změnit výchozí hodnotu a vytvořte jiné vzory. Můžete také změnit parametry samotného modulu tělesa a dosáhnout tak různých efektů.

    hashtag
    Část II: Převod uzlu Python Script na vlastní uzel

    Nyní, když jsme vytvořili užitečný skript jazyka Python, uložte jej jako uživatelský uzel. Vyberte uzel Python Script, klikněte pravým tlačítkem na pracovní prostor a vyberte možnost Vytvořit vlastní uzel.

    Přiřaďte název, popis a kategorii.

    Tím se otevře nový pracovní prostor, ve kterém se má upravit uživatelský uzel.

    1. Vstupy: Změňte vstupní názvy tak, aby byly popisnější, a přidejte typy dat a výchozí hodnoty.

    2. Výstup: Změňte název výstupu.

    Uzel uložte jako soubor .dyf a měli byste vidět, že vlastní uzel odráží změny, které jsme právě provedli.

    import clr
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    
    solid = IN[0]
    seed = IN[1]
    xCount = IN[2]
    yCount = IN[3]
    
    solids = []
    
    yDist = solid.BoundingBox.MaxPoint.Y-solid.BoundingBox.MinPoint.Y
    xDist = solid.BoundingBox.MaxPoint.X-solid.BoundingBox.MinPoint.X
    
    for i in xRange:
    	for j in yRange:
    		fromCoord = solid.ContextCoordinateSystem
    		toCoord = fromCoord.Rotate(solid.ContextCoordinateSystem.Origin,Vector.ByCoordinates(0,0,1),(90*(i+j%val)))
    		vec = Vector.ByCoordinates((xDist*i),(yDist*j),0)
    		toCoord = toCoord.Translate(vec)
    		solids.append(solid.Transform(fromCoord,toCoord))
    
    OUT = solids
    Pomocí bloku kódu vytvořte seznam čtyř hodnot odpovídajících čtyřem bodům. Tím posunete jeden roh tělesa nahoru.
  • Polygon.ByPoints: Pomocí převedených bodů rekonstruujte horní polygon.

  • Surface.ByPatch: Připojením polygonu vytvořte horní povrch.

  • Solid.ByConnectedSurfaces: Spojením povrchů vytvořte modul tělesa.

    https://github.com/DynamoDS/DynamoPrimerNew/blob/master-csy/coding-in-dynamo/7_code-blocks-and-design-script/7-2_design-script-syntax.md
    DesignScript Guidearrow-up-right
    file-download
    35KB
    Python_Custom-Node.dyn
    arrow-up-right-from-squareOpen
    # Load the Python Standard and DesignScript Libraries
    import sys
    import clr
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    
    # The inputs to this node will be stored as a list in the IN variables.
    #The solid module to be arrayed
    solid = IN[0]
    
    #A Number that determines which rotation pattern to use
    seed = IN[1]
    
    #The number of solids to array in the X and Y axes
    xCount = IN[2]
    yCount = IN[3]
    
    #Create an empty list for the arrayed solids
    solids = []
    
    # Place your code below this line
    
    
    # Assign your output to the OUT variable.
    OUT = solids
    # Load the Python Standard and DesignScript Libraries
    import sys
    import clr
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    
    # The inputs to this node will be stored as a list in the IN variables.
    #The solid module to be arrayed
    solid = IN[0]
    
    #A Number that determines which rotation pattern to use
    seed = IN[1]
    
    #The number of solids to array in the X and Y axes
    xCount = IN[2]
    yCount = IN[3]
    
    #Create an empty list for the arrayed solids
    solids = []
    #Create an empty list for the edge curves
    crvs = []
    
    # Place your code below this line
    #Loop through edges an append corresponding curve geometry to the list
    for edge in solid.Edges:
        crvs.append(edge.CurveGeometry)
    
    #Get the bounding box of the curves
    bbox = BoundingBox.ByGeometry(crvs)
    
    #Get the x and y translation distance based on the bounding box
    yDist = bbox.MaxPoint.Y-bbox.MinPoint.Y
    xDist = bbox.MaxPoint.X-bbox.MinPoint.X
    
    # Assign your output to the OUT variable.
    OUT = solids
    # Load the Python Standard and DesignScript Libraries
    import sys
    import clr
    clr.AddReference('ProtoGeometry')
    from Autodesk.DesignScript.Geometry import *
    
    # The inputs to this node will be stored as a list in the IN variables.
    #The solid module to be arrayed
    solid = IN[0]
    
    #A Number that determines which rotation pattern to use
    seed = IN[1]
    
    #The number of solids to array in the X and Y axes
    xCount = IN[2]
    yCount = IN[3]
    
    #Create an empty list for the arrayed solids
    solids = []
    #Create an empty list for the edge curves
    crvs = []
    
    # Place your code below this line
    #Loop through edges an append corresponding curve geometry to the list
    for edge in solid.Edges:
        crvs.append(edge.CurveGeometry)
    
    #Get the bounding box of the curves
    bbox = BoundingBox.ByGeometry(crvs)
    
    #Get the x and y translation distance based on the bounding box
    yDist = bbox.MaxPoint.Y-bbox.MinPoint.Y
    xDist = bbox.MaxPoint.X-bbox.MinPoint.X
    
    #Get the source coordinate system
    fromCoord = solid.ContextCoordinateSystem
    
    #Loop through x and y
    for i in range(xCount):
        for j in range(yCount):
            #Rotate and translate the coordinate system
            toCoord = fromCoord.Rotate(solid.ContextCoordinateSystem.Origin, Vector.ByCoordinates(0,0,1), (90*(i+j%seed)))
            vec = Vector.ByCoordinates((xDist*i),(yDist*j),0)
            toCoord = toCoord.Translate(vec)
            #Transform the solid from the source coord syste, to the target coord system and append to the list
            solids.append(solid.Transform(fromCoord,toCoord))
    
    # Assign your output to the OUT variable.
    OUT = solids