Exemplo n.º 1
0
        private void CreateBezierSurface()
        {
            var viewModel = BezierSurfaceCreationViewModel.ShowDialog();

            if (viewModel == null)
            {
                return;
            }

            BezierSurfaceWorldObject surface;

            if (viewModel.CylindricalFold)
            {
                surface = BezierSurfaceWorldObject.CreateCylindrical(viewModel.SegmentsX, viewModel.SegmentsY,
                                                                     viewModel.Radius, viewModel.Height);
            }
            else
            {
                surface = BezierSurfaceWorldObject.CreateFlatGrid(viewModel.SegmentsX, viewModel.SegmentsY, viewModel.PlaneWidth, viewModel.PlaneHeight);
            }

            surface.Name = "Bezier surface";

            _scene.SmartEditTarget?.RegisterNewObject(surface);
            _scene.AttachObject(surface);
        }
Exemplo n.º 2
0
        private void FillWithGregory()
        {
            var gregoryAdjacentPatches = _scene.GrabbedObjects
                                         .Where(t => t is BezierSurfaceWorldObject)
                                         .Cast <BezierSurfaceWorldObject>()
                                         .Take(3) // todo: support for more
                                         .ToList();

            var outline = BezierSurfaceWorldObject.FindHoleOutline(
                gregoryAdjacentPatches
                );

            if (outline.Count != 9)
            {
                MessageBox.Show(
                    _ownerWindow,
                    "Hole cannot be filled for selected patches",
                    "Operation cannot be performed",
                    MessageBoxButton.OK,
                    MessageBoxImage.Information
                    );
                return;
            }

            var fill = new TriangularHoleFill {
                OutlinePoints = outline
            };

            _scene.AttachObject(fill);
        }
Exemplo n.º 3
0
        private WorldObject MakeImportableObject(
            string objectTypeName,
            string objectName)
        {
            objectTypeName = objectTypeName.Trim();
            objectName     = objectName.Trim();

            if (objectTypeName == "BEZIERCURVE")
            {
                var beziercurve = new BezierC0WorldObject
                {
                    Name  = objectName,
                    Shape = new BezierCurveC0()
                };

                var refPointsCount = ReadInt();
                for (var i = 0; i < refPointsCount; ++i)
                {
                    beziercurve.AttachObject(GetMarkerPoint(ReadInt()));
                }

                return(beziercurve);
            }

            if (objectTypeName == "BSPLINECURVE")
            {
                var bsplinecurve = new BezierC2WorldObject
                {
                    Name  = objectName,
                    Shape = new BezierCurveC2()
                };

                var refPointsCount = ReadInt();
                for (var i = 0; i < refPointsCount; ++i)
                {
                    bsplinecurve.AttachObject(GetMarkerPoint(ReadInt()));
                }

                return(bsplinecurve);
            }

            if (objectTypeName == "INTERP")
            {
                var interpolat = new InterpolatingBSplineObject
                {
                    Name  = objectName,
                    Shape = new BezierCurveC2()
                };

                var refPointsCount = ReadInt();
                for (var i = 0; i < refPointsCount; ++i)
                {
                    interpolat.AttachObject(GetMarkerPoint(ReadInt()));
                }

                return(interpolat);
            }

            if (objectTypeName == "BEZIERSURF" ||
                objectTypeName == "BSPLINESURF")
            {
                var controlPointsV   = ReadInt();
                var controlPointsU   = ReadInt();
                var folded           = GetTextSegment()[0] == 'C';
                var correctDirection = GetTextSegment()[0] == 'H';

                var dataRows    = controlPointsU;
                var dataColumns = controlPointsV;

                Func <int, int, Tuple <int, int> > mapper;
                if (correctDirection)
                {
                    mapper = (i, j) => new Tuple <int, int>(i, j);
                }
                else
                {
                    throw new ArgumentException("Only H option is supported");
                }

                var data = new SharedPoint3D[dataRows, dataColumns];

                for (var row = 0; row < controlPointsU; ++row)
                {
                    for (var column = 0; column < controlPointsV; ++column)
                    {
                        var id     = ReadInt();
                        var point  = _referencePoints[id];
                        var mapped = mapper(row, column);
                        data[mapped.Item1, mapped.Item2] = point;
                    }
                }

                WorldObject surf;
                if (objectTypeName == "BEZIERSURF")
                {
                    var bezierSurf = new BezierSurfaceWorldObject
                    {
                        Name  = objectName,
                        Shape = new BezierPatchGroup(),
                    };

                    bezierSurf.BuildFromExternalData(data, folded);
                    surf = bezierSurf;
                }
                else
                {
                    var bsplineSurf = new BSplineSurfaceWorldObject
                    {
                        Name  = objectName,
                        Shape = new BSplinePatchGroup(),
                    };

                    bsplineSurf.BuildFromExternalData(data, folded);
                    surf = bsplineSurf;
                }

                return(surf);
            }

            return(null);
        }