fire_evac / floor_plan.py
ratyim's picture
Upload 6 files
faa740f verified
"""
Floor Plan Module - Represents building layout with rooms, corridors, and connections
"""
import numpy as np
from typing import Dict, List, Tuple, Optional
class Room:
"""Represents a room or area in the building"""
def __init__(self, room_id: str, name: str, position: Tuple[float, float],
room_type: str = "room", size: Tuple[float, float] = (5, 5)):
self.room_id = room_id
self.name = name
self.position = position # (x, y) coordinates
self.room_type = room_type # room, corridor, exit, stairwell
self.size = size # (width, height)
self.connected_to = [] # List of connected room IDs
self.has_oxygen_cylinder = False
self.has_fire_extinguisher = False
def add_connection(self, room_id: str, distance: float = None):
"""Add connection to another room"""
if distance is None:
distance = 1.0
self.connected_to.append((room_id, distance))
def __repr__(self):
return f"Room({self.room_id}, {self.name})"
class FloorPlan:
"""Represents the complete building floor plan"""
def __init__(self, floor_name: str = "Ground Floor"):
self.floor_name = floor_name
self.rooms: Dict[str, Room] = {}
self.exits: List[str] = []
def add_room(self, room: Room):
"""Add a room to the floor plan"""
self.rooms[room.room_id] = room
if room.room_type == "exit":
self.exits.append(room.room_id)
def add_connection(self, room_id1: str, room_id2: str, distance: float = 1.0):
"""Create bidirectional connection between two rooms"""
if room_id1 in self.rooms and room_id2 in self.rooms:
self.rooms[room_id1].add_connection(room_id2, distance)
self.rooms[room_id2].add_connection(room_id1, distance)
def get_neighbors(self, room_id: str) -> List[Tuple[str, float]]:
"""Get all neighboring rooms and their distances"""
if room_id in self.rooms:
return self.rooms[room_id].connected_to
return []
def get_all_exits(self) -> List[str]:
"""Get all exit points"""
return self.exits
def get_room(self, room_id: str) -> Optional[Room]:
"""Get room by ID"""
return self.rooms.get(room_id)
def create_sample_floor_plan() -> FloorPlan:
"""
Create an expanded floor plan with multiple rooms and 5 exit routes
Layout:
[R1] - [C1] - [R2] - [C4] - [R5] - [EXIT1] (Route 1: has oxygen cylinder)
| | |
[C2] [C3] [C8]
| | |
[R3] - [C5] - [R4] - [C6] - [R6] - [EXIT2] (Route 2)
| |
[C7] [C9]
| |
[EXIT3] (Route 3) [EXIT4] (Route 4)
[R7] - [C10] - [EXIT5] (Route 5)
"""
plan = FloorPlan("Ground Floor")
# Create rooms with better spacing
rooms = [
# Main floor rooms
Room("R1", "Room 101", (10, 10), "room", (12, 12)),
Room("R2", "Room 102", (60, 10), "room", (12, 12)),
Room("R3", "Room 103", (10, 50), "room", (12, 12)),
Room("R4", "Room 104", (60, 50), "room", (12, 12)),
Room("R5", "Room 105", (110, 10), "room", (12, 12)),
Room("R6", "Room 106", (110, 50), "room", (12, 12)),
Room("R7", "Room 107", (10, 100), "room", (12, 12)),
# Corridors
Room("C1", "Corridor 1", (35, 10), "corridor", (15, 6)),
Room("C2", "Corridor 2", (10, 30), "corridor", (6, 12)),
Room("C3", "Corridor 3", (60, 30), "corridor", (6, 12)),
Room("C4", "Corridor 4", (85, 10), "corridor", (15, 6)),
Room("C5", "Corridor 5", (35, 50), "corridor", (15, 6)),
Room("C6", "Corridor 6", (85, 50), "corridor", (15, 6)),
Room("C7", "Corridor 7", (10, 75), "corridor", (6, 15)),
Room("C8", "Corridor 8", (110, 30), "corridor", (6, 12)),
Room("C9", "Corridor 9", (110, 75), "corridor", (6, 15)),
Room("C10", "Corridor 10", (35, 100), "corridor", (15, 6)),
# Exits (5 exits now!)
Room("EXIT1", "North Exit", (135, 10), "exit", (8, 8)),
Room("EXIT2", "East Exit", (135, 50), "exit", (8, 8)),
Room("EXIT3", "South Exit", (10, 125), "exit", (8, 8)),
Room("EXIT4", "Southeast Exit", (110, 125), "exit", (8, 8)),
Room("EXIT5", "West Exit", (60, 100), "exit", (8, 8)),
]
# Add oxygen cylinder to corridor 1 (Route 1)
for room in rooms:
if room.room_id == "C1":
room.has_oxygen_cylinder = True
if room.room_id in ["R2", "R3", "R5"]:
room.has_fire_extinguisher = True
# Add all rooms to floor plan
for room in rooms:
plan.add_room(room)
# Create connections (building the graph)
connections = [
# Route 1 path (North - via oxygen cylinder area)
("R1", "C1", 1.0),
("C1", "R2", 1.0),
("R2", "C4", 1.0),
("C4", "R5", 1.0),
("R5", "EXIT1", 1.0),
# Route 2 path (East)
("R1", "C2", 1.0),
("C2", "R3", 1.0),
("R3", "C5", 1.0),
("C5", "R4", 1.0),
("R4", "C6", 1.0),
("C6", "R6", 1.0),
("R6", "EXIT2", 1.0),
# Route 3 path (South)
("R3", "C7", 1.0),
("C7", "EXIT3", 1.0),
# Route 4 path (Southeast)
("R6", "C9", 1.0),
("C9", "EXIT4", 1.0),
# Route 5 path (West)
("R7", "C10", 1.0),
("C10", "EXIT5", 1.0),
# Cross connections
("R2", "C3", 1.0),
("C3", "R4", 1.0),
("R5", "C8", 1.0),
("C8", "R6", 1.0),
("R3", "R7", 1.0), # Direct connection
]
for room1, room2, distance in connections:
plan.add_connection(room1, room2, distance)
return plan