예제 #1
0
        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);
        }