public void SplitAtOffset() { var grid = new Grid1d(30); grid.SplitAtOffset(5); grid.SplitAtOffset(5, true); Assert.Equal(5, grid.Cells[0].Domain.Length); Assert.Equal(20, grid.Cells[1].Domain.Length); Assert.Equal(5, grid.Cells[2].Domain.Length); }
private static List <WallPanel> ProcessWallsAndStandardWalls(PanelsFromWallsInputs input, List <Wall> allWalls, out int totalCount, out int uniqueCount, out int nonStandardCount) { var wallCenterlines = allWalls.Select(TryGetCenterlineFromWall).Where(s => s != null); var endPoints = wallCenterlines.SelectMany(l => new[] { l.Start, l.End }); var network = new Network(wallCenterlines); Dictionary <Elements.Spatial.Edge, Grid1d> edgeGrids = new Dictionary <Elements.Spatial.Edge, Grid1d>(); foreach (var edge in network.Edges) { var edgeLine = network.GetEdgeLine(edge); var grid = new Grid1d(edgeLine); edgeGrids.Add(edge, grid); var cornerAtStart = network[edge.From].Valence > 1; var cornerAtEnd = network[edge.To].Valence > 1; var cornerCount = (cornerAtStart ? 1 : 0) + (cornerAtEnd ? 1 : 0); var cornerLength = input.CornerLength; if (cornerLength * cornerCount > edgeLine.Length()) { cornerLength = edgeLine.Length() / cornerCount; } if (cornerAtStart) { grid.SplitAtOffset(cornerLength); } if (cornerAtEnd) { grid.SplitAtOffset(cornerLength, true); } Grid1d gridToSubdivide = null; if (!grid.IsSingleCell) { switch (grid.Cells.Count) { case 3: gridToSubdivide = grid[1]; break; case 2: if (cornerCount == 1) { if (cornerAtStart) { gridToSubdivide = grid[1]; } if (cornerAtEnd) { gridToSubdivide = grid[0]; } } break; default: gridToSubdivide = grid; break; } if (gridToSubdivide != null) { gridToSubdivide.DivideByFixedLength(input.PanelLength, FixedDivisionMode.RemainderAtEnd); } } } List <Line> lines = new List <Line>(); foreach (var edgeGrid in edgeGrids) { if (edgeGrid.Value == null) { continue; } var cells = edgeGrid.Value.IsSingleCell ? new List <Grid1d> { edgeGrid.Value } : edgeGrid.Value.GetCells(); var cellGeometry = cells.Select(c => c.GetCellGeometry()).OfType <Line>(); lines.AddRange(cellGeometry); } // Create walls from lines, and assign a random color material var walls = new List <WallPanel>(); var rand = new Random(); var colorMap = new Dictionary <int, Color>(); colorMap.Add(KeyFromLength(input.CornerLength), Colors.Red); if (input.CornerLength != input.PanelLength) { colorMap.Add(KeyFromLength(input.PanelLength), Colors.Blue); } foreach (var wallLine in lines) { var color = default(Color); var lengthKey = KeyFromLength(wallLine.Length()); if (colorMap.ContainsKey(lengthKey)) { color = colorMap[lengthKey]; } else { color = new Color(rand.NextDouble(), rand.NextDouble(), rand.NextDouble(), 1.0); colorMap.Add(lengthKey, color); } var mat = input.ColorCodeByLength ? new Material(color, 0, 0, false, null, true, Guid.NewGuid(), color.ToString()) : BuiltInMaterials.Concrete; walls.Add(CreateSimpleWallPanel(wallLine, 0.1, 3.0, mat)); } nonStandardCount = lines.Where(l => KeyFromLength(l.Length()) != KeyFromLength(input.PanelLength) && KeyFromLength(l.Length()) != KeyFromLength(input.CornerLength)).Count(); totalCount = walls.Count; uniqueCount = Math.Min(totalCount, colorMap.Count()); return(walls); }