Browse Source

fix 18989: 【图像测量】【小动物】PW模式下,肺循环QP 和 体循环QS测量结束后,生成的QP和QS结果带有体积结果,而超声机没有

Melon 9 months ago
parent
commit
ca34c52822

+ 34 - 27
lib/process/calcuators/sv.dart

@@ -1,13 +1,14 @@
 import 'package:fis_measure/configs/patient.dart';
+import 'package:fis_measure/interfaces/process/calculators/values.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
 import 'package:fis_measure/interfaces/process/items/terms.dart';
-import 'package:fis_measure/process/calcuators/formulas/cardiac.dart';
 import 'package:fis_measure/process/primitives/combos/sv.dart';
 import 'package:fis_measure/process/primitives/multi_method/multiple_trace.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import 'calculator.dart';
-import 'formulas/general.dart';
 import 'trace.dart';
+import 'unit_formulas/index.dart';
 
 class SvCal extends Calculator<Sv, double> {
   SvCal(super.ref);
@@ -18,16 +19,28 @@ class SvCal extends Calculator<Sv, double> {
 
     final feature = ref.feature!;
 
-    final diam = pickChildFloatValue(ref.l);
-    if (diam == null) {
+    feature.values.clear();
+
+    final itemName = ref.meta.name;
+    if (['qp', 'qs'].contains(itemName.toLowerCase())) {
+      final output = ItemOutputMeta(itemName, itemName, VidUsUnit.None);
+      // Qp、Qs仅占位
+      feature.updateStringValue(output, '');
+    } else {
       updateStringValue("");
+    }
+
+    final diam = pickChildToFloatValue(ref.l)?.toUnitFloatValue();
+    if (diam == null) {
       return;
     }
 
-    double? vti;
-    double? sv;
+    final viewport = ref.application.currentVisualArea.viewport!;
+
+    UnitFloatValue? vti;
+    UnitFloatValue? sv;
+    UnitFloatValue? co;
     int? hr;
-    double? co;
     final bsa = GlobalPatientConfig.bsa;
 
     TraceItemFeatureAbstract? traceFeature = ref.trace.feature;
@@ -42,21 +55,12 @@ class SvCal extends Calculator<Sv, double> {
       var outputVTI = countVTIResult[0];
       var outputHR = countVTIResult[5];
 
-      vti = outputVTI;
+      vti = UnitFloatValue(outputVTI, viewport.yUnit);
       hr = outputHR.toInt();
 
-      sv = GeneralFormulas.svDiam(diam, vti);
+      sv = UnitFormulas.general.svDiam(diam, vti);
     }
 
-    if (sv != null) {
-      updateFloatValue(sv, unit: VidUsUnit.cm3);
-    } else {
-      updateStringValue("");
-    }
-
-    // Diam 输出
-    // feature.updateFloatValue(ref.l.meta.outputs[0], diam, VidUsUnit.cm);
-
     if (traceFeature != null) {
       //  Trace 输出
       for (var output in ref.trace.meta.outputs) {
@@ -77,22 +81,25 @@ class SvCal extends Calculator<Sv, double> {
     if (sv != null) {
       for (var output in ref.meta.outputs) {
         switch (output.name) {
+          case MeasureTerms.SV:
+            feature.updateFloatValue(output, sv.value, sv.unit);
+            break;
           case MeasureTerms.SI:
             if (bsa > 0) {
-              final si = CardiacFormulas.si(sv, bsa);
-              feature.updateFloatValue(output, si, VidUsUnit.mlm2);
+              final si = UnitFormulas.cardiac.si(sv, bsa: bsa);
+              feature.updateFloatValue(output, si.value, si.unit);
             }
             break;
           case MeasureTerms.CO:
             if (hr != null) {
-              co = CardiacFormulas.co(sv, hr: hr);
-              feature.updateFloatValue(output, co, VidUsUnit.Lmin);
+              final co = UnitFormulas.cardiac.co(sv, hr: hr);
+              feature.updateFloatValue(output, co.value, co.unit);
             }
             break;
           case MeasureTerms.CI:
-            if (co != null && bsa > 0) {
-              final ci = CardiacFormulas.ci(sv, hr: hr!, bsa: bsa);
-              feature.updateFloatValue(output, ci, VidUsUnit.Lminm2);
+            if (hr != null && bsa > 0) {
+              final ci = UnitFormulas.cardiac.ci(sv, bsa: bsa, hr: hr);
+              feature.updateFloatValue(output, ci.value, ci.unit);
             }
             break;
         }
@@ -103,8 +110,8 @@ class SvCal extends Calculator<Sv, double> {
         ref.meta.outputs.indexWhere((e) => e.name == MeasureTerms.CSA);
     if (csaIndex > -1) {
       final output = ref.meta.outputs[csaIndex];
-      final csa = GeneralFormulas.csa(diam);
-      feature.updateFloatValue(output, csa, VidUsUnit.cm2);
+      final csa = UnitFormulas.general.csa(diam);
+      feature.updateFloatValue(output, csa.value, csa.unit);
     }
   }
 }

+ 33 - 20
lib/process/calcuators/two_distance.dart

@@ -9,6 +9,7 @@ import 'package:vid/us/vid_us_unit.dart';
 
 import 'calculator.dart';
 import 'formulas/general.dart';
+import 'lv_study.dart';
 
 class TwoDistanceCalBase extends Calculator<TwoStraightLine, double> {
   TwoDistanceCalBase(TwoStraightLine ref) : super(ref);
@@ -178,36 +179,48 @@ class IvsThckCal extends Calculator<TwoStraightLine, double> {
   }
 }
 
-abstract class EFCal extends Calculator<TwoStraightLine, double> {
-  EFCal(TwoStraightLine twoStraightLine) : super(twoStraightLine);
+abstract class EfCal extends LvStudyCalculatorBase<TwoStraightLine> {
+  late final StraightLine kidLVIDd;
+  late final StraightLine kidLVIDs;
+
+  EfCal(super.ref) {
+    kidLVIDd = ref.child1;
+    kidLVIDs = ref.child2;
+  }
 
   @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);
-}
+    updateStringValue('');
 
-class EfTeichCal extends EFCal {
-  EfTeichCal(TwoStraightLine ref) : super(ref);
+    restoreVals();
+    uv.lvidd = pickChildToFloatValue(kidLVIDd)?.toUnitFloatValue();
+    uv.lvids = pickChildToFloatValue(kidLVIDs)?.toUnitFloatValue();
 
-  @override
-  List<double> onCalculateEdvEsv(double lvidd, double lvids) {
-    double edv = CardiacFormulas.edvTeichholz(lvidd);
-    double esv = CardiacFormulas.edvTeichholz(lvids);
-    return [edv, esv];
+    for (var output in ref.meta.outputs) {
+      switch (output.name) {
+        case MeasureTerms.LVEDV:
+          updateLVEDV();
+          break;
+        case MeasureTerms.LVESV:
+          updateLVESV();
+          break;
+        case MeasureTerms.EF:
+          updateEF();
+          break;
+        case MeasureTerms.CO:
+          updateCO();
+          break;
+      }
+    }
   }
 }
 
+class EfTeichCal extends EfCal {
+  EfTeichCal(TwoStraightLine ref) : super(ref);
+}
+
 class RvStudyCal extends TwoDistanceCalBase {
   RvStudyCal(super.ref);
 

+ 8 - 0
lib/process/calcuators/unit_formulas/base/general.dart

@@ -15,4 +15,12 @@ class GeneralFormulasBase implements IGeneralFormulas {
     );
     return UnitFloatValue(value, VidUsUnit.cm3);
   }
+
+  @override
+  UnitFloatValue csa(UnitFloatValue diam) {
+    final value = formulas.GeneralFormulas.csa(
+      diam.convert(VidUsUnit.cm),
+    );
+    return UnitFloatValue(value, VidUsUnit.cm2);
+  }
 }

+ 1 - 0
lib/process/calcuators/unit_formulas/interfaces/general.dart

@@ -2,4 +2,5 @@ import 'package:fis_measure/interfaces/process/calculators/values.dart';
 
 abstract class IGeneralFormulas {
   UnitFloatValue svDiam(UnitFloatValue diam, UnitFloatValue vti);
+  UnitFloatValue csa(UnitFloatValue diam);
 }