//-------------------------------------------------------------------------------------------------- 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()); }
//-------------------------------------------------------------------------------------------------- void _ImportGroup(SvgDomGroup domGroup) { }