public Drawing(DrawingSettings settings, ReadOnlyTree <string, Layer> layers, string author) : this(settings, layers, layers.GetKeys().OrderBy(x => x).First(), author) { }
public Task <ReadDrawingResult> ReadDrawing(string fileName, Stream fileStream, Func <string, Task <byte[]> > contentResolver) { ReadOnlyTree <string, Layer> layers = null; using (var reader = new StreamReader(fileStream, encoding: Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { var json = reader.ReadToEnd(); var jsonDrawing = JsonConvert.DeserializeObject <JsonDrawing>(json, Settings); var layerList = new List <Layer>(); foreach (var jsonLayer in jsonDrawing.Floorplan.Layers) { var layer = new Layer(jsonLayer.Name, color: CadColor.FromArgb(255, jsonLayer.R, jsonLayer.G, jsonLayer.B)); layerList.Add(layer); } layers = ReadOnlyTree <string, Layer> .FromEnumerable(layerList, l => l.Name); void AddEntityToLayer(string layerName, Entity entity) { var layer = layers.GetValue(layerName); layer = layer.Add(entity); layers = layers.Insert(layerName, layer); } foreach (var block in jsonDrawing.Floorplan.Blocks) { switch (block.Name.ToUpperInvariant()) { case "*MODEL_SPACE": foreach (var jsonEntity in block.Entities) { switch (jsonEntity) { case JsonArc jsonArc: var arc = new Arc(jsonArc.Center, jsonArc.Radius, jsonArc.StartAngle * MathHelper.RadiansToDegrees, jsonArc.EndAngle * MathHelper.RadiansToDegrees, Vector.ZAxis); AddEntityToLayer(jsonEntity.Layer, arc); break; case JsonLine jsonLine: for (int i = 0; i < jsonLine.Points.Count - 1; i++) { AddEntityToLayer(jsonEntity.Layer, new Line(jsonLine.Points[i], jsonLine.Points[i + 1])); } if (jsonLine.Points.Count > 2) { AddEntityToLayer(jsonEntity.Layer, new Line(jsonLine.Points.Last(), jsonLine.Points.First())); } break; default: break; } } break; // TODO: handle other blocks? } } } var drawing = new Drawing().Update(layers: layers); return(Task.FromResult(ReadDrawingResult.Succeeded(drawing, null))); }
public Layer(string name, IEnumerable <Entity> entities, CadColor?color = null, bool isVisible = true) : this(name, ReadOnlyTree <uint, Entity> .FromEnumerable(entities, (ent) => ent.Id), color, isVisible) { }