private Story MakeStory() { var story = new Story() { Color = Palette.Green, Elevation = 0.0, Height = 6.0, Name = "First Floor", Perimeter = new Polygon( new[] { new Vector3(0.0, 0.0), new Vector3(60.0, 0.0), new Vector3(60.0, 40.0), new Vector3(0.0, 40.0) }), SlabThickness = 0.1 }; story.RoomsByDivision(4, 2, 5.5, 10.0, "Retail", Palette.Lime); story.AddCorridor( new Room() { Color = Palette.White, Height = 5.5, Perimeter = new Line(new Vector3(10.0, 20.0), new Vector3(50.0, 20.0)).Thicken(2.0) }); story.AddCorridor( new Room() { Color = Palette.White, Height = 5.5, Perimeter = new Line(new Vector3(30.0, 10.0), new Vector3(30.0, 30.0)).Thicken(2.0) }); story.AddExclusion( new Room() { Perimeter = new Polygon( new [] { Vector3.Origin, new Vector3(5.0, 0.0), new Vector3(5.0, 5.0), new Vector3(0.0, 5.0), }) }); story.AddService( new Room() { Color = BuiltInMaterials.Concrete.Color, Height = 6.0, Perimeter = new Line(new Vector3(30.0, 15.0), new Vector3(30.0, 25.0)).Thicken(2.0) }); return(story); }
public void AddService() { var polygon = new Polygon ( new[] { new Vector3(0.0, 0.0), new Vector3(48.0, 0.0), new Vector3(48.0, 12.0), new Vector3(0.0, 12.0) } ); var story = new Story() { Color = Palette.Green, Elevation = 0.0, Height = 6.0, Perimeter = polygon, SlabThickness = 0.3 }; story.RoomsByDivision(4, 1, 5.5, 0.5, "", Palette.Lime); story.AddCorridor(new Vector3(24.0, -0.01), new Vector3(24.0, 10.0), 2.0, 5.5, "", Palette.White); story.AddCorridor(new Vector3(0.5, 10.75), new Vector3(47.5, 10.75), 1.5, 5.5, "", Palette.White); polygon = new Line(new Vector3(24.0, 7.0), new Vector3(24.0, 11.5)).Thicken(5.0); story.AddService(polygon, "", Palette.Gray); var model = new Model(); foreach (Space space in story.InteriorsAsSpaces) { model.AddElement(space); } model.AddElement(story.Slab); model.SaveGlb("../../../../AddService.glb"); }
/// <summary> /// Generates Rooms of a supplied area on each incoming Level deployed along the Level's straight skeleton spine which is used as a central corridor path. /// </summary> /// <param name="model">The input model.</param> /// <param name="input">The arguments to the execution.</param> /// <returns>A RoomsByLevelsOutputs instance containing computed results and the model with any new elements.</returns> public static RoomsByLevelsOutputs Execute(Dictionary <string, Model> inputModels, RoomsByLevelsInputs input) { var levels = new List <LevelPerimeter>(); inputModels.TryGetValue("Levels", out var lvlModel); if (lvlModel != null) { levels.AddRange(lvlModel.AllElementsOfType <LevelPerimeter>()); } if (levels.Count == 0) { throw new ArgumentException("No LevelPerimeters found."); } levels = levels.OrderBy(l => l.Elevation).ToList(); var stories = new List <Story>(); for (var i = 0; i < levels.Count - 1; i++) { var perimeter = levels[i].Perimeter; var elevation = levels[i].Elevation; var height = (levels[i + 1].Elevation - levels[i].Elevation) - 0.5; // replace this number with a plenum height var spine = levels[i].Perimeter.Spine(); var sections = levels[i].Perimeter.Jigsaw(); var endSects = new List <Polygon>(); var midSects = new List <Polygon>(); var corridors = new List <Polygon>(); var story = new Story(perimeter) { Elevation = elevation }; foreach (var line in spine) { corridors.Add(line.ToPolyline().Offset(input.CorridorWidth * 0.5, EndType.Square).First()); } corridors = Shaper.Merge(corridors); foreach (var corridor in corridors) { story.AddCorridor(new RoomKit.Room(corridor.Straighten(input.CorridorWidth * 0.1).Simplify(input.CorridorWidth * 0.9), height), false); } foreach (var polygon in sections) { if (polygon.Vertices.Count == 3) { endSects.Add(polygon.AlignedBox()); continue; } midSects.Add(polygon); } var scaffolds = new List <Polygon>(endSects); foreach (var midSect in midSects) { scaffolds.AddRange(Shaper.Differences(midSect.ToList(), endSects)); } var roomRows = new List <RoomRow>(); foreach (var polygon in scaffolds) { roomRows.Add(new RoomRow(polygon)); } foreach (var row in roomRows) { var result = row.AddRoomByArea(row.Area * 0.5, height, elevation); result = row.AddRoomByArea(row.Area * 0.5, height, elevation); row.Infill(height, true); } var rowRooms = new List <RoomKit.Room>(); foreach (var row in roomRows) { rowRooms.AddRange(row.Rooms); } foreach (var room in rowRooms) { story.AddRoom(room); } stories.Add(story); } var rooms = new List <Elements.Room>(); foreach (var story in stories) { foreach (var room in story.Rooms) { room.Color = Palette.Aqua; var solid = new Elements.Geometry.Solids.Extrude(room.Perimeter, room.Height, Vector3.ZAxis, false); var geomRep = new Representation(new List <Elements.Geometry.Solids.SolidOperation>() { solid }); rooms.Add(new Elements.Room(room.Perimeter, Vector3.ZAxis, "", "", "", "", input.RoomArea, room.Ratio, 0.0, room.Elevation, room.Height, room.Area, null, room.ColorAsMaterial, geomRep, false, Guid.NewGuid(), room.Name)); } foreach (var room in story.Corridors) { room.Color = Palette.White; var solid = new Elements.Geometry.Solids.Extrude(room.Perimeter, room.Height, Vector3.ZAxis, false); var geomRep = new Representation(new List <Elements.Geometry.Solids.SolidOperation>() { solid }); rooms.Add(new Elements.Room(room.Perimeter, Vector3.ZAxis, "", "", "", "", input.RoomArea, room.Ratio, 0.0, room.Elevation, room.Height, room.Area, null, room.ColorAsMaterial, geomRep, false, Guid.NewGuid(), room.Name)); } } var output = new RoomsByLevelsOutputs(rooms.Count / levels.Count, rooms.Count); foreach (var room in rooms) { output.Model.AddElement(room); } return(output); }
public Story MakeStory() { var perimeter = new Polygon( new[] { new Vector3(0.0, 0.0), new Vector3(20.0, 0.0), new Vector3(20.0, 20.0), new Vector3(0.0, 20.0) }); var story = new Story(perimeter) { Color = Palette.Green, Elevation = 0.0, Height = 8.0, Name = "First Floor" }; perimeter = Polygon.Rectangle(Vector3.Origin, new Vector3(10.0, 10.0)); story.AddRoom( new Room(perimeter, 5.0) { Color = Palette.Aqua }); perimeter = perimeter.MoveFromTo(Vector3.Origin, new Vector3(10.0, 0.0)); story.AddRoom( new Room(perimeter, 5.0) { Color = Palette.Blue }); perimeter = perimeter.MoveFromTo(Vector3.Origin, new Vector3(-10.0, 10.0)); story.AddRoom( new Room(perimeter, 5.0) { Color = Palette.Cobalt }); perimeter = perimeter.MoveFromTo(Vector3.Origin, new Vector3(10.0, 0.0)); story.AddRoom( new Room(perimeter, 5.0) { Color = Palette.Teal, Name = "Retail" }); perimeter = Polygon.Rectangle(new Vector3(0.0, 8.5), new Vector3(20.0, 11.5)); story.AddCorridor( new Room(perimeter, 6.0) { Color = Palette.White }); perimeter = Polygon.Rectangle(new Vector3(8.5, 0.0), new Vector3(11.5, 20.0)); story.AddCorridor( new Room(perimeter, 6.0) { Color = Palette.White }); perimeter = Polygon.Rectangle(new Vector3(7.5, 7.5), new Vector3(12.5, 12.5)); story.AddService( new Room(perimeter, 1.0) { Color = Palette.Red }); perimeter = Polygon.Rectangle(new Vector3(2.0, 3.0), new Vector3(18.0, 5.0)); story.AddExclusion(new Room(perimeter, 1.0)); perimeter = Polygon.Rectangle(new Vector3(10.0, 1.0), new Vector3(15.0, 15.0)); story.AddOpening(new Room(perimeter, 1.0)); var model = new Model(); model.AddElement(new Space(story.PerimeterAsProfile, story.Height, story.ColorAsMaterial)); foreach (Room room in story.Rooms) { model.AddElement(new Space(room.PerimeterAsProfile, room.Height, room.ColorAsMaterial)); } foreach (Room room in story.Corridors) { model.AddElement(new Space(room.PerimeterAsProfile, room.Height, room.ColorAsMaterial)); } foreach (Room room in story.Services) { model.AddElement(new Space(room.PerimeterAsProfile, room.Height, room.ColorAsMaterial)); } model.ToGlTF("../../../../RoomKitTest/output/story.glb"); return(story); }