Explorar el Código

update(measure): 支持【 EF 】【MV E/A Ratio】测量项 review by baka

gavin.chen hace 2 años
padre
commit
fe6e8e8ee3

+ 48 - 0
lib/process/calcuators/formulas/cardiac.dart

@@ -0,0 +1,48 @@
+import 'dart:math' as math;
+
+import 'package:fis_measure/utils/number.dart';
+
+class CardiacFormulas {
+  CardiacFormulas._();
+
+  /// <summary>
+  /// IMP=(CO-ET)/ET
+  /// </summary>
+  /// <param name="co">s</param>
+  /// <param name="et">s</param>
+  /// <returns>(unit None)</returns>
+  static double teiIndex(double co, double et) {
+    double imp = 0.0;
+    if (et != 0.0) {
+      imp = (((co).abs() - (et).abs()) / et).abs();
+    }
+    return imp;
+  }
+
+  /// <summary>
+  /// EF = (EDV - ESV )/EDV
+  /// </summary>
+  /// <param name="edv">cm³</param>
+  /// <param name="esv">cm³</param>
+  /// <returns>None</returns>
+  static double ef(double edv, double esv) {
+    // 这行判断暂时注释掉是为了使实际表现与旧版一致
+    // if (edv < esv) {
+    //   return double.nan;
+    // }
+    return (edv - esv) / edv * 100;
+  }
+
+  /// <summary>
+  /// EDV (Teichholz) = [7.0/(2.4 + LVIDd)] x LVIDd^3
+  /// </summary>
+  /// <param name="lvidd">Unit cm</param>
+  /// <returns>cm³</returns>
+  static double edvTeichholz(double lvidd) {
+    double edv = double.nan;
+    if (!NumUtil.almostEquals(lvidd, 0)) {
+      edv = 7.0 * math.pow(lvidd, 3) / (2.4 + lvidd);
+    }
+    return edv;
+  }
+}

+ 0 - 20
lib/process/calcuators/formulas/obstetrics copy.dart

@@ -1,20 +0,0 @@
-import 'dart:math' as math;
-import 'package:fis_measure/utils/number.dart';
-
-class CardiacFormulas {
-  CardiacFormulas._();
-
-  /// <summary>
-  /// IMP=(CO-ET)/ET
-  /// </summary>
-  /// <param name="co">s</param>
-  /// <param name="et">s</param>
-  /// <returns>(unit None)</returns>
-  static double teiIndex(double co, double et) {
-    double imp = 0.0;
-    if (et != 0.0) {
-      imp = (((co).abs() - (et).abs()) / et).abs();
-    }
-    return imp;
-  }
-}

+ 1 - 5
lib/process/calcuators/tei_index.dart

@@ -1,11 +1,7 @@
-import 'package:fis_measure/interfaces/process/calculators/output.dart';
 import 'package:fis_measure/interfaces/process/calculators/values.dart';
-import 'package:fis_measure/process/calcuators/formulas/general.dart';
-import 'package:fis_measure/process/calcuators/formulas/obstetrics%20copy.dart';
+import 'package:fis_measure/process/calcuators/formulas/cardiac.dart';
 import 'package:fis_measure/process/items/item.dart';
-import 'package:fis_measure/process/primitives/combos/two_area.dart';
 import 'package:fis_measure/process/primitives/combos/two_length.dart';
-import 'package:fis_measure/process/primitives/trace.dart';
 
 import 'calculator.dart';
 

+ 31 - 0
lib/process/calcuators/two_distance.dart

@@ -1,6 +1,7 @@
 import 'package:fis_measure/interfaces/date_types/vector.dart';
 import 'package:fis_measure/interfaces/process/calculators/values.dart';
 import 'package:fis_measure/interfaces/process/items/terms.dart';
+import 'package:fis_measure/process/calcuators/formulas/cardiac.dart';
 import 'package:fis_measure/process/calcuators/formulas/urology.dart';
 import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
@@ -176,3 +177,33 @@ class IvsThckCal extends Calculator<TwoStraightLine, double> {
     return (ivss - ivsd) / ivsd * 100;
   }
 }
+
+abstract class EFCal extends Calculator<TwoStraightLine, double> {
+  EFCal(TwoStraightLine twoStraightLine) : super(twoStraightLine);
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+    double lvidd = pickChildFloatValue(ref.child1) ?? 0;
+    double lvids = pickChildFloatValue(ref.child2) ?? 0;
+    List<double> edvAndEsv = onCalculateEdvEsv(lvidd, lvids);
+    assert(edvAndEsv.length == 2, 'edvAndEsv.length == 2');
+    double edv = edvAndEsv[0];
+    double esv = edvAndEsv[1];
+    double ef = CardiacFormulas.ef(edv, esv);
+    updateFloatValue(ef, unit: VidUsUnit.percent, useRound: true);
+  }
+
+  List<double> onCalculateEdvEsv(double lvidd, double lvids);
+}
+
+class EfTeichCal extends EFCal {
+  EfTeichCal(TwoStraightLine ref) : super(ref);
+
+  @override
+  List<double> onCalculateEdvEsv(double lvidd, double lvids) {
+    double edv = CardiacFormulas.edvTeichholz(lvidd);
+    double esv = CardiacFormulas.edvTeichholz(lvids);
+    return [edv, esv];
+  }
+}

+ 3 - 0
lib/process/items/factory.dart

@@ -144,6 +144,9 @@ class MeasureItemFactory {
         TwoStraightLine.createStenosisTwoVerticalDistance);
     _singleton._register(MeasureTypes.AbRatioTwoVerticalDistance,
         TwoStraightLine.createAbRatioTwoVerticalDistance);
+    _singleton._register(
+        MeasureTypes.AbRatioTwoSlope, TwoStraightLine.createAbRatioSlope);
+    _singleton._register(MeasureTypes.EfTeich, TwoStraightLine.createEfTeich);
     _singleton._register(MeasureTypes.Slope, StraightLine.createSlope);
     _singleton._register(
         MeasureTypes.SlopeDoppler, StraightLine.createSlopeDoppler);

+ 13 - 0
lib/process/primitives/combos/two_straightline.dart

@@ -98,6 +98,13 @@ class TwoStraightLine extends TwoLengthAbstract<TwoStraightLineFeature> {
     return twoStraightline;
   }
 
+  static TwoStraightLine createAbRatioSlope(ItemMeta meta,
+      [IMeasureItem? parent]) {
+    var twoStraightline = TwoStraightLine(meta, ifTimeSpan: false);
+    twoStraightline.calculator = ABRatioCal(twoStraightline);
+    return twoStraightline;
+  }
+
   static TwoStraightLine createTeiIndex(ItemMeta meta, [IMeasureItem? parent]) {
     var twoStraightline = TwoStraightLine(meta, ifTimeSpan: true);
     twoStraightline.calculator = TeiIndexCal(twoStraightline);
@@ -123,6 +130,12 @@ class TwoStraightLine extends TwoLengthAbstract<TwoStraightLineFeature> {
     return twoStraightline;
   }
 
+  static TwoStraightLine createEfTeich(ItemMeta meta, [IMeasureItem? parent]) {
+    var twoStraightline = TwoStraightLine(meta);
+    twoStraightline.calculator = EfTeichCal(twoStraightline);
+    return twoStraightline;
+  }
+
   static TwoStraightLine createIvsThck(ItemMeta meta, [IMeasureItem? parent]) {
     var twoStraightline = TwoStraightLine(meta);
     twoStraightline.calculator = IvsThckCal(twoStraightline);

+ 3 - 2
lib/view/measure/measure_tool.dart

@@ -30,8 +30,9 @@ class LeftSiderSelectMeasure extends FStatefulWidget
 
 class LeftSiderSelectMeasureState extends FState<LeftSiderSelectMeasure> {
   /// 数据
-  get application => Get.find<IApplication>();
-  get playerController => Get.find<IPlayerController>() as VidPlayerController;
+  IApplication get application => Get.find<IApplication>();
+  VidPlayerController get playerController =>
+      Get.find<IPlayerController>() as VidPlayerController;
   final measureHandler = Get.find<MeasureHandler>();
   final measureData = Get.find<MeasureDataController>();
   final measureMetaController = Get.find<MeasureMetaController>();