public async Task <OpenOfficeLayoutOutputs> Handler(OpenOfficeLayoutInputs args, ILambdaContext context) { // Preload dependencies (if they exist), // so that they are available during model deserialization. var sw = System.Diagnostics.Stopwatch.StartNew(); var asmLocation = this.GetType().Assembly.Location; var asmDir = Path.GetDirectoryName(asmLocation); // Explicitly load the dependencies project, it might have types // that aren't used in the function but are necessary for correct // deserialization. var asmName = Path.GetFileNameWithoutExtension(asmLocation); var depPath = Path.Combine(asmDir, $"{asmName}.Dependencies.dll"); if (File.Exists(depPath)) { Console.WriteLine($"Loading dependencies assembly from: {depPath}..."); Assembly.LoadFrom(depPath); Console.WriteLine("Dependencies assembly loaded."); } // Load all reference assemblies. Console.WriteLine($"Loading all referenced assemblies."); foreach (var asm in this.GetType().Assembly.GetReferencedAssemblies()) { try { Assembly.Load(asm); } catch (Exception e) { Console.WriteLine($"Failed to load {asm.FullName}"); Console.WriteLine(e.Message); } } sw.Stop(); Console.WriteLine($"Time to load assemblies: {sw.Elapsed.TotalSeconds})"); if (this.store == null) { this.store = new S3ModelStore <OpenOfficeLayoutInputs>(RegionEndpoint.USWest1); } var l = new InvocationWrapper <OpenOfficeLayoutInputs, OpenOfficeLayoutOutputs>(store, OpenOfficeLayout.Execute); var output = await l.InvokeAsync(args); return(output); }
/// <summary> /// The OpenOfficeLayout function. /// </summary> /// <param name="model">The input model.</param> /// <param name="input">The arguments to the execution.</param> /// <returns>A OpenOfficeLayoutOutputs instance containing computed results and the model with any new elements.</returns> public static OpenOfficeLayoutOutputs Execute(Dictionary <string, Model> inputModels, OpenOfficeLayoutInputs input) { var spacePlanningZones = inputModels["Space Planning Zones"]; var levels = spacePlanningZones.AllElementsOfType <LevelElements>(); var deskCount = 0; var configJson = File.ReadAllText("OpenOfficeConfigurations.json"); var configs = JsonConvert.DeserializeObject <SpaceConfiguration>(configJson); var firstConfig = configs[Hypar.Model.Utilities.GetStringValueFromEnum(input.DeskType)]; var desksPerInstance = input.DeskType == OpenOfficeLayoutInputsDeskType.Enclosed_Pair || input.DeskType == OpenOfficeLayoutInputsDeskType.Double_Desk ? 2 : 1; var output = new OpenOfficeLayoutOutputs(); foreach (var lvl in levels) { var corridors = lvl.Elements.OfType <Floor>(); var corridorSegments = corridors.SelectMany(p => p.Profile.Segments()); var officeBoundaries = lvl.Elements.OfType <SpaceBoundary>().Where(z => z.Name == "Open Office"); foreach (var ob in officeBoundaries) { var spaceBoundary = ob.Boundary; Line orientationGuideEdge = FindEdgeAdjacentToCorridor(spaceBoundary.Perimeter, corridorSegments); var orientationTransform = new Transform(Vector3.Origin, orientationGuideEdge.Direction(), Vector3.ZAxis); var boundaryCurves = new List <Polygon>(); boundaryCurves.Add(spaceBoundary.Perimeter); boundaryCurves.AddRange(spaceBoundary.Voids ?? new List <Polygon>()); Grid2d grid; try { grid = new Grid2d(boundaryCurves, orientationTransform); } catch { Console.WriteLine("Something went wrong creating a grid."); continue; } var aisleWidth = 1.0; grid.V.DivideByPattern(new[] { ("Desk", firstConfig.Width), ("Desk", firstConfig.Width), ("Desk", firstConfig.Width), ("Desk", firstConfig.Width), ("Aisle", aisleWidth) }, PatternMode.Cycle, FixedDivisionMode.RemainderAtBothEnds);
/// <summary> /// The OpenOfficeLayout function. /// </summary> /// <param name="model">The input model.</param> /// <param name="input">The arguments to the execution.</param> /// <returns>A OpenOfficeLayoutOutputs instance containing computed results and the model with any new elements.</returns> public static OpenOfficeLayoutOutputs Execute(Dictionary <string, Model> inputModels, OpenOfficeLayoutInputs input) { var catalog = JsonConvert.DeserializeObject <ContentCatalog>(File.ReadAllText("./catalog.json")); var spacePlanningZones = inputModels["Space Planning Zones"]; var levels = spacePlanningZones.AllElementsOfType <LevelElements>(); var deskCount = 0; var configJson = File.ReadAllText("OpenOfficeDeskConfigurations.json"); var configs = JsonConvert.DeserializeObject <SpaceConfiguration>(configJson); var defaultConfig = configs[Hypar.Model.Utilities.GetStringValueFromEnum(input.DeskType)]; var desksPerInstance = input.DeskType == OpenOfficeLayoutInputsDeskType.Enclosed_Pair || input.DeskType == OpenOfficeLayoutInputsDeskType.Double_Desk ? 2 : 1; var output = new OpenOfficeLayoutOutputs(); var overridesByCentroid = new Dictionary <Guid, SpaceSettingsOverride>(); foreach (var spaceOverride in input.Overrides?.SpaceSettings ?? new List <SpaceSettingsOverride>()) { var matchingBoundary = levels.SelectMany(l => l.Elements).OfType <SpaceBoundary>().OrderBy(ob => ((JObject)ob.AdditionalProperties["ParentCentroid"]).ToObject <Vector3>().DistanceTo(spaceOverride.Identity.ParentCentroid)).First(); if (overridesByCentroid.ContainsKey(matchingBoundary.Id)) { var mbCentroid = ((JObject)matchingBoundary.AdditionalProperties["ParentCentroid"]).ToObject <Vector3>(); if (overridesByCentroid[matchingBoundary.Id].Identity.ParentCentroid.DistanceTo(mbCentroid) > spaceOverride.Identity.ParentCentroid.DistanceTo(mbCentroid)) { overridesByCentroid[matchingBoundary.Id] = spaceOverride; } } else { overridesByCentroid.Add(matchingBoundary.Id, spaceOverride); } } foreach (var lvl in levels) { var corridors = lvl.Elements.OfType <Floor>(); var corridorSegments = corridors.SelectMany(p => p.Profile.Segments()); var officeBoundaries = lvl.Elements.OfType <SpaceBoundary>().Where(z => z.Name == "Open Office"); foreach (var ob in officeBoundaries) { // create a boundary we can use to override individual groups of desks. It's sunk slightly so that, if floors are on, you don't see it. var overridableBoundary = new SpaceBoundary(ob.Boundary, ob.Cells, ob.Transform.Concatenated(new Transform(0, 0, -0.05)), ob.Material, new Representation(new[] { new Lamina(ob.Boundary.Perimeter, false) }), false, Guid.NewGuid(), "DeskArea"); overridableBoundary.AdditionalProperties.Add("ParentCentroid", (ob.AdditionalProperties["ParentCentroid"] as JObject).ToObject <Vector3>()); overridableBoundary.AdditionalProperties.Add("Desk Type", Hypar.Model.Utilities.GetStringValueFromEnum(input.DeskType)); output.Model.AddElement(overridableBoundary); var spaceBoundary = ob.Boundary; Line orientationGuideEdge = FindEdgeAdjacentToCorridor(spaceBoundary.Perimeter, corridorSegments); var orientationTransform = new Transform(Vector3.Origin, orientationGuideEdge.Direction(), Vector3.ZAxis); var boundaryCurves = new List <Polygon>(); boundaryCurves.Add(spaceBoundary.Perimeter); boundaryCurves.AddRange(spaceBoundary.Voids ?? new List <Polygon>()); Grid2d grid; try { grid = new Grid2d(boundaryCurves, orientationTransform); } catch { Console.WriteLine("Something went wrong creating a grid."); continue; } var selectedConfig = defaultConfig; if (overridesByCentroid.ContainsKey(ob.Id)) { var spaceOverride = overridesByCentroid[ob.Id]; selectedConfig = configs[Hypar.Model.Utilities.GetStringValueFromEnum(spaceOverride.Value.DeskType)]; overridableBoundary.AdditionalProperties["Desk Type"] = Hypar.Model.Utilities.GetStringValueFromEnum(spaceOverride.Value.DeskType); } var aisleWidth = 1.0; grid.V.DivideByPattern(new[] { ("Desk", selectedConfig.Width), ("Desk", selectedConfig.Width), ("Desk", selectedConfig.Width), ("Desk", selectedConfig.Width), ("Aisle", aisleWidth) }, PatternMode.Cycle, FixedDivisionMode.RemainderAtBothEnds);