//--------------------------------------------------------------------------------------------------

        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);
        }
예제 #3
0
        //--------------------------------------------------------------------------------------------------

        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);
        }
예제 #4
0
        //--------------------------------------------------------------------------------------------------

        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);
        }