Developed and maintained by Thomas Mahon
Bimorph Nodes are a versatile collection of powerful utility nodes that extend Dynamo for Revit. It includes ultra-efficient clash detection and geometry intersection nodes, which are enabling entirely new workflows in Dynamo!
It is also the first Dynamo Package with nodes capable of converting curves from CAD Links or Imports using layer names as filters.
The package includes:
CAD | |
CAD.LayerNames | Get the full list of layer names from a CAD Link or Import.
Visit Bimorph Nodes CAD.LayerNames for user guides and downloadable example graphs |
CAD.LayersInUse | Get the list of layer names from a CAD link or import that are in use and contain curves.
Visit Bimorph Nodes CAD.LayersInUse for user guides and downloadable example graphs |
CAD.CurvesFromCADLayers | Convert curves from a CAD Link or Import by layer name to Dynamo curves or Revit Model Lines. Layer names can be input to filter and convert only curves on those layers. Curves are output in sublists based on their layer name and mapped to the Lines Line Style to prevent unwanted CAD styles from entering your Revit project. Alternatively, Line Style names can be input to map each sublist to that style during conversion. To convert all layers, leave the layerName input unconnected. Input layerNames and LineStyleNames are case-sensitive.
The node is optimised to convert curve-types that typically fail when using Dynamo’s Element.Curves node or Revit’s Explode tool for enhanced performance. The node also circumvents the 10000 element limit set by Revit for greater workflow flexibility. Visit Bimorph Nodes CAD.CurvesFromCADLayers for user guides and downloadable example graphs |
CAD.DetailCurvesFromCADLayers | Convert curves to Revit Detail Lines from a CAD Link or Import by layer name. Curves are output in sublists based on their layer name and mapped to the Lines Line Style to prevent unwanted CAD Line Styles from entering your project.
Alternatively, Line Style names can be input to map each curve sublist to that style during conversion. Layer names can be input to filter and convert only curves on those layers. To convert all layers, leave the layerName input unconnected. Input layerNames and LineStyleNames are case-sensitive. The node is optimised to convert-curve types that typically fail when using Dynamo’s Element.Curves node or Revit’s Explode tool for enhanced performance. The node also circumvents the 10000 element limit set by Revit for greater workflow flexibility. Visit Bimorph Nodes CAD.DetailCurvesFromCADLayers for user guides and downloadable example graphs |
CAD.SymbolicCurvesFromCADLayers | Convert curves from a CAD Link or Import to Revit Family Symbolic Lines using the import instance layer names as filters.
Curves are output in sublists based on their layer name and mapped to the Family’s default Line Style to prevent unwanted CAD Line Styles from entering your project. Alternatively, Line Style names can be input to map each curve sublist to that style during conversion. Layer names can be input to filter and convert only curves on those layers. To convert all layers, leave the layerNames input unconnected. Input layerNames and lineStyleMap are case-sensitive. The node is optimised to convert-curve types that typically fail when using Dynamo’s Element.Curves node or Revit’s Explode tool for enhanced performance. The node also circumvents the 10,000 element limit set by Revit for greater workflow flexibility. Visit Bimorph Nodes CAD.SymbolicCurvesFromCADLayers for user guides and downloadable example graphs |
CAD.ReportInstances | Generates a report of all CAD links and imports in the document providing information on: instance name, link status, view specific, owner view id, workset name, file path and host level. Linked and Imported CAD links are output into lists to aid with CAD file management in Revit. The node can be used to report the current document by leaving the filePath unput unconnected, or any external Revit file or Family can be reported silently (without opening) by inputting its file path.
Visit Bimorph Nodes CAD.ReportInstances for user guides and downloadable example graphs |
CAD.SetObjectStyle | Set weight and colour of CAD link or import layers Object Styles. Enter the layers to set as strings. The layer names are case-sensitive. If there are less items in the lineStylesWeight or lineStylesColour list then longest lacing is used to map these attributes to the layerNames list.
Visit Bimorph Nodes CAD.SetObjectStyle for user guides and downloadable example graphs |
Curve | |
Curve.RemoveDuplicates | Removes duplicates from a list of Curves. Dynamo Curves, Revit Model or Detail Lines are all supported. Revit Curves have optional inputs to delete any duplicates from the document and to retain duplicate curves that match the first style from the retainByLineStyles input (optional). LineStyle lists are iterated until a match is found. If no match is found, first-in first-out rules apply.
To simplify model element selection in Revit when using the Dynamo Select Model Elements node, heterogeneous lists (any Revit element type) can be input as the node filters the list for curves before processing. Note that LineStyle names are case-sensitive. Visit Bimorph Nodes Curve.RemoveDuplicates for user guides and downloadable example graphs |
Curve.SolidIntersection | Curve.SolidIntersection adds entirely new functionality to Dynamo – now solids can be used to intersect or trim curves. Prior to BimorphNodes v2.1 it was not possible to intersect a solid with a curve, yet this functionality has significant value for a myriad of workflows; from volumetric containment testing to procedural modelling.
The node can output curve segments that either intersect the solid (default behaviour), or the result can be inverted, which outputs curve segments outside the solid. Inverting provides dual functionality to the node, with both solid intersection or solid trim possible. In some cases, curves can fail the intersection process due to tolerance limitations within the Revit API. The node has been designed to handle these failures by returning the indexes of any problem curves to the exceptions[] output, enabling them to be filtered and rerouted to alternative methods. Visit Bimorph Nodes Curve.SolidIntersection for user guides and downloadable example graphs |
Curve.IntersectAll | Curve.IntersectAll adds new functionality to Dynamo’s Curve class. The node is ultra-efficient, implementing a purpose-built curve intersection method from the Revit API which is further optimised by our own algorithms to eliminate redundant intersection tests and maximise efficiency. The result is a node which can calculate intersection points infinitely quicker than the same workflow using standard Dynamo nodes; in bench-marking tests, we have recorded up to 99.7% reduction in overall processing time!
Visit Bimorph Nodes Curve.IntersectAll for user guides and downloadable example graphs |
BoundingBox | |
BoundingBox.GetElementsInside | Filter and return Revit elements inside a bounding box. BoundingBox.GetElementsInside exposes Revits ElementQuickFilter class, which operates only on the ElementRecord (a low-memory class), making it ideal for rapid element containment testing and collection. Note that the results are – by design – coarse, as the input element Outlines (BoundingBoxes) are used to determine the result, not the geometry. QuickFilters therefore, should be used as a means of optimisation prior to performing more complex, time-consuming processes, such as geometry intersections.
For example, these nodes can be used to optimise an interference checking workflow by collecting only elements within the proximity of another element. The result will be a far more focused collection of elements, making any subsequent geometry or element interference process significantly more efficient as redundant interference tests will be largely eliminated. The optional tolerance input can be used to collect elements extending from the BoundingBox by the distance input. Use positive values to increase the BoundingBox zone, or negative values to decrease the zone. It uses the active document units (mm, cm, m etc) and converts them to Revit internal units dynamically. Visit Bimorph Nodes BoundingBox.GetElementsInside for user guides and downloadable example graphs |
BoundingBox.GetElementsIntersect | Filter and return Revit elements that are inside or intersecting a bounding box. BoundingBox.GetElementsIntersect exposes Revits ElementQuickFilter class, which operates only on the ElementRecord (a low-memory class), making it ideal for rapid element containment testing and collection. Note that the results are – by design – coarse, as the input element Outlines (BoundingBoxes) are used to determine the result, not the geometry. QuickFilters therefore, should be used as a means of optimisation prior to performing more complex, time-consuming processes, such as geometry intersections.
For example, these nodes can be used to optimise an interference checking workflow by collecting only elements within the proximity of another element. The result will be a far more focused collection of elements, making any subsequent geometry or element interference process significantly more efficient as redundant interference tests will be largely eliminated. The optional tolerance input can be used to collect elements extending from the BoundingBox by the distance input. Use positive values to increase the BoundingBox zone, or negative values to decrease the zone. It uses the active document units (mm, cm, m etc) and converts them to Revit internal units dynamically. Visit Bimorph Nodes BoundingBox.GetElementsIntersect for user guides and downloadable example graphs |
Element | |
Element.IntersectsElement | Element.IntersectsElement is one of our new game-changing clash-detection nodes, making it possible to perform ultra-efficient clash-detection tests in Dynamo.
It utilises a purpose-built Revit API method to perform the intersection – which itself is optimised – coupled with our own algorithm, which optimises each clash test by collecting and using only surrounding elements before processing. The technique results in a massive performance increase, with up to a 99.95% reduction in overall processing time compared to the current approach using standard Dynamo nodes Geometry.Intersects + Element.Solid. The output Elements are structured into sublists to support downstream workflows. Understanding the output data structure is simple: any elements from Set B that intersect an element in Set A are stored in a sublist (the ‘clash result’). If there are no intersections, an empty sublist is returned to maintain data structure consistency. The node also includes intelligence which prevents self-intersections if an element is found in both element Set A and B, to eliminate false-flags. Visit Bimorph Nodes Element.IntersectsElement for user guides and downloadable example graphs |
Element.IntersectsSolid | Element.IntersectsSolid is a game-changing clash-detection node built for Dynamo BIM, which provides greater flexibility and interop with Dynamo Solid vs Revit elements. The node is extremely useful in situations where there is no reference geometry – for example, testing if door swings clash with another element. In this scenario, Dynamo Cylinder extrusions could be created at each door to represent the swing zone, then Element.IntersectsSolid can be used to perform the clash test.
The node utilises a purpose-built Revit API method to perform the intersection test, which drastically improves efficiency in comparison to standard Dynamo nodes such as Geometry.IntersectAll. In addition, it is built on the same infrastructure as the Element.IntersectsElement node, meaning it also includes our custom optimisations to minimise redundant tests by filtering surrounding elements per clash. As the node utilises a purpose-built method from the API, many of the performance bottlenecks typically encountered with the OOTB Geometry.IntersectAll node are prevented, providing ultra-efficient intersection results despite the fact solid intersections are still being computed. In some cases, solids can fail the intersection process due limitations with certain geometries processed by the Revit API Shape Builder. The node has been designed to handle these failures by returning the indexes of any problem solids to the exceptions[] output, enabling them to be bypassed, or filtered and rerouted to alternative methods. Visit Bimorph Nodes Element.IntersectsSolid for user guides and downloadable example graphs |
Element.IsElementSupported | Not all Revit elements are supported by the two Bimorph Element.Intersects nodes because the Revit API provides no support. It is difficult to know which elements are not supported since the output from the two Element.Intersects nodes defaults to an empty list when intersections fail.
Element.IsElementSupported provides a means to check if the element and its category is supported, outputting true or false accordingly. If the element is not supported (such as Rooms), a good alternative is to extract its solid volume and use the Element.IntersectsSolid node. Visit Bimorph Nodes Element.IsElementSupported for user guides and downloadable example graphs |
Revit.LineStyle | |
LineStyle.AllAttributes | Gets all the Revit Line Styles in the document and reports their Line Style Name, Weight and Colour as strings and integers. The Revit GraphicsStyle (Category) element for each Line Style is also output.
Visit Bimorph Nodes LineStyle.AllAttributes for user guides and downloadable example graphs |
LineStyle.Create | Create single or multiple new Line Styles in a Revit document by inputting names, line weights and RGB values. The node is equipped with a range of user-friendly pop-up messages that guide users through the creation process by specifying the expected inputs.
Visit Bimorph Nodes LineStyle.Create for user guides and downloadable example graphs |
Revit.LinkElement | |
LinkElement.OfCategory | Get Elements from a linked Revit model (a Link Instance) by Category.
The LinkElement class is exclusive to BimorphNodes and inherits Dynamo’s Revit.Elments.Element class, meaning instances are compatible with any node that accept Elements as inputs. LinkElement’s are purpose-built to solve the Revit API transform limitation imposed on elements from links (which restricts them to their center-to-center position, even if the associated link instance has been transformed). LinkElement’s have no such restriction and are designed to position elements at their host location by default. The LinkElement class is also optimised for use with BimorphNodes Element and BoundingBox nodes, firstly to ensure these nodes remain ultra-efficient, and secondly, to enable full support of elements from linked Revit models by virtue of solving the Revit API transform limitation. Visit Bimorph Nodes LinkElement.OfCategory for user guides and downloadable example graphs |
LinkElement.BoundingBox | Get the linked Elements bounding box at its host location.
Visit Bimorph Nodes LinkElement.BoundingBox for user guides and downloadable example graphs |
LinkElement.Element | Get the Element stored in this LinkElement. Use the Element with any nodes that are incompatible with the LinkElement.
Visit Bimorph Nodes LinkElement.Element for user guides and downloadable example graphs |
LinkElement.Faces | Get the Faces from the LinkElement at its host location.
Visit Bimorph Nodes LinkElement.Faces for user guides and downloadable example graphs |
LinkElement.LinkInstanceId | Get the instance Id of the Revit link instance from where the LinkElement derived.
Visit Bimorph Nodes LinkElement.LinkInstanceId for user guides and downloadable example graphs |
LinkElement.Location | Get the location geometry – either a point or cure – from the LinkElement at its host location.
Visit Bimorph Nodes LinkElement.Location for user guides and downloadable example graphs |
LinkElement.Solids | Get the Solids from the LinkElement at its host location.
Visit Bimorph Nodes LinkElement.Solids for user guides and downloadable example graphs |
LinkElement.TotalTransform | Get the total transform (coordinate system) of the Revit link instance from where the LinkElement derived.
Visit Bimorph Nodes LinkElement.TotalTransform for user guides and downloadable example graphs |
Revit.Schedule | |
Schedule.GetData | Gets all the table data from a given Schedule as strings.
Visit Bimorph Nodes Schedule.GetData for user guides and downloadable example graphs |
Schedule.GetDataColumns | Get the specified column data from a given schedule as strings. Column indexes start at 0 and any input indexes that are out of range are ignored. Use the removeHeading input to specifiy if the headings should be removed from the returned string lists.
Visit Bimorph Nodes Schedule.GetDataColumns for user guides and downloadable example graphs |
Schedule.GetDataRows | Get the specified row data from a given schedule as strings. Schedules have a blank row after the headings so index 1 will always contain no data. Row indexes start at 0 and any input indexes that are out of range are ignored.
Visit Bimorph Nodes Schedule.GetDataRows for user guides and downloadable example graphs |
Revit.Sheet | |
Sheet.Duplicate | Duplicate selected Sheets with options to specify the duplication of placed Views and the method of duplication. The node will identify illegal characters in View names (such as {3D} for example) and clean them automatically to circumvent unexpected failures.
The algorithm which controls the duplicate View behaviour has been designed so that dependent Views are duplicated from a newly created parent View to maintain the existing View structure. The node will also check if the parent View exists on subsequent runs to handle situations where any of its other dependent Views need to be duplicated. The report output provides a detailed log of any Sheets that fail to duplicate, any Views that fail to duplicate or cant be placed, and View names cleaned of illegal characters. Visit Bimorph Nodes Sheet.Duplicate for user guides and downloadable example graphs |
Sheet.RenumberRename | Renumber and/or rename Revit Sheets. To renumber only, leave the newNames input unconnected. To rename only, leave the newNumbers input unconnected. For the node to execute, the sheets and newNumbers lists must contain an equal number of items.
The node uses an algorithm which handles common Revit Sheet renumber failures, including failures caused by number ‘overlaps’ that can occur during the renumber process, resulting in significantly higher success rates when compared to updating the Number parameter using the out-of-the-box Element.SetParameterByName node. Visit Bimorph Nodes Sheet.RenumberRename for user guides and downloadable example graphs |
Sheet.FromSchedule | Collects and returns all Revit sheet elements from a Sheet List Schedule using either a View or view name input. The Sheet Number field should be added to the Schedule for the node to execute.
Visit Bimorph Nodes Sheet.FromSchedule for user guides and downloadable example graphs |
2 thoughts on “Bimorph Nodes Index”