//-------------------------------------------------------------------------------------------------- bool _CreateSlices() { var sliceInterval = SliceThickness / SliceCount; for (int sliceIndex = 0; sliceIndex < SliceCount; sliceIndex++) { var sliceOffset = sliceInterval * (sliceIndex + 0.5); var cutPlane = _RefPlane.Translated(SliceDirection.ToVec().Multiplied(sliceOffset)); var cutPlaneFace = new TopoDS_Face(); new BRep_Builder().MakeFace(cutPlaneFace, new Geom_Plane(cutPlane), 1e-7); // Create contour var common = new BRepAlgoAPI_Common(SourceShape, cutPlaneFace); if (!common.IsDone()) { Messages.Error("Cannot create contour face from shape."); return(false); } var bodySpaceShape = common.Shape(); // Move to origin var transform = new Trsf(Ax3.XOY, cutPlane.Position); var transformer = new BRepBuilderAPI_Transform(bodySpaceShape, transform, true); var shape = transformer.Shape(); var slice = new Slice(shape, cutPlane); _Slices[sliceIndex] = slice; } return(true); }
//-------------------------------------------------------------------------------------------------- bool _MakeSolid(IShapeOperand sourceShape) { var sourceBRep = GetOperandBRep(0); if (sourceBRep == null) { return(false); } // Calculate Parameters Ax3 axis = _CalculateSolidAxis(); var(interval, offset) = _CalculateParameters(); // Build Transformed Shapes TopoDS_Compound resultShape = new TopoDS_Compound(); var builder = new TopoDS_Builder(); builder.MakeCompound(resultShape); for (var index = 0; index < Quantity; index++) { var angle = (interval * index + offset).ToRad(); var transform = Trsf.Identity; if (_KeepOrientation) { // Translation transform transform.SetTranslation(Pnt.Origin.Rotated(axis.Axis, angle).ToVec()); } else { // Rotation transform transform.SetRotation(axis.Axis, angle); } var makeTransform = new BRepBuilderAPI_Transform(sourceBRep, transform); if (!makeTransform.IsDone()) { Messages.Error("Failed transforming shape."); return(false); } builder.Add(resultShape, makeTransform.Shape()); } // Finalize BRep = resultShape; return(true); }
//-------------------------------------------------------------------------------------------------- bool _Make2D() { // We work with 2D shapes as source var faceShape = GetOperand2DFaces(0, null); if (faceShape == null) { return(false); } // Get plane if (!FaceAlgo.GetPlaneOfFaces(faceShape, out var plane)) { return(false); } // If extrusion vector has zero length, just copy the source shape converted to faces if (Depth == 0) { BRep = faceShape; return(base.MakeInternal(MakeFlags.NoTransformation)); } // Generate vector var vector = plane.Axis.Direction.ToVec().Multiplied(Depth); // Offset if symmetric if (Symmetric) { var offset = vector.Reversed().Multiplied(0.5); var transform = new BRepBuilderAPI_Transform(faceShape, new Trsf(Pnt.Origin, offset.ToPnt())); faceShape = transform.Shape(); } // Do it! var makePrism = new BRepPrimAPI_MakePrism(faceShape, vector); // Get final shape BRep = makePrism.Shape(); return(true); }
//-------------------------------------------------------------------------------------------------- bool _MakeSolid(IShapeOperand sourceShape) { var sourceBRep = GetOperandBRep(0); if (sourceBRep == null) { return(false); } // Calculate Offsets Ax3 plane; switch (Plane) { case PlaneType.XY: plane = Ax3.XOY.Rotated(Ax1.OZ, _Rotation.ToRad()); break; case PlaneType.ZX: plane = Ax3.ZOX.Rotated(Ax1.OY, _Rotation.ToRad()); break; case PlaneType.YZ: plane = Ax3.YOZ.Rotated(Ax1.OX, _Rotation.ToRad()); break; default: throw new ArgumentOutOfRangeException(); } var bbTransform = new Trsf(new Ax3(Ax2.XOY), plane); var extents = sourceBRep.BoundingBox().Transformed(bbTransform).Extents(); var offset = Vec.Zero; var interval1 = plane.XDirection.ToVec() * _CalculateOffset(DistanceMode1, Quantity1, Distance1, extents.X); switch (_Alignment1) { case AlignmentMode.Center: offset += interval1 * (Quantity1 - 1) * -0.5; break; case AlignmentMode.Last: interval1 *= -1; break; } var interval2 = plane.YDirection.ToVec() * _CalculateOffset(DistanceMode2, Quantity2, Distance2, extents.Y); switch (_Alignment2) { case AlignmentMode.Center: offset += interval2 * (Quantity2 - 1) * -0.5; break; case AlignmentMode.Last: interval2 *= -1; break; } // Build Transformed Shapes TopoDS_Compound resultShape = new TopoDS_Compound(); var builder = new TopoDS_Builder(); builder.MakeCompound(resultShape); for (var index1 = 0; index1 < Quantity1; index1++) { for (var index2 = 0; index2 < Quantity2; index2++) { if (_Border && index1 != 0 && index1 != Quantity1 - 1 && index2 != 0 && index2 != Quantity2 - 1) { continue; // Skip inner parts } var transform = new Trsf(); transform.SetTranslation(interval1 * index1 + interval2 * index2 + offset); var makeTransform = new BRepBuilderAPI_Transform(sourceBRep, transform); if (!makeTransform.IsDone()) { Messages.Error("Failed transforming shape."); return(false); } builder.Add(resultShape, makeTransform.Shape()); } } // Finalize BRep = resultShape; return(true); }