private void CreateBezierCurveC0()
        {
            var bezier = new BezierC0WorldObject()
            {
                Name  = "Bezier Curve C0 #" + _sessionBezierId++,
                Shape = new BezierCurveC0(),
            };

            _scene.SmartEditTarget?.RegisterNewObject(bezier);
            _scene.AttachObject(bezier);
        }
        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);
        }