The method Solid.IntersectWithCurve() calculates the intersection between a closed volume solid and a curve. The SolidCurveIntersectionOptions class can specify whether the results from the IntersectWithCurve() method will include curve segments inside the solid volume or outside. The curve segments inside the solid will include curve segments coincident with the face(s) of the solid. Both the curve segments and the parameters of the segments are available in the results.
The following example uses the IntersectWithCurve() method to calculate the length of rebar that lies within a column.
Code Region: Finding intersection between solid and curve |
private void FindColumnRebarIntersections(Document document, FamilyInstance column) { // We will be computing the total length of the rebar inside the column double totalRebarLengthInColumn = 0; // Find rebar hosted by this column RebarHostData rebarHostData = RebarHostData.GetRebarHostData(column); if (rebarHostData == null) { return; } IList<Rebar> rebars = rebarHostData.GetRebarsInHost(); if (rebars.Count == 0) { return; } // Retrieve geometry of the column Options geomOptions = new Options(); geomOptions.ComputeReferences = true; geomOptions.DetailLevel = ViewDetailLevel.Fine; GeometryElement elemGeometry = column.get_Geometry(geomOptions); // Examine all geometry primitives of the column foreach (GeometryObject elemPrimitive in elemGeometry) { // Skip objects that are not geometry instances GeometryInstance gInstance = elemPrimitive as GeometryInstance; if (gInstance == null) { continue; } // Retrieve geometry of each found geometry instance GeometryElement instGeometry = gInstance.GetInstanceGeometry(); foreach (GeometryObject instPrimitive in instGeometry) { // Skip non-solid sobject Solid solid = instPrimitive as Solid; if (solid == null) { continue; } SolidCurveIntersectionOptions intersectOptions = new SolidCurveIntersectionOptions(); foreach (Rebar rebar in rebars) { // Get the centerlines for the rebar to find their intersection with the column bool selfIntersection = false; bool suppresHooks = false; bool suppresBends = false; IList<Curve> curves = rebar.GetCenterlineCurves(selfIntersection, suppresHooks, suppresBends, MultiplanarOption.IncludeOnlyPlanarCurves, 0); // Examine every segment of every curve of the centerline foreach (Curve curve in curves) { SolidCurveIntersection intersection = solid.IntersectWithCurve(curve, intersectOptions); for (int segment = 0; segment <= intersection.SegmentCount - 1; segment++) { // Calculate length of the rebar that is inside the column Curve curveInside = intersection.GetCurveSegment(segment); double rebarLengthInColumn = curveInside.Length; totalRebarLengthInColumn = totalRebarLengthInColumn + rebarLengthInColumn; } } } } } } |