예제 #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());
        }
예제 #2
0
        //--------------------------------------------------------------------------------------------------

        SvgGroupElement _ExportLayer(VectorExportLayer layer)
        {
            if (_Styles == null || !_Styles.TryGetValue(layer.Type, out var lineStyle))
            {
                return(null);
            }

            CurrentGroup = new SvgGroupElement
            {
                ID    = layer.Name,
                Style = lineStyle
            };

            if (layer.BRep == null)
            {
                return(null);
            }

            if (_Template == VectorExportTemplate.Contours)
            {
                CurrentGroup.IsLayer = true;
            }

            CurrentPath = null;
            if (_Template == VectorExportTemplate.Drawing)
            {
                // Drawings do only contain lines
                CombineToPath = false;
                _ExportEdges(layer.BRep.Edges(), null);
            }
            else
            {
                CombineToPath = layer.Type.HasFlag(VectorExportLayerType.Filled);

                var faces = layer.BRep.Faces();
                foreach (var face in faces)
                {
                    var outerWire = BRepTools.OuterWire(face);
                    if (outerWire == null)
                    {
                        continue;
                    }

                    _ExportEdges(outerWire.Edges(), face);

                    var wires = face.Wires();
                    foreach (var wire in wires)
                    {
                        if (wire.IsEqual(outerWire))
                        {
                            continue;
                        }
                        _ExportEdges(wire.Edges(), face);
                    }
                    FinalizePath();
                }
            }

            if (CurrentGroup.Children.Any())
            {
                return(CurrentGroup);
            }

            return(null);
        }
        //--------------------------------------------------------------------------------------------------

        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());
        }
예제 #4
0
        internal virtual bool Read(XmlReader reader, SvgConverter conv)
        {
            var transformString = reader.GetAttribute("transform");

            if (!transformString.IsNullOrEmpty())
            {
                Transforms.AddRange(SvgTransform.Create(transformString, conv));
            }

            conv.PushTransform(Transforms);
            var depth = reader.Depth;

            reader.Read();
            while (!reader.EOF && reader.Depth > depth)
            {
                if (reader.NodeType != XmlNodeType.Element)
                {
                    reader.Read();
                    continue;
                }

                SvgElement newElement = null;
                switch (reader.LocalName.ToLower())
                {
                case "g":
                    newElement = new SvgGroupElement();
                    break;

                case "circle":
                    newElement = new SvgCircleElement();
                    break;

                case "ellipse":
                    newElement = new SvgEllipseElement();
                    break;

                case "path":
                    newElement = new SvgPathElement();
                    break;

                case "line":
                    newElement = new SvgLineElement();
                    break;

                case "rect":
                    newElement = new SvgRectElement();
                    break;
                }

                if (newElement != null)
                {
                    if (newElement.Read(reader, conv))
                    {
                        Children.Add(newElement);
                    }
                }
                else
                {
                    reader.Skip();
                }
            }

            return(true);
        }
        //--------------------------------------------------------------------------------------------------

        void _ImportGroup(SvgGroupElement group)
        {
        }