public async Task GetTrimCurves2ForAHalfDiscShouldReturnTwoNonPeriodicOpenTrimCurve()
        {
            await CreatePartDoc(async (modelDoc, yielder) =>
            {
                var disc0 = Modeler.CreateSemiCirclularSheet
                                (center: Vector3.Zero
                                , vNormal: Vector3.UnitZ
                                , vRef: Vector3.UnitX
                                , radius: 2
                                );

                // Display the original sheet. Visually verify it is ok.
                // Press "Continue Test Execution" button within solidworks
                // to continue the test after visual inspection of the sheet
                using (disc0.DisplayUndoable(modelDoc))
                    await PauseTestExecution(pause: false);

                // The sheet should only have one face. Extract it
                var faces = disc0.GetFaces().CastArray <IFace2>();
                faces.Length.Should().Be(1);
                var face = faces[0];

                // Convert the solidworks face to a bspline face
                var bsplineFace = BSplineFace.Create(face);

                bsplineFace.TrimLoops.Count.Should().Be(1);
                var trimLoop = bsplineFace.TrimLoops[0];

                trimLoop.Count.Should().Be(2);

                {
                    // The curve is a clamped open curve. ( A half circle ) It is not "Solidworks periodic"
                    trimLoop[0].Order.Should().Be(3);
                    trimLoop[0].KnotVectorU.Take(3).ShouldBeEquivalentTo(new[] { 0, 0, 0 });
                    trimLoop[0].KnotVectorU.TakeLast(3).ShouldBeEquivalentTo(new[] { 1, 1, 1 });
                    var controlPoints00 = trimLoop[0].ControlPoints;

                    controlPoints00.First()
                    .Should().NotBe(controlPoints00.Last());

                    // This is not solidworks periodic so this property should be false
                    trimLoop[0].IsClosed.Should().BeFalse();
                }
                {
                    // The curve is a clamped closed curve. ( A line ) It is not "Solidworks periodic"
                    trimLoop[1].Order.Should().Be(2);
                    trimLoop[1].KnotVectorU.Take(2).ShouldBeEquivalentTo(new[] { 0, 0 });
                    trimLoop[1].KnotVectorU.TakeLast(2).ShouldBeEquivalentTo(new[] { 1, 1 });
                    var controlPoints00 = trimLoop[0].ControlPoints;

                    controlPoints00.First()
                    .Should().NotBe(controlPoints00.Last());

                    // This is not solidworks periodic so this property should be false
                    trimLoop[1].IsClosed.Should().BeFalse();
                }
            });
        }
Exemplo n.º 2
0
        private static IBody2[] RoundTrip(IBody2 cutBody)
        {
            var faces  = cutBody.GetFaces().CastArray <IFace2>();
            var sheets = faces.Select(face => BSplineFace.Create(face).ToSheetBody()).ToArray();

            //foreach (var sheet in sheets)
            //{
            //    yielder(sheet.DisplayUndoable(modelDoc));
            //}


            var error = (int)swSheetSewingError_e.swSewingOk;
            var body  = Modeler
                        .CreateBodiesFromSheets2(sheets, (int)swSheetSewingOption_e.swSewToSolid, 1e-5, ref error)
                        .CastArray <IBody2>();

            return(body);
        }
        public async Task CanRebuildASquareSheet()
        {
            await CreatePartDoc(async (modelDoc, yielder) =>
            {
                var box    = Modeler.CreateSheet(Vector3.Zero, Vector3.UnitZ, 2);
                var faces  = box.GetFaces().CastArray <IFace2>();
                var sheets = faces
                             .Select
                                 (face =>
                {
                    var faceParams = BSplineFace.Create(face)
                                     .TransformSurfaceControlPoints
                                         (ctrlPts => ctrlPts.Select(v => new Vector4(v.X + 2, v.Y, v.Z, v.W)));

                    return(faceParams.ToSheetBody());
                })
                             .AssertAllSome()
                             .ToArray();

                using (box.DisplayUndoable(modelDoc)) {
                    await PauseTestExecution();
                };

                //foreach (var sheet in sheets)
                //{
                //    yielder(sheet.DisplayUndoable(modelDoc));
                //}


                var error = (int)swSheetSewingError_e.swSewingOk;
                var body  = Modeler
                            .CreateBodiesFromSheets2(sheets, (int)swSheetSewingOption_e.swSewToSolid, 1e-5, ref error)
                            .CastArray <IBody2>();

                body.Should().NotBeEmpty();

                yielder(body.DisplayUndoable(modelDoc));

                await PauseTestExecution();
            });
        }
        public async Task CanRebuildComplexFeature()
        {
            await CreatePartDoc(async (modelDoc, yielder) =>
            {
                var m       = SwAddinBase.Active.Modeler;
                var cone    = m.CreateCone(0.8, 0.2, 5);
                var box     = m.CreateBox(1, 2, 3);
                var solid   = box.Cut(cone);
                var cutBody = solid.Bodies[0];

                var faces  = cutBody.GetFaces().CastArray <IFace2>();
                var sheets = faces
                             .Select
                                 (face =>
                {
                    var faceParams = BSplineFace.Create(face)
                                     .TransformSurfaceControlPoints
                                         (ctrlPts => ctrlPts.Select(v => new Vector4(v.X + 1, v.Y, v.Z, v.W)));

                    return(faceParams.ToSheetBody());
                })
                             .ToArray();

                //foreach (var sheet in sheets)
                //{
                //    yielder(sheet.DisplayUndoable(modelDoc));
                //}


                var error = (int)swSheetSewingError_e.swSewingOk;
                var body  = Modeler
                            .CreateBodiesFromSheets2(sheets, (int)swSheetSewingOption_e.swSewToSolid, 1e-5, ref error)
                            .CastArray <IBody2>();

                body.Should().NotBeEmpty();

                yielder(body.DisplayUndoable(modelDoc));

                await PauseTestExecution();
            });
        }
        public async Task CanRebuildACirclularSheet()
        {
            await CreatePartDoc(async (modelDoc, yielder) =>
            {
                var disc0 = Modeler.CreateCirclularSheet
                                (center: Vector3.Zero
                                , vNormal: Vector3.UnitZ
                                , vRef: Vector3.UnitX
                                , radius: 2
                                );

                // Display the original sheet. Visually verify it is ok.
                // Press "Continue Test Execution" button within solidworks
                // to continue the test after visual inspection of the sheet
                using (disc0.DisplayUndoable(modelDoc))
                    await PauseTestExecution();

                // The sheet should only have one face. Extract it
                var faces = disc0.GetFaces().CastArray <IFace2>();
                faces.Length.Should().Be(1);
                var face = faces[0];

                // Convert the solidworks face to a bspline face
                var bsplineFace = BSplineFace.Create(face);

                // Convert the bspline face back to a sheet body
                var disc1 = bsplineFace.ToSheetBody().__Value__();

                // Display the recovered sheet. Visually verify it is ok
                // Press "Continue Test Execution" button within solidworks
                // to continue the test after visual inspection of the sheet
                using (disc1.DisplayUndoable(modelDoc))
                    await PauseTestExecution();

                await PauseTestExecution();
            });
        }