コード例 #1
0
ファイル: SectionLayout.cs プロジェクト: tkahng/BeyondAEC2020
        private static Polygon AddRoomFromCell(Grid2d cell, string department, Material material, Model model, double circulationWidth, double height)
        {
            var polygons = cell.GetTrimmedCellGeometry();

            if (polygons.Count() == 0)
            {
                return(null);
            }
            var polygon = (Polygon)polygons.First();

            var newPoints  = polygon.Vertices.ToList().ToArray().Shrink(circulationWidth);
            var newPolygon = new Polygon(newPoints);

            var solid   = new Elements.Geometry.Solids.Extrude(newPolygon, height, Vector3.ZAxis, false);
            var geomRep = new Representation(new List <Elements.Geometry.Solids.SolidOperation>()
            {
                solid
            });
            var room = new Room((Polygon)newPolygon, Vector3.ZAxis, "Section 1", "100", department, "100", newPolygon.Area(),
                                1.0, 0, 0, 10, newPolygon.Area(), new Transform(), material, geomRep, false, System.Guid.NewGuid(), "Section 1");

            model.AddElement(room);
            return(newPolygon);
        }
コード例 #2
0
        /// <summary>
        /// Subdivides an incoming Floor according to x- and y-axis distances and grid rotation.
        /// </summary>
        /// <param name="model">The input model.</param>
        /// <param name="input">The arguments to the execution.</param>
        /// <returns>A SubdivideSlabOutputs instance containing computed results and the model with any new elements.</returns>
        public static SubdivideSlabOutputs Execute(Dictionary <string, Model> inputModels, SubdivideSlabInputs input)
        {
            var allFloors = new List <Floor>();

            inputModels.TryGetValue("Floors", out var flrModel);
            if (flrModel == null || flrModel.AllElementsOfType <Floor>().Count() == 0)
            {
                throw new ArgumentException("No Floors found.");
            }
            allFloors.AddRange(flrModel.AllElementsOfType <Floor>());
            List <SlabSubdivision> subdivisions = new List <SlabSubdivision>();

            for (int i = 0; i < allFloors.Count; i++)
            {
                Floor floor      = allFloors[i];
                var   floorId    = StringExtensions.NumberToString(i);
                var   profile    = floor.Profile;
                var   perimeter  = profile.Perimeter;
                var   voids      = profile.Voids;
                var   openings   = floor.Openings.Select(o => o.Profile);
                var   elevation  = floor.Elevation;
                var   boundaries = new List <Polygon>();
                boundaries.Add(perimeter);
                if (voids != null)
                {
                    boundaries.AddRange(voids);
                }
                if (openings != null)
                {
                    boundaries.AddRange(openings.Select(o => o.Perimeter));
                }
                Transform transform = null;
                if (input.AlignToLongestEdge)
                {
                    var longestEdge = perimeter.Segments().OrderByDescending(p => p.Length()).First();
                    var xAxis       = (longestEdge.End - longestEdge.Start).Unitized();
                    if (perimeter.IsClockWise())
                    {
                        xAxis = xAxis * -1;
                    }
                    transform = new Transform(Vector3.Origin, xAxis, Vector3.ZAxis, 0);
                    // if (perimeter.IsClockWise())
                    // {
                    //     transform.Invert();
                    // }
                }
                var grid = new Grid2d(boundaries, transform);
                if (input.SubdivideAtVoidCorners && voids != null && voids.Count > 0)
                {
                    foreach (var voidCrv in voids)
                    {
                        grid.SplitAtPoints(voidCrv.Vertices);
                    }
                    foreach (var cell in grid.CellsFlat)
                    {
                        cell.U.DivideByApproximateLength(input.Length, EvenDivisionMode.RoundUp);
                        cell.V.DivideByApproximateLength(input.Width, EvenDivisionMode.RoundUp);
                    }
                }
                else
                {
                    grid.U.DivideByApproximateLength(input.Length, EvenDivisionMode.RoundUp);
                    grid.V.DivideByApproximateLength(input.Width, EvenDivisionMode.RoundUp);
                }

                var cells = grid.GetCells();

                for (int i1 = 0; i1 < cells.Count; i1++)
                {
                    var    id        = $"{floorId}-{i1:000}";
                    Grid2d cell      = cells[i1];
                    var    cellCrvs  = cell.GetTrimmedCellGeometry();
                    var    isTrimmed = cell.IsTrimmed();
                    if (cellCrvs != null && cellCrvs.Length > 0)
                    {
                        subdivisions.Add(CreateSlabSubdivision(id, cellCrvs, floor, isTrimmed));
                    }
                }
            }

            var output = new SubdivideSlabOutputs(subdivisions.Count);

            output.Model.AddElements(subdivisions);
            foreach (var subdiv in subdivisions)
            {
                var thicknessXform = new Transform(0, 0, subdiv.Depth);
                var profile        = subdiv.Transform.OfProfile(subdiv.Profile);
                profile = thicknessXform.OfProfile(profile);
                output.Model.AddElement(new ModelCurve(profile.Perimeter));
                if (profile.Voids != null && profile.Voids.Count > 0)
                {
                    output.Model.AddElements(profile.Voids.Select(v => new ModelCurve(v)));
                }
            }
            return(output);
        }
コード例 #3
0
        /// <summary>
        /// The SubdivideSlabNew function.
        /// </summary>
        /// <param name="model">The input model.</param>
        /// <param name="input">The arguments to the execution.</param>
        /// <returns>A SubdivideSlabNewOutputs instance containing computed results and the model with any new elements.</returns>
        public static SubdivideSlabNewOutputs Execute(Dictionary <string, Model> inputModels, SubdivideSlabNewInputs input)
        {
            var model     = new Model();
            var allFloors = new List <Floor>();

            inputModels.TryGetValue("Floors", out var flrModel);
            if (flrModel == null || flrModel.AllElementsOfType <Floor>().Count() == 0)
            {
                throw new ArgumentException("No Floors found.");
            }
            allFloors.AddRange(flrModel.AllElementsOfType <Floor>());
            List <SlabSubdivision> subdivisions = new List <SlabSubdivision>();
            List <ModelCurve>      modelCurves  = new List <ModelCurve>();
            List <Column>          columns      = new List <Column>();

            for (int i = 0; i < allFloors.Count; i++)
            {
                Floor floor      = allFloors[i];
                var   floorId    = StringExtensions.NumberToString(i);
                var   profile    = floor.Profile;
                var   perimeter  = profile.Perimeter;
                var   voids      = profile.Voids;
                var   elevation  = floor.Elevation;
                var   boundaries = new List <Polygon>();
                boundaries.Add(perimeter);
                if (voids != null)
                {
                    boundaries.AddRange(voids);
                }
                Transform transform = null;
                if (input.AlignToLongestEdge)
                {
                    var longestEdge = perimeter.Segments().OrderByDescending(p => p.Length()).First();
                    var xAxis       = (longestEdge.End - longestEdge.Start).Unitized();
                    transform = new Transform(Vector3.Origin, xAxis, Vector3.ZAxis, 0);
                    transform.Invert();
                }
                var grid = new Grid2d(boundaries, transform);
                if (input.SubdivideAtVoidCorners && voids != null && voids.Count > 0)
                {
                    foreach (var voidCrv in voids)
                    {
                        grid.SplitAtPoints(voidCrv.Vertices);
                    }
                    foreach (var cell in grid.CellsFlat)
                    {
                        cell.U.DivideByApproximateLength(input.Length, EvenDivisionMode.RoundUp);
                        cell.V.DivideByApproximateLength(input.Width, EvenDivisionMode.RoundUp);
                    }
                }
                else
                {
                    grid.U.DivideByApproximateLength(input.Length, EvenDivisionMode.RoundUp);
                    grid.V.DivideByApproximateLength(input.Width, EvenDivisionMode.RoundUp);
                }

                var cells = grid.GetCells();

                // foreach(var pt in grid.U.GetCellSeparators())
                // {
                // var column = new Column(new Vector3(pt.X, pt.Y, elevation), 5, Polygon.Rectangle(1.0, 1.0));
                // columns.Add(column);
                // }

                for (int i1 = 0; i1 < cells.Count; i1++)
                {
                    var    id        = $"{floorId}-{i1:000}";
                    Grid2d cell      = cells[i1];
                    var    cellCrvs  = cell.GetTrimmedCellGeometry();
                    var    isTrimmed = cell.IsTrimmed();
                    if (cellCrvs != null && cellCrvs.Length > 0)
                    {
                        subdivisions.Add(CreateSlabSubdivision(id, cellCrvs, floor, isTrimmed));
                        // var column = new Column(pt, 5, Polygon.Rectangle(0.05, 0.05));
                        // output.Model.AddElement(column);
                        var outerBoundary = cellCrvs.First();
                        var polygon       = (Polygon)outerBoundary;
                        var pt            = polygon.Centroid();
                        var column        = new Column(new Vector3(pt.X, pt.Y, elevation), 5, Polygon.Rectangle(1.0, 1.0));
                        columns.Add(column);
                    }
                    foreach (var crv in cellCrvs)
                    {
                        modelCurves.Add(ToModelCurve(crv, elevation + 1.0));
                    }
                }
            }

            var output = new SubdivideSlabNewOutputs(subdivisions.Count, columns.Count);

            output.Model = model;
            // output.Model.AddElements(subdivisions);
            output.Model.AddElements(modelCurves);
            output.Model.AddElements(columns);
            return(output);
        }