Browse Source

Merge branch 'master' of http://git.ius.plus:88/Project-Wing/fis_lib_measure

gavin.chen 9 months ago
parent
commit
3625d240b7

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

@@ -120,6 +120,8 @@ class MeasureTerms {
   static const MaxPos = "MaxPos";
   static const MinPos = "MinPos";
 
+  static const URMPerfusionIndex = "Perfusion Index";
+
   ///////////////////////////////////////////////////////////////////////////////////////////////////////
 
   /* AI [begin]*/

+ 15 - 20
lib/process/calcuators/urm_calcuators/urm_trace_perfusion.dart

@@ -3,11 +3,12 @@ import 'package:fis_jsonrpc/rpc.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_trace_measure.dart';
 import 'package:fis_measure/process/primitives/urm_measure/urm_trace_measure.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
-import 'package:vid/us/vid_us_unit.dart';
 import 'dart:ui' as ui;
 import 'dart:convert';
 import 'dart:typed_data';
 
+import 'package:vid/us/vid_us_unit.dart';
+
 class URMTracePerfusionCal extends URMTraceMeasureCal {
   URMTracePerfusionCal(super.ref);
 
@@ -25,7 +26,7 @@ class URMTracePerfusionCal extends URMTraceMeasureCal {
       // 添加入参
       List<UrmPoint> srcDPoints = [];
       for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
+        srcDPoints.add(urmApplication.localToView(point));
       }
 
       URMMeasureProcessResult? outresult =
@@ -39,22 +40,20 @@ class URMTracePerfusionCal extends URMTraceMeasureCal {
       }
       final feature = ref.feature!;
 
-      /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-      // if (ref.meta.outputs.isNotEmpty) {
-      // final first = ref.meta.outputs.first;
-      // first.unit = VidUsUnit.None;
+      if (ref.meta.outputs.isNotEmpty) {
+        final first = ref.meta.outputs.first;
+        first.unit = VidUsUnit.None;
+
+        feature.updateFloatValue(first, outresult.resultData, first.unit);
 
-      // feature.updateFloatValue(first, outresult.resultData, first.unit);
-      print("feature is! TracePerfusionImageFeature");
-      print(feature is! TracePerfusionImageFeature);
-      print(feature);
-      print("feature is! TracePerfusionImageFeature");
-      if (feature is! TracePerfusionImageFeature) return;
-      if (outresult.perfusionImgBase64 != null) {
-        feature.perfusionImg =
-            await loadImageFromBase64(outresult.perfusionImgBase64!);
+        if (feature is! TracePerfusionImageFeature) return;
+        if (outresult.perfusionImgBase64 != null) {
+          feature.perfusionImg =
+              await loadImageFromBase64(outresult.perfusionImgBase64!);
+          feature.perfusionScaleDRect =
+              urmApplication.viewToLocalRect(outresult.perfusionScaleDRect!);
+        }
       }
-      // }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
@@ -63,13 +62,9 @@ class URMTracePerfusionCal extends URMTraceMeasureCal {
   }
 
   Future<ui.Image> loadImageFromBase64(String base64String) async {
-    // Replace this with your actual Base64 string
     Uint8List bytes = base64Decode(base64String);
     ui.Codec codec = await ui.instantiateImageCodec(bytes);
     ui.FrameInfo frameInfo = await codec.getNextFrame();
     return frameInfo.image;
-    // setState(() {
-    //   _image = frameInfo.image;
-    // });
   }
 }

+ 61 - 7
lib/process/primitives/urm_measure/urm_trace_measure.dart

@@ -1,3 +1,4 @@
+import 'package:fis_jsonrpc/rpc.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';
@@ -15,6 +16,8 @@ import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:flutter/material.dart';
 import 'dart:ui' as ui;
 
+import 'package:flutter/services.dart';
+
 class URMTraceMeasure extends Trace {
   URMTraceMeasure(super.meta, super.parent);
   static bool needPerfusion = false;
@@ -115,11 +118,6 @@ class URMTraceMeasure extends Trace {
   void handleMouseDownWhileWaiting(PointInfo args) {
     if (needPerfusion) {
       feature = TracePerfusionImageFeature(this);
-      // if (args.hostVisualArea != null) {
-      //   feature!.hostVisualArea = args.hostVisualArea;
-      // }
-      // final point = args.toAreaLogicPoint();
-      // feature!.adopt(point);
       state = ItemStates.running;
     } else {
       super.handleMouseDownWhileWaiting(args);
@@ -137,18 +135,74 @@ class URMTraceMeasure extends Trace {
     PromptBox.dismiss();
     waitingResult = false;
   }
+
+  /// 自动结束检测
+  @override
+  bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) {
+    if (feature == null || feature!.innerPoints.length < 3) {
+      isSmartMove = false;
+      return _syncState(false);
+    }
+
+    // final viewport = feature!.hostVisualArea!.viewport!;
+
+    if (isAutoSnap == false) return false;
+    final pixelSize = application.displaySize;
+
+    final p1 = feature!.innerPoints.first.scale2Size(pixelSize);
+    final p2 = current.scale2Size(pixelSize);
+    final length = (p1 - p2).length;
+    if (length > snapThreshold * 2.0 && !isSmartMove) {
+      isSmartMove = true;
+    }
+    if (length < snapThreshold && isSmartMove) {
+      feature!.innerPoints.last = feature!.innerPoints.first.clone();
+
+      /// 此处的最后一个点,方便计算,但是绘制时要剔除
+      // feature!.innerPoints.removeLast();
+
+      HapticFeedback.heavyImpact();
+      if (autoFinishFeature) {
+        handleFinish();
+      }
+      isSmartMove = false;
+      return _syncState(true);
+    } else {
+      return _syncState(false);
+    }
+  }
+
+  bool _syncState(bool isSnap) {
+    snapState = isSnap;
+    return snapState;
+  }
 }
 
 class TracePerfusionImageFeature extends TraceFeature {
   TracePerfusionImageFeature(AreaItemAbstract refItem) : super(refItem);
 
   ui.Image? perfusionImg;
+  IntRect? perfusionPiexlRect;
+  Rect? perfusionScaleDRect;
   @override
   void paint(Canvas canvas, Size size) {
-    super.paint(canvas, size);
     if (perfusionImg != null) {
       Paint paint = Paint();
-      canvas.drawImage(perfusionImg!, Offset.zero, paint);
+
+      Rect src = Rect.fromLTWH(
+        0,
+        0,
+        perfusionImg!.width.toDouble(),
+        perfusionImg!.height.toDouble(),
+      );
+      Rect dst = Rect.fromLTWH(
+        perfusionScaleDRect!.left.toDouble() * size.width,
+        perfusionScaleDRect!.top.toDouble() * size.height,
+        perfusionScaleDRect!.width.toDouble() * size.width,
+        perfusionScaleDRect!.height.toDouble() * size.height,
+      );
+      canvas.drawImageRect(perfusionImg!, src, dst, paint);
     }
+    super.paint(canvas, size);
   }
 }