82 lines
3.0 KiB
Dart
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;
|
|
}
|
|
}
|