(For details of the project please refer to previous post.)
DEFINING MASS, WALLS AND PARAMETERS
I started with a simplified version of mass model, uploaded to Revit Project. Then I associated mass with Dynamo and created the walls by using Wall.ByFace Built-in node (to obtain this node I needed an update in Dynamo).
For generating the roof, I used same node, but this time I selected the roof planes from mass.
In the next step, I chose mass family by Family Types node, and by using Get Family Parameter, I defined the parameters one by one.
DEFINING FACADE
I used several methods and combination of nodes for this process; however none of them gave the solution. My approaches are below:
1. Approach:
By using categories and AllElementsof Category, I selected walls. The output of this node is expected to be Walls, but in this case it was Facewalls.
I used Place.Elements.InWalls from the same named package, and Place.Window.Doors.InWalls from the same named package. Both nodes gave null list.
2. Approach:
First, I selected the face on which the window will be hosted. I found the vertices and by picking and translating one of the corner points I generated the corner points of the window. I used HostedInstance.ByPoints node by Springs package. but this node gave empty list.
3. Approach:
I used HostedInstance.ByPoints node by Springs in another combination. First, I selected categories of walls. When Categories node was plugged into All Elements of Category, it again gave Facewalls. Also, both Element.GetLocation node and Element.Location+ by Clockwork package node gave null list.
Before this method I have tried other methods and several nodes.
--------------------------------------------------------------------------------------------------------------------------
OTHER METHODS I TRIED
METHOD 1 (FROM SCRATCH IN DYNAMO BY GENERATING & TRANSLATING POINTS)
I started to model my mass in Dynamo from scratch by using points. I created the origin (0,0,0) point and by translating it and adding points I created all the corner points of the mass.
1. GENERATE POINTS
2. DEFINE PARAMETERS
By using number sliders and vectors, I defined the parameters as translation in X and Y axes.
For the height parameters, the points were translated in Z axis and again number slider were used. Mid height was defined as units, lowest height and peak height were defined as dependent to the mid height with changeable ratios.
3. GENERATE SURFACES
After generating all the corner points, I created polygons and surfaces, both for the walls and the roof.
4. CREATE FLOORS
I also created a polygon for the footprint of the mass and by defining levels, I translated it in Z axis. By using Floor.ByOutlineTypeAndLevel node, I generated the floors.
After generating the mass in Dynamo with its parameters, second step is to generate parametric walls, floors and roof.
The problems started when I tried to generate the walls from the surfaces I created.
Creating Parametric Walls
FAILURES & SOLUTIONS
Failures
1. I used Wall.ByFace node by Clockwork Package, it gave empty list.
Later I learned that I need to upgrade my Dynamo to use OOTB Wall.ByFace node which means Dynamo itself has an inbuilt Wall.ByFace node in the latest version. (My version was the one that comes in with Revit 2018)
However, OOTB Wall.ByFace node gave empty list, too.
2. I used RevitFace.FromDynamoSurface, and got again empty list.
I learned that this node does not convert a surface generated in Dynamo to Revit. First, bring geometry to Revit & bring its faces back to Dynamo.
3. So I used ImportInstance.ByGeometry > SelectFace > RevitFace.FromDynamoSurface in order to bring my geometry to Revit and retrieve to Dynamo.
However, it gave empty list, too.
4. I used ImportInstance.ByGeometry > TopologyFaces > RevitFace.FromDynamoSurface
This process gave the surfaces, but OOTB Wall.ByFace node did not work even if I tried the longest lacing and gave warning.
Warning: One or more of the input types are not matching. Couldn't find a version of ByFace that takes arguments of type (__array,__array,__array)
Then, I learned that, for OOTB Wall.ByFace node to work, the faces need to be the faces of a mass surface in Revit.
5. I have imported my mass to Revit by ImportInstance.ByGeometry. I retrieved the faces of Revit mass by using SelectFace node. But OOTB Wall.ByFace node got again empty list. (The longest lacing did not work.)
Solution
I used Wall.ByCurveAndHeight node by benefiting from the ImportInstance.ByGeometry faces. Wall.ByCurveAndHeight node has height input which results in the height parameter of points being invalid.
See below:
This node gave the vertical walls which works parametricly and a warning: "Warning: Wall.ByCurveAndHeight operation failed.
The curve argument is not valid for rectangular wall creation.
Parameter name: curve"
Limitation
Wall.ByCurveAndHeight node has height input and it results all the walls having same height.
Creating Parametric Floors
I used a combination of the same process and nodes (Wall.ByCurveAndHeight, ImportInstance.ByGeometry) as in the wall generation and create floor step above to create parametric floors.See below:
Deleting Unwanted Model Elements
After each parametric change, Revit keeps the older version too, and this makes a confusion since both the oldest and latest versions overlap.I used Elements.Delete node by Archi-lab.net Package to delete older model elements. But I needed to select them manually by using Tab, which was not very practical. After running Dynamo, since the model elements were deleted, Select Model Elements nodes became empty. Manual selection is required to delete the model elements after each parametric change.
METHOD 2 (USING MASS MODEL)
I used Family Types node to select mass family, and then defined the parameters.
By using one of the element outputs, I got surfaces and defined walls by using Wall.ByCurveAndHeight.
Creating Parametric Roof
After creating the walls, I needed to pick the top corner points in order to define a base for roof. First, I selected the top surfaces of each wall and found the vertices. From the list of vertices, I picked up the corner walls. I found the exact points by experimenting.
For creating roof, base points and peak points were needed. Below is the generating the peak points by benefiting from corner points.
By using Roof.SlabShapeByPoints node, I generated the whole roof, but the result was not satisfying. So I tried to generate the roof in two pieces.
However, the result is again not satisfying.
References:
https://forum.dynamobim.com/t/dynamo-mass-and-revit-wall-by-face/4543/8
https://forum.dynamobim.com/t/revitface-fromdynamosurface-empty-list-problem/16718/9
http://dynamobim.org/forums/topic/point-extraction-from-surface-and-placing-components-at-those-points/
http://dynamobim.org/forums/topic/placing-windows/#post-38349
http://dynamobim.com/forums/topic/how-to-put-a-door-or-window-object-on-the-wall-2/
https://www.youtube.com/watch?v=1fzJbxJMzQk