Exemplo n.º 1
0
        //--------------------------------------------------------------------------------------------------

        MemoryStream _Export(VectorExportLayer[] layers)
        {
            // Create group
            var group = new SvgGroupElement
            {
                ID      = _Template.ToString(),
                IsLayer = _Template == VectorExportTemplate.Contours
            };

            BoundingBox = new Bnd_Box2d();

            // Export
            foreach (var layer in layers)
            {
                var subgroup = _ExportLayer(layer);
                if (subgroup != null)
                {
                    group.Children.Add(subgroup);
                }
            }

            // Scale
            double width  = 100;
            double height = 100;

            if (!BoundingBox.IsVoid())
            {
                BoundingBox.SetGap(10.0); // 1cm on each side
                double xmin = 0, xmax = 0, ymin = 0, ymax = 0;
                BoundingBox.Get(ref xmin, ref ymin, ref xmax, ref ymax);
                width  = xmax - xmin;
                height = ymax - ymin;
                group.Transforms.Add(new SvgTranslateTransform(-xmin, -ymax));
            }

            // Create Document
            var doc = new SvgDocument {
                DotsPerInch = DotsPerInch,
                Width       = width,
                Height      = height
            };

            doc.Children.Add(group);

            return(doc.WriteToStream());
        }
        //--------------------------------------------------------------------------------------------------

        MemoryStream _Export()
        {
            _Group = new SvgGroupElement
            {
                ID    = _Sketch.Name,
                Style = new SvgStyle {
                    StrokeWidth = 0.1f, StrokeColor = Color.Black, FillColor = null
                }
            };

            var freeSegments = new Dictionary <int, SketchSegment>(_Sketch.Segments);

            while (freeSegments.Any())
            {
                var currentSegmentKvp = freeSegments.First();
                freeSegments.Remove(currentSegmentKvp.Key);

                var currentSegment = currentSegmentKvp.Value;
                if ((currentSegment.StartPoint == -1) || (currentSegment.EndPoint == -1))
                {
                    // Unconnected segment
                    _AddUnconnectableSegment(currentSegment);
                    continue;
                }

                // Start path
                _CurrentPath       = new SvgPathElement();
                _FirstPathEndPoint = -1;
                _LastPathEndPoint  = -1;

                // search for connected
                while (freeSegments.Any())
                {
                    currentSegmentKvp = freeSegments.FirstOrDefault(kvp => kvp.Value.IsConnected(currentSegment));
                    if (currentSegmentKvp.Value == null)
                    {
                        // disconnected segment
                        break;
                    }

                    if (_FirstPathEndPoint == -1)
                    {
                        // First connection, get winding order and write the move to start position
                        if ((currentSegment.EndPoint == currentSegmentKvp.Value.StartPoint) ||
                            (currentSegment.EndPoint == currentSegmentKvp.Value.EndPoint))
                        {
                            var startPoint = _Sketch.Points[currentSegment.StartPoint];
                            _CurrentPath.Segments.Add(new SvgPathSegMoveto(startPoint));
                            _LastPathEndPoint  = currentSegment.StartPoint;
                            _FirstPathEndPoint = currentSegment.StartPoint;
                        }
                        else
                        {
                            var startPoint = _Sketch.Points[currentSegment.EndPoint];
                            _CurrentPath.Segments.Add(new SvgPathSegMoveto(startPoint));
                            _LastPathEndPoint  = currentSegment.EndPoint;
                            _FirstPathEndPoint = currentSegment.EndPoint;
                        }

                        // add first element
                        if (!_AddPathSegment(currentSegment))
                        {
                            break;
                        }
                    }

                    // Next connected, write
                    currentSegment = currentSegmentKvp.Value;
                    freeSegments.Remove(currentSegmentKvp.Key);

                    if (!_AddPathSegment(currentSegment))
                    {
                        break;
                    }
                }

                if (_LastPathEndPoint == -1)
                {
                    // Standalone element, write as single segment
                    var startPoint = _Sketch.Points[currentSegment.StartPoint];
                    _CurrentPath.Segments.Add(new SvgPathSegMoveto(startPoint));
                    _AddPathSegment(currentSegment);
                }

                // Close segment, if needed
                if (_FirstPathEndPoint == _LastPathEndPoint)
                {
                    _CurrentPath.Segments.Add(new SvgPathSegClosePath());
                }

                // Add to group
                _Group.Children.Add(_CurrentPath);
            }

            var doc = new SvgDocument
            {
                Width       = 100,
                Height      = 100,
                DotsPerInch = DotsPerInch
            };

            doc.Children.Add(_Group);

            return(doc.WriteToStream());
        }