Beispiel #1
0
        //--------------------------------------------------------------------------------------------------

        MemoryStream _Export()
        {
            _DomGroup = new SvgDomGroup
            {
                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 SvgDomPath();
                _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
                _DomGroup.Children.Add(_CurrentPath);
            }

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

            doc.Children.Add(_DomGroup);

            return(doc.WriteToStream());
        }
Beispiel #2
0
        //--------------------------------------------------------------------------------------------------

        void _ImportGroup(SvgDomGroup domGroup)
        {
        }