Răsfoiți Sursa

测量结果单位换算

melon.yin 2 ani în urmă
părinte
comite
f91ff63c3e

+ 7 - 2
lib/process/unit/convert/abstract.dart

@@ -1,10 +1,13 @@
+import 'package:fis_measure/utils/number.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 abstract class UnitMapBase {
   Map<VidUsUnit, double>? _map;
   final VidUsUnit unit;
 
-  UnitMapBase(this.unit);
+  UnitMapBase(this.unit) {
+    initMap();
+  }
 
   Map<VidUsUnit, double> get map {
     _map ??= <VidUsUnit, double>{};
@@ -18,9 +21,11 @@ abstract class UnitMapBase {
   }
 
   double convert(VidUsUnit target, double value) {
+    if (target == unit) return value;
+
     if (map.containsKey(target)) {
       final scale = map[target]!;
-      final result = value / scale;
+      final result = NumUtil.roundDouble(value / scale, 2);
       return result;
     }
     return value;

+ 41 - 4
lib/process/unit/convert/convert.dart

@@ -1,11 +1,48 @@
+import 'package:fis_measure/process/unit/convert/length.dart';
+import 'package:fis_measure/process/unit/convert/time.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import 'abstract.dart';
 
-class UnitConverter {
-  static final _map = <VidUsUnit, UnitMapBase>{};
+/// 单位数值转换器
+class UnitValueConverter {
+  static UnitValueConverter? _ins;
+  static UnitValueConverter get _singleton {
+    if (_ins == null) {
+      _ins = UnitValueConverter._();
+      _ins!._init();
+    }
+    return _ins!;
+  }
+
+  UnitValueConverter._();
+  final _map = <VidUsUnit, UnitMapBase>{};
+
+  /// 转换为目标单位的值
+  ///
+  /// [unit] 当前单位
+  ///
+  /// [targetUnit] 目标单位
+  ///
+  /// [value] 当前单位值
+  static double convert(VidUsUnit unit, VidUsUnit targetUnit, double value) {
+    final result = _singleton._findUnitExt(unit)?.convert(targetUnit, value);
+    return result ?? value;
+  }
+
+  UnitMapBase? _findUnitExt(VidUsUnit unit) {
+    if (_map.containsKey(unit)) {
+      return _map[unit];
+    }
+    return null;
+  }
+
+  void _init() {
+    _add(LengthMap());
+    _add(TimeMap());
+  }
 
-  double convert(double value) {
-    return value;
+  void _add(UnitMapBase item) {
+    _map[item.unit] = item;
   }
 }

+ 0 - 12
lib/process/unit/convert/distance.dart

@@ -1,12 +0,0 @@
-import 'package:vid/us/vid_us_unit.dart';
-
-import 'abstract.dart';
-
-class DistanceMap extends UnitMapBase {
-  DistanceMap() : super(VidUsUnit.cm);
-
-  @override
-  void initMap() {
-    add(VidUsUnit.mm, 0.1);
-  }
-}

+ 14 - 0
lib/process/unit/convert/length.dart

@@ -0,0 +1,14 @@
+import 'package:vid/us/vid_us_unit.dart';
+
+import 'abstract.dart';
+
+class LengthMap extends UnitMapBase {
+  LengthMap() : super(VidUsUnit.cm);
+
+  @override
+  void initMap() {
+    add(VidUsUnit.mm, 0.1);
+    add(VidUsUnit.inch, 2.54);
+    add(VidUsUnit.ft, 30.48);
+  }
+}

+ 14 - 0
lib/process/unit/convert/time.dart

@@ -0,0 +1,14 @@
+import 'package:vid/us/vid_us_unit.dart';
+
+import 'abstract.dart';
+
+class TimeMap extends UnitMapBase {
+  TimeMap() : super(VidUsUnit.s);
+
+  @override
+  void initMap() {
+    add(VidUsUnit.minute, 60);
+    add(VidUsUnit.hour, 3600);
+    add(VidUsUnit.msec, 0.001);
+  }
+}

+ 9 - 0
lib/utils/number.dart

@@ -0,0 +1,9 @@
+/// 数值工具类
+class NumUtil {
+  /// 对double四舍五入
+  static double roundDouble(double value, [int digits = 2]) {
+    final digitsStr = value.toStringAsFixed(digits);
+    final result = double.parse(digitsStr);
+    return result;
+  }
+}

+ 0 - 9
lib/utils/unit_ext.dart

@@ -1,9 +0,0 @@
-import 'package:vid/us/vid_us_unit.dart';
-
-extension UnitExt on VidUsUnit {
-  // static final _map=
-}
-
-class UnitConverter {
-  //
-}

+ 7 - 4
lib/view/result/converter.dart

@@ -1,6 +1,7 @@
 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/process/unit/convert/convert.dart';
 import 'package:fis_measure/values/unit_desc.dart';
 
 class FeatureValueDescConverter {
@@ -77,10 +78,12 @@ class FeatureValueDescConverter {
 
   String _pickValueStr(ValueBase value) {
     if (value is FloatValue) {
-      final floatVal =
-          _roundDouble(value.value!, value.meta.fractionalDigits).toString();
-      final unitStr = UnitDescriptionMap.getDesc(value.meta.unit);
-      return '$floatVal $unitStr';
+      final floatVal = _roundDouble(value.value!, value.meta.fractionalDigits);
+      final unit = value.unit;
+      final targetUnit = value.targetUnit;
+      final targetVal = UnitValueConverter.convert(unit, targetUnit, floatVal);
+      final unitStr = UnitDescriptionMap.getDesc(targetUnit);
+      return '$targetVal $unitStr';
     } else if (value is StringValue) {
       return value.value!;
     }