Ejemplo n.º 1
0
        public async Task <SubdivideSlabNewOutputs> Handler(SubdivideSlabNewInputs args, ILambdaContext context)
        {
            if (this.store == null)
            {
                // Preload the dependencies (if they exist),
                // so that they are available during model deserialization.
                var asmLocation = this.GetType().Assembly.Location;
                var asmDir      = Path.GetDirectoryName(asmLocation);
                var asmName     = Path.GetFileNameWithoutExtension(asmLocation);
                var depPath     = Path.Combine(asmDir, $"{asmName}.Dependencies.dll");

                if (File.Exists(depPath))
                {
                    Console.WriteLine($"Loading dependencies from assembly: {depPath}...");
                    Assembly.LoadFrom(depPath);
                    Console.WriteLine("Dependencies assembly loaded.");
                }

                this.store = new S3ModelStore <SubdivideSlabNewInputs>(RegionEndpoint.USWest1);
            }

            var l      = new InvocationWrapper <SubdivideSlabNewInputs, SubdivideSlabNewOutputs>(store, SubdivideSlabNew.Execute);
            var output = await l.InvokeAsync(args);

            return(output);
        }
Ejemplo n.º 2
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);
        }