Melon 11 months ago
parent
commit
6b1300711a

+ 1 - 0
lib/interfaces/process/items/terms.dart

@@ -503,6 +503,7 @@ class MeasureTerms {
 
 
   /// 右室收缩压:Right Ventricular Systolic Pressure
   /// 右室收缩压:Right Ventricular Systolic Pressure
   static const RVSP = "RVSP";
   static const RVSP = "RVSP";
+  static const TRVmax = "TR Vmax";
 
 
   /// 右心室心功能测量
   /// 右心室心功能测量
   static const RVStudy = "RV Study";
   static const RVStudy = "RV Study";

+ 5 - 0
lib/interfaces/process/items/types.dart

@@ -142,6 +142,8 @@ class MeasureTypes {
   static const DopplerTrace = "DopplerTrace";
   static const DopplerTrace = "DopplerTrace";
   static const SlopeDoppler = "SlopeDoppler";
   static const SlopeDoppler = "SlopeDoppler";
   static const SV = "SV";
   static const SV = "SV";
+  static const QpQs = "QpQs";
+  static const MultiQpQs = "MultiQpQs";
 
 
   /// 阻力指数
   /// 阻力指数
   static const ResistivityIndex = "ResistivityIndex";
   static const ResistivityIndex = "ResistivityIndex";
@@ -169,4 +171,7 @@ class MeasureTypes {
 
 
   /// 左心室舒张期质量
   /// 左心室舒张期质量
   static const LVdMass = "LVd Mass";
   static const LVdMass = "LVd Mass";
+
+  /// 右室收缩压
+  static const RVSP = "RVSP";
 }
 }

+ 68 - 1
lib/process/calcuators/a_b_ratio.dart

@@ -1,7 +1,10 @@
+import 'package:fis_common/index.dart';
 import 'package:fis_measure/interfaces/process/calculators/output.dart';
 import 'package:fis_measure/interfaces/process/calculators/output.dart';
 import 'package:fis_measure/interfaces/process/calculators/values.dart';
 import 'package:fis_measure/interfaces/process/calculators/values.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
 import 'package:fis_measure/process/calcuators/formulas/general.dart';
 import 'package:fis_measure/process/calcuators/formulas/general.dart';
 import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/primitives/combos/sv.dart';
 import 'package:fis_measure/process/primitives/combos/two_area.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/combos/two_length.dart';
 import 'package:fis_measure/process/primitives/trace.dart';
 import 'package:fis_measure/process/primitives/trace.dart';
@@ -43,7 +46,71 @@ class ABRatioCal extends Calculator<TwoLengthAbstract, double> {
       value = item.feature!.value;
       value = item.feature!.value;
     }
     }
     if (value != null) {
     if (value != null) {
-      return (value as FloatValue).value ?? 0;
+      if (value is FloatValue) {
+        return value.value ?? 0;
+      }
+    }
+    return null;
+  }
+}
+
+class QpQsCal extends ABRatioCal {
+  QpQsCal(super.ref);
+
+  @override
+  void calculate() {
+    final mianVal = _getQpQsValue();
+    if (mianVal == null) {
+      updateStringValue("");
+    }
+
+    super.calculate();
+
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+
+    final qp = ref.child1 as Sv;
+    final qs = ref.child2 as Sv;
+    final qpValues = qp.feature?.values;
+    final qsValues = qs.feature?.values;
+
+    if (qpValues != null) {
+      for (var val in qpValues) {
+        if (val.name != qp.meta.name) {
+          if (val is FloatValue) {
+            final meta = val.meta;
+            final output = ItemOutputMeta(
+                "${meta.name}(ROVT)", meta.description, meta.unit);
+            feature.updateFloatValue(output, val.value!, val.unit);
+          }
+        }
+      }
+    }
+
+    if (qsValues != null) {
+      for (var val in qsValues) {
+        if (val.name != qs.meta.name) {
+          if (val is FloatValue) {
+            final meta = val.meta;
+            final output = ItemOutputMeta(
+                "${meta.name}(LOVT)", meta.description, meta.unit);
+            feature.updateFloatValue(output, val.value!, val.unit);
+          }
+        }
+      }
+    }
+  }
+
+  ValueBase? _getQpQsValue() {
+    final values = ref.feature?.values;
+    if (values == null || values.isEmpty) {
+      return null;
+    }
+    final matchValue =
+        values.firstWhereNullable((e) => e.name == ref.meta.name);
+    if (matchValue != null && matchValue is FloatValue) {
+      return matchValue;
     }
     }
     return null;
     return null;
   }
   }

+ 44 - 0
lib/process/calcuators/rvsp.dart

@@ -0,0 +1,44 @@
+import 'package:fis_measure/interfaces/process/items/terms.dart';
+import 'package:fis_measure/process/primitives/rvsp.dart';
+import 'package:vid/us/vid_us_unit.dart';
+
+import 'calculator.dart';
+import 'formulas/general.dart';
+
+class RvspCal extends Calculator<Rvsp, double> {
+  RvspCal(super.ref);
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+
+    final tRVmax = pickChildFloatValue(ref.tRVmax);
+    if (tRVmax == null) {
+      updateStringValue("");
+      return;
+    }
+
+    final rap = ref.rap.value ?? 0;
+
+    final rvsp = GeneralFormulas.countPressure(tRVmax) + rap;
+
+    // TODO: ??? PG=RVSP-RAP
+    final pg = rvsp - rap;
+
+    for (var output in ref.meta.outputs) {
+      switch (output.name) {
+        case MeasureTerms.RVSP:
+          updateFloatValue(rvsp);
+          break;
+        case MeasureTerms.RAP:
+          feature.updateFloatValue(output, rap, VidUsUnit.mmHg);
+          break;
+        case MeasureTerms.PG:
+          feature.updateFloatValue(output, pg, VidUsUnit.mmHg);
+          break;
+      }
+    }
+  }
+}

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

@@ -15,6 +15,7 @@ import 'package:fis_measure/process/primitives/combos/two_area.dart';
 import 'package:fis_measure/process/primitives/combos/two_location.dart';
 import 'package:fis_measure/process/primitives/combos/two_location.dart';
 import 'package:fis_measure/process/primitives/combos/two_ray.dart';
 import 'package:fis_measure/process/primitives/combos/two_ray.dart';
 import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
 import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
+import 'package:fis_measure/process/primitives/combos/two_sv.dart';
 import 'package:fis_measure/process/primitives/detection.dart';
 import 'package:fis_measure/process/primitives/detection.dart';
 import 'package:fis_measure/process/primitives/ellipse.dart';
 import 'package:fis_measure/process/primitives/ellipse.dart';
 import 'package:fis_measure/process/primitives/empty.dart';
 import 'package:fis_measure/process/primitives/empty.dart';
@@ -23,6 +24,7 @@ import 'package:fis_measure/process/primitives/multi_method/multiple_trace.dart'
 import 'package:fis_measure/process/primitives/polyline.dart';
 import 'package:fis_measure/process/primitives/polyline.dart';
 import 'package:fis_measure/process/primitives/polyline_angle.dart';
 import 'package:fis_measure/process/primitives/polyline_angle.dart';
 import 'package:fis_measure/process/primitives/ray.dart';
 import 'package:fis_measure/process/primitives/ray.dart';
+import 'package:fis_measure/process/primitives/rvsp.dart';
 import 'package:fis_measure/process/primitives/single_straightline.dart';
 import 'package:fis_measure/process/primitives/single_straightline.dart';
 import 'package:fis_measure/process/primitives/spline.dart';
 import 'package:fis_measure/process/primitives/spline.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
@@ -92,9 +94,12 @@ class MeasureItemFactory {
         MeasureTypes.LvSimpleTissueTm, LvStudy.createLvSimpleTissueTm);
         MeasureTypes.LvSimpleTissueTm, LvStudy.createLvSimpleTissueTm);
 
 
     _singleton._register(MeasureTypes.LVdMass, LVMass.createLVdMass);
     _singleton._register(MeasureTypes.LVdMass, LVMass.createLVdMass);
+    _singleton._register(MeasureTypes.RVSP, Rvsp.createRvsp);
 
 
     // SV
     // SV
     _singleton._register(MeasureTypes.SV, Sv.createSV);
     _singleton._register(MeasureTypes.SV, Sv.createSV);
+    _singleton._register(MeasureTypes.QpQs, TwoSv.crateQpQs);
+    _singleton._register(MeasureTypes.MultiQpQs, TwoSv.crateQpQs);
 
 
     // Empty
     // Empty
     _singleton._register(MeasureTypes.Empty, Empty.createEmpty);
     _singleton._register(MeasureTypes.Empty, Empty.createEmpty);

+ 47 - 0
lib/process/primitives/combos/two_sv.dart

@@ -0,0 +1,47 @@
+import 'package:fis_measure/interfaces/process/items/item.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/process/calcuators/a_b_ratio.dart';
+import 'package:fis_measure/process/items/item_feature.dart';
+import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/items/top_item_feature.dart';
+import 'package:fis_measure/process/primitives/combos/sv.dart';
+
+import 'two_length.dart';
+
+class TwoSv extends TwoLengthAbstract<TwoSvFeature> {
+  late final Sv qp;
+  late final Sv qs;
+
+  TwoSv(super.meta) {
+    {
+      final metaQp = meta.childItems[0];
+      final metaQs = meta.childItems[1];
+      qp = Sv.createSV(metaQp, this);
+      qs = Sv.createSV(metaQs, this);
+      childItems.add(qp);
+      childItems.add(qs);
+    }
+  }
+
+  @override
+  MeasureItem<MeasureItemFeature> get child1 => qp;
+
+  @override
+  MeasureItem<MeasureItemFeature> get child2 => qs;
+
+  @override
+  TwoSvFeature buildFeature() => TwoSvFeature(this);
+
+  static TwoSv crateQpQs(ItemMeta meta, [IMeasureItem? parent]) {
+    var ins = TwoSv(meta);
+    ins.calculator = QpQsCal(ins);
+
+    return ins;
+  }
+}
+
+class TwoSvFeature extends TopMeasureItemFeature {
+  TwoSvFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 59 - 0
lib/process/primitives/rvsp.dart

@@ -0,0 +1,59 @@
+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_metas.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
+import 'package:fis_measure/process/calcuators/rvsp.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+import 'package:fis_measure/process/items/top_item_feature.dart';
+import 'package:fis_measure/process/primitives/empty.dart';
+import 'package:vid/us/vid_us_unit.dart';
+
+import 'location.dart';
+
+class Rvsp extends TopMeasureItem<RvspFeature> {
+  static const String tRVmaxKey = "TR Vmax";
+
+  late final Location tRVmax;
+  late final FloatValue _rap;
+
+  Rvsp(super.meta) {
+    final tRVmaxMeta = meta.getChildByName(tRVmaxKey)!;
+    tRVmax = Location.createVelocity(tRVmaxMeta, this);
+    childItems.add(tRVmax);
+
+    final rapOutputMeta =
+        ItemOutputMeta(MeasureTerms.RAP, "RAP", VidUsUnit.mmHg);
+    final rapMeta = ItemMeta(
+      MeasureTerms.RAP,
+      measureType: MeasureTerms.Placeholder,
+      description: "RAP",
+      outputs: [rapOutputMeta],
+    );
+    _rap = FloatValue(rapOutputMeta, 0, rapOutputMeta.unit);
+    final rapPlaceholder = Empty.createEmpty(rapMeta, this);
+    // childItems.add(rapPlaceholder);
+  }
+
+  FloatValue get rap => _rap;
+
+  @override
+  bool get repeatableEditable => false;
+
+  @override
+  RvspFeature buildFeature() => RvspFeature(this);
+
+  static Rvsp createRvsp(
+    ItemMeta meta, [
+    IMeasureItem? parent,
+  ]) {
+    Rvsp ins = Rvsp(meta);
+    ins.calculator = RvspCal(ins);
+    return ins;
+  }
+}
+
+class RvspFeature extends TopMeasureItemFeature {
+  RvspFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 6 - 0
lib/process/primitives/straightline.dart

@@ -58,6 +58,12 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
     return sraightLine;
     return sraightLine;
   }
   }
 
 
+  static StraightLine createLvDpDt(ItemMeta meta, [IMeasureItem? parent]) {
+    StraightLine sraightLine = StraightLine(meta, parent);
+    sraightLine.calculator = TimeSpanCal(sraightLine); // TODO
+    return sraightLine;
+  }
+
   @override
   @override
   bool onExecuteMouse(PointInfo args) {
   bool onExecuteMouse(PointInfo args) {
     if (state == ItemStates.finished) {
     if (state == ItemStates.finished) {