314 lines
9.9 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|