Pagina's op IkLeerBIM

vrijdag 7 oktober 2022

Custom Dynamo Node - RoomSolidIntersectionByParameterValue

Vandaag het vervolg op mijn vorige post. In mijn vorige post vertelde ik over de node RoomsToSolidRepresentation. Het was een lange post. En vandaag gaat het over een toepassing hiervan. Dat kan gelukkig wat korter. Bij deze RoomSolidIntersectionByParameterValue

Nadat we een gesloten en betekenisvol analytisch model hebben gegenereerd van een live project -een eerste stap naar een Topological model zeg maar-, kan je beginnen met een paar analyses. Je kan bijvoorbeeld eigenschappen hangen aan de snijvlakken tussen de ruimtes. Denk concreet aan brandscheidingen en bijv. geluideisen. Dit zijn de vakjes 4.5 en 4.6 uit de BIM Basis ILS. Maar er zijn vast meer toepassingen denkbaar. ;-)

RoomSolidIntersectionByParameterValue = dit dus.

Het hele proces bestaat uit een paar stappen:
  1. Je gebruikt de Node RoomsToSolidRepresentation, en maakt zo lijsten met Solids en Rooms.
  2. Je kiest een Room parameter als sturing voor de analyse. En koppelt vervolgens de Parameter naam, de Solids en de Rooms aan de Node RoomSolidIntersectionByParameterValue
  3. Open de CSV die de Node gemaakt heeft. En vul de eisen in.
  4. Run het script nogmaals. De Node zal dan de ingevulde waardes van de CSV gebruiken en vlakken en bijbehorende waardes rapporteren
  5. Doe er wat leuks mee! Pas Revit aan: plaats DirectShapes, plaats Families, selecteer Revit objecten en pas eigenschappen aan. Of blijf nog in Dynamo en tweak het gegenereerde. Of exporteer de data, bijv. met de Topologic Package. Je kan dan in je eigen software verder. Of gebruik Rhino, Blender of ...

Laten we deze stappen eens stap voor stap nalopen en gebruiken 'het Revit huis' als referentie.

1 - We genereren de Solids en checken het resultaat.

In Dynamo zien we nog een paar vreemde zaken. Laten we in Revit kijken of we kunnen begrijpen wat er aan de hand is. En of we het model nog beter kunnen maken.
'out of the Box'

Het blijkt dat alle Levels een BuildingStorey zijn. Dit helpt niet. Daarnaast ontbreekt er een ruimte op de 1e verdieping, die zorgt voor een 'schoorsteen'. En er zitten wat verticale Room Bounding gaten in de ruimte links onder. En ten slotte zit er nog een horizontale sleuf boven de entree die we ook willen oplossen.
Level Schedule

Room Schedule

Met een Level Schedule kunnen we snel en efficiënt de vervuilende BuildingStorey eigenschappen aanpassen. Daarna passen we via een Schedule de hoogtes van de ruimtes aan. Als er verticale gaten zitten in de constructie is er een extra motivatie om een Room ván Level naar Level te laten lopen.
'foute' Living

aangepaste Living

De iets verdiepte Living heeft meerdere 'foutjes'. De Room is niet op de juiste Level geplaatst. Mijn Node doet vooralsnog niks met een Base Offset (zou misschien wel moeten). En omdat het niet op de juiste Level is geplaatst, missen er ook m2 ter plaatse van de trap. En in de hoogte zou je eigenlijk een extra Level verwachten bij de bovenkant van het dakterras. Niet schandalig veel werk om even aan te passen. Maar als dit niet belangrijk is, zou je het bewust kunnen overslaan. Ik accepteer hier overigens wel dat Rooms in de hoogte door elkaar steken. Dat lost de Node wel op.
toevoegen schacht

En tenslotte missen we op de 2e verdieping nog een schacht die we ook snel toevoegen. Al met al zijn we bijna klaar.
voorlopig klaar

tja. 'the sky is the limit', maar ergens stop je

Er blijft nog 1 raar hoekje over. Dat is bij de Master Bath 207. De Room geometrie is hier 'gewoon' iets te complex om 100% te krijgen. In de afbeelding hieronder zie je de 3D Room Solid, samen met de gegenereerde Room Solid en ook de gegenereerde snijvlakken. Er lijkt 1 snijvlak te ontbreken. Voor nu is de oplossing om dit extra puntje te accepteren. Het is voor de rest van de flow ook niet van belang. Of je kan het wandje waar de toilet aan hangt, even niet 'Room Bounding' maken. Deze wand scheid ook niet echt 2 ruimtes.
Natuurlijk zou de Node het moeten kunnen oplossen, maar de hoeveelheid energie die gestopt wordt in zo'n uitzonderingen staat niet altijd in verhouding tot wat het opbrengt. Het moet ook leuk blijven. En ik stop liever energie in grotere stappen vooruit. Vooralsnog is dit een uitzondering die 90% goed is.

2 - Kiezen Room Parameter voor analyse. 

Name is in dit geval een prima optie. Overigens kan je ook een lijst met Parameter namen toevoegen. Dit zorgt er vooral voor, dat de lijst met mogelijke combinaties, alleen maar groter wordt. 1 Maximaal 2 is logischer.
Overigens wordt er per doorgegeven Room 1 Solid gepakt uit de andere doorgegeven lijst. Solids die als opvulling gemaakt zijn -en dus geen Room hebben- staan aan het eind van de lijst met Solids en worden dus niet meegenomen in het vervolg. Opvullen is dus leuk op de korte termijn, maar voor deze workflow wil je het liever meteen oplossen.


Je krijgt meteen de snijvlakken van alle Solids = Rooms met een verschillende waarde voor de opgegeven Parameter, of combinatie van Parameters en gecombineerde waardes. In dit geval 36 items. We hebben een lijst met 36 unieke ingevulde parameter combinaties. Een lijst met 36 opgegeven (in eerste instantie "-") analyse eisen. Dit moeten we zo gaan aanpassen. En een lijst met 36 lijstjes met geometrie. Doorgaans een Surface.



3 - De CSV

Nu moeten we de nieuw aangemaakte CSV gaan openen en aanpassen, zoals wij dat willen. Zoals je kan zien wordt de locatie van de CSV gerapporteerd. Deze staat in de map van het lokale Project, of van de Central File.
Als je het bestand opent (bijvoorbeeld in Excel zie je een Matrix met alle voorkomende parameter waardes. De helft van de combinaties heeft een "x". En de rest heeft een "-". Bij het beoordelen van een combinatie van waardes in de matrix, slaat het script een "x" over. Dat doet het script ook bij "X" of een lege cel. 
Een "-" wordt niet overgeslagen en als waarde gezien. Daarom zal het resultaat in eerste instantie alle vlakken zijn. Dit is gedaan om te voorkomen dat gebruikers denken dat er niks is gebeurd, als de CSV voor het eerst wordt aangemaakt.
Je kan nu alle "-" waardes verwijderen en een juiste waarde invullen. Bijvoorbeeld met Ctrl+H


maak er wat moois van

4 - Run het script opnieuw en controleer het resultaat. 

Bovenstaande matrix is natuurlijk niet de meest slimme manier om verblijfsruimtes en installatie geluid te beoordelen. Dus ik had al snel een paar foutjes gemaakt. Maar het principe is duidelijk. 
Hieronder het eindresultaat. Blauw staat hier voor 30. En Rood voor 32. (na een paar aanpassingen van de CSV)

tada!

Als er nou nieuwe waardes of nieuw Rooms worden gemaakt, zal het script dit in eerste instantie rapporteren. Zie hieronder. Hier heb ik de zelf geplaatste Shaft ruimte een nieuwe naam gegeven. Ik heb de hoofdletter vervangen. De ruimte heet nu "shaft". Zoals je kan zien krijgen we een melding van een nieuwe waarde. En ontbreken de snijvlakken met de gewijzigde ruimte in eerste instantie. Als we het script nogmaals zouden draaien, zien we de "-" waardes weer verschijnen als resultaat. Pas dus de CSV gelijk aan als er wijzigingen gerapporteerd worden. Je zult zien dat de oude "Shaft" naast de nieuwe "shaft" blijft staan.

na aanpassen van een Room Parameter in Revit

uitgebreide CSV

Het is dus aan te raden van te voren goed na te denken hoe je de matrix gebruikt. Vaste waardes en parameter benamingen zouden er zelfs voor kunnen zorgen dat je CSV bestanden bij meerdere projecten kan hergebruiken.


5 - Over het gebruik en hergebruik van deze gegevens zal ik niet veel zeggen. 

Ik heb al tal van voorbeelden genoemd. En ik verwacht dat vanuit het gebruik ook wel meer toepassingen en vragen voor verbeteringen zullen komen.

Tenslotte nog een paar woorden over het Python script en het genereren van de Surfaces. 

Veel zaken zijn vergelijkbaar met het script van RoomsToSolidRepresentation. Ook hier is een debug mode, gebruik ik native Dynamo Nodes in het script. Het script houd de tijd bij, maar rapporteert dit alleen in de debug mode. En ten slotte worden er meldingen gemaakt in de 'Report' output als er problemen zijn.
Zoals je mag verwachten zit er een hoop Python list management in het script. Transpose, sort, groupby, map, lambda, range etc. Ook for-loops met 2 tellers (X en Y) komen een paar keer voor. Het is daardoor helaas soms wat slechter leesbaar.
Ik hoop door het gebruik van sets en dictionaries ook wat tijd winst te halen. Maar dat is altijd in verhouding tot de hoeveelheid data die wordt verwerkt.
Voor het geometrische deel heb ik weer Dynamo aanroepen gedaan. Na de Solids gegroepeerd te hebben, probeer ik deze met een Solid.ByUnion samen te voegen. En het bleek dat de Geometry.Intersect beter leek te werken met een PolySurface dan met Solids (...). Dus de gecombineerde Solids zet ik daarom eerst om in PolySurfaces. Ik controleer niet op voorhand of er een intersectie Surface is (had gekund). Maar ik rapporteer wel als er geen intersectie aanwezig is.




Geen opmerkingen:

Populaire berichten

Zoeken in deze blog