public async Task <PreparedFoodLayoutOutputs> Handler(PreparedFoodLayoutInputs 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 <PreparedFoodLayoutInputs>(RegionEndpoint.USWest1); } var l = new InvocationWrapper <PreparedFoodLayoutInputs, PreparedFoodLayoutOutputs>(store, PreparedFoodLayout.Execute); var output = await l.InvokeAsync(args); return(output); }
/// <summary> /// The PreparedFoodLayout function. /// </summary> /// <param name="model">The input model.</param> /// <param name="input">The arguments to the execution.</param> /// <returns>A PreparedFoodLayoutOutputs instance containing computed results and the model with any new elements.</returns> public static PreparedFoodLayoutOutputs Execute(Dictionary <string, Model> inputModels, PreparedFoodLayoutInputs input) { var counterDepth = input.CounterDepth / 39.37; if (counterDepth == 0) { counterDepth = 1; } var counterHeight = input.CounterHeight / 39.37; if (counterHeight == 0) { counterHeight = 1; } var aisle = input.AisleFrontage / 39.37; if (aisle <= 0) { aisle = 1.0; } PreparedFoodLayoutOutputs output = new PreparedFoodLayoutOutputs(); Model model = null; IList <Room> rooms = null; //test inputModels.Clear(); // we want Departments as inputs! if (inputModels.TryGetValue("Departments", out model)) { rooms = model.AllElementsOfType <Room>().ToList(); } else { //throw new ApplicationException("Need Departments as input!"); // default: double inputLength = 55; double inputWidth = 25; double inputHeight = 5; var rectangle = Polygon.Rectangle(inputLength, inputWidth); var mass = new Mass(rectangle, inputHeight); output.model.AddElement(mass); var material = new Material("office", new Color(0, 0, 1, 0.5)); var solid = new Elements.Geometry.Solids.Extrude(rectangle, inputHeight, Vector3.ZAxis, false); var geomRep = new Representation(new List <Elements.Geometry.Solids.SolidOperation>() { solid }); Room r = new Room(rectangle, Vector3.ZAxis, "Section 1", "100", "prepared", "100", rectangle.Area(), 1.0, 0, 0, inputHeight, rectangle.Area(), new Transform(), material, geomRep, false, System.Guid.NewGuid(), "Section 1"); output.model.AddElement(r); rooms = new List <Room>(); rooms.Add(r); } // ok, now the real work begins... from the room // this function only deals with certain departments. var appropriateRooms = rooms.Where(r => r.Department == "prepared"); if (appropriateRooms.Count() == 0) { throw new ApplicationException("This function works only on rooms with 'prepared' department"); } foreach (var r in appropriateRooms) { var side1 = r.Perimeter.Segments()[0]; var side2 = r.Perimeter.Segments()[1]; Console.WriteLine("side1: " + side1.Direction()); Console.WriteLine("side2: " + side2.Direction()); var line1 = side1.DivideByLength(aisle).First(); var line2 = side2.Reversed().DivideByLength(aisle).First(); var roomCenter = r.Perimeter.GetCenter(); //roomCenter.HighlightPoint(2, output.model); // var lineX = new Line( roomCenter, roomCenter + new Vector3(10,0,0)); //var lineY = new Line( roomCenter, roomCenter + new Vector3(0,5,0)); //lineX.HighlightThis(output.model); //lineY.HighlightThis(output.model); // ok - sweep is not working so we're going to have to build out the plan view and extrude up. // the "B" will be the inside curve. //line1.HighlightThis(output.model); //line2.HighlightThis(output.model); var smallerSide = (Math.Min(side1.Length(), side2.Length())); var radius = (input.CounterRadiusRatio / 100.0) * smallerSide; //var radius = (side1.Length() - line1.Length()) * 0.3; var p1 = line1.PointAt(1.0); var p2 = line2.PointAt(1.0); // p1.HighlightPoint(1,output.model); //p2.HighlightPoint(1,output.model); // p1b.HighlightPoint(0.5, output.model); //p2b.HighlightPoint(0.5, output.model); var dir1 = side2.Direction().WhichPointsTo(p1, roomCenter); var dir2 = side1.Direction().WhichPointsTo(p2, roomCenter); var line1Offset = new Line(p1, p1 + dir1 * 10); var line2Offset = new Line(p2, p2 + dir2 * 10); var line1bOffset = line1Offset.OffsetTowards(roomCenter, counterDepth); var line2bOffset = line2Offset.OffsetTowards(roomCenter, counterDepth); var p1b = line1bOffset.Start; var p2b = line2bOffset.Start; Console.WriteLine("L1Offset: " + line1Offset.Direction()); Console.WriteLine("L2Offset: " + line2Offset.Direction()); Console.WriteLine("L1bOffset: " + line1bOffset.Direction()); Console.WriteLine("L2bOffset: " + line2bOffset.Direction()); var arc = line1Offset.Fillet(line2Offset, radius); var arcB = line1bOffset.Fillet(line2bOffset, radius - counterDepth); // which end will be nearest? var closest1 = (p1.DistanceTo(arc.Start) < p1.DistanceTo(arc.End))? arc.Start : arc.End; var closest2 = (p2.DistanceTo(arc.Start) < p2.DistanceTo(arc.End))? arc.Start : arc.End; var closest1b = (p1b.DistanceTo(arcB.Start) < p1b.DistanceTo(arcB.End))? arcB.Start : arcB.End; var closest2b = (p2b.DistanceTo(arcB.Start) < p2b.DistanceTo(arcB.End))? arcB.Start : arcB.End; //line1Offset.HighlightThis(output.model); // line2Offset.HighlightThis(output.model); // redefine to the arc points line1Offset = new Line(p1, closest1); line2Offset = new Line(p2, closest2); //line1Offset.HighlightThis(output.model); //line2Offset.HighlightThis(output.model); //line1bOffset.HighlightThis(output.model); //line2bOffset.HighlightThis(output.model); // arc.HighlightThis(output.model); // arcB.HighlightThis(output.model); // ok - we want to draw the lines now // ordered list of vectors int numSegments = 10; var list = new List <Vector3>(); list.Add(p1); if (arc.Start.DistanceTo(closest1) < arc.Start.DistanceTo(closest2)) { list.AddRange(arc.Divide(numSegments)); } else { list.AddRange(arc.Reversed().Divide(numSegments)); } list.Add(p2); list.Add(p2b); if (arcB.Start.DistanceTo(closest2b) < arcB.Start.DistanceTo(closest1b)) { list.AddRange(arcB.Divide(numSegments)); } else { list.AddRange(arcB.Divide(numSegments)); } list.Add(p1b); Polygon newP = new Polygon(list); newP = newP.Reversed(); // it was the wrong way. //line1.ThickenThis(model); var counter = new Material("Countertop", Colors.Granite); var prepFoodCounter = new Elements.Geometry.Solids.Extrude(new Profile(newP), counterHeight, Vector3.ZAxis, false); Representation geomRep = null; // new Representation(new Elements.Geometry.Solids.SolidOperation[] { prepFoodCounter}); var mass = new Mass(new Profile(newP), counterHeight, counter, null, geomRep); output.model.AddElement(mass); // Console.WriteLine(output.model.ToJson(true)); //System.IO.File.WriteAllText(@"C:\temp\model.json", output.model.ToJson(true)); } return(output); }