Files
maps-saas/packages/tactical_app/lib/models/military_operations_models.dart
T

314 lines
9.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
/// Military Echelon Levels (المستوى القيادي / التشكيل)
enum MilitaryEchelon {
team, // طاقم / جماعة (●)
squad, // حظيرة (●●)
platoon, // فصيل (●●●)
company, // سرية ( | )
battalion, // كتيبة ( || )
regiment, // فوج ( ||| )
brigade, // لواء ( X )
division, // فرقة ( XX )
}
/// Tactical Symbol Types (الرموز العسكرية القياسية)
enum TacticalSymbolType {
friendlyInfantry, // مشاة صديقة
friendlyArmor, // دروع / دبابات صديقة
friendlyArtillery,// مدفعية ميدان صديقة
friendlyAirDefense,// دفاع جوي صديق
friendlyRadar, // رادار واستطلاع أرضي
friendlyHq, // مركز قيادة وسيطرة (HQ)
checkpoint, // نقطة غلق وتفتيش أمني
observationPost, // نقطة مراقبة واستطلاع أمامي (OP)
enemyInfantry, // مشاة معادية
enemyArmor, // دروع معادية
enemyArtillery, // مدفعية معادية
minefield, // حقل ألغام
hlz, // مهبط طيران عامودي
}
/// Tactical Unit / Symbol on Map
class TacticalSymbolItem {
final String id;
final String name;
final TacticalSymbolType type;
final MilitaryEchelon echelon;
final LatLng position;
final double azimuthDeg;
final String callsign;
final String notes;
const TacticalSymbolItem({
required this.id,
required this.name,
required this.type,
this.echelon = MilitaryEchelon.battalion,
required this.position,
this.azimuthDeg = 0.0,
this.callsign = '',
this.notes = '',
});
bool get isEnemy =>
type == TacticalSymbolType.enemyInfantry ||
type == TacticalSymbolType.enemyArmor ||
type == TacticalSymbolType.enemyArtillery;
Color get color {
if (isEnemy) return const Color(0xFFEF4444); // Red
if (type == TacticalSymbolType.minefield) return const Color(0xFFF59E0B); // Amber
if (type == TacticalSymbolType.hlz) return const Color(0xFF10B981); // Emerald
if (type == TacticalSymbolType.checkpoint || type == TacticalSymbolType.observationPost) {
return const Color(0xFF38BDF8); // Cyan
}
return const Color(0xFF0071E3); // Friendly Blue
}
IconData get icon {
switch (type) {
case TacticalSymbolType.friendlyInfantry:
case TacticalSymbolType.enemyInfantry:
return Icons.group;
case TacticalSymbolType.friendlyArmor:
case TacticalSymbolType.enemyArmor:
return Icons.shield;
case TacticalSymbolType.friendlyArtillery:
case TacticalSymbolType.enemyArtillery:
return Icons.gps_fixed;
case TacticalSymbolType.friendlyAirDefense:
return Icons.radar;
case TacticalSymbolType.friendlyRadar:
return Icons.track_changes;
case TacticalSymbolType.friendlyHq:
return Icons.flag;
case TacticalSymbolType.checkpoint:
return Icons.gavel;
case TacticalSymbolType.observationPost:
return Icons.visibility;
case TacticalSymbolType.minefield:
return Icons.warning_amber;
case TacticalSymbolType.hlz:
return Icons.flight_land;
}
}
}
/// Artillery Weapon Profile (أنظمة المدفعية الميدانية والراجمات)
class ArtilleryWeaponSystem {
final String id;
final String nameAr;
final String caliber;
final double maxRangeMeters;
final double minRangeMeters;
final double muzzleVelocityMps; // سرعة الفوهة م/ث
final double minElevationDeg;
final double maxElevationDeg;
const ArtilleryWeaponSystem({
required this.id,
required this.nameAr,
required this.caliber,
required this.maxRangeMeters,
required this.minRangeMeters,
required this.muzzleVelocityMps,
required this.minElevationDeg,
required this.maxElevationDeg,
});
static const List<ArtilleryWeaponSystem> standardSystems = [
ArtilleryWeaponSystem(
id: 'm109_155',
nameAr: 'هاوتزر ذاتي الحركة M109A2/A3 (155 ملم)',
caliber: '155mm',
minRangeMeters: 3000,
maxRangeMeters: 24000,
muzzleVelocityMps: 684,
minElevationDeg: 3,
maxElevationDeg: 75,
),
ArtilleryWeaponSystem(
id: 'mortar_120',
nameAr: 'هاون ثقيل M120 (120 ملم)',
caliber: '120mm',
minRangeMeters: 200,
maxRangeMeters: 7200,
muzzleVelocityMps: 318,
minElevationDeg: 45,
maxElevationDeg: 85,
),
ArtilleryWeaponSystem(
id: 'grad_122',
nameAr: 'راجمة صواريخ BM-21 غراد (122 ملم)',
caliber: '122mm Rocket',
minRangeMeters: 5000,
maxRangeMeters: 20400,
muzzleVelocityMps: 690,
minElevationDeg: 0,
maxElevationDeg: 55,
),
ArtilleryWeaponSystem(
id: 'mortar_81',
nameAr: 'هاون متوسط L16 (81 ملم)',
caliber: '81mm',
minRangeMeters: 100,
maxRangeMeters: 5650,
muzzleVelocityMps: 250,
minElevationDeg: 45,
maxElevationDeg: 85,
),
];
}
/// Ballistic Trajectory Point
class BallisticTrajectoryPoint {
final double distanceMeters;
final double altitudeMeters;
final double groundElevationMeters;
final LatLng coordinate;
const BallisticTrajectoryPoint({
required this.distanceMeters,
required this.altitudeMeters,
required this.groundElevationMeters,
required this.coordinate,
});
}
/// Complete Artillery Firing Solution (حل الرماية وقوس القذيفة)
class ArtilleryFiringSolution {
final ArtilleryWeaponSystem weapon;
final LatLng gunPosition;
final LatLng targetPosition;
final double distanceMeters;
final double azimuthDeg;
final double azimuthMilsNato; // 6400 mils
final double quadrantElevationDeg; // زاوية الارتفاع
final double quadrantElevationMilsNato;
final double timeOfFlightSeconds; // زمن الطيران
final double apogeeAltitudeMeters; // ذروة القوس
final bool isCrestClear; // سلامة تجاوز قمم الجبال (Crest Clearance)
final double minCrestClearanceMeters;
final List<BallisticTrajectoryPoint> trajectoryProfile;
const ArtilleryFiringSolution({
required this.weapon,
required this.gunPosition,
required this.targetPosition,
required this.distanceMeters,
required this.azimuthDeg,
required this.azimuthMilsNato,
required this.quadrantElevationDeg,
required this.quadrantElevationMilsNato,
required this.timeOfFlightSeconds,
required this.apogeeAltitudeMeters,
required this.isCrestClear,
required this.minCrestClearanceMeters,
required this.trajectoryProfile,
});
}
/// Helicopter Types for HLZ
enum HelicopterType {
lightUtility, // طوافة استطلاع خفيفة (Little Bird / Bell 407)
mediumLift, // طوافة نقل وتكتيك متوسطة (UH-60 Blackhawk / AH-64 Apache)
heavyTransport // طوافة نقل ثقيل (CH-47 Chinook / Super Stallion)
}
/// Helicopter Landing Zone Assessment Result (تقييم مهبط الطيران العامودي)
class HlzAssessmentResult {
final LatLng center;
final HelicopterType helicopterType;
final double groundElevationM;
final double maxSlopePercent; // نسبة انحدار الأرض
final double avgSlopePercent;
final double recommendedClearanceRadiusM;
final bool isSlopeAcceptable;
final bool isObstacleClear;
final String suitabilityGrade; // "ممتاز (OPTIMAL)", "مقبول بحذر (MARGINAL)", "غير صالح (NO-GO)"
final Color gradeColor;
final double approachAzimuthDeg; // ممر الاقتراب الآمن
final List<LatLng> padBoundary;
final List<LatLng> approachFunnel;
const HlzAssessmentResult({
required this.center,
required this.helicopterType,
required this.groundElevationM,
required this.maxSlopePercent,
required this.avgSlopePercent,
required this.recommendedClearanceRadiusM,
required this.isSlopeAcceptable,
required this.isObstacleClear,
required this.suitabilityGrade,
required this.gradeColor,
required this.approachAzimuthDeg,
required this.padBoundary,
required this.approachFunnel,
});
}
/// Minefield Type
enum MinefieldType {
antiTank, // حقل ألغام ضد الدروع (AT)
antiPersonnel, // حقل ألغام ضد الأفراد (AP)
mixedBarrier, // حقل موانع مركب ومختلط
}
/// Minefield Zone & Breaching Corridor (حقل الألغام وممرات العبور)
class MinefieldZoneResult {
final LatLng startPoint;
final LatLng endPoint;
final MinefieldType type;
final double widthMeters;
final double lengthMeters;
final double estimatedMinesCount;
final List<LatLng> boundaryPolygon;
final List<LatLng> breachLaneCenterline; // ممر الثغرة الآمن
final List<LatLng> breachLanePolygon;
const MinefieldZoneResult({
required this.startPoint,
required this.endPoint,
required this.type,
required this.widthMeters,
required this.lengthMeters,
required this.estimatedMinesCount,
required this.boundaryPolygon,
required this.breachLaneCenterline,
required this.breachLanePolygon,
});
}
/// Tactical Overlays (منظومة الشفافات العسكرية)
class TacticalOverlayLayer {
final String id;
final String nameAr;
final Color color;
final bool isVisible;
final List<List<LatLng>> polygons;
final List<List<LatLng>> lines;
const TacticalOverlayLayer({
required this.id,
required this.nameAr,
required this.color,
this.isVisible = true,
this.polygons = const [],
this.lines = const [],
});
TacticalOverlayLayer copyWith({bool? isVisible}) {
return TacticalOverlayLayer(
id: id,
nameAr: nameAr,
color: color,
isVisible: isVisible ?? this.isVisible,
polygons: polygons,
lines: lines,
);
}
}