File size: 6,242 Bytes
faa740f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
"""
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
|