Forráskód Böngészése

update(measure): 完成 M 模式下的 TimeSpan

gavin.chen 2 éve
szülő
commit
5054203ba3

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

@@ -58,7 +58,25 @@ class MeasureTypes {
   /// 内膜检测
   static const String IntimaDetection = "Intima Detection";
 
-  /// M 模式(TissueTM)下的测量项 ///
+  /// M 模式(TissueTM)下的测量项
+  /// 见 Vinno.Modules.MeasureModule 内
+  /// ItemMetas\MeasureAppMetas.Config.cs
+  /// Line: 846-856
   /// 距离 TODO: 因为当前使用的是 switchItemByName ,所以此处name先不与普通Distance重复
   static const String VerticalDistance = "M_Distance";
+
+  /// 时间
+  static const String TimeSpen = "Time";
+
+  /// 心率
+  static const String Hr = "HR";
+
+  /// 狭窄率
+  static const String StenosisTwoVerticalDistance = "M_%Stenosis";
+
+  /// A/B比值 TODO ? See: Line: 858
+  // static const String CreateMAbRatio = "M_A/B Ratio";
+
+  /// 深度
+  static const String MDepth = "M_Depth";
 }

+ 1 - 0
lib/measure_page_test.dart

@@ -353,6 +353,7 @@ class _MeasureLeftBoardState extends State<_MeasureLeftBoard> {
   // ignore: non_constant_identifier_names
   static final C_SUPPORTED_M_ITEMS = <String>[
     MeasureTypes.VerticalDistance,
+    MeasureTypes.TimeSpen
   ];
 
   final scrollController = ScrollController();

+ 19 - 0
lib/process/calcuators/vertical_distance.dart → lib/process/calcuators/time_motion.dart

@@ -19,3 +19,22 @@ class VerticalDistanceCal extends Calculator<StraightLine, double> {
     updateFloatValue(value);
   }
 }
+
+class TimeSpanCal extends Calculator<StraightLine, double> {
+  TimeSpanCal(StraightLine ref) : super(ref);
+
+  @override
+  void calculate() {
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+    final viewport = feature.hostVisualArea!.viewport!;
+    final p1 = feature.startPoint;
+    final p2 = feature.endPoint;
+    final pp1 = viewport.convert(p1);
+    final pp2 = viewport.convert(p2);
+
+    final value = (pp2.x - pp1.x).abs();
+    updateFloatValue(value);
+  }
+}

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

@@ -85,6 +85,7 @@ class MeasureItemFactory {
     // TissueTM
     _singleton._register(
         MeasureTypes.VerticalDistance, StraightLine.createVerticalDistance);
+    _singleton._register(MeasureTypes.TimeSpen, StraightLine.createTimeSpan);
 
     //Ellipse
     _singleton._register(

+ 4 - 2
lib/process/items/item_feature.dart

@@ -202,8 +202,10 @@ abstract class MeasureItemFeature implements IMeasureItemFeature {
   }
 
   /// 画短横标记
-  void drawMark(Canvas canvas, Offset offset, [bool active = false]) {
-    canvas.drawMark(offset, vertexSize, active: active);
+  void drawMark(Canvas canvas, Offset offset,
+      [bool active = false, bool ifHorizontal = true]) {
+    canvas.drawMark(offset, vertexSize,
+        active: active, ifHorizontal: ifHorizontal);
   }
 
   /// 计算文本长度

+ 44 - 14
lib/process/primitives/straightline.dart

@@ -4,8 +4,9 @@ import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/items.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/types.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
-import 'package:fis_measure/process/calcuators/vertical_distance.dart';
+import 'package:fis_measure/process/calcuators/time_motion.dart';
 import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
@@ -34,6 +35,12 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
     return sraightLine;
   }
 
+  static StraightLine createTimeSpan(ItemMeta meta, [IMeasureItem? parent]) {
+    StraightLine sraightLine = StraightLine(meta, parent);
+    sraightLine.calculator = TimeSpanCal(sraightLine);
+    return sraightLine;
+  }
+
   @override
   bool onExecuteMouse(PointInfo args) {
     if (state == ItemStates.finished) {
@@ -100,17 +107,35 @@ class StraightLine extends MeasureItem<StraightLineFeature> {
     // TODO: 判断是否当前area
     // 转换为Area逻辑位置
     final point = args.toAreaLogicPoint();
-    feature = StraightLineFeature(this, point, point);
+    // feature = StraightLineFeature(this, point, point);
     if (args.hostVisualArea != null) {
-      if (args.hostVisualArea!.mode.modeType == VidUsModeType.TissueTM) {
-        feature = StraightLineTimeMotionFeature(this, point, point);
-        mouseState.crossIndicatorStyleChanged
-            .emit(this, CrossIndicatorStyle.horizontal);
-      }
+      handleTissueTM(args.hostVisualArea!.mode.modeType, point);
       feature!.hostVisualArea = args.hostVisualArea;
     }
     state = ItemStates.running;
   }
+
+  /// 处理TissueTimeMotion模式
+  void handleTissueTM(VidUsModeType mode, DPoint point) {
+    if (mode == VidUsModeType.TissueTM) {
+      switch (meta.measureType) {
+        case MeasureTypes.TimeSpen:
+          feature = StraightLineTimeMotionFeature(this, point, point,
+              ifHorizontal: false);
+          mouseState.crossIndicatorStyleChanged
+              .emit(this, CrossIndicatorStyle.vertical);
+          break;
+        case MeasureTypes.VerticalDistance:
+          feature = StraightLineTimeMotionFeature(this, point, point);
+          mouseState.crossIndicatorStyleChanged
+              .emit(this, CrossIndicatorStyle.horizontal);
+          break;
+        default:
+      }
+    } else {
+      feature = StraightLineFeature(this, point, point);
+    }
+  }
 }
 
 class StraightLineFeature extends MeasureItemFeature {
@@ -152,10 +177,10 @@ class StraightLineFeature extends MeasureItemFeature {
 
 class StraightLineTimeMotionFeature extends StraightLineFeature {
   StraightLineTimeMotionFeature(
-    IMeasureItem refItem,
-    DPoint startPoint,
-    DPoint endPoint,
-  ) : super(refItem, startPoint, endPoint);
+      IMeasureItem refItem, DPoint startPoint, DPoint endPoint,
+      {this.ifHorizontal = true})
+      : super(refItem, startPoint, endPoint);
+  final bool ifHorizontal;
   @override
   void paint(Canvas canvas, Size size) {
     if (startPoint == endPoint) return;
@@ -163,9 +188,14 @@ class StraightLineTimeMotionFeature extends StraightLineFeature {
     drawId(canvas, size, idText);
 
     final startOffset = convert2ViewPoint(size, startPoint).toOffset();
-    drawMark(canvas, startOffset);
-
     final endOffset = convert2ViewPoint(size, endPoint).toOffset();
-    drawMark(canvas, Offset(startOffset.dx, endOffset.dy), isActive);
+    if (ifHorizontal) {
+      drawMark(canvas, startOffset);
+      drawMark(canvas, Offset(startOffset.dx, endOffset.dy), isActive);
+    } else {
+      drawMark(canvas, startOffset, false, ifHorizontal);
+      drawMark(
+          canvas, Offset(endOffset.dx, startOffset.dy), isActive, ifHorizontal);
+    }
   }
 }

+ 14 - 0
lib/process/workspace/application.dart

@@ -622,6 +622,20 @@ class Application implements IApplication {
       );
       return;
     }
+    if (name == MeasureTypes.TimeSpen) {
+      activeMeasureItem = MeasureItemFactory.createItem(
+        ItemMeta(
+          MeasureTypes.TimeSpen,
+          measureType: MeasureTypes.TimeSpen,
+          description: MeasureTypes.TimeSpen,
+          outputs: [
+            ItemOutputMeta(
+                MeasureTypes.TimeSpen, MeasureTypes.TimeSpen, VidUsUnit.s),
+          ],
+        ),
+      );
+      return;
+    }
     print("Unknown measure type: $name");
     activeMeasureItem = null;
   }

+ 9 - 2
lib/utils/canvas.dart

@@ -261,18 +261,25 @@ extension MeasureCanvasExt on Canvas {
     ..isAntiAlias = false;
 
   ///绘制短横标记
+  ///ifHorizontal true:横向标记 false:纵向标记
   void drawMark(
     Offset offset,
     double size, {
     bool active = false,
+    bool ifHorizontal = true,
   }) {
     final radius = size / 3.0;
     double x = offset.dx, y = offset.dy;
     save();
     final path = Path();
     // top_left -> bottom_right
-    path.moveTo(x - radius, y);
-    path.lineTo(x + radius, y);
+    if (ifHorizontal) {
+      path.moveTo(x - radius, y);
+      path.lineTo(x + radius, y);
+    } else {
+      path.moveTo(x, y - radius);
+      path.lineTo(x, y + radius);
+    }
 
     _markPaint.color =
         active ? MeasureColors.ActiveCaliper : MeasureColors.Primary;