11 pro

Stvaranje i promjena instanci Revit® familija pomoću Dynamo Pythona

Stvaranje instanci Revit® familija pomoću Python koda u Dynamo-u je jednostavna ako imate odgovarajući primjerak koda/skripte. Zato ću je podijeliti ovdje.

Primjerak koda prikazuje kako napraviti nekoliko korisnih stvari:

  • Kako odabrati određenu Revit® familiju i tip koju mislimo koristiti.
  • Kako stvoriti instancu tog tipa u modelu na nekoj koordinati.
  • Kako dohvatiti određeni parametar te instance.
  • Kako postaviti vrijednost određenog parametra.
  • Kako rotirati instancu familije oko njezine točke ishodišta (rotacije oko vertikalne/Z osi).

Molim imati na umu da će se kod pokrenuti jednom ukoliko nije ništa izmijenjeno u Dynamo skripti. Daljnja pokretanja neće napraviti ništa. Da bi smo natjerali Dynamo da ponovo pokrene skriput, moramo ga “prevariti” na način da misli da smo nešto promijenili. To radimo na način da dodamo jedan true/false prekidač (vidi sliku) isključivo radi svrhe testiranja (taj true/false se nigdje ne koristi u kodu, on samo govori Dynamo-u (laže) da se “nešto promijenilo”). Ovako ćemo uvjeriti Dynamo da ponovo pokrene isti kod. Također, imajte na umu da pokretanje skripte nekoliko puta na ovaj način će rezultirati ponovnim kreiranjem instance iste familije na istom mjesu (npr. “obični” Dynamo node za kreiranje familije neće stvoriti istu instancu na istom mjestu, to je razlika).

Dynamo Python koristi interne mjerne jedinice iz Revit® API-ja, a to su nažalost stope (feet). Zato, prilikom izračuna (kreiranja) koordinate točke gdje želite stvoriti instancu pazite da su izračunate u stopama. Ili, najbolje je kreirati svoju funkciju u Python kodu koja će pretvarati “vaše jedinice” (npr. mm) u “Revit® jedinice” (stope, ft).

Za izradu ove skripte koristio sam sljedeće verzije alata:

  • Dynamo Core 2.0.3.8810
  • Dynamo Revit® 2.0.3.8811
  • Architectural Revit® template koji dolazi instaliran s Revit®-om

Python node izgleda ovako (pročitajte i komentare unutar koda za više detalja):

# Omogućavanje podrške Python-a i učitavanje DesignScript biblioteke
import clr
import math
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Uvoz Revit® API-ja
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

# Uvoz Manager klasa za Revit®
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

# Ulazni podaci u IN čvorove će biti spremljeni u IN varijablu.
dataEnteringNode = IN

# Ovdje postavljamo naziv odabrane familije i naziv tipa. Ekstenziju rfa ne pišemo. :
FamilyName = "M_Desk"
FamilyType = "1830 x 915mm"

doc = DocumentManager.Instance.CurrentDBDocument
# Početak transakcije
TransactionManager.Instance.EnsureInTransaction(doc)

collector = FilteredElementCollector(doc)

# da bi smo imali kraću listu kandidata (brže izvršavanje koda), collector varijabla može biti fokusirana na samo jednu kategoriju. 
# vidi kompletan popis Revit® kategorija ovdje: https://www.revitapidocs.com/2019/ba1c5b30-242f-5fdc-8ea9-ec3b61e6e722.htm
collector.OfCategory(BuiltInCategory.OST_Furniture)

# dohvati elemente iz collector varijable:
familyTypes = collector.OfClass(FamilySymbol).ToElements()

output = []

for typ in familyTypes:
     typeName = typ.get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString()
     
     # Provjeri da li je trenutni tip željenog naziva tipa i familije definiranog gore:
    if typ.Family.Name == FamilyName and typeName == FamilyType:
        if typ.IsActive == False:
            typ.Activate()
            doc.Regenerate()
         
         # lokacija (koordinata) točke za umetanje familije se postavlja ovdje:
        loc = XYZ(0,0,0)
        
        # stvori instancu familije:
        familyInstance = doc.Create.NewFamilyInstance(loc, typ, Structure.StructuralType.NonStructural)
        
        # Ovako dohvaćamo određeni parametar instance:
        param = familyInstance.GetParameters("Phase Created")[0].AsValueString()
        
        # Ovako postavljamo vrijednost u određeni parametar instance:
        familyInstance.LookupParameter("Comments").Set("This is sample comment")
        
        # Ovako dohvaćamo određeni parametar tipa:
        typ.LookupParameter("Description").Set("This is sample description")
        
        angle = 40.0  # 40 stupnjeva. Uvijek dodajte .0 pa i za "okrugle" brojeve. Tako ćete natjerati Python da ih tretira kao float tip varijable. 
        point1 = XYZ(loc.X, loc.Y, loc.Z)
        
        # druga točka vertikalne osi oko koje rotiramo je točno iznad točke postavljanja. Dovoljno je dodati proizvoljni broj na z koordinatu, npr. 100
        point2 = XYZ(loc.X, loc.Y, loc.Z + 100.0)
        axis = Line.CreateBound(point1, point2)
        
        # rotacija instance familije oko osi (linije), kut se mora pretvoriti u radijane:
        ElementTransformUtils.RotateElement(doc, familyInstance.Id, axis, math.radians(angle))
        
        # u izlaznu listu dodajte što god vam treba:
        output.append(familyInstance)
        output.append(param)
        break
# kraj transakcije, izvrši transakciju:
TransactionManager.Instance.TransactionTaskDone()

# Transakcija završena 
# od ove točke na dalje instanca familije je stvorena, sad se mogu raditi ostale stvari

# Dodijelite izlaznu listu u OUT varijablu.
OUT = output

Eto, nadam se da ćete naći dobru primjenu za ovo!

Odgovori

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa * (obavezno)