Browse Source

1、测量项优化

guanxinyi 9 months ago
parent
commit
4c66ae02f2

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

@@ -43,6 +43,9 @@ abstract class IMeasureItemFeature {
 
   /// 设置当前 zoom area 的归一化 Rect
   void setZoomRect(Rect? zoomRect);
+
+  /// 灌注图 绘制
+  void paintPerfusion(Canvas canvas, Size size);
 }
 
 /// 测试项单次快照样式配置

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

@@ -257,8 +257,8 @@ class MeasureTypes {
   static const URMEllipseVelMeasure = "URMEllipseVelMeasure";
   static const URMEllipseDenVelMeasure = "URMEllipseDenVelMeasure";
   static const URMVesselMeasure = "URMVesselMeasure";
-  static const URMRectPerfusion = "URMRectPerfusion";
-  static const URMTracePerfusion = "URMTracePerfusion";
+  static const URMRectPerfusion = "URMRectPerfusionMeasure";
+  static const URMTracePerfusion = "URMTracePerfusionMeasure";
   static const URMEllipsePerfusion = "URMEllipsePerfusion";
   static const URMRectHist = "URMRectHist";
   static const URMTraceHist = "URMTraceHist";

+ 11 - 3
lib/process/calcuators/urm_calcuators/urm_shell_perfusion_measure.dart

@@ -4,6 +4,7 @@ import 'dart:typed_data';
 import 'dart:ui' as 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/interfaces/process/items/terms.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_shell_measure.dart';
 import 'package:fis_measure/process/primitives/urm_measure/urm_shell_measure.dart';
@@ -30,6 +31,7 @@ class URMShellPerfusionMeasureCal extends URMShellMeasureCal {
         urmMeasureType: URMMeasureType.URMPerfusion,
         rOIType: URMROIType.URMShell,
         srcDPoints: param!.srcDPoints,
+        shellWidth: 0.1,
       );
 
       if (outResult != null) {
@@ -44,9 +46,15 @@ class URMShellPerfusionMeasureCal extends URMShellMeasureCal {
             if (outResult.perfusionImgBase64 != null) {
               feature.perfusionImg =
                   await loadImageFromBase64(outResult.perfusionImgBase64!);
-              feature.perfusionScaleDRect = urmApplication.viewToLocalRect(
-                outResult.perfusionScaleDRect!,
-              );
+              feature.leftTopPoint = urmApplication
+                  .viewToLocal(outResult.perfusionScaleDRect!.topLeft!);
+              feature.rightBottomPoint = urmApplication
+                  .viewToLocal(outResult.perfusionScaleDRect!.bottomRight!);
+              List<DPoint> outerExterPoints = [];
+              outResult.outerExterPoints?.forEach((element) {
+                outerExterPoints.add(urmApplication.viewToLocal(element));
+              });
+              feature.outerExterPoints = outerExterPoints;
             }
           }
         }

+ 6 - 0
lib/process/items/item_feature.dart

@@ -205,6 +205,12 @@ abstract class MeasureItemFeature implements IMeasureItemFeature {
     zoomRect = rect;
   }
 
+  @override
+  void paintPerfusion(
+    Canvas canvas,
+    Size size,
+  ) {}
+
   /// 画序号
   ///
   /// [text] 自定义序号内容

+ 4 - 0
lib/process/primitives/ellipse.dart

@@ -247,6 +247,10 @@ class EllipseFeature extends AreaItemFeatureAbstract {
     }
   }
 
+  /// 绘制灌注图
+  @override
+  void paintPerfusion(Canvas canvas, Size size) {}
+
   /// X轴半径
   double getRadiusX([Size? fitSize]) {
     if (innerPoints.length < 2) {

+ 4 - 0
lib/process/primitives/trace.dart

@@ -175,4 +175,8 @@ class TraceFeature extends AreaItemFeatureAbstract {
 
     drawVertex(canvas, points.last.toOffset(), isActive);
   }
+
+  /// 绘制灌注图
+  @override
+  void paintPerfusion(Canvas canvas, Size size) {}
 }

+ 9 - 2
lib/process/primitives/urm_measure/urm_ellipse_measure.dart

@@ -23,6 +23,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseDenMeasure(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureEllipse = URMEllipseMeasure(meta, parent);
     measureEllipse.calculator = URMEllipseDenMeasureCal(
       measureEllipse,
@@ -32,6 +33,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseHist(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureHist = URMEllipseMeasure(meta, parent);
     measureHist.calculator = URMEllipseHistCal(
       measureHist,
@@ -41,6 +43,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseDenVelMeasure(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureEllipseDenVel = URMEllipseMeasure(meta, parent);
     measureEllipseDenVel.calculator = URMEllipseDenVelMeasureCal(
       measureEllipseDenVel,
@@ -50,6 +53,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseDensity(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureEllipseDensity = URMEllipseMeasure(meta, parent);
     measureEllipseDensity.calculator = URMEllipseDensityCal(
       measureEllipseDensity,
@@ -59,6 +63,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseFractalDim(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureEllipseFractalDim =
         URMEllipseMeasure(meta, parent);
     measureEllipseFractalDim.calculator = URMEllipseFractalDimCal(
@@ -69,6 +74,7 @@ class URMEllipseMeasure extends Ellipse {
 
   static URMEllipseMeasure createURMEllipseVelMeasure(ItemMeta meta,
       [IMeasureItem? parent]) {
+    needPerfusion = false;
     URMEllipseMeasure measureEllipseVel = URMEllipseMeasure(meta, parent);
     measureEllipseVel.calculator = URMEllipseVelMeasureCal(
       measureEllipseVel,
@@ -163,8 +169,10 @@ class EllipsePerfusionImageFeature extends EllipseFeature {
   IntRect? perfusionPiexlRect;
   DPoint? leftTopPoint;
   DPoint? rightBottomPoint;
+
+  /// 绘制灌注图
   @override
-  void paint(Canvas canvas, Size size) {
+  void paintPerfusion(Canvas canvas, Size size) {
     if (perfusionImg != null) {
       Paint paint = Paint();
 
@@ -184,6 +192,5 @@ class EllipsePerfusionImageFeature extends EllipseFeature {
           Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
       canvas.drawImageRect(perfusionImg!, src, dst, paint);
     }
-    super.paint(canvas, size);
   }
 }

+ 7 - 2
lib/process/primitives/urm_measure/urm_rect_measure.dart

@@ -199,6 +199,10 @@ class URMRectFeature extends MeasureItemFeature {
       canvas.drawPointsLine(offsets, paintLinePan);
     }
   }
+
+  /// 绘制灌注图
+  @override
+  void paintPerfusion(Canvas canvas, Size size) {}
 }
 
 class RectPerfusionImageFeature extends URMRectFeature {
@@ -212,8 +216,10 @@ class RectPerfusionImageFeature extends URMRectFeature {
   IntRect? perfusionPiexlRect;
   DPoint? leftTopPoint;
   DPoint? rightBottomPoint;
+
+  /// 绘制灌注图
   @override
-  void paint(Canvas canvas, Size size) {
+  void paintPerfusion(Canvas canvas, Size size) {
     if (perfusionImg != null) {
       Paint paint = Paint();
 
@@ -233,6 +239,5 @@ class RectPerfusionImageFeature extends URMRectFeature {
           Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
       canvas.drawImageRect(perfusionImg!, src, dst, paint);
     }
-    super.paint(canvas, size);
   }
 }

+ 22 - 11
lib/process/primitives/urm_measure/urm_shell_measure.dart

@@ -1,6 +1,6 @@
 import 'dart:ui' as 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';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
@@ -14,6 +14,7 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_shell_perfusio
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_shell_vel_measure.dart';
 import 'package:fis_measure/process/primitives/area_abstract.dart';
 import 'package:fis_measure/process/primitives/trace.dart';
+import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
@@ -180,10 +181,13 @@ class ShellPerfusionImageFeature extends TraceFeature {
   ShellPerfusionImageFeature(AreaItemAbstract refItem) : super(refItem);
 
   ui.Image? perfusionImg;
-  IntRect? perfusionPiexlRect;
-  Rect? perfusionScaleDRect;
+  DPoint? leftTopPoint;
+  DPoint? rightBottomPoint;
+  List<DPoint> outerExterPoints = [];
+
+  /// 绘制灌注图
   @override
-  void paint(Canvas canvas, Size size) {
+  void paintPerfusion(Canvas canvas, Size size) {
     if (perfusionImg != null) {
       Paint paint = Paint();
 
@@ -193,14 +197,21 @@ class ShellPerfusionImageFeature extends TraceFeature {
         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,
-      );
+      if (leftTopPoint == null || rightBottomPoint == null) {
+        return;
+      }
+      DPoint leftTop = convert2ViewPoint(size, leftTopPoint!);
+      DPoint rightBottom = convert2ViewPoint(size, rightBottomPoint!);
+      convert2ViewPoint(size, rightBottomPoint!);
+      Rect dst = Rect.fromPoints(
+          Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
       canvas.drawImageRect(perfusionImg!, src, dst, paint);
+
+      final pixelPoints = outerExterPoints.map((e) {
+        return convert2ViewPoint(size, e).toOffset();
+      }).toList();
+
+      canvas.drawDashPointsLine(pixelPoints, 1, 10, paintLinePan, close: true);
     }
-    super.paint(canvas, size);
   }
 }

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

@@ -188,6 +188,13 @@ class TracePerfusionImageFeature extends TraceFeature {
   DPoint? rightBottomPoint;
   @override
   void paint(Canvas canvas, Size size) {
+    // paintPerfusion(canvas, size);
+    super.paint(canvas, size);
+  }
+
+  /// 绘制灌注图
+  @override
+  void paintPerfusion(Canvas canvas, Size size) {
     if (perfusionImg != null) {
       Paint paint = Paint();
 
@@ -207,6 +214,5 @@ class TracePerfusionImageFeature extends TraceFeature {
           Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
       canvas.drawImageRect(perfusionImg!, src, dst, paint);
     }
-    super.paint(canvas, size);
   }
 }