Пример #1
0
        public int CreateReferencePoint(SharedPoint3D pos)
        {
            if (StoredReferencePointsMap.ContainsKey(pos))
            {
                return(StoredReferencePointsMap[pos]);
            }

            var id = ReferencePoints.Count;

            ReferencePoints.Add(pos);
            StoredReferencePointsMap[pos] = id;
            return(id);
        }
Пример #2
0
        public void Import(Scene scene)
        {
            BaseIndex = scene.Objects.Count;

            _referencePointsTotalCount = ReadInt();
            for (var i = 0; i < _referencePointsTotalCount; ++i)
            {
                var x = ReadDouble();
                var y = ReadDouble();
                var z = ReadDouble();

                var point       = new Point3D(x, y, z);
                var sharedPoint = new SharedPoint3D()
                {
                    Data = point
                };

                _referencePoints.Add(sharedPoint);
            }

            _objectsNumber = ReadInt();
            for (var i = 0; i < _objectsNumber; ++i)
            {
                var objectTypeName = GetTextSegment();
                var objectName     = GetToEndOfLine();

                var imported = MakeImportableObject(objectTypeName, objectName);
                scene.AttachObject(imported);

                var segment = GetTextSegment();
                if (segment != null && !segment.StartsWith("END"))
                {
                    throw new ApplicationException(
                              "END expected and not found.");
                }
            }

            // attach virutal points that are visible on list
        }
Пример #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);
        }