public Drawing(DrawingSettings settings, ReadOnlyTree <string, Layer> layers, string author) : this(settings, layers, layers.GetKeys().OrderBy(x => x).First(), author) { }
public bool ReadDrawing(string fileName, Stream fileStream, out Drawing drawing, out ViewPort viewPort) { var file = DxfFile.Load(fileStream); var layers = new ReadOnlyTree <string, Layer>(); foreach (var layer in file.Layers) { layers = layers.Insert(layer.Name, new Layer(layer.Name, color: layer.Color.ToColor(), isVisible: layer.IsLayerOn)); } foreach (var item in file.Entities) { var layer = GetOrCreateLayer(ref layers, item.Layer); // create the entity var entity = item.ToEntity(); // add the entity to the appropriate layer if (entity != null) { layer = layer.Add(entity); layers = layers.Insert(layer.Name, layer); } } foreach (var block in file.Blocks) { var layer = GetOrCreateLayer(ref layers, block.Layer); // create the aggregate entity var children = ReadOnlyList <Entity> .Empty(); foreach (var item in block.Entities) { var tempEnt = item.ToEntity(); if (tempEnt != null) { children = children.Add(tempEnt); } } // add the entity to the appropriate layer if (children.Count != 0) { layer = layer.Add(new AggregateEntity(block.BasePoint.ToPoint(), children)); layers = layers.Insert(layer.Name, layer); } } drawing = new Drawing( settings: new DrawingSettings(fileName, file.Header.UnitFormat.ToUnitFormat(), file.Header.UnitPrecision), layers: layers, currentLayerName: file.Header.CurrentLayer ?? layers.GetKeys().OrderBy(x => x).First(), author: null); drawing.Tag = file; // prefer `*ACTIVE` view port first // TODO: use `DxfFile.ActiveViewPort` when available var vp = file.ViewPorts.FirstOrDefault(v => string.Compare(v.Name, DxfViewPort.ActiveViewPortName, StringComparison.OrdinalIgnoreCase) == 0) ?? file.ViewPorts.FirstOrDefault(); if (vp != null) { viewPort = new ViewPort( vp.LowerLeft.ToPoint(), vp.ViewDirection.ToVector(), Vector.YAxis, vp.ViewHeight); } else { viewPort = null; // auto-set it later } return(true); }