// return null if parent should be completely clipped. // TODO: determine whether or not to use face boundary. private static IFCAnyHandle ProcessClippingFace(ExporterIFC exporterIFC, CurveLoop outerBoundary, Plane boundaryPlane, Plane extrusionBasePlane, XYZ extrusionDirection, IFCRange range, bool useFaceBoundary, IFCAnyHandle bodyItemHnd) { if (outerBoundary == null || boundaryPlane == null) { throw new Exception("Invalid face boundary."); } double clippingSlant = boundaryPlane.Normal.DotProduct(extrusionDirection); if (useFaceBoundary) { if (MathUtil.IsAlmostZero(clippingSlant)) { return(bodyItemHnd); } } bool clipCompletely; if (!IsInRange(range, outerBoundary, boundaryPlane, extrusionDirection, out clipCompletely)) { return(clipCompletely ? null : bodyItemHnd); } if (MathUtil.IsAlmostZero(clippingSlant)) { throw new Exception("Can't create clipping perpendicular to extrusion."); } IFCFile file = exporterIFC.GetFile(); XYZ scaledOrig = ExporterIFCUtils.TransformAndScalePoint(exporterIFC, boundaryPlane.Origin); XYZ scaledNorm = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, boundaryPlane.Normal); XYZ scaledXDir = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, boundaryPlane.XVec); IFCAnyHandle planeAxisHnd = ExporterUtil.CreateAxis(file, scaledOrig, scaledNorm, scaledXDir); IFCAnyHandle surfHnd = IFCInstanceExporter.CreatePlane(file, planeAxisHnd); IFCAnyHandle clippedBodyItemHnd = null; IFCAnyHandle halfSpaceHnd = null; if (useFaceBoundary) { IFCAnyHandle boundedCurveHnd; if (boundaryPlane != null) { XYZ projScaledOrigin = ExporterIFCUtils.TransformAndScalePoint(exporterIFC, extrusionBasePlane.Origin); XYZ projScaledX = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, extrusionBasePlane.XVec); XYZ projScaledY = ExporterIFCUtils.TransformAndScaleVector(exporterIFC, extrusionBasePlane.YVec); XYZ projScaledNorm = projScaledX.CrossProduct(projScaledY); Plane projScaledPlane = new Plane(projScaledX, projScaledY, projScaledOrigin); IList <UV> polylinePts = TransformAndProjectCurveLoopToPlane(exporterIFC, outerBoundary, projScaledPlane); polylinePts.Add(polylinePts[0]); boundedCurveHnd = ExporterUtil.CreatePolyline(file, polylinePts); IFCAnyHandle boundedAxisHnd = ExporterUtil.CreateAxis(file, projScaledOrigin, projScaledNorm, projScaledX); halfSpaceHnd = IFCInstanceExporter.CreatePolygonalBoundedHalfSpace(file, boundedAxisHnd, boundedCurveHnd, surfHnd, false); } else { throw new Exception("Can't create non-polygonal face boundary."); } } else { halfSpaceHnd = IFCInstanceExporter.CreateHalfSpaceSolid(file, surfHnd, false); } if (halfSpaceHnd == null) { throw new Exception("Can't create clipping."); } clippedBodyItemHnd = IFCInstanceExporter.CreateBooleanClippingResult(file, IFCBooleanOperator.Difference, bodyItemHnd, halfSpaceHnd); return(clippedBodyItemHnd); }