//-------------------------------------------------------------------------------------------------- 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()); }