public async Task <ColumnsByFloorsOutputs> Handler(ColumnsByFloorsInputs 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 <ColumnsByFloorsInputs>(RegionEndpoint.USWest1);
            }

            var l      = new InvocationWrapper <ColumnsByFloorsInputs, ColumnsByFloorsOutputs>(store, ColumnsByFloors.Execute);
            var output = await l.InvokeAsync(args);

            return(output);
        }
Beispiel #2
0
        /// <summary>
        /// The ColumnsByFloors function.
        /// </summary>
        /// <param name="model">The input model.</param>
        /// <param name="input">The arguments to the execution.</param>
        /// <returns>A ColumnsByFloorsOutputs instance containing computed results and the model with any new elements.</returns>
        public static ColumnsByFloorsOutputs Execute(Dictionary <string, Model> inputModels, ColumnsByFloorsInputs 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>());
            var floorGroups = new List <List <Floor> >();

            while (allFloors.Count > 0)
            {
                var testPerimeter = allFloors.First().Profile.Perimeter;
                var floors        = new List <Floor>();
                foreach (var floor in allFloors.ToList())
                {
                    if (testPerimeter.Intersects(floor.Profile.Perimeter))
                    {
                        floors.Add(floor);
                        allFloors.Remove(floor);
                    }
                }
                floorGroups.Add(floors);
            }
            var columns = new List <Column>();

            foreach (var floorGroup in floorGroups)
            {
                var floors = floorGroup.OrderBy(f => f.Elevation).ToList();
                for (var i = 0; i < floors.Count() - 1; i++)
                {
                    var   floor   = floors.ElementAt(i);
                    int   next    = 1;
                    Floor ceiling = null;
                    do
                    {
                        ceiling = floors.ElementAt(i + next);
                        next++;
                    } while (!floor.Profile.Perimeter.Intersects(ceiling.Profile.Perimeter));

                    var height = ceiling.Elevation - floor.Elevation - floor.Thickness;
                    var grid   = new CoordinateGrid(ceiling.Profile.Perimeter, input.GridXAxisInterval, input.GridYAxisInterval, input.GridRotation);
                    foreach (var point in grid.Available)
                    {
                        var colPerim = Polygon.Rectangle(input.ColumnDiameter, input.ColumnDiameter).MoveFromTo(Vector3.Origin, point);
                        if (!floor.Profile.Perimeter.Covers(colPerim) ||
                            !ceiling.Profile.Perimeter.Covers(colPerim))
                        {
                            continue;
                        }
                        columns.Add(new Column(point, height,
                                               new Profile(Polygon.Rectangle(input.ColumnDiameter, input.ColumnDiameter)),
                                               BuiltInMaterials.Concrete,
                                               new Transform(0.0, 0.0, floor.Elevation + floor.Thickness),
                                               0.0, 0.0, input.GridRotation,
                                               false, Guid.NewGuid(), ""));
                    }
                }
            }
            var output = new ColumnsByFloorsOutputs(columns.Count());

            foreach (var column in columns)
            {
                output.model.AddElement(column);
            }
            return(output);
        }