Open-source library providing extension methods for Autodesk Revit API to simplify geometric operations.
This library was originally written in 2021 as part of the AlphaBIM project. This was during my early days of coding, so please bear with me if there are bugs or issues with the methods.
Starting from November 13, 2025, I decided to open-source the code I have written, including these extension methods, rather than letting it sit unused for years. While these methods have been in use for some time, they can be improved and refined through community contributions and feedback.
- Extension method style API for Revit classes
- XYZ Extensions (
Extensions/XYZs/)XYZComparisonExtensions,XYZDistanceExtensions,XYZGeometryExtensionsXYZTransformExtensions,XYZUtilityExtensions,XYZVectorExtensions
- Curve Extensions (
Extensions/GeometryObjects/Curves/)CurveExtensions,LineExtensions
- Face Extensions (
Extensions/GeometryObjects/Faces/)FaceExtensions,PlanarFaceExtensions,CylindricalFaceExtensions
- Other Extensions
ToleranceConstants- Predefined tolerance values for geometric comparisonsLinqExtensions- Additional LINQ operations
- Supports Revit 2021-2026 (.NET Framework 4.8 / .NET 8.0)
Build the project and reference SonnyRevitExtensions.dll in your Revit add-in project.
using SonnyRevitExtensions.Extensions.XYZs;
using SonnyRevitExtensions.Extensions;
var point1 = new XYZ(0, 0, 0);
var point2 = new XYZ(10, 10, 5);
// 2D distance
double dist2D = point1.DistanceTo2D(point2);
// Compare points
bool equal = point1.IsAlmostEqual2D(point2, ToleranceConstants.GeneralTolerance);
// Vector operations
var vec1 = new XYZ(1, 0, 0);
var vec2 = new XYZ(2, 0, 0);
bool parallel = vec1.AreVectorsParallel(vec2);using SonnyRevitExtensions.Extensions.GeometryObjects.Curves;
var curve1 = Line.CreateBound(new XYZ(0, 0, 0), new XYZ(10, 0, 0));
var curve2 = Line.CreateBound(new XYZ(5, -5, 0), new XYZ(5, 5, 0));
// Get intersection point
XYZ? intersection = curve1.GetIntersection(curve2);
// Check if parallel
bool isParallel = curve1.IsParallel(curve2);
// Get distance from point to curve
double distance = curve1.Distance(point);using SonnyRevitExtensions.Extensions.GeometryObjects.Faces;
// Check if point is inside face
bool isInside = face.IsPointInside(point);
// Get intersection points between two faces
List<XYZ> intersectionPoints = face1.GetIntersectionPoints(face2);
// Get normal vector
XYZ normal = face.GetNormal();
// For PlanarFace: check if parallel
bool isParallel = planarFace1.IsParallelPlanarFace(planarFace2);
// For CylindricalFace: get radius
double? radius = cylindricalFace.GetRadius();XYZComparisonExtensions- Point comparison operationsXYZDistanceExtensions- Distance calculationsXYZGeometryExtensions- Geometric operations (centroid, intersection, point-in-polygon)XYZTransformExtensions- Transformation operationsXYZUtilityExtensions- Utility methodsXYZVectorExtensions- Vector operations
CurveExtensions- Operations for Curve classLineExtensions- Operations for Line class
FaceExtensions- Operations for Face classPlanarFaceExtensions- Operations for PlanarFace classCylindricalFaceExtensions- Operations for CylindricalFace class
ToleranceConstants- Predefined tolerance constants for geometric comparisonsLinqExtensions- Additional LINQ operations
The goal is to open-source all extension methods that have been developed during work on the project. Future additions may include:
- Solid extensions
- Edge extensions
- Additional geometric operations
Contributions welcome! Follow existing code style, add XML documentation, and ensure compatibility across all Revit versions.