//-------------------------------------------------------------------------------------------------- #endregion #region Paths protected void InitPathExport() { CurrentPath = new SvgDomPath() { Style = CurrentStyle }; _PathStart = new Pnt2d(); _PathPosition = new Pnt2d(); _SubPathStartIndex = 0; }
//-------------------------------------------------------------------------------------------------- protected SvgDomPath FinalizePath() { ClosePath(); SvgDomPath path = CurrentPath; if (path?.Segments.Count > 0) { CurrentDomGroup.Children.Add(path); } CurrentPath = null; return(path); }
//-------------------------------------------------------------------------------------------------- protected void ClosePath() { SvgDomPath path = CurrentPath; if (path?.Segments.Count > 0) { if (_PathPosition != Pnt2d.Origin && _AreEqual(_PathStart, _PathPosition)) { path.Segments.Add(new SvgPathSegClosePath()); } } _PathPosition = new Pnt2d(); _PathStart = new Pnt2d(); }
//-------------------------------------------------------------------------------------------------- void _ImportPath(SvgDomPath path) { if (path.Segments.Count < 1) { return; } int startPoint = -1; int firstPoint = -1; foreach (var pathSegment in path.Segments) { switch (pathSegment) { case SvgPathSegMoveto moveToSegment: startPoint = _AddPoint(pathSegment.Start); if (firstPoint == -1) { firstPoint = startPoint; } break; case SvgPathSegLineto lineSegment: _ImportLineSegment(lineSegment, ref startPoint); break; case SvgPathSegClosePath closePathSegment: _ImportClosePathSegment(closePathSegment, ref startPoint, ref firstPoint); break; case SvgPathSegArc arcSegment: _ImportArcSegment(arcSegment, ref startPoint); break; case SvgPathSegCurvetoCubic cubicCurveSegment: _ImportCubicCurveSegment(cubicCurveSegment, ref startPoint); break; case SvgPathSegCurvetoQuadratic quadraticCurveSegment: _ImportQuadraticCurveSegment(quadraticCurveSegment, ref startPoint); break; default: var endPoint = _AddPoint(pathSegment.End); startPoint = endPoint; Messages.Warning("Imported SVG shape does have an unsupported path segment type " + pathSegment.GetType().Name + ". [ " + path.ID + " ]"); break; } } }
//-------------------------------------------------------------------------------------------------- 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()); }