public Layer(LayerTemplate template) { _isLockCheckEnabled = false; Template = template; Width = template.Width; Height = template.Height; void BuildPin(Position pos, int width, int height) { for (var i = 0; i < width; i++) { for (var j = 0; j < height; j++) { AddCellMetal(pos.Offset(i, j)); } } for (var i = 0; i < width - 1; i++) { for (var j = 0; j < height - 1; j++) { AddLink(pos.Offset(i, j), pos.Offset(i + 1, j), LinkType.MetalLink); AddLink(pos.Offset(i, j), pos.Offset(i, j + 1), LinkType.MetalLink); } } for (var i = 0; i < width; i++) { AddLink(pos.Offset(i, height - 1), pos.Offset(i + 1, height - 1), LinkType.MetalLink); } for (var i = 0; i < height; i++) { AddLink(pos.Offset(width - 1, i), pos.Offset(width - 1, i + 1), LinkType.MetalLink); } } _cellMatrix = new LayerCellMatrix(this); foreach (var pin in template.Pins) { var pos = new Position(pin.Col, pin.Row); BuildPin(pos, pin.Width, pin.Height); SetCellPin(pos, pin); } CommitChanges(false); _isLockCheckEnabled = true; }
public Layer(SavedLayer savedLayer) : this(savedLayer.Template) { var layerData = savedLayer.Data; // todo: verification var height = layerData.Cells.GetLength(0); var width = layerData.Cells.GetLength(1); if (width != Template.Width || height != Template.Height) { throw new ArgumentException(); } if (layerData.RightLinks.GetLength(0) != height || layerData.RightLinks.GetLength(1) != width) { throw new ArgumentException(); } if (layerData.BottomLinks.GetLength(0) != height || layerData.BottomLinks.GetLength(1) != width) { throw new ArgumentException(); } Width = width; Height = height; _cellMatrix = new LayerCellMatrix(this); for (var i = 0; i < height; i++) { for (var j = 0; j < width; j++) { _cellMatrix.UpdateCellContent(new Position(j, i), layerData.Cells[i, j]); _cellMatrix.UpdateLinkContent(new Position(j, i), Side.Right, layerData.RightLinks[i, j]); _cellMatrix.UpdateLinkContent(new Position(j, i), Side.Bottom, layerData.BottomLinks[i, j]); } } CommitChanges(false); }