Explorar el Código

fix some measure issues

Melon hace 10 meses
padre
commit
9fd35f75e6

+ 3 - 0
lib/interfaces/process/items/item.dart

@@ -85,6 +85,9 @@ abstract class ITopMeasureItem implements IMeasureItem {
   /// 是否允许子项自行输出
   bool get canChildOutputSelf;
 
+  /// 是否跨区域测量模式
+  bool get isCrossAreaMode;
+
   /// 工作子项变更事件
   late final FEventHandler<int> workingChildChanged;
 

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

@@ -53,6 +53,7 @@ class MeasureTypes {
   static const DepthToBaseLine = "DepthToBaseLine";
   static const AutoVesselDiam = "AutoVesselDiam";
   static const MultipleVesselDiam = "MultipleVesselDiam";
+  static const PISA = "PISA";
 /* Length [end]*/
 
 /* Area Perimeter [begin] */
@@ -145,7 +146,7 @@ class MeasureTypes {
   static const SemiManualTrace = "SemiManualTrace";
   static const DopplerTrace = "DopplerTrace";
   static const SlopeDoppler = "SlopeDoppler";
-  static const SV = "SV";
+  static const SV = "Sv";
   static const QpQs = "QpQs";
   static const MultiQpQs = "MultiQpQs";
   static const LvDpDt = "LvDpDt";

+ 16 - 0
lib/process/calcuators/pisa.dart

@@ -0,0 +1,16 @@
+import 'package:fis_measure/process/primitives/combos/pisa.dart';
+
+import 'calculator.dart';
+
+class PisaCal extends Calculator<Pisa, double> {
+  PisaCal(super.ref);
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+
+    //
+  }
+}

+ 3 - 3
lib/process/calcuators/sv.dart

@@ -63,9 +63,9 @@ class SvCal extends Calculator<Sv, double> {
         if (output.name == MeasureTerms.SV_Trace) {
           // feature.updateStringValue(output, '', VidUsUnit.None);
         } else if (output.name == MeasureTerms.VTI) {
-          if (vti != null) {
-            feature.updateFloatValue(output, vti, VidUsUnit.cm);
-          }
+          // if (vti != null) {
+          //   feature.updateFloatValue(output, vti, VidUsUnit.cm);
+          // }
         } else if (output.name == MeasureTerms.HeartRate) {
           if (hr != null) {
             feature.updateFloatValue(output, hr.toDouble(), VidUsUnit.HR);

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

@@ -10,6 +10,7 @@ import 'package:fis_measure/process/primitives/combos/flow_area_vti.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/lv_study.dart';
+import 'package:fis_measure/process/primitives/combos/pisa.dart';
 import 'package:fis_measure/process/primitives/combos/simpson.dart';
 import 'package:fis_measure/process/primitives/combos/sv.dart';
 import 'package:fis_measure/process/primitives/combos/three_ray.dart';
@@ -117,6 +118,7 @@ class MeasureItemFactory {
     _singleton._register(MeasureTypes.FlowVol, Sv.createFlowVol);
     _singleton._register(
         MeasureTypes.FlowAreaByVTI, FlowAreaByVti.createFlowAreaByVti);
+    _singleton._register(MeasureTypes.PISA, Pisa.createPisa);
 
     // Empty
     _singleton._register(MeasureTypes.Empty, Empty.createEmpty);

+ 7 - 0
lib/process/items/top_item.dart

@@ -13,6 +13,8 @@ abstract class TopMeasureItem<T extends MeasureItemFeature>
   final List<IMeasureItem> _childItems = [];
   int _childIndex = 0;
   bool _isCrossFrameMode = false;
+  bool _isCrossAreaMode = false;
+
   bool _canChildOutputSelf = true;
 
   bool get ifAutoStart => false;
@@ -52,6 +54,11 @@ abstract class TopMeasureItem<T extends MeasureItemFeature>
   bool get canChildOutputSelf => _canChildOutputSelf;
   set canChildOutputSelf(bool val) => _canChildOutputSelf = val;
 
+  @override
+  bool get isCrossAreaMode => _isCrossAreaMode;
+  @protected
+  set isCrossAreaMode(bool val) => _isCrossAreaMode = val;
+
   @override
   late final FEventHandler<int> workingChildChanged;
 

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

@@ -21,6 +21,7 @@ class FlowAreaByVti extends TopMeasureItem<FlowAreaByVtiFeature> {
     childItems.add(l);
     childItems.add(trace1);
     childItems.add(trace2);
+    isCrossAreaMode = true;
   }
 
   @override

+ 2 - 0
lib/process/primitives/combos/lv_mass.dart

@@ -27,6 +27,8 @@ class LVMass extends TopMeasureItem<LVMassFeature> {
     childItems.add(epi);
     childItems.add(endo);
     childItems.add(l);
+
+    isCrossAreaMode = true;
   }
 
   @override

+ 39 - 0
lib/process/primitives/combos/pisa.dart

@@ -0,0 +1,39 @@
+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/pisa.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+import 'package:fis_measure/process/items/top_item_feature.dart';
+
+import '../multi_method/multiple_trace.dart';
+import '../straightline.dart';
+
+class Pisa extends TopMeasureItem<PisaFeature> {
+  late final StraightLine radius;
+  late final MultiTrace trace;
+
+  Pisa(super.meta) {
+    final metaRadius = meta.childItems[0];
+    final metaTrace = meta.childItems[1];
+    radius = StraightLine.createDistance(metaRadius, this);
+    trace = MultiTrace.createTrace(metaTrace, this);
+    childItems.add(radius);
+    childItems.add(trace);
+    isCrossAreaMode = true;
+    // canChildOutputSelf = false;
+  }
+
+  @override
+  PisaFeature buildFeature() => PisaFeature(this);
+
+  static Pisa createPisa(ItemMeta meta, [IMeasureItem? parent]) {
+    var pisa = Pisa(meta);
+    pisa.calculator = PisaCal(pisa);
+    return pisa;
+  }
+}
+
+class PisaFeature extends TopMeasureItemFeature {
+  PisaFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 2 - 0
lib/process/primitives/combos/sv.dart

@@ -19,6 +19,8 @@ class Sv extends TopMeasureItem<SvFeature> {
     trace = MultiTrace.createTrace(metaTA, this);
     childItems.add(l);
     childItems.add(trace);
+    isCrossAreaMode = true;
+    // canChildOutputSelf = false;
   }
 
   @override

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

@@ -20,6 +20,7 @@ class TwoSv extends TwoLengthAbstract<TwoSvFeature> {
       qs = Sv.createSV(metaQs, this);
       childItems.add(qp);
       childItems.add(qs);
+      isCrossAreaMode = true;
     }
   }
 

+ 15 - 3
lib/process/workspace/application.dart

@@ -619,18 +619,30 @@ class Application implements IApplication {
       }
     }
     if (needSwitch) {
-      _changeAcitveArea(area);
+      bool shouldNotifiyUI = true;
+
+      if (activeMeasureItem != null && activeMeasureItem! is ITopMeasureItem) {
+        final topItem = activeMeasureItem as ITopMeasureItem;
+        if (topItem.isCrossAreaMode) {
+          // 跨区域测量的组合项,不允许UI切换模式
+          shouldNotifiyUI = false;
+        }
+      }
+
+      _changeAcitveArea(area, shouldNotifiyUI);
       return true;
     }
 
     return false;
   }
 
-  void _changeAcitveArea(IVisualArea area) {
+  void _changeAcitveArea(IVisualArea area, [bool shouldNotifiyUI = true]) {
     for (var visual in visuals) {
       visual.setUnAcitve();
     }
     area.isActive = true;
-    visualAreaChanged.emit(this, area);
+    if (shouldNotifiyUI) {
+      visualAreaChanged.emit(this, area);
+    }
   }
 }