I am trying to find a method to create buildings in Forma from my closed polyline plans. I have tried the two methods below with the same data set resulting in different problems for each.
The Dataset
The surfaces originate from a large generative design script. I then exported those to Revit for checking and sharing on here once I ran into errors.
Regions Check.rvt (6.3 MB)
Integrate.ByRepresentations method
Works, but then in Forma it is missing an area?
Forma Import_Legacy-2025-07-17-1039-Forum.dyn (107.6 KB)
BasicBuilding.ByPlans method
Has error unless I remove the hall and stairwell areas. What is causing this?
Forma Import-2025-07-17-1047-Forum.dyn (60.3 KB)
Notes
I’m was using Revit 2026 with it’s corresponding dynamo ( 3.4.1 ?) running the brand new 4.6.0 DynamoFormaBeta package. I am currently installing the Revit 2026.2 update with Dynamo 3.5.2 and will see if I get any different results.
Hi @SteveDFT
Sorry for the delay on this. I’ve been out on summer holidays. 
Integrate.ByRepresentations
Just confirming here that you are missing this area after you click Add Floors or Edit in 3D Sketch, right?
If I hover the Residential area prior to clicking Add Floors, the area is counted and included in the visualization
And If I change the function for the area in the Floor Sketcher after adding floors, it actually comes back:
BasicBuilding.ByPlans
The underlying issue here is floating point precision. We are using a library called terf to verify intersections of the input geometry. I have not gotten to the bottom of this yet, but this issue suggest clamping precision as a workaround. I’ve attached a modified graph with a python script to clamp the polycurves to 8 decimals, @solamour or @jacob.small probably has a suggestion for a node only version of the clamping. This then passes the API validations.
Forma Import-2025-07-17-1047-Forum.dyn (66.3 KB)
This is the DesignScript variant
Thanks to Gemini and some specific prompting!
def ClampedPolyCurves(inputCurves : PolyCurve[]..[])
{
// Step 1: Get all points from all input curves.
// 'inputCurves.Points' automatically preserves the nested structure.
// If inputCurves = [polyCurve1, polyCurve2], then
// allPoints = [[point1a, point1b, ...], [point2a, point2b, ...]]
allPoints = inputCurves.Points;
// Step 2: Create new Point objects with rounded X and Y coordinates.
// DesignScript's replication engine will apply 'Point.ByCoordinates'
// to each individual point in the nested 'allPoints' list,
// maintaining the nested structure for 'clampedPoints'.
clampedPoints = Point.ByCoordinates(
Math.Round(allPoints.X, 8),
Math.Round(allPoints.Y, 8)
);
// Step 3: Reconstruct PolyCurves from the nested list of clamped points.
// Since 'clampedPoints' has the same nested structure as the original points,
// 'PolyCurve.ByPoints' will be applied to each inner list of points,
// resulting in a new list of PolyCurves.
return = PolyCurve.ByPoints(clampedPoints, true);
};
Thanks Guys! I will try some of this out soon.
1 Like
Here’s is the node based version that I went with:
1 Like
FYI,
At one point I thought it might be a problem with the normals, so I had been performing the below adjustment to my surfaces, aligning the normals. Interestingly enough, this still breaks it…