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