import 'dart:developer'; import 'package:fis_measure/interfaces/process/calculators/values.dart'; import 'package:fis_measure/interfaces/process/items/item.dart'; import 'package:fis_measure/interfaces/process/items/item_feature.dart'; import 'package:fis_measure/interfaces/process/items/item_metas.dart'; import 'package:fis_measure/process/unit/convert/convert.dart'; import 'package:fis_measure/process/workspace/measure_data_controller.dart'; import 'package:fis_measure/values/unit_desc.dart'; import 'package:fis_measure/view/result/results_panel.dart'; import 'package:get/get.dart'; import 'package:vid/us/vid_us_unit.dart'; class FeatureValueDescConverter { final IMeasureItemFeature feature; FeatureValueDescConverter(this.feature); String idPlaceStr = ' '; String idStr = ' '; List<ResultLine> generate(int idLength) { idPlaceStr = ' '.padRight(idLength, ' '); idStr = feature.id.toString().padRight(idLength, ' '); final List<ResultLine> arr = []; final mainLines = _findFeatureLines(feature); arr.addAll(mainLines); final ref = feature.refItem; if (ref is ITopMeasureItem) { for (var child in ref.childItems) { for (var feature in child.measuredFeatures) { final str = _findChildLine(feature); if (str != null && str.isNotEmpty) { arr.add(str); } } if (child.feature != null) { final str = _findChildLine(child.feature!); if (str != null && str.isNotEmpty) { arr.add(str); } } } } return arr; } ResultLine? _findChildLine(IMeasureItemFeature feature) { if (feature.value == null) return null; final value = feature.value!; final valueStr = _pickValueStr(value); final name = feature.refItem.description; return ResultLine(label: ' $idPlaceStr $name', value: valueStr); } List<ResultLine> _findFeatureLines(IMeasureItemFeature feature) { final count = feature.values.length; final itemName = _findMetaDisplayName( feature.refItem.meta, feature.featureStyle.showBriefAnnotation); if (count == 0) { return [ResultLine(label: '$idStr $itemName')]; } List<ResultLine> arr = []; for (var i = 0; i < count; i++) { final val = feature.values[i]; final meta = val.meta; final valueStr = _pickValueStr(val); if (i == 0) { arr.add(ResultLine(label: "$idStr $itemName", value: valueStr)); } else { final name = _findOutputMetaDisplayName( meta, feature.featureStyle.showBriefAnnotation); arr.add(ResultLine(label: "$idPlaceStr $name", value: valueStr)); } } return arr; } String _pickValueStr(ValueBase value) { if (value is FloatValue) { final floatVal = _roundDouble(value.value!, 6); if (floatVal.isNaN) { return ''; } final unit = value.unit; final targetUnit = getUnitFromConfig(value.metaUnit); final targetVal = UnitValueConverter.convert(unit, targetUnit, floatVal); final targetValRound = _roundDoubleToString(targetVal, value.meta.fractionalDigits); final unitStr = UnitDescriptionMap.getDesc(targetUnit); return '$targetValRound $unitStr'; } else if (value is StringValue) { return value.value!; } return ''; } String _findMetaDisplayName(ItemMeta meta, [bool showBriefAnnotation = false]) { if (showBriefAnnotation) { if (meta.briefAnnotation.isNotEmpty) { return meta.briefAnnotation; } } return meta.description; } String _findOutputMetaDisplayName(ItemOutputMeta meta, [bool showBriefAnnotation = false]) { if (showBriefAnnotation) { if (meta.briefAnnotation != null && meta.briefAnnotation!.isNotEmpty) { return meta.briefAnnotation!; } } return meta.description; } double _roundDouble(double value, [int digits = 2]) { final digitsStr = value.toStringAsFixed(digits); final result = double.parse(digitsStr); return result; } String _roundDoubleToString(double value, [int digits = 2]) { final digitsStr = value.toStringAsFixed(digits); return digitsStr; } VidUsUnit getUnitFromConfig(VidUsUnit unit) { try { final measureData = Get.find<MeasureDataController>(); if (distanceUnits.contains(unit)) { return VidUsUnitMap.getUnit( measureData.measureSystemSetting.distanceUnit.index); } if (areaUnits.contains(unit)) { return VidUsUnitMap.getUnit( measureData.measureSystemSetting.areaUnit.index); } if (velocityUnits.contains(unit)) { return VidUsUnitMap.getUnit( measureData.measureSystemSetting.velocityUnit.index); } if (timeUnits.contains(unit)) { return VidUsUnitMap.getUnit( measureData.measureSystemSetting.timeUnit.index); } return unit; } catch (e) { log('getUnitFromConfig error: $e'); return unit; } } static final List<VidUsUnit> distanceUnits = [ VidUsUnit.mm, VidUsUnit.cm, VidUsUnit.inch, VidUsUnit.ft, ]; static final List<VidUsUnit> areaUnits = [ VidUsUnit.mm2, VidUsUnit.cm2, VidUsUnit.m2, ]; static final List<VidUsUnit> velocityUnits = [ VidUsUnit.mms, VidUsUnit.cms, VidUsUnit.ms, ]; static final List<VidUsUnit> timeUnits = [ VidUsUnit.msec, VidUsUnit.s, ]; }