Melon 11 сар өмнө
parent
commit
63e2f4690a

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

@@ -266,6 +266,7 @@ class MeasureTerms {
 
   /// 左心室心功能测量
   static const LvStudy = "LV Study";
+  static const LvStudySimple = "LV Study(Simple)";
 
   /// Body Surface Area
   /// 体表面积
@@ -461,6 +462,12 @@ class MeasureTerms {
   /// 二尖瓣有效返流口面积
   static const MREROA = "MR EROA";
 
+  /// 二尖瓣口面积
+  static const PercentMAM = "MAM%";
+
+  /// 二尖瓣环平面收缩期偏移
+  static const MAPSE = "MAPSE";
+
   /// 顺应系数
   static const PWVCC = "CC";
 

+ 4 - 1
lib/interfaces/process/items/types.dart

@@ -5,8 +5,10 @@
 class MeasureTypes {
   MeasureTypes._();
 
-  /// LV Study 线段组(B mode)
+  /// LV Study
   static const LvStudyByLineGroupTissue = 'LvStudyByLineGroupTissue';
+  static const LvSimpleTissue = "LvSimpleTissue";
+  static const LvSimpleTissueTm = "LvSimpleTissueTm";
 
   /// 空类型,用于结束测量
   static const Empty = 'Empty';
@@ -96,6 +98,7 @@ class MeasureTypes {
 /* Three StraightLine  [begin] */
   static const ThreeDistanceMean = "ThreeDistanceMean";
   static const ThreeDistanceMax = "ThreeDistanceMax";
+  static const ThreeVerticalDistance = "ThreeVerticalDistance";
 /* Three StraightLine  [end] */
 
 /* Two StraightLine  [begin] */

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

@@ -156,4 +156,9 @@ class CardiacFormulas {
   static double lvpwPercent(double lvpws, double lvpwd) {
     return ((lvpws - lvpwd) / lvpwd) * 100;
   }
+
+  /// MAM%
+  static double mamPercent(double mapse, double lvidd, double lvids) {
+    return mapse / (lvidd - lvids + mapse) * 100;
+  }
 }

+ 143 - 71
lib/process/calcuators/lv_study.dart

@@ -1,23 +1,70 @@
 import 'package:fis_measure/configs/cardiac.dart';
 import 'package:fis_measure/configs/patient.dart';
 import 'package:fis_measure/interfaces/enums/calcuator.dart';
+import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/terms.dart';
-import 'package:fis_measure/process/primitives/combos/straightline_group.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+import 'package:fis_measure/process/primitives/combos/lv_study.dart';
+import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
+import 'package:flutter/foundation.dart';
 import 'package:vid/us/vid_us_unit.dart';
 import 'dart:math' as math;
 
 import 'calculator.dart';
 import 'formulas/cardiac.dart';
 
-class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
+class LvStudySimpleCal extends LvStudyCalculatorBase<LvStudy> {
+  late final StraightLine kidLVIDd;
+  late final StraightLine kidLVIDs;
+
+  LvStudySimpleCal(super.ref) {
+    kidLVIDd = ref.findChildByName("L1") as StraightLine;
+    kidLVIDs = ref.findChildByName("L2") as StraightLine;
+  }
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+
+    v = _ValTemp();
+    v.lvidd = pickChildFloatValue(kidLVIDd);
+    v.lvids = pickChildFloatValue(kidLVIDs);
+
+    for (var output in ref.meta.outputs) {
+      switch (output.name) {
+        case MeasureTerms.LvStudySimple:
+          feature.updateStringValue(output, "");
+          break;
+        case MeasureTerms.LVEDV:
+          updateLVEDV();
+          break;
+        case MeasureTerms.LVESV:
+          updateLVESV();
+          break;
+        case MeasureTerms.SV:
+          updateSV();
+          break;
+        case MeasureTerms.EF:
+          updateEF();
+          break;
+        case MeasureTerms.FS:
+          updatePercentFS();
+          break;
+      }
+    }
+  }
+}
+
+class LvStudyDistanceGroupCal extends LvStudyCalculatorBase<LvStudy> {
   late final StraightLine kidIVSd;
   late final StraightLine kidLVIDd;
   late final StraightLine kidLVPWd;
   late final StraightLine kidIVSs;
   late final StraightLine kidLVIDs;
   late final StraightLine kidLVPWs;
-  late _ValTemp _v;
 
   LvStudyDistanceGroupCal(super.ref) {
     kidIVSd = ref.findChildByName(MeasureTerms.IVSd) as StraightLine;
@@ -34,13 +81,13 @@ class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
 
     final feature = ref.feature!;
 
-    _v = _ValTemp();
-    _v.ivsd = pickChildFloatValue(kidIVSd);
-    _v.ivss = pickChildFloatValue(kidIVSs);
-    _v.lvidd = pickChildFloatValue(kidLVIDd);
-    _v.lvids = pickChildFloatValue(kidLVIDs);
-    _v.lvpwd = pickChildFloatValue(kidLVPWd);
-    _v.lvpws = pickChildFloatValue(kidLVPWs);
+    v = _ValTemp();
+    v.ivsd = pickChildFloatValue(kidIVSd);
+    v.ivss = pickChildFloatValue(kidIVSs);
+    v.lvidd = pickChildFloatValue(kidLVIDd);
+    v.lvids = pickChildFloatValue(kidLVIDs);
+    v.lvpwd = pickChildFloatValue(kidLVPWd);
+    v.lvpws = pickChildFloatValue(kidLVPWs);
 
     for (var output in ref.meta.outputs) {
       switch (output.name) {
@@ -48,47 +95,61 @@ class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
           feature.updateStringValue(output, "");
           break;
         case MeasureTerms.LVEDV:
-          _updateLVEDV();
+          updateLVEDV();
           break;
         case MeasureTerms.LVESV:
-          _updateLVESV();
+          updateLVESV();
           break;
         case MeasureTerms.LVdMass:
-          _updateLVdMass();
+          updateLVdMass();
           break;
         case MeasureTerms.PercentIVS:
-          _updatePercentIVS();
+          updatePercentIVS();
           break;
         case MeasureTerms.SV:
-          _updateSV();
+          updateSV();
           break;
         case MeasureTerms.EF:
-          _updateEF();
+          updateEF();
           break;
         case MeasureTerms.FS:
-          _updatePercentFS();
+          updatePercentFS();
           break;
         case MeasureTerms.PercentLVPW:
-          _updatePercentLVPW();
+          updatePercentLVPW();
           break;
         case MeasureTerms.CO:
-          _updateCO();
+          updateCO();
           break;
         case MeasureTerms.CI:
-          _updateCI();
+          updateCI();
           break;
         case MeasureTerms.SI:
-          _updateSI();
+          updateSI();
           break;
       }
     }
   }
+}
+
+class LvStudyCalculatorBase<T extends TopMeasureItem>
+    extends Calculator<T, double> {
+  LvStudyCalculatorBase(super.ref);
+
+  @protected
+  late _ValTemp v;
+
+  @override
+  void calculate() {
+    // TODO: implement calculate
+  }
 
-  void _updateLVEDV() {
-    if (_v.lvidd == null) {
+  @protected
+  void updateLVEDV() {
+    if (v.lvidd == null) {
       return;
     }
-    final lvidd = _v.lvidd!;
+    final lvidd = v.lvidd!;
 
     double value = 0;
     if (GlobalCardiacConfigs.EDVFormulaMode ==
@@ -98,15 +159,16 @@ class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
         CardiacEDVFormulaMode.cube) {
       value = CardiacFormulas.edvCube(lvidd);
     }
-    _updateFloatValueByName(MeasureTerms.LVEDV, value, unit: VidUsUnit.cm3);
-    _v.lvedv = value;
+    updateFloatValueByName(MeasureTerms.LVEDV, value, unit: VidUsUnit.cm3);
+    v.lvedv = value;
   }
 
-  void _updateLVESV() {
-    if (_v.lvids == null) {
+  @protected
+  void updateLVESV() {
+    if (v.lvids == null) {
       return;
     }
-    final lvids = _v.lvids!;
+    final lvids = v.lvids!;
 
     double value = 0;
     if (GlobalCardiacConfigs.EDVFormulaMode ==
@@ -116,97 +178,107 @@ class LvStudyDistanceGroupCal extends Calculator<StraightLineGroup, double> {
         CardiacEDVFormulaMode.cube) {
       value = CardiacFormulas.esvCube(lvids);
     }
-    _updateFloatValueByName(MeasureTerms.LVESV, value, unit: VidUsUnit.cm3);
-    _v.lvesv = value;
+    updateFloatValueByName(MeasureTerms.LVESV, value, unit: VidUsUnit.cm3);
+    v.lvesv = value;
   }
 
-  void _updateLVdMass() {
-    if (_v.ivsd == null || _v.lvidd == null || _v.lvpwd == null) {
+  @protected
+  void updateLVdMass() {
+    if (v.ivsd == null || v.lvidd == null || v.lvpwd == null) {
       return;
     }
 
-    double value = CardiacFormulas.lvdMass(_v.ivsd!, _v.lvidd!, _v.lvpwd!);
-    _updateFloatValueByName(MeasureTerms.LVdMass, value, unit: VidUsUnit.kg);
+    double value = CardiacFormulas.lvdMass(v.ivsd!, v.lvidd!, v.lvpwd!);
+    updateFloatValueByName(MeasureTerms.LVdMass, value, unit: VidUsUnit.kg);
   }
 
-  void _updatePercentIVS() {
-    if (_v.ivsd == null || _v.ivss == null) {
+  @protected
+  void updatePercentIVS() {
+    if (v.ivsd == null || v.ivss == null) {
       return;
     }
-    double value = CardiacFormulas.ivsPercent(_v.ivss!, _v.ivsd!);
-    _updateFloatValueByName(MeasureTerms.PercentIVS, value);
+    double value = CardiacFormulas.ivsPercent(v.ivss!, v.ivsd!);
+    updateFloatValueByName(MeasureTerms.PercentIVS, value);
   }
 
-  void _updateSV() {
-    if (_v.lvedv == null || _v.lvesv == null) {
+  @protected
+  void updateSV() {
+    if (v.lvedv == null || v.lvesv == null) {
       return;
     }
-    final edv = _v.lvedv!;
-    final esv = _v.lvesv!;
+    final edv = v.lvedv!;
+    final esv = v.lvesv!;
     double value = CardiacFormulas.sv(edv, esv);
-    _updateFloatValueByName(MeasureTerms.SV, value, unit: VidUsUnit.cm3);
-    _v.sv = value;
+    updateFloatValueByName(MeasureTerms.SV, value, unit: VidUsUnit.cm3);
+    v.sv = value;
   }
 
-  void _updateEF() {
-    if (_v.lvedv == null || _v.lvesv == null) {
+  @protected
+  void updateEF() {
+    if (v.lvedv == null || v.lvesv == null) {
       return;
     }
-    final edv = _v.lvedv!;
-    final esv = _v.lvesv!;
+    final edv = v.lvedv!;
+    final esv = v.lvesv!;
     double value = CardiacFormulas.ef(edv, esv);
-    _updateFloatValueByName(MeasureTerms.EF, value);
+    updateFloatValueByName(MeasureTerms.EF, value);
   }
 
-  void _updatePercentFS() {
-    if (_v.lvidd == null || _v.lvids == null) {
+  @protected
+  void updatePercentFS() {
+    if (v.lvidd == null || v.lvids == null) {
       return;
     }
-    final lvidd = _v.lvidd!;
-    final lvids = _v.lvids!;
+    final lvidd = v.lvidd!;
+    final lvids = v.lvids!;
     double value = CardiacFormulas.fsPercent(lvidd, lvids);
-    _updateFloatValueByName(MeasureTerms.FS, value);
+    updateFloatValueByName(MeasureTerms.FS, value);
   }
 
-  void _updatePercentLVPW() {
-    if (_v.lvpws == null || _v.lvpwd == null) {
+  @protected
+  void updatePercentLVPW() {
+    if (v.lvpws == null || v.lvpwd == null) {
       return;
     }
-    final lvpws = _v.lvpws!;
-    final lvpwd = _v.lvpwd!;
+    final lvpws = v.lvpws!;
+    final lvpwd = v.lvpwd!;
     double value = CardiacFormulas.lvpwPercent(lvpws, lvpwd);
-    _updateFloatValueByName(MeasureTerms.PercentLVPW, value);
+    updateFloatValueByName(MeasureTerms.PercentLVPW, value);
   }
 
-  void _updateCO() {
-    if (_v.sv == null || _v.hr == null) {
+  @protected
+  void updateCO() {
+    if (v.sv == null || v.hr == null) {
       return;
     }
-    double value = CardiacFormulas.co(_v.sv!, hr: _v.hr!);
-    _updateFloatValueByName(MeasureTerms.CO, value);
+    double value = CardiacFormulas.co(v.sv!, hr: v.hr!);
+    updateFloatValueByName(MeasureTerms.CO, value);
   }
 
-  void _updateCI() {
-    if (_v.sv == null || _v.hr == null) {
+  @protected
+  void updateCI() {
+    if (v.sv == null || v.hr == null) {
       return;
     }
     if (GlobalPatientConfig.bsa == 0) {
       return;
     }
     double value = CardiacFormulas.ci(
-      _v.sv!,
-      hr: _v.hr!,
+      v.sv!,
+      hr: v.hr!,
       bsa: GlobalPatientConfig.bsa,
     );
-    _updateFloatValueByName(MeasureTerms.CI, value);
+    updateFloatValueByName(MeasureTerms.CI, value);
   }
 
-  void _updateSI() {
+  @protected
+  void updateSI() {
     //_updateSI
     // TODO:
   }
 
-  void _updateFloatValueByName(
+  @protected
+  void updateFloatValueByName(
     String name,
     double value, {
     VidUsUnit? unit,

+ 27 - 0
lib/process/calcuators/three_distance.dart

@@ -8,6 +8,7 @@ import 'package:fis_measure/process/primitives/straightline.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import 'calculator.dart';
+import 'formulas/cardiac.dart';
 import 'formulas/obstetrics.dart';
 
 class VolumeThreeDistanceCal extends Calculator<LWHStraightLine, double> {
@@ -77,3 +78,29 @@ class ThreeDistMaxCalculator extends Calculator<LWHStraightLine, double> {
     updateFloatValue(gs, unit: VidUsUnit.cm, useRound: true);
   }
 }
+
+class PercentMAMCalculator extends Calculator<LWHStraightLine, double> {
+  PercentMAMCalculator(LWHStraightLine ref) : super(ref);
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+
+    final l = findChildFeature(ref.l);
+    final w = findChildFeature(ref.w);
+    final h = findChildFeature(ref.h);
+    if (l == null && w == null && h == null) return;
+
+    double? mapse;
+    double? lvidd;
+    double? lvids;
+    if (l != null) mapse = l.value?.pickFloat() ?? 0;
+    if (w != null) lvidd = w.value?.pickFloat() ?? 0;
+    if (h != null) lvids = h.value?.pickFloat() ?? 0;
+
+    if (mapse != null && lvidd != null && lvids != null) {
+      double mam = CardiacFormulas.mamPercent(mapse, lvidd, lvids);
+      updateFloatValue(mam, unit: VidUsUnit.percent);
+    }
+  }
+}

+ 9 - 2
lib/process/items/factory.dart

@@ -8,7 +8,7 @@ import 'package:fis_measure/process/primitives/combos/area_straightline.dart';
 import 'package:fis_measure/process/primitives/combos/depth2baseline.dart';
 import 'package:fis_measure/process/primitives/combos/lv_mass.dart';
 import 'package:fis_measure/process/primitives/combos/lwh_straightline.dart';
-import 'package:fis_measure/process/primitives/combos/straightline_group.dart';
+import 'package:fis_measure/process/primitives/combos/lv_study.dart';
 import 'package:fis_measure/process/primitives/combos/three_ray.dart';
 import 'package:fis_measure/process/primitives/combos/two_area.dart';
 import 'package:fis_measure/process/primitives/combos/two_location.dart';
@@ -83,8 +83,13 @@ class MeasureItemFactory {
 
   static void _registerItemCreators() {
     // Cardiac
+    _singleton._register(MeasureTypes.LvStudyByLineGroupTissue,
+        LvStudy.createLvStudyByLineGroup);
     _singleton._register(
-        MeasureTypes.LvStudyByLineGroupTissue, StraightLineGroup.createLvStudy);
+        MeasureTypes.LvSimpleTissue, LvStudy.createLvSimpleTissue);
+    _singleton._register(
+        MeasureTypes.LvSimpleTissueTm, LvStudy.createLvSimpleTissueTm);
+
     _singleton._register(MeasureTypes.LVdMass, LVMass.createLVdMass);
 
     // Empty
@@ -116,6 +121,8 @@ class MeasureItemFactory {
     _singleton._register(
         MeasureTypes.VolumeTwoDistance, TwoStraightLine.createVolume);
     _singleton._register(MeasureTypes.VolumeEllipse, Ellipse.createVolume);
+    _singleton._register(MeasureTypes.ThreeVerticalDistance,
+        LWHStraightLine.createThreeVerticalDistance);
 
     // Two Area
     _singleton._register(MeasureTypes.StenosisTwoArea, TwoArea.crateStenosis);

+ 69 - 0
lib/process/primitives/combos/lv_study.dart

@@ -0,0 +1,69 @@
+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/types.dart';
+import 'package:fis_measure/process/calcuators/lv_study.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/straightline.dart';
+
+class LvStudy extends TopMeasureItem<StraightLineGroupFeature> {
+  final bool ifVertical;
+  final bool ifTimeSpan;
+
+  LvStudy(ItemMeta meta, {this.ifVertical = false, this.ifTimeSpan = false})
+      : super(meta) {
+    for (final childMeta in meta.childItems) {
+      IMeasureItem childItem;
+      if (ifVertical) {
+        childItem = StraightLine.createVerticalDistance(childMeta, this);
+      } else if (ifTimeSpan) {
+        childItem = StraightLine.createTimeSpan(childMeta, this);
+      } else {
+        childItem = StraightLine.createDistance(childMeta, this);
+      }
+      childItems.add(childItem);
+    }
+  }
+
+  @override
+  bool get finishAfterUnactive => true;
+
+  @override
+  bool get isCrossFrameMode => true;
+
+  @override
+  StraightLineGroupFeature buildFeature() => StraightLineGroupFeature(this);
+
+  static LvStudy createLvStudyByLineGroup(ItemMeta meta,
+      [IMeasureItem? parent]) {
+    if (meta.measureType != MeasureTypes.LvStudyByLineGroupTissue) {
+      throw ArgumentError();
+    }
+    var ins = LvStudy(meta);
+    ins.calculator = LvStudyDistanceGroupCal(ins);
+
+    return ins;
+  }
+
+  static LvStudy createLvSimpleTissue(ItemMeta meta, [IMeasureItem? parent]) {
+    var ins = LvStudy(meta);
+    ins.calculator = LvStudySimpleCal(ins);
+    return ins;
+  }
+
+  static LvStudy createLvSimpleTissueTm(ItemMeta meta, [IMeasureItem? parent]) {
+    var ins = LvStudy(
+      meta,
+      ifTimeSpan: true,
+      ifVertical: true,
+    );
+    ins.calculator = LvStudySimpleCal(ins);
+    return ins;
+  }
+}
+
+class StraightLineGroupFeature extends TopMeasureItemFeature {
+  StraightLineGroupFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 46 - 5
lib/process/primitives/combos/lwh_straightline.dart

@@ -2,15 +2,19 @@ import 'dart:ui';
 
 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/interfaces/process/items/types.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/three_distance.dart';
+import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/process/items/item_feature.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/straightline.dart';
 
-class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
+import 'three_children.dart';
+
+class LWHStraightLine extends ThreeChildrenAbstract<LWHStraightlineFeature> {
   static const String _lineLKey = "L";
   static const String _lineWKey = "W";
   static const String _lineHKey = "H";
@@ -18,14 +22,30 @@ class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
   late final StraightLine l;
   late final StraightLine w;
   late final StraightLine h;
+  final bool ifVertical;
+  final bool ifTimeSpan;
 
-  LWHStraightLine(ItemMeta meta) : super(meta) {
+  LWHStraightLine(ItemMeta meta,
+      {this.ifVertical = false, this.ifTimeSpan = false})
+      : super(meta) {
     final metaL = meta.getChildByName(_lineLKey)!;
     final metaH = meta.getChildByName(_lineHKey)!;
     final metaW = meta.getChildByName(_lineWKey)!;
-    l = StraightLine.createDistance(metaL, this);
-    w = StraightLine.createDistance(metaW, this);
-    h = StraightLine.createDistance(metaH, this);
+
+    if (ifVertical) {
+      l = StraightLine.createVerticalDistance(metaL, this);
+      w = StraightLine.createVerticalDistance(metaW, this);
+      h = StraightLine.createVerticalDistance(metaH, this);
+    } else if (ifTimeSpan) {
+      l = StraightLine.createTimeSpan(metaL, this);
+      w = StraightLine.createTimeSpan(metaW, this);
+      h = StraightLine.createTimeSpan(metaH, this);
+    } else {
+      l = StraightLine.createDistance(metaL, this);
+      w = StraightLine.createDistance(metaW, this);
+      h = StraightLine.createDistance(metaH, this);
+    }
+
     childItems.add(l);
     childItems.add(w);
     childItems.add(h);
@@ -34,6 +54,15 @@ class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
   @override
   bool get finishAfterUnactive => true;
 
+  @override
+  MeasureItem<MeasureItemFeature> get child1 => l;
+
+  @override
+  MeasureItem<MeasureItemFeature> get child2 => w;
+
+  @override
+  MeasureItem<MeasureItemFeature> get child3 => h;
+
   @override
   LWHStraightlineFeature buildFeature() => LWHStraightlineFeature(this);
 
@@ -66,6 +95,18 @@ class LWHStraightLine extends TopMeasureItem<LWHStraightlineFeature> {
     lwh.calculator = ThreeDistMaxCalculator(lwh);
     return lwh;
   }
+
+  static LWHStraightLine createThreeVerticalDistance(ItemMeta meta,
+      [IMeasureItem? parent]) {
+    if (meta.measureType != MeasureTypes.ThreeVerticalDistance) {
+      throw ArgumentError();
+    }
+    var lwh = LWHStraightLine(meta);
+    if (meta.name == MeasureTerms.PercentMAM) {
+      lwh.calculator = PercentMAMCalculator(lwh);
+    }
+    return lwh;
+  }
 }
 
 class LWHStraightlineFeature extends TopMeasureItemFeature {

+ 0 - 40
lib/process/primitives/combos/straightline_group.dart

@@ -1,40 +0,0 @@
-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/types.dart';
-import 'package:fis_measure/process/calcuators/lv_study.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/straightline.dart';
-
-class StraightLineGroup extends TopMeasureItem<StraightLineGroupFeature> {
-  StraightLineGroup(ItemMeta meta) : super(meta) {
-    for (final childMeta in meta.childItems) {
-      final childItem = StraightLine.createDistance(childMeta, this);
-      childItems.add(childItem);
-    }
-  }
-
-  @override
-  bool get finishAfterUnactive => true;
-
-  @override
-  StraightLineGroupFeature buildFeature() => StraightLineGroupFeature(this);
-
-  static StraightLineGroup createLvStudy(ItemMeta meta,
-      [IMeasureItem? parent]) {
-    if (meta.measureType != MeasureTypes.LvStudyByLineGroupTissue) {
-      throw ArgumentError();
-    }
-    var ins = StraightLineGroup(meta);
-    ins.isCrossFrameMode = true;
-    ins.calculator = LvStudyDistanceGroupCal(ins);
-
-    return ins;
-  }
-}
-
-class StraightLineGroupFeature extends TopMeasureItemFeature {
-  StraightLineGroupFeature(
-    ITopMeasureItem refItem,
-  ) : super(refItem);
-}

+ 16 - 0
lib/process/primitives/combos/three_children.dart

@@ -0,0 +1,16 @@
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/items/item_feature.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+
+abstract class ThreeChildrenAbstract<T extends MeasureItemFeature>
+    extends TopMeasureItem<T> {
+  ThreeChildrenAbstract(ItemMeta meta) : super(meta);
+
+  MeasureItem get child1;
+  MeasureItem get child2;
+  MeasureItem get child3;
+
+  @override
+  bool get finishAfterUnactive => true;
+}

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

@@ -1,6 +1,5 @@
 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/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/a_b_ratio.dart';
 import 'package:fis_measure/process/calcuators/stenosis.dart';
 import 'package:fis_measure/process/calcuators/tei_index.dart';