69 lines
1.9 KiB
Dart
69 lines
1.9 KiB
Dart
import 'position.dart';
|
|
|
|
class Room {
|
|
const Room({required this.id, required this.name, required this.polygon});
|
|
|
|
final String id;
|
|
final String name;
|
|
|
|
/// Polygon vertices in normalised 0..1 coordinates.
|
|
final List<Position> polygon;
|
|
|
|
Room copyWith({String? name, List<Position>? polygon}) =>
|
|
Room(id: id, name: name ?? this.name, polygon: polygon ?? this.polygon);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'id': id,
|
|
'name': name,
|
|
'polygon': polygon.map((p) => p.toJson()).toList(),
|
|
};
|
|
|
|
factory Room.fromJson(Map<String, dynamic> json) => Room(
|
|
id: json['id'] as String,
|
|
name: json['name'] as String,
|
|
polygon: (json['polygon'] as List)
|
|
.map((p) => Position.fromJson(p as Map<String, dynamic>))
|
|
.toList(),
|
|
);
|
|
}
|
|
|
|
class FloorPlan {
|
|
const FloorPlan({
|
|
required this.id,
|
|
required this.floorId,
|
|
required this.metersPerUnit,
|
|
required this.rooms,
|
|
});
|
|
|
|
final String id;
|
|
final String floorId;
|
|
|
|
/// Scale: how many real-world meters one normalised unit represents.
|
|
final double metersPerUnit;
|
|
|
|
final List<Room> rooms;
|
|
|
|
FloorPlan copyWith({double? metersPerUnit, List<Room>? rooms}) => FloorPlan(
|
|
id: id,
|
|
floorId: floorId,
|
|
metersPerUnit: metersPerUnit ?? this.metersPerUnit,
|
|
rooms: rooms ?? this.rooms,
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'id': id,
|
|
'floor_id': floorId,
|
|
'meters_per_unit': metersPerUnit,
|
|
'rooms': rooms.map((r) => r.toJson()).toList(),
|
|
};
|
|
|
|
factory FloorPlan.fromJson(Map<String, dynamic> json) => FloorPlan(
|
|
id: json['id'] as String,
|
|
floorId: json['floor_id'] as String,
|
|
metersPerUnit: (json['meters_per_unit'] as num).toDouble(),
|
|
rooms: (json['rooms'] as List)
|
|
.map((r) => Room.fromJson(r as Map<String, dynamic>))
|
|
.toList(),
|
|
);
|
|
}
|