a.k.a. Springs for Dynamo, Dynamo Springs
Spring Nodes is a custom node package for Dynamo .
Its main focus is to improve Dynamo's interaction with Revit. The wider goal is to explore any and all means that can help accelerate BIM focused work-flows. Many of the nodes use either IronPython or DesignScript and can be a good starting point for learning the specific syntax and finer points of both.
The package repository is posted under the MIT license. You will find all the sample files and brief descriptions here, that can further demonstrate how some of the nodes work.
Nobody likes squeaky springs. Therefore your recommendations and ideas on how to improve this package further are always welcome. Please be sure to report any issues or feedback directly to the repository.
Some of the nodes provided in this package have been sprung by existing content, such as the wonderful SteamNodes, archi-lab.net, Clockwork and LunchBox, because every great mechanism could use a spare spring from time to time. The aim is to always improve upon the original content either by enabling additional functionality or opening up new uses. By giving it a new twist, we avoid affecting the original content's goals and direction.
Installation is simple - just use Dynamo's built-in package manager and search for spring
.
- All nodes that previously returned an empty list when an error occurs, return a null value instead. This is due to Dynamo's issues when processing empty lists. (like list rank reduction).
- The ElementType.Duplicate node now handles most element types. Previously the existing type detection was limited to floor, wall and instance types only.
- The File.Size and Number.ToString nodes now have additional functionality.
- The Polygon.ContainmentTest+ node now returns a list of bools (instead of a pair of in/out lists). This is to bring it more in line with Dynamo's other geometric nodes and provide easier coexistance with the core list management nodes.
- The Pt2Str and Ln2Str have been converted from DS to python for increased performance. (calling DS functions on thousands of elements has a big overhead) They also have additional rounding and trimming options.
- The Collector.ElementsInView now has an optional category input for when you'd like to get only the elements of a specific category.
- New nodes:
- Doc.CentralPath: If the document is workshared, the node returns the path to the central document as a string. Otherwise a null value will be returned.
- Doc.CopyFromLinkInstance: The node will use the total transformation of the link instance to copy the input elements into the local document.
- Element.Unjoin: Unjoins the element(s) in the second list from the primary input element.
- ElementType.Instances: Fetches all instances of the input element type. (optimised for concurrent use with multiple types)
- Geometry.IndexByDistance: Provides the index of the closest or farthest geometry. Should prove much faster than getting the geometry and finding its index in two separate operations.
- ScopeBox.Geometry: Fetches the base curve and solid representation of a scope box element.
- RevitProcess.EmptyWorkingSet: Use at your own risk! Removes as many pages as possible from the working set of the active Revit session. (I've seen some improvements in performance by doing this in cases where Dynamo has been running for a while and has accumulated a lot of memory and after closing it, fails to release that memory.)
- Minor bug fixes and two new nodes for working with 2d:
- Polygon.2DArea, used to quickly get the 2d area of a polygon using simple numeric calculations.
- Delaunay2D.ByPoints, is a fix for the built in node with the same name. It works with 2d collections of points.
- ErrorReport/InterferenceCheck.Parse get a big speed boost from improved iteration.
- BrepShape/DirectShape.ByGeometry have been revised in accordance with issue #25
- Collector.ElementSketch has been revised to improve performance (if elementid - 1 is a sketch, avoid an expensive sub-transaction)
- List management (like the Dictionary.ByKeysValues and List.MergeBuBoolMask) nodes's inputs have been revised so that they work better with nested lists and the new list@level functionality.
- Bugs in Feet2Fraction & Fraction2Feet fixed. However DesignScript functions have been behaving problematically. (VM failing to register the function inside a custom node).
- New Node: Elements.GroupByDistance provides a functionality very similar to the Geometry.GroupByDistance node. By pairing each element with a geometry, we cal quickly detect element groups.
- Fix for #20
- Fixed a regression in Element.SetLocation, that I created previously, when cleaning up old Revit2014 code.
- New nodes:
- Springs.BrepShape.ByGeometry works only in Revit 2017 and later and implements the new BrepBuilder class to generate DirectShapes with materials. However, poly-surfaces and solids with periodic faces like spheres, cylinders and cones are not supported at thistime.
- Springs.SelectFaces+ works in a similar manner to the built in node, with the exception that it provides a valid face reference for family instance elements and the global picl point during selection. You can use the pick point to easily identfy the correct face for planar surfaces with multiple loops.
- Springs.BoundingBox.MidPoint is a simple utility node that can quickly compute the mid point between a BB's min and max extent.
- Springs.Points.ConvexHull2D is an evolution of Clockwork's "UV.ConvexHull2D".
- The DirectShapeType implementation has been revised in an attempt to make it more robust between Revit sessions.
- All UI nodes now have an additional "CustomMsg" input to provide additional insight when using the nodes with DynamoPlayer.
- The serialization nodes now have an optional separator input to customize the output for use with some CSV files.
- The even/odd list utility node have been merged.
- Sheet.Views+ got a big speed boost
- Doc.DeleteElements now handles elements that could not be deleted and returns their ids as a chained string
- A lot of nodes provided duplicate functionality or needed refactoring and were removed / replaced. You can find a full list of the changes here
- The library organisation has been revised. Everything is now under the "Springs" tab. All nodes have a "Springs" prefix so that users don't have to wonder where that node comes from.
- As Dynamo 0.82 was the last version that supported Revit 2014, Spring Nodes no longer targets Revit 2014.
- New nodes:
- Geometry.Extents fetches the W/L/H of a geometry object.
- Mesh.ToToolkitMesh converts a dynamo mesh (like the one you'd get from a toposurface) to a mesh toolkit mesh
- Refactored nodes:
- Geometry.GroupByDistance acts similarly to archi-lab's "Group Curves" node and the "Lines.GroupAndFixCorners" but works for all types of geometry
- LineLoop.Merge replaces the "Lines.GroupAndFixCorners" after you've first grouped the lines with the "Geometry.GroupByDistance" node.
- Mesh.ToPolySurface is now multithreaded and replaces the "Topography.ToPolySurface" node. This way you can also process meshes obtained through other means and still handle toposurfaces by first extracting their mesh with the built-in "Topography.Mesh" node.
- ElementType.Duplicate is similar to Clockwork's node with the same name but can handle duplicate names. It will be merged with clockwork's node after Clockwork 1.0
- New nodes:
- AdaptiveFamily.ByFacetedGeometry will genearate a new adaptive component family type from any solid or polysurface consisting of planar faces.
- List.MergeByBoolMask will merge two lists by a third of true and false values.
- List.Subpairs is similar in principle to the built-in Sublists node.
- PolyCurve.Chamfer creates chamfered edges with the specified distance. Neeeds to be tweaked for 1.0
- Geometry.SplitRecursively(Dir) is an alternative of the node with the same name. It has an additional point.geometry input that defines the general direction of the split. The old node does not function as expexted when lines are used as the split tools.
- New node: PlanarFace.FixDomain fixes PointAtParameter for 3&4 corner planar revit faces.
- ClosedCurve.Offset+(0.90) merged into main node(alternative solution)
- Element.AddVoidCut now accepts a new integer based lacing input
- List.DropFirstLast also lists the removed items
- tiny bugfix
- AreaPlan.ByLevelName, "Select Linked Face" revised.
- Lots of tiny optimizations.
- New nodes:
- AreaPlan.ByLevelName will generate new area plans.
- Polygon.ContainmentTest+ should perform a bit faster than the built-in node at the cost of some accuracy
- FamilyInsance.ByFacePoints will place multiple face based families on a target face
- "Select Elements (ordered)" and "Select Linked Elements (ordered)" will preserve the order of selection of your elements.
- General bug cleaning and optimization.
- DirectShape.Transform added. (vector node renamed to DS.Translate)
- Topography.ToPolySurface(py) added. Should provide a 5-10% boost compared to the DS version.
- Element Collectors get a much needed maintenance.
- Even more general maintenance.
- FamilyInstance.ByGeometry and Form.ByGeometry now support localized versions of Revit.
- More general maintenance.
- All collector nodes now have a refresh toggle.
- Sheet.Views+ now collects schedules as well.
- Sheet.Views+ now lists schedules as well.
- General maintenance. Converted most for loops to xrange loops.
- All UI nodes now have an optional "names" input. This should make handling named objects such as views and sheets much easier.
- Watch+ is a new UI node that provides an alternative to the built-in watch node.
- Bug fixes:
- FamilyInstance.ByGeometry was failing to assign a subcategory when no material was in use ( Thanks Jeremy)
- HostedInstance.ByPoints did not work for non-active family types.
- New nodes:
- ErrorReport.Parse is an awesome way of making sence of Revit errors and fetching the offending elements.
- InterferenceCheck.Parse similar to the error report node but for interference checks.
- Bug fixes:
- Element.SetLocation works in Revit 2014 once again
- New nodes:
- Collector.ElementSketch: fetches the actual geometry curves used to generate the element; can optionally fetch the model curve equivalents - this opens the (dangerous) functionality of moving and deleting curve loops that represent openings for example.
- Select Edges: Fetches multiple edges and converts them to Dynamo geometry.
- List.DragDropReorder: My current pride and joy - a node that allows us to visually reorder the elements of a list.
- Point.PullOntoPlane: Pulls a point along the plane normal. The Geom.ClosestTo was producing errors for some reason...
- New functionality/changes:
- FamilyInstance.ByGeometry has a new optional Subcategory input. Also by popular demand, the newly generated geometry is now placed next to the family origin. The node is out of BETA (as long as it behaves) and can be found under SpringNodes>Revit>FamilyInstances
- "Filter.BySelection" and "List.DropDown" are out of BETA as well and have been moved to SpringNodes>Lists. They've also received a new paint job and support nested lists.
- Bug fixes:
- DirectShape.ByGeometry. The element was being offset from the origin.
- SelectInRevit will now work in R16.
- FamilyInstance.ByGeometry will now work in R16.
- New nodes:
-Element.AddVoidCut, Element.RemoveVoidCut, Element.IsCut and Element.IsCutting for managing void cuts in a variety of ways. Works great in combination with FamilyInstance.ByGeometry.
- Select Linked Face will enable face selection from linked files.
- List.Split is a very simple but a time saving node for easy list management.
- Line.StraightenXY and Line.StraightenZ can be used to axially align lines. Usefull with those pesky Revit errors.
- Curve.Offset+ and ClosedCurve.Offset+(there's a special version for 0.9 due to name changes) improve the default offset functionality.
- Minor maintenance on "SelectInRevit" and "Collector.LinkedInstanceElements".
- The collector was outputting vectors because I was only using it for links that were moved and were not mirrored or rotated/
- The node now outputs coordinate systems that can be used to correctly relocate the geometry.
- New geometry node, "N-hedron.ByOriginVector", used to generate multi - sided polyhedrons. (pyramids)
- New BETA features. These feateres may proove more unstable than usual:
- "FamilyInstance.ByGeometry" generates a new family in the background of the currently open document and places an instance of that family.
- "Filter.BySelection" and "List.DropDown" each provide a custom interface for object selection and management.
- DirectShape.ByGeometry and Form.ByGeometry have been completely revised
- the (SAT) versions have been depreciated and merged into the main node
- the node is now unitless
- better error handling and error messages
- Sheet.Views+ now supports Revit 2014
- new List.EveryOther node added. As the name stipulates, it creates a new list for each list element and drops the corresponding element.
- new FamilyInstance.Rotation node added. It fetches a point based element's rotation around its insertion point.
- new CurveLoop.Simplify node added. Design script based. It attempts to merge continuous straight curves into a single line.
- Two nodes for converting Revit decimal colours to Dynamo colours and back added. ( Color2Decimal & Decimal2Color)
- Two new nodes for Converting between fractional and decimal feet added.
- Two new nodes for fetching elements from linked files added.
- Form.ByGeometry(SAT) added.
- New node BoundingBox.Scale added
- DirectShape.ByGeometry(SAT) added. It uses a more robust SAT import method.
- Form.ByGeometry improvements
- small bug fixes
- new Element.Copy and DirectShape.Translate nodes
- more robust DirectShape.ByGeometry node (had to downgrade back to 0.82 due to regression DynamoDS/Dynamo#5371)
- Dictionary.ByKeysValues can handle search for missing keys
- Fixed bug in DirectShape.ByGeometry
- Initial release