/// Egy mérési felvétel (lövés) a PC-szoftver által feltöltött /// `terepi_seged_measure_records` táblából. /// /// SZÁNDÉKOSAN nincs helyi tükör — ez a PC-szoftverből folyamatosan, /// élőben érkező adat, mindig friss, sosem gyorsítótárazott (lásd /// MeasureDataService.watchRecords). class MeasuredRecord { final int id; final String projectId; final double? sourceLineNumber; final double? sourcePointNumber; final DateTime measuredAt; final double? eovX; final double? eovY; final int? gpsTimeInMicroseconds; final int? minReceiverPointNumber; final int? minReceiverPointFduNumber; final int? maxReceiverPointNumber; final int? maxReceiverPointFduNumber; final String? imagePath; final String? imageUrl; final int? ffid; final int? recordType; final int? recordSerialNumberOfSourcePoint; const MeasuredRecord({ required this.id, required this.projectId, this.sourceLineNumber, this.sourcePointNumber, required this.measuredAt, this.eovX, this.eovY, this.gpsTimeInMicroseconds, this.minReceiverPointNumber, this.minReceiverPointFduNumber, this.maxReceiverPointNumber, this.maxReceiverPointFduNumber, this.imagePath, this.imageUrl, this.ffid, this.recordType, this.recordSerialNumberOfSourcePoint, }); factory MeasuredRecord.fromMap(Map m) => MeasuredRecord( id: m['id'] as int, projectId: m['project_id'] as String, sourceLineNumber: (m['source_line_number'] as num?)?.toDouble(), sourcePointNumber: (m['source_point_number'] as num?)?.toDouble(), measuredAt: DateTime.parse(m['measured_at'] as String), eovX: (m['eov_x'] as num?)?.toDouble(), eovY: (m['eov_y'] as num?)?.toDouble(), gpsTimeInMicroseconds: (m['gps_time_in_microseconds'] as num?)?.toInt(), minReceiverPointNumber: (m['min_receiver_point_number'] as num?)?.toInt(), minReceiverPointFduNumber: (m['min_receiver_point_fdu_number'] as num?)?.toInt(), maxReceiverPointNumber: (m['max_receiver_point_number'] as num?)?.toInt(), maxReceiverPointFduNumber: (m['max_receiver_point_fdu_number'] as num?)?.toInt(), imagePath: m['image_path'] as String?, imageUrl: m['image_url'] as String?, ffid: (m['ffid'] as num?)?.toInt(), recordType: (m['record_type'] as num?)?.toInt(), recordSerialNumberOfSourcePoint: (m['record_serial_number_of_source_point'] as num?)?.toInt(), ); bool get hasImage => (imageUrl != null && imageUrl!.isNotEmpty) || (imagePath != null && imagePath!.isNotEmpty); String? get geophoneRange => (minReceiverPointNumber != null && maxReceiverPointNumber != null) ? '$minReceiverPointNumber–$maxReceiverPointNumber' : null; }