[2 units]
I used the Twisting Cog conceptual mass family for the form-flexing exercise in Revit/Dynamo (two instances shown below). The mass floors are spaced equally every 12ft up to a top height of 720ft (30ft below the maximum height spec), and the maximum outer radius is set at the base to 100ft.
The total occupied plan and height of the tower is 200’ x 200’ x 720’.
(Revit Project Location set to SF, CA)
Conceptual Mass Properties/Parameters
The Twisting Cog is defined by Height, Rotation, Radius, and Spread Angle at 3 heights (base, middle, top). The rotation defines the positioning of the 3 teeth: changing the relative rotation between base/mid/top results in twisting. The spread angle defines how wide the teeth are: a large spread gives the look of nooks in the surface, while a small spread looks like a thin protrusion on the surface.
The mass was simulated in Dynamo with various combinations of Mid Height, Mid Radius, and Mid Spread to evaluate the effects of tapering the mid-section on Gross Volume/Surface/Floor Area.
The main Dynamo script is comprised of:
-Revit Element, Input and Output variable selection
-A custom node EvaluateInputCombos, used to compute the Output variables via Function Apply
-A data export to Excel for report generation
Input variables to the script
The Revit Element is selected by clicking the “Change” button, then clicking on the mass in the Revit window where the element is in view.
To take advantage of the ability to pass in lists to Element.SetParameterByName and Element.GetParameterValueByName function blocks, the Input Names/Values and Output Names are passed in as lists of strings/numbers.*
*I notice, however, that this requires matching the number of Input Names with the number of Output Names. Make sure to do this if you want to keep the flexibility of the custom node to take in any number of Input/Output parameters—even if it means passing in an input parameter twice or getting an output parameter twice.
The List.Join block defines the rule governing the List.CartesianProduct block when combining the 3 input value lists; the product of that block is then flattened before passed on to Function Apply for simulation.
Custom Node definition
Custom node EvaluateInputCombos is executed for each input combination in the flattened input values list via Function Apply. It takes in a list of strings and numbers, as mentioned, and sets/gets parameter values accordingly in just 2 code blocks. The SetParameter block is enclosed by Transaction.Start/End to capture each test case passed in by function apply (like a for loop). The GetParameter block is placed after Transaction.End to allow Revit slightly more time to compute and record the output values (yes, I observed this difference in debugging).
Report generation
Finally, once all test cases have been run using Function Apply, the resulting list is combined with the input values, as well as the input/output names as headers, into an Excel spreadsheet as a report.
Report results
8 of the 36 test cases resulted in 1.2 to 1.5 million square feet of floor space. For cases with Mid Radius < 100ft, it’s tough to reach 1.2M SF with fixed base and top radii at 100ft and 50ft, but 1M SF is more obtainable (see unshaded rows in filtered results below). Of the 8 qualified test cases, the 100ft radius - 40deg spread - 300ft mid height test case resulted in the lowest surface area (513K SF).