Browse Source

1、完成urm Rect测量

guanxinyi 9 months ago
parent
commit
06b0345317

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

@@ -122,6 +122,30 @@ class MeasureTerms {
 
   static const URMPerfusionIndex = "Perfusion Index";
 
+  static const OutURMDenROI = "Vessel ratio(out)";
+  static const OutURMDenFractalDim = "Complexity level(out)";
+  static const OutURMDenMax = "MaxDen(out)";
+  static const OutURMDenMin = "MinDen(out)";
+  static const OutURMDenMean = "MeanDen(out)";
+  static const OutURMDenStd = "StdDen(out)";
+  static const OutURMVelMax = "MaxVel(out)";
+  static const OutURMVelMin = "MinVel(out)";
+  static const OutURMVelMean = "MeanVel(out)";
+  static const OutURMVelStd = "StdVel(out)";
+  static const OutArea = "Area(out)";
+
+  static const InURMDenROI = "Vessel ratio(in)";
+  static const InURMDenFractalDim = "Complexity level(in)";
+  static const InURMDenMax = "MaxDen(in)";
+  static const InURMDenMin = "MinDen(in)";
+  static const InURMDenMean = "MeanDen(in)";
+  static const InURMDenStd = "StdDen(in)";
+  static const InURMVelMax = "MaxVel(in)";
+  static const InURMVelMin = "MinVel(in)";
+  static const InURMVelMean = "MeanVel(in)";
+  static const InURMVelStd = "StdVel(in)";
+  static const InArea = "Area(in)";
+
   ///////////////////////////////////////////////////////////////////////////////////////////////////////
 
   /* AI [begin]*/

+ 45 - 1
lib/process/calcuators/urm_calcuators/urm_rect_den_measure.dart

@@ -1,6 +1,10 @@
 import 'package:fis_common/logger/logger.dart';
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
+import 'package:vid/us/vid_us_unit.dart';
+import 'dart:math' as math;
 
 class URMRectDenMeasureCal extends URMRectMeasureCal {
   URMRectDenMeasureCal(super.ref);
@@ -14,11 +18,51 @@ class URMRectDenMeasureCal extends URMRectMeasureCal {
     try {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
+      final URMApplication urmApplication = ref.application as URMApplication;
 
-      // TODO 规划入参,坐标系转换,调用接口,处理返回结果
+      URMMeasureProcessResult? outResult =
+          await urmApplication.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMDenMeasure,
+        rOIType: URMROIType.URMRect,
+        srcDPoints: param!.srcDPoints,
+      );
+      var result = outResult?.denMeasureResult;
+
+      if (result != null) {
+        final feature = ref.feature!;
+
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMDenROI) {
+            output.unit = VidUsUnit.percent;
+            feature.updateFloatValue(output, result.roiDen * 100, output.unit);
+          } else if (output.name == MeasureTerms.URMDenFractalDim) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.roiFractalDim, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMax) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.maxDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMin) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.minDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMean) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.meanDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenStd) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(
+                output, math.sqrt(result.varianceDensity), output.unit);
+          } else if (output.name == MeasureTerms.Area) {
+            output.unit = VidUsUnit.cm2;
+            feature.updateFloatValue(output, result.roiArea, output.unit);
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
     }
+    ref.application.updateRenderReady.emit(this, null);
   }
 }

+ 59 - 1
lib/process/calcuators/urm_calcuators/urm_rect_den_vel_measure.dart

@@ -1,6 +1,10 @@
 import 'package:fis_common/logger/logger.dart';
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
+import 'package:vid/us/vid_us_unit.dart';
+import 'dart:math' as math;
 
 class URMRectDenVelMeasureCal extends URMRectMeasureCal {
   URMRectDenVelMeasureCal(super.ref);
@@ -14,11 +18,65 @@ class URMRectDenVelMeasureCal extends URMRectMeasureCal {
     try {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
+      final URMApplication urmApplication = ref.application as URMApplication;
 
-      // TODO 规划入参,坐标系转换,调用接口,处理返回结果
+      URMMeasureProcessResult? outResult =
+          await urmApplication.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMDenVelMeasure,
+        rOIType: URMROIType.URMRect,
+        srcDPoints: param!.srcDPoints,
+      );
+      var result = outResult?.denMeasureResult;
+      var velResult = outResult?.velMeasureResult;
+
+      if (result != null && velResult != null) {
+        final feature = ref.feature!;
+
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMDenROI) {
+            output.unit = VidUsUnit.percent;
+            feature.updateFloatValue(output, result.roiDen * 100, output.unit);
+          } else if (output.name == MeasureTerms.URMDenFractalDim) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.roiFractalDim, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMax) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.maxDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMin) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.minDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenMean) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.meanDensity, output.unit);
+          } else if (output.name == MeasureTerms.URMDenStd) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(
+                output, math.sqrt(result.varianceDensity), output.unit);
+          } else if (output.name == MeasureTerms.URMVelMax) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.maxVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelMin) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.minVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelMean) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.meanVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelStd) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(
+                output, math.sqrt(velResult.varianceVel), output.unit);
+          } else if (output.name == MeasureTerms.Area) {
+            output.unit = VidUsUnit.cm2;
+            feature.updateFloatValue(output, result.roiArea, output.unit);
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
     }
+    ref.application.updateRenderReady.emit(this, null);
   }
 }

+ 13 - 26
lib/process/calcuators/urm_calcuators/urm_rect_density.dart

@@ -1,7 +1,6 @@
-import 'dart:ui';
-
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
 import 'package:vid/us/vid_us_unit.dart';
@@ -19,37 +18,25 @@ class URMRectDensityCal extends URMRectMeasureCal {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
-      Size urmResultSize = const Size(0, 0);
-
-      // 添加入参
-
-      urmResultSize = Size(urmApplication.resultWidth.toDouble(),
-          urmApplication.resultHeight.toDouble());
-      final p1 = ref.feature!.startPoint;
-      final p2 = ref.feature!.endPoint;
-      List<UrmPoint> srcDPoints = [
-        UrmPoint(x: p1.x, y: p1.y),
-        UrmPoint(x: p2.x, y: p2.y)
-      ];
 
-      URMMeasureProcessResult? result =
+      URMMeasureProcessResult? outResult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMDen,
         rOIType: URMROIType.URMRect,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
-      if (result != null) {
-        // TODO 将返回的视图百分比区域的点集转换为全图百分比点集,然会然后绘制
-        final feature = ref.feature!;
+      var result = outResult?.denMeasureResult;
+      var velResult = outResult?.velMeasureResult;
 
-        /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
+      if (result != null && velResult != null) {
+        final feature = ref.feature!;
 
-        ref.meta.outputs.first.unit = VidUsUnit.None;
-        feature.updateFloatValue(
-          ref.meta.outputs.first,
-          result.resultData,
-          ref.meta.outputs.first.unit,
-        );
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMDenROI) {
+            output.unit = VidUsUnit.percent;
+            feature.updateFloatValue(output, result.roiDen * 100, output.unit);
+          }
+        }
       } else {
         throw Exception("URM Measure API error");
       }

+ 27 - 3
lib/process/calcuators/urm_calcuators/urm_rect_fractal_dim.dart

@@ -1,14 +1,16 @@
 import 'package:fis_common/logger/logger.dart';
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/primitives/urm_measure/urm_rect_measure.dart';
 
 // import 'package:fis_measure/process/primitives/urm_straightline.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
+import 'package:vid/us/vid_us_unit.dart';
 
 class URMRectFractalDimCal extends URMRectMeasureCal {
   URMRectFractalDimCal(URMRectMeasure ref) : super(ref);
-  @override
-  URMSimpleMeasureParams? param;
+
   @override
   void calculate() {}
 
@@ -18,11 +20,33 @@ class URMRectFractalDimCal extends URMRectMeasureCal {
     try {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
+      final URMApplication urmApplication = ref.application as URMApplication;
+
+      URMMeasureProcessResult? outResult =
+          await urmApplication.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMFracetalDim,
+        rOIType: URMROIType.URMRect,
+        srcDPoints: param!.srcDPoints,
+      );
+      var result = outResult?.denMeasureResult;
+      var velResult = outResult?.velMeasureResult;
+
+      if (result != null && velResult != null) {
+        final feature = ref.feature!;
 
-      // TODO 规划入参,坐标系转换,调用接口,处理返回结果
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMDenFractalDim) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, result.roiFractalDim, output.unit);
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
     }
+    ref.application.updateRenderReady.emit(this, null);
   }
 }

+ 5 - 12
lib/process/calcuators/urm_calcuators/urm_rect_measure.dart

@@ -2,7 +2,6 @@ import 'dart:ui';
 
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
-import 'package:fis_measure/interfaces/date_types/point.dart';
 
 import 'package:fis_measure/process/primitives/urm_measure/urm_rect_measure.dart';
 // import 'package:fis_measure/process/primitives/urm_straightline.dart';
@@ -21,8 +20,8 @@ class URMRectMeasureCal extends Calculator<URMRectMeasure, double> {
   @override
   Future<void> calculateAsync() async {
     if (ref.feature == null) return;
-    Size urmResultSize = const Size(0, 0);
     try {
+      Size urmResultSize = const Size(0, 0);
       if (ref.application is! URMApplication) {
         return;
       }
@@ -31,12 +30,6 @@ class URMRectMeasureCal extends Calculator<URMRectMeasure, double> {
           urmApplication.resultHeight.toDouble());
       final p1 = ref.feature!.startPoint;
       final p2 = ref.feature!.endPoint;
-      //左上顶点
-      final leftTopPercent =
-          DPoint(p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y);
-      //右下顶点
-      final rightBottomPercent =
-          DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
 
       String description = "URM\n Calculating...";
       updateStringValue(description);
@@ -49,21 +42,21 @@ class URMRectMeasureCal extends Calculator<URMRectMeasure, double> {
   /// 处理获取到的URM参数
   void handleURMSimpleMeasureParams() {
     if (ref.feature == null) return;
-    Size urmResultSize = const Size(0, 0);
     try {
       if (ref.application is! URMApplication) {
         return;
       }
       final URMApplication urmApplication = ref.application as URMApplication;
-      urmResultSize = Size(urmApplication.resultWidth.toDouble(),
-          urmApplication.resultHeight.toDouble());
       final p1 = ref.feature!.startPoint;
       final p2 = ref.feature!.endPoint;
 
       param = URMSimpleMeasureParams(
         urmMeasureType: URMMeasureType.URMCurvature,
         rOIType: URMROIType.URMRect,
-        srcDPoints: [UrmPoint(x: p1.x, y: p1.y), UrmPoint(x: p2.x, y: p2.y)],
+        srcDPoints: [
+          urmApplication.localToView(p1),
+          urmApplication.localToView(p2)
+        ],
       );
     } catch (e) {
       logger.e('URM handleURMSimpleMeasureParams error: $e');

+ 44 - 1
lib/process/calcuators/urm_calcuators/urm_rect_perfusion.dart

@@ -1,9 +1,16 @@
+import 'dart:convert';
+import 'dart:typed_data';
+
 import 'package:fis_common/logger/logger.dart';
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/primitives/urm_measure/urm_rect_measure.dart';
 
 // import 'package:fis_measure/process/primitives/urm_straightline.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
+import 'dart:ui' as ui;
+import 'package:vid/us/vid_us_unit.dart';
 
 class URMRectPerfusionCal extends URMRectMeasureCal {
   URMRectPerfusionCal(URMRectMeasure ref) : super(ref);
@@ -16,11 +23,47 @@ class URMRectPerfusionCal extends URMRectMeasureCal {
     try {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
+      final URMApplication urmApplication = ref.application as URMApplication;
+
+      URMMeasureProcessResult? outResult =
+          await urmApplication.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMPerfusion,
+        rOIType: URMROIType.URMRect,
+        srcDPoints: param!.srcDPoints,
+      );
+
+      if (outResult != null) {
+        final feature = ref.feature!;
 
-      // TODO 规划入参,坐标系转换,调用接口,处理返回结果
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMPerfusionIndex) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, outResult.resultData, output.unit);
+
+            if (feature is! RectPerfusionImageFeature) return;
+            if (outResult.perfusionImgBase64 != null) {
+              feature.perfusionImg =
+                  await loadImageFromBase64(outResult.perfusionImgBase64!);
+              feature.perfusionScaleDRect = urmApplication.viewToLocalRect(
+                outResult.perfusionScaleDRect!,
+              );
+            }
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
     }
+    ref.application.updateRenderReady.emit(this, null);
+  }
+
+  Future<ui.Image> loadImageFromBase64(String base64String) async {
+    Uint8List bytes = base64Decode(base64String);
+    ui.Codec codec = await ui.instantiateImageCodec(bytes);
+    ui.FrameInfo frameInfo = await codec.getNextFrame();
+    return frameInfo.image;
   }
 }

+ 40 - 1
lib/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart

@@ -1,9 +1,13 @@
 import 'package:fis_common/logger/logger.dart';
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:fis_measure/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_measure.dart';
 import 'package:fis_measure/process/primitives/urm_measure/urm_rect_measure.dart';
 
 // import 'package:fis_measure/process/primitives/urm_straightline.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
+import 'package:vid/us/vid_us_unit.dart';
+import 'dart:math' as math;
 
 class URMRectVelMeasureCal extends URMRectMeasureCal {
   URMRectVelMeasureCal(URMRectMeasure ref) : super(ref);
@@ -16,11 +20,46 @@ class URMRectVelMeasureCal extends URMRectMeasureCal {
     try {
       if (ref.feature == null) return;
       if (ref.application is! URMApplication) return;
+      final URMApplication urmApplication = ref.application as URMApplication;
 
-      // TODO 规划入参,坐标系转换,调用接口,处理返回结果
+      URMMeasureProcessResult? outResult =
+          await urmApplication.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMVelMeasure,
+        rOIType: URMROIType.URMRect,
+        srcDPoints: param!.srcDPoints,
+      );
+      var result = outResult?.denMeasureResult;
+      var velResult = outResult?.velMeasureResult;
+
+      if (result != null && velResult != null) {
+        final feature = ref.feature!;
+
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.URMVelMax) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.maxVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelMin) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.minVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelMean) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, velResult.meanVel, output.unit);
+          } else if (output.name == MeasureTerms.URMVelStd) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(
+                output, math.sqrt(velResult.varianceVel), output.unit);
+          } else if (output.name == MeasureTerms.Area) {
+            output.unit = VidUsUnit.cm2;
+            feature.updateFloatValue(output, result.roiArea, output.unit);
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
     }
+    ref.application.updateRenderReady.emit(this, null);
   }
 }

+ 1 - 10
lib/process/calcuators/urm_calcuators/urm_trace_den_measure.dart

@@ -20,17 +20,11 @@ class URMTraceDenMeasureCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMDenMeasure,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;
@@ -38,11 +32,8 @@ class URMTraceDenMeasureCal extends URMTraceMeasureCal {
       URMDenMeasureResult? result = outresult.denMeasureResult;
 
       if (result != null) {
-        // TODO 将返回的视图百分比区域的点集转换为全图百分比点集,然会然后绘制
         final feature = ref.feature!;
 
-        /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMDenROI) {
             output.unit = VidUsUnit.percent;

+ 1 - 10
lib/process/calcuators/urm_calcuators/urm_trace_den_vel_measure.dart

@@ -19,17 +19,11 @@ class URMTraceDenVelMeasureCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMDenVelMeasure,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;
@@ -37,11 +31,8 @@ class URMTraceDenVelMeasureCal extends URMTraceMeasureCal {
       URMDenMeasureResult? denresult = outresult.denMeasureResult;
       URMVelMeasureResult? velresult = outresult.velMeasureResult;
       if (denresult != null && velresult != null) {
-        // TODO 将返回的视图百分比区域的点集转换为全图百分比点集,然会然后绘制
         final feature = ref.feature!;
 
-        /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMDenROI) {
             output.unit = VidUsUnit.percent;

+ 1 - 9
lib/process/calcuators/urm_calcuators/urm_trace_density.dart

@@ -18,25 +18,17 @@ class URMTraceDensityCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMDen,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;
       }
       final feature = ref.feature!;
 
-      /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-
       final first = ref.meta.outputs.first;
       first.unit = VidUsUnit.percent;
 

+ 1 - 9
lib/process/calcuators/urm_calcuators/urm_trace_fractal_dim.dart

@@ -18,25 +18,17 @@ class URMTraceFractalDimCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMFracetalDim,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;
       }
       final feature = ref.feature!;
 
-      /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-
       final first = ref.meta.outputs.first;
       first.unit = VidUsUnit.None;
 

+ 1 - 7
lib/process/calcuators/urm_calcuators/urm_trace_hist.dart

@@ -18,17 +18,11 @@ class URMTraceHistCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMHist,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;

+ 7 - 12
lib/process/calcuators/urm_calcuators/urm_trace_measure.dart

@@ -45,28 +45,23 @@ class URMTraceMeasureCal extends Calculator<URMTraceMeasure, double> {
   /// 处理获取到的URM参数
   void handleURMSimpleMeasureParams() {
     if (ref.feature == null) return;
-    Size urmResultSize = const Size(0, 0);
 
     try {
       if (ref.application is! URMApplication) {
         return;
       }
       final URMApplication urmApplication = ref.application as URMApplication;
-      urmResultSize = Size(urmApplication.resultWidth.toDouble(),
-          urmApplication.resultHeight.toDouble());
-      final List<UrmPoint> points = ref.feature!.innerPoints
-          .map(
-            (e) => UrmPoint(
-              x: e.scale2Size(urmResultSize).x,
-              y: e.scale2Size(urmResultSize).y,
-            ),
-          )
-          .toList();
+
+      // 添加入参
+      List<UrmPoint> srcDPoints = [];
+      for (var point in ref.feature!.innerPoints) {
+        srcDPoints.add(urmApplication.localToView(point));
+      }
 
       param = URMSimpleMeasureParams(
         urmMeasureType: URMMeasureType.URMCurvature,
         rOIType: URMROIType.URMRect,
-        srcDPoints: points,
+        srcDPoints: srcDPoints,
       );
     } catch (e) {
       logger.e('URM handleURMSimpleMeasureParams error: $e');

+ 1 - 7
lib/process/calcuators/urm_calcuators/urm_trace_perfusion.dart

@@ -23,17 +23,11 @@ class URMTracePerfusionCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(urmApplication.localToView(point));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMPerfusion,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;

+ 1 - 10
lib/process/calcuators/urm_calcuators/urm_trace_vel_measure.dart

@@ -19,17 +19,11 @@ class URMTraceVelMeasureCal extends URMTraceMeasureCal {
       if (ref.application is! URMApplication) return;
       final URMApplication urmApplication = ref.application as URMApplication;
 
-      // 添加入参
-      List<UrmPoint> srcDPoints = [];
-      for (var point in ref.feature!.innerPoints) {
-        srcDPoints.add(UrmPoint(x: point.x, y: point.y));
-      }
-
       URMMeasureProcessResult? outresult =
           await urmApplication.getURMMeasureResult(
         urmMeasureType: URMMeasureType.URMVelMeasure,
         rOIType: URMROIType.URMTrace,
-        srcDPoints: srcDPoints,
+        srcDPoints: param!.srcDPoints,
       );
       if (outresult == null) {
         return;
@@ -37,11 +31,8 @@ class URMTraceVelMeasureCal extends URMTraceMeasureCal {
       URMVelMeasureResult? result = outresult.velMeasureResult;
 
       if (result != null) {
-        // TODO 将返回的视图百分比区域的点集转换为全图百分比点集,然会然后绘制
         final feature = ref.feature!;
 
-        /// TODO 只转数据类型还不够,需要将 视图区域百分比坐标转为全图百分比坐标
-
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMVelMax) {
             output.unit = VidUsUnit.mms;

+ 48 - 3
lib/process/primitives/urm_measure/urm_rect_measure.dart

@@ -1,5 +1,6 @@
 import 'dart:ui';
 
+import 'package:fis_jsonrpc/rpc.dart';
 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';
@@ -15,11 +16,13 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_vel_measu
 import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
+import 'dart:ui' as ui;
 
 import '../../items/item_feature.dart';
 
 class URMRectMeasure extends MeasureItem<URMRectFeature> {
   URMRectMeasure(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
+  static bool needPerfusion = false;
 
   static URMRectMeasure createMeasureRect(ItemMeta meta,
       [IMeasureItem? parent]) {
@@ -57,6 +60,7 @@ class URMRectMeasure extends MeasureItem<URMRectFeature> {
 
   static URMRectMeasure createURMRectPerfusion(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = true;
     URMRectMeasure measureRect = URMRectMeasure(meta, parent);
     measureRect.calculator = URMRectPerfusionCal(
       measureRect,
@@ -137,10 +141,18 @@ class URMRectMeasure extends MeasureItem<URMRectFeature> {
     // TODO: 判断是否当前area
     // 转换为Area逻辑位置
     final point = args.toAreaLogicPoint();
-    feature = URMRectFeature(this, point, point);
-    if (args.hostVisualArea != null) {
-      feature!.hostVisualArea = args.hostVisualArea;
+    if (needPerfusion) {
+      feature = RectPerfusionImageFeature(this, point, point);
+      if (args.hostVisualArea != null) {
+        feature!.hostVisualArea = args.hostVisualArea;
+      }
+    } else {
+      feature = URMRectFeature(this, point, point);
+      if (args.hostVisualArea != null) {
+        feature!.hostVisualArea = args.hostVisualArea;
+      }
     }
+
     state = ItemStates.running;
   }
 }
@@ -188,3 +200,36 @@ class URMRectFeature extends MeasureItemFeature {
     }
   }
 }
+
+class RectPerfusionImageFeature extends URMRectFeature {
+  RectPerfusionImageFeature(
+    IMeasureItem refItem,
+    DPoint startPoint,
+    DPoint endPoint,
+  ) : super(refItem, startPoint, endPoint);
+
+  ui.Image? perfusionImg;
+  IntRect? perfusionPiexlRect;
+  Rect? perfusionScaleDRect;
+  @override
+  void paint(Canvas canvas, Size size) {
+    if (perfusionImg != null) {
+      Paint paint = 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);
+  }
+}