Esempio n. 1
0
        public virtual void AddDefault(IMarkGeometry geometryIn, double[] color)
        {
            if (geometryIn == null || color == null || color.Length < 3)
            {
                AddDefault(geometryIn);
                return;
            }

            // Update extents
            MaxX = Math.Max(geometryIn.Extents.MaxX, MaxX);
            MaxY = Math.Max(geometryIn.Extents.MaxY, MaxY);
            MinX = Math.Min(geometryIn.Extents.MinX, MinX);
            MinY = Math.Min(geometryIn.Extents.MinY, MinY);

            // Update Counter
            Count += 1;

            if (geometryIn is MarkGeometryPoint point)
            {
                _points.Add(new VertexGroup()
                {
                    Color    = color,
                    Vertices = new List <double>()
                    {
                        point.X, point.Y
                    }
                });
            }
            else if (geometryIn is MarkGeometryLine line)
            {
                // add to default
                _lines.Add(new VertexGroup()
                {
                    Color    = color,
                    Vertices = new List <double>()
                    {
                        line.StartPoint.X, line.StartPoint.Y,
                        line.EndPoint.X, line.EndPoint.Y
                    }
                });
            }
            else if (geometryIn is MarkGeometryCircle circle)
            {
                var vtx = new VertexGroup(color);
                for (int i = 0; i <= circle.VertexCount; i++)
                {
                    vtx.Add(
                        (circle.CentrePoint.X + (circle.Radius * Math.Cos(i * Math.PI * 2 / circle.VertexCount))), (circle.CentrePoint.Y + (circle.Radius * Math.Sin(i * Math.PI * 2 / circle.VertexCount)))
                        );
                }
                _closedPolylines.Add(vtx);
            }
            else if (geometryIn is MarkGeometryArc arc)
            {
                var arcPath = new MarkGeometryPath(arc);
                var vtx     = new VertexGroup(color);

                // add points
                for (int i = 0; i < arcPath.Points.Count; i++)
                {
                    vtx.Add(arcPath.Points[i].X, arcPath.Points[i].Y);
                }

                if (arcPath.IsClosed)
                {
                    _closedPolylines.Add(vtx);
                }
                else
                {
                    _openPolylines.Add(vtx);
                }
            }
            else if (geometryIn is MarkGeometryPath path)
            {
                var vtx = new VertexGroup(color);

                // add points
                for (int i = 0; i < path.Points.Count; i++)
                {
                    vtx.Add(path.Points[i].X, path.Points[i].Y);
                }

                if (path.IsClosed)
                {
                    _closedPolylines.Add(vtx);
                }
                else
                {
                    _openPolylines.Add(vtx);
                }
            }
            else if (geometryIn is IMarkGeometryWrapper wrapper)
            {
                wrapper.BeginGetAll((geometry) =>
                {
                    AddDefault(geometry, color);
                    return(true);
                });
            }

            Update();
        }
Esempio n. 2
0
        private (string LayerName, List <IMarkGeometry> Path) ParseLWPolyline(AdvancedLineStreamReader readerIn)
        {
            var(success, layerName) = ReadLayerName(readerIn, MatchLWPolylineEntity);

            if (success)
            {
                var result1 = readerIn.FindConsecutiveLines(
                    MatchSubClassMarker,
                    MatchLWPolylineEntity
                    );

                if (!result1.Success)
                {
                    return(null, null);
                }
            }

            readerIn.ReadLine(); // consume number of vertices 90
            int numberOfVertices = int.Parse(readerIn.ReadLine());
            int flag             = ReadInteger(readerIn, "70");

            var bulges = new List <double>(numberOfVertices);
            var points = new List <MarkGeometryPoint>(numberOfVertices - 1);

            for (int i = 0; i < numberOfVertices; i++)
            {
                points.Add(ReadPointFast2D(readerIn));
                bulges.Add((readerIn.PeekLine().Trim() == "42") ? ReadDouble(readerIn, "42") : 0d);
            }

            if (points.Count > 0 && flag == 1) // i.e. is closed
            {
                points.Add(points[0]);
            }

            var buffer = new List <IMarkGeometry>();
            var path   = new MarkGeometryPath();

            for (int i = 0; i < points.Count - 1; i++)
            {
                var p1    = points[i];
                var p2    = points[i + 1];
                var bulge = bulges[i];

                if (Math.Abs(bulge) <= double.Epsilon)
                {
                    path.Add(p1, true);
                    path.Add(p2, true);
                }
                else
                {
                    if (path.Points.Count > 0)
                    {
                        path.Update(); // force path to re-compute it's properties
                        buffer.Add(path);
                        path = new MarkGeometryPath();
                    }

                    buffer.Add(new MarkGeometryArc(p1, p2, bulge));
                }
            }

            if (path.Points.Count > 0)
            {
                path.Update(); // force path to re-compute it's properties
                buffer.Add(path);
            }

            return(layerName, buffer);
        }