|
|
"""
|
|
|
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
|
|
|
self.room_type = room_type
|
|
|
self.size = size
|
|
|
self.connected_to = []
|
|
|
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")
|
|
|
|
|
|
|
|
|
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)),
|
|
|
|
|
|
|
|
|
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)),
|
|
|
|
|
|
|
|
|
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)),
|
|
|
]
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
for room in rooms:
|
|
|
plan.add_room(room)
|
|
|
|
|
|
|
|
|
connections = [
|
|
|
|
|
|
("R1", "C1", 1.0),
|
|
|
("C1", "R2", 1.0),
|
|
|
("R2", "C4", 1.0),
|
|
|
("C4", "R5", 1.0),
|
|
|
("R5", "EXIT1", 1.0),
|
|
|
|
|
|
|
|
|
("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),
|
|
|
|
|
|
|
|
|
("R3", "C7", 1.0),
|
|
|
("C7", "EXIT3", 1.0),
|
|
|
|
|
|
|
|
|
("R6", "C9", 1.0),
|
|
|
("C9", "EXIT4", 1.0),
|
|
|
|
|
|
|
|
|
("R7", "C10", 1.0),
|
|
|
("C10", "EXIT5", 1.0),
|
|
|
|
|
|
|
|
|
("R2", "C3", 1.0),
|
|
|
("C3", "R4", 1.0),
|
|
|
("R5", "C8", 1.0),
|
|
|
("C8", "R6", 1.0),
|
|
|
("R3", "R7", 1.0),
|
|
|
]
|
|
|
|
|
|
for room1, room2, distance in connections:
|
|
|
plan.add_connection(room1, room2, distance)
|
|
|
|
|
|
return plan
|
|
|
|
|
|
|