/// <summary> /// Adds a Room to the Corridors list. /// </summary> /// <param name="room">Room to add.</param> /// <param name="fit">Indicates whether the new corridor should mutually fit to other Story features.</param> /// <param name="merge">Indicates whether the new corridor should merge with other corridors.</param> /// <returns> /// True if one or more rooms were added to the Story. /// </returns> public bool AddCorridor(Room room, bool fit = true, bool merge = true) { if (Perimeter == null || room.Perimeter == null || !Perimeter.Covers(perimeter)) { return(false); } var newRoom = new Room() { Color = room.Color, Elevation = Elevation, Height = room.Height, Name = room.Name, Perimeter = room.Perimeter }; var fitRooms = new List <Room> { newRoom }; if (fit) { var toRooms = new List <Room>(Exclusions); toRooms.AddRange(Services); fitRooms = FitRooms(fitRooms, toRooms, false); Rooms = FitRooms(Rooms, fitRooms); } if (fitRooms.Count == 0) { return(false); } Corridors.AddRange(fitRooms); var merged = Shaper.Merge(CorridorsAsPolygons); if (merge && merged.Count < Corridors.Count) { Corridors.Clear(); foreach (var corridor in merged) { Corridors.Add( new Room() { Color = room.Color, Elevation = Elevation, Height = room.Height, Name = room.Name, Perimeter = corridor }); } } return(true); }
/// <summary> /// Private function configuring all Corridor perimeters to conform to all Service perimeters. /// </summary> /// <returns> /// None. /// </returns> private void FitCorridorsToServices() { foreach (Room service in Services) { if (service.Perimeter == null) { continue; } int index = 0; List <int> indices = new List <int>(); var addRooms = new List <Room>(); foreach (Room room in Corridors) { var perimeters = room.Perimeter.Difference(service.Perimeter); if (perimeters != null && perimeters.Count > 0) { room.Perimeter = perimeters.First(); for (int i = 1; i < perimeters.Count; i++) { var addRoom = new Room() { Color = room.Color, Elevation = room.Elevation, Height = room.Height, Name = room.Name, Perimeter = perimeters[i] }; addRooms.Add(addRoom); } } else { indices.Add(index); } index++; } foreach (int remove in indices) { Corridors.RemoveAt(remove); } if (addRooms.Count > 0) { Corridors.AddRange(addRooms); } } }
/// <summary> /// Adds a Room to the Corridors list. /// </summary> /// <param name="room">Room to add.</param> /// <param name="fit">Indicates whether the new room should mutually fit to other Story features. Default is true.</param> /// <returns> /// True if one or more rooms were added to the Story. /// </returns> public bool AddCorridor(Room room, bool fit = true) { if (Perimeter == null || room.Perimeter == null) { throw new ArgumentNullException(Messages.PERIMETER_NULL_EXCEPTION); } if (!Perimeter.Covers(perimeter)) { throw new ArgumentNullException(Messages.PERIMETER_PLACEMENT_EXCEPTION); } var newRoom = new Room() { Color = room.Color, Elevation = Elevation, Height = room.Height, Name = room.Name, Perimeter = room.Perimeter }; var fitRooms = new List <Room> { newRoom }; if (fit) { var toRooms = new List <Room>(Exclusions); toRooms.AddRange(Services); fitRooms = FitRooms(fitRooms, toRooms, false); Rooms = FitRooms(Rooms, fitRooms); } if (fitRooms.Count == 0) { return(false); } Corridors.AddRange(fitRooms); return(true); }