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