Files
maps-saas/packages/tactical_app/lib/controllers/minefield_controller.dart
T

82 lines
3.0 KiB
Dart

import 'package:get/get.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
import '../models/military_operations_models.dart';
import '../services/minefield_engine.dart';
/// ============================================================================
/// [MinefieldController] - وحدة التحكم بحقول الألغام وممرات الثغرات
/// ============================================================================
/// English:
/// GetX Controller managing minefield zone geometry, barrier types, threat
/// envelope generation, mine density estimation, and safe breaching corridor calculations.
///
/// العربية:
/// متحكم GetX لإدارة هندسة حقول الألغام والموانع، تصنيف نوع الألغام،
/// حساب الكثافة التقديرية، وتخطيط ممرات الثغرات الآمنة (Breaching Lanes).
/// ============================================================================
class MinefieldController extends GetxController {
// ── Observables / الحالات التفاعلية ──────────────────────────────────────
final Rx<LatLng?> startPoint = Rx<LatLng?>(null);
final Rx<LatLng?> endPoint = Rx<LatLng?>(null);
final Rx<MinefieldType> minefieldType =
Rx<MinefieldType>(MinefieldType.antiTank);
final RxDouble widthMeters = 200.0.obs;
final Rx<MinefieldZoneResult?> zoneResult = Rx<MinefieldZoneResult?>(null);
/// Set Minefield Start Point (A) / تعيين بداية حقل الألغام
void setStartPoint(LatLng pos) {
startPoint.value = pos;
calculateZone();
}
/// Set Minefield End Point (B) / تعيين نهاية حقل الألغام
void setEndPoint(LatLng pos) {
endPoint.value = pos;
calculateZone();
}
/// Swap Start and End Points / تبديل نقاط بداية ونهاية الحقل
void swapPoints() {
final temp = startPoint.value;
startPoint.value = endPoint.value;
endPoint.value = temp;
calculateZone();
}
/// Select Minefield Type / تحديد نوع المانع (ضد دروع / ضد أفراد / مركب)
void setType(MinefieldType type) {
minefieldType.value = type;
calculateZone();
}
/// Set Frontage Depth / تحديد عمق الحقل بالمتر
void setWidth(double width) {
widthMeters.value = width;
calculateZone();
}
/// Calculate Minefield Threat Box & Breaching Corridor / حساب منطقة الخطر وممر الثغرة
void calculateZone() {
if (startPoint.value == null || endPoint.value == null) {
zoneResult.value = null;
return;
}
final res = MinefieldEngine.calculateMinefieldZone(
startPoint: startPoint.value!,
endPoint: endPoint.value!,
type: minefieldType.value,
widthMeters: widthMeters.value,
);
zoneResult.value = res;
}
/// Reset minefield state / إعادة ضبط حقل الألغام
void reset() {
startPoint.value = null;
endPoint.value = null;
zoneResult.value = null;
}
}