Exemple #1
0
        /// <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);
        }
Exemple #2
0
 /// <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);
         }
     }
 }
Exemple #3
0
        /// <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);
        }