Browse Source

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

gavin.chen 9 months ago
parent
commit
033eaff8fe
23 changed files with 298 additions and 50 deletions
  1. 1 1
      lib/process/calcuators/urm_calcuators/urm_curve_curvature_line.dart
  2. 4 4
      lib/process/calcuators/urm_calcuators/urm_ellipse_den_vel_measure.dart
  3. 1 3
      lib/process/calcuators/urm_calcuators/urm_ellipse_measure.dart
  4. 4 4
      lib/process/calcuators/urm_calcuators/urm_ellipse_vel_measure.dart
  5. 2 1
      lib/process/calcuators/urm_calcuators/urm_location_vel.dart
  6. 4 4
      lib/process/calcuators/urm_calcuators/urm_rect_den_vel_measure.dart
  7. 1 5
      lib/process/calcuators/urm_calcuators/urm_rect_fractal_dim.dart
  8. 4 4
      lib/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart
  9. 2 2
      lib/process/calcuators/urm_calcuators/urm_shell_den_measure.dart
  10. 31 2
      lib/process/calcuators/urm_calcuators/urm_shell_den_vel_measure.dart
  11. 2 0
      lib/process/calcuators/urm_calcuators/urm_shell_density_measure.dart
  12. 31 0
      lib/process/calcuators/urm_calcuators/urm_shell_vel_measure.dart
  13. 10 10
      lib/process/calcuators/urm_calcuators/urm_vessel_measure.dart
  14. 0 1
      lib/process/items/item_feature.dart
  15. 47 1
      lib/process/primitives/ellipse.dart
  16. 13 1
      lib/process/primitives/urm_measure/urm_ellipse_measure.dart
  17. 13 1
      lib/process/primitives/urm_measure/urm_rect_measure.dart
  18. 13 1
      lib/process/primitives/urm_measure/urm_shell_measure.dart
  19. 13 1
      lib/process/primitives/urm_measure/urm_trace_measure.dart
  20. 98 0
      lib/process/primitives/utils/urm_sharp_copy.dart
  21. 1 1
      lib/process/workspace/measure_data_controller.dart
  22. 2 2
      pubspec.lock
  23. 1 1
      pubspec.yaml

+ 1 - 1
lib/process/calcuators/urm_calcuators/urm_curve_curvature_line.dart

@@ -8,7 +8,7 @@ import 'package:fis_jsonrpc/rpc.dart';
 import 'package:vid/us/vid_us_unit.dart';
 import '../calculator.dart';
 
-/// 曲线弯曲度计算
+///【TODO】  曲线弯曲度计算
 class URMCurveCurvatureLineCal extends Calculator<Trace, double> {
   URMCurveCurvatureLineCal(
     Trace ref,

+ 4 - 4
lib/process/calcuators/urm_calcuators/urm_ellipse_den_vel_measure.dart

@@ -57,16 +57,16 @@ class URMEllipseDenVelMeasureCal extends URMEllipseMeasureCal {
             feature.updateFloatValue(
                 output, math.sqrt(result.varianceDensity), output.unit);
           } else if (output.name == MeasureTerms.URMVelMax) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.maxVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMin) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.minVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMean) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.meanVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelStd) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(
                 output, math.sqrt(velResult.varianceVel), output.unit);
           } else if (output.name == MeasureTerms.Area) {

+ 1 - 3
lib/process/calcuators/urm_calcuators/urm_ellipse_measure.dart

@@ -32,9 +32,7 @@ class URMEllipseMeasureCal extends Calculator<URMEllipseMeasure, double> {
 
       // 添加入参
       List<UrmPoint> srcDPoints = [];
-      // if (ref.feature is! EllipseFeature) {
-      //   srcDPoints = [];
-      // }
+
       for (var point in ref.feature!.innerPoints) {
         srcDPoints.add(urmApplication.localToView(point));
       }

+ 4 - 4
lib/process/calcuators/urm_calcuators/urm_ellipse_vel_measure.dart

@@ -39,16 +39,16 @@ class URMEllipseVelMeasureCal extends URMEllipseMeasureCal {
             VidUsUnit.None);
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMVelMax) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.maxVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMin) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.minVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMean) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.meanVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelStd) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(
                 output, math.sqrt(velResult.varianceVel), output.unit);
           } else if (output.name == MeasureTerms.Area) {

+ 2 - 1
lib/process/calcuators/urm_calcuators/urm_location_vel.dart

@@ -8,6 +8,7 @@ import 'package:fis_measure/process/primitives/location.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 '../calculator.dart';
 
@@ -42,7 +43,7 @@ class URMLocationVelCal extends Calculator<Location, double> {
 
           for (var output in ref.meta.outputs) {
             if (output.name == MeasureTerms.URMLocationVel) {
-              // output.unit = VidUsUnit.percent;
+              output.unit = VidUsUnit.mms;
               feature.updateFloatValue(
                   output, outResult.resultData, output.unit);
             }

+ 4 - 4
lib/process/calcuators/urm_calcuators/urm_rect_den_vel_measure.dart

@@ -57,16 +57,16 @@ class URMRectDenVelMeasureCal extends URMRectMeasureCal {
             feature.updateFloatValue(
                 output, math.sqrt(result.varianceDensity), output.unit);
           } else if (output.name == MeasureTerms.URMVelMax) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.maxVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMin) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.minVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMean) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.meanVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelStd) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(
                 output, math.sqrt(velResult.varianceVel), output.unit);
           } else if (output.name == MeasureTerms.Area) {

+ 1 - 5
lib/process/calcuators/urm_calcuators/urm_rect_fractal_dim.dart

@@ -1,6 +1,5 @@
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
-import 'package:fis_measure/interfaces/process/items/item_metas.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';
@@ -32,10 +31,7 @@ class URMRectFractalDimCal extends URMRectMeasureCal {
 
       if (outResult != null) {
         final feature = ref.feature!;
-        feature.updateStringValue(
-            ItemOutputMeta("Placeholder", "Placeholder", VidUsUnit.None),
-            "",
-            VidUsUnit.None);
+
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMDenFractalDim) {
             output.unit = VidUsUnit.None;

+ 4 - 4
lib/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart

@@ -40,16 +40,16 @@ class URMRectVelMeasureCal extends URMRectMeasureCal {
             VidUsUnit.None);
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.URMVelMax) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.maxVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMin) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.minVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelMean) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(output, velResult.meanVel, output.unit);
           } else if (output.name == MeasureTerms.URMVelStd) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.mms;
             feature.updateFloatValue(
                 output, math.sqrt(velResult.varianceVel), output.unit);
           } else if (output.name == MeasureTerms.Area) {

+ 2 - 2
lib/process/calcuators/urm_calcuators/urm_shell_den_measure.dart

@@ -71,7 +71,7 @@ class URMShellDenMeasureCal extends URMShellMeasureCal {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, result.roiArea, output.unit);
           } else if (output.name == MeasureTerms.InURMDenROI) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.percent;
             feature.updateFloatValue(
                 output, result.inRoiDen * 100, output.unit);
           } else if (output.name == MeasureTerms.InURMDenFractalDim) {
@@ -95,7 +95,7 @@ class URMShellDenMeasureCal extends URMShellMeasureCal {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, result.inRoiArea, output.unit);
           } else if (output.name == MeasureTerms.OutURMDenROI) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.percent;
             feature.updateFloatValue(
                 output, result.outRoiDen * 100, output.unit);
           } else if (output.name == MeasureTerms.OutURMDenFractalDim) {

+ 31 - 2
lib/process/calcuators/urm_calcuators/urm_shell_den_vel_measure.dart

@@ -91,7 +91,7 @@ class URMShellDenVelMeasureCal extends URMShellMeasureCal {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, velresult.roiArea, output.unit);
           } else if (output.name == MeasureTerms.InURMDenROI) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.percent;
             feature.updateFloatValue(
                 output, denresult.inRoiDen * 100, output.unit);
           } else if (output.name == MeasureTerms.InURMDenFractalDim) {
@@ -114,11 +114,24 @@ class URMShellDenVelMeasureCal extends URMShellMeasureCal {
             output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, math.sqrt(denresult.inVarianceDensity), output.unit);
+          } else if (output.name == MeasureTerms.InURMVelMax) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, velresult.inMaxVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMDenMin) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, velresult.inMinVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelMean) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, velresult.inMeanVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelStd) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, velresult.inVarianceVel, output.unit);
           } else if (output.name == MeasureTerms.InArea) {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, denresult.inRoiArea, output.unit);
           } else if (output.name == MeasureTerms.OutURMDenROI) {
-            output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.percent;
             feature.updateFloatValue(
                 output, denresult.outRoiDen * 100, output.unit);
           } else if (output.name == MeasureTerms.OutURMDenFractalDim) {
@@ -141,6 +154,22 @@ class URMShellDenVelMeasureCal extends URMShellMeasureCal {
             output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, math.sqrt(denresult.outVarianceDensity), output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMax) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, math.sqrt(velresult.outMaxVel), output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMin) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, math.sqrt(velresult.outMinVel), output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMean) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, math.sqrt(velresult.outMeanVel), output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelStd) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, math.sqrt(velresult.outVarianceVel), output.unit);
           } else if (output.name == MeasureTerms.OutArea) {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, denresult.outRoiArea, output.unit);

+ 2 - 0
lib/process/calcuators/urm_calcuators/urm_shell_density_measure.dart

@@ -35,6 +35,8 @@ class URMShellDensityMeasureCal extends URMShellMeasureCal {
       final feature = ref.feature!;
       if (ref.meta.outputs.isNotEmpty) {
         final first = ref.meta.outputs.first;
+        if (first == null) return;
+
         first.unit = VidUsUnit.percent;
         feature.updateStringValue(
             ItemOutputMeta("Placeholder", "Placeholder", VidUsUnit.None),

+ 31 - 0
lib/process/calcuators/urm_calcuators/urm_shell_vel_measure.dart

@@ -65,6 +65,37 @@ class URMShellVelMeasureCal extends URMShellMeasureCal {
           } else if (output.name == MeasureTerms.Area) {
             output.unit = VidUsUnit.cm2;
             feature.updateFloatValue(output, result.roiArea, output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMax) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.outMaxVel, output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMin) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.outMinVel, output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelMean) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.outMeanVel, output.unit);
+          } else if (output.name == MeasureTerms.OutURMVelStd) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(
+                output, result.outVarianceVel, output.unit);
+          } else if (output.name == MeasureTerms.OutArea) {
+            output.unit = VidUsUnit.cm2;
+            feature.updateFloatValue(output, result.outRoiArea, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelMax) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.inMaxVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelMin) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.inMinVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelMean) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.inMeanVel, output.unit);
+          } else if (output.name == MeasureTerms.InURMVelStd) {
+            output.unit = VidUsUnit.mms;
+            feature.updateFloatValue(output, result.inVarianceVel, output.unit);
+          } else if (output.name == MeasureTerms.InArea) {
+            output.unit = VidUsUnit.cm2;
+            feature.updateFloatValue(output, result.inRoiArea, output.unit);
           }
         }
       } else {

+ 10 - 10
lib/process/calcuators/urm_calcuators/urm_vessel_measure.dart

@@ -57,43 +57,43 @@ class URMVesselMeasureCal extends Calculator<URMVesselMeasure, double> {
             VidUsUnit.None);
         for (var output in ref.meta.outputs) {
           if (output.name == MeasureTerms.MaxVessDistance) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.maxVessDistance, output.unit);
           } else if (output.name == MeasureTerms.MinVessDistance) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.minVessDistance, output.unit);
           } else if (output.name == MeasureTerms.MeanVessDistacne) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.meanVessDistacne, output.unit);
           } else if (output.name == MeasureTerms.StdVessDistance) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(output,
                 math.sqrt(vessMeasureResult.varianceVessDistance), output.unit);
           } else if (output.name == MeasureTerms.MaxVessDiameter) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.maxVessDiameter, output.unit);
           } else if (output.name == MeasureTerms.MinVessDiameter) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.minVessDiameter, output.unit);
           } else if (output.name == MeasureTerms.MeanVessDiameter) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.meanVessDiameter, output.unit);
           } else if (output.name == MeasureTerms.StdVessDiameter) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(output,
                 math.sqrt(vessMeasureResult.varianceVessDiameter), output.unit);
           } else if (output.name == MeasureTerms.VesselCount) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
             feature.updateFloatValue(
                 output, vessMeasureResult.vesselCount.toDouble(), output.unit);
           } else if (output.name == MeasureTerms.Distance) {
-            // output.unit = VidUsUnit.None;
+            output.unit = VidUsUnit.None;
 
             feature.updateFloatValue(output, cmlength, output.unit);
           }

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

@@ -36,7 +36,6 @@ abstract class MeasureItemFeature implements IMeasureItemFeature {
   @override
   int? imageBelongSign;
 
-  @protected
   Paint get paintPan => measureData.paintPen;
   Paint get paintLinePan => measureData.paintLinePan;
   Paint get paintPointPan => measureData.paintPointPan;

+ 47 - 1
lib/process/primitives/ellipse.dart

@@ -253,6 +253,52 @@ class EllipseFeature extends AreaItemFeatureAbstract {
   @override
   void paintPerfusion(Canvas canvas, Size size) {}
 
+  void paintSharpOnly(Canvas canvas, Size size, {Paint? customPaintPen}) {
+    if (innerPoints.isEmpty) return;
+
+    final xStartOffset = convert2ViewPoint(size, xAxisStart).toOffset();
+    final xEndOffset = convert2ViewPoint(size, xAxisEnd).toOffset();
+    canvas.drawDashLine(
+        xStartOffset, xEndOffset, 1, 10, customPaintPen ?? paintLinePan);
+
+    final yStartOffset = convert2ViewPoint(size, innerPoints[2]).toOffset();
+    final yEndOffset = convert2ViewPoint(size, innerPoints[3]).toOffset();
+    final centroidOffset = convert2ViewPoint(size, centroid).toOffset();
+    canvas.drawDashLine(
+        yStartOffset, yEndOffset, 1, 10, customPaintPen ?? paintLinePan);
+
+    final radiusX = getRadiusX(size);
+    final radiusY = getRadiusY(size);
+
+    canvas.save();
+    final path = Path();
+    path.moveTo(xStartOffset.dx, xStartOffset.dy);
+
+    // 以质心为原点旋转到水平方向
+    canvas.translate(centroidOffset.dx, centroidOffset.dy);
+    final rotateRad = (xEndOffset - xStartOffset).direction;
+    canvas.rotate(rotateRad);
+    canvas.translate(-centroidOffset.dx, -centroidOffset.dy);
+
+    path.addOval(
+      Rect.fromCenter(
+        center: centroidOffset,
+        width: radiusX * 2,
+        height: radiusY * 2,
+      ),
+    );
+
+    canvas.drawPath(
+      dashPath(
+        path,
+        dashArray: CircularIntervalList<double>(<double>[2.0, 10.0]),
+      ),
+      customPaintPen ?? paintPan,
+    );
+
+    canvas.restore();
+  }
+
   /// X轴半径
   double getRadiusX([Size? fitSize]) {
     if (innerPoints.length < 2) {
@@ -309,7 +355,7 @@ class EllipseFeature extends AreaItemFeatureAbstract {
   void adjustPoints(DPoint point) {
     if (activeIndex < 1) return;
     Size refSize;
-    if (refItem.feature?.isURMDualImages ?? false) {
+    if (isURMDualImages ?? false) {
       refSize = Size(refItem.application.displaySize.width / 2,
           refItem.application.displaySize.height);
     } else {

+ 13 - 1
lib/process/primitives/urm_measure/urm_ellipse_measure.dart

@@ -13,6 +13,7 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_hist.d
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_perfusion.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_vel_measure.dart';
 import 'package:fis_measure/process/primitives/ellipse.dart';
+import 'package:fis_measure/process/primitives/utils/urm_sharp_copy.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:flutter/material.dart';
 import 'dart:ui' as ui;
@@ -146,7 +147,11 @@ class URMEllipseMeasure extends Ellipse {
 
   bool waitingResult = false;
 
-  void handleFinish() async {
+  void handleFinish({bool recordSharp = true}) async {
+    if (recordSharp) {
+      _recordSharp();
+    }
+
     feature!.isActive = false;
     waitingResult = true;
     await doCalculateAsync();
@@ -155,6 +160,13 @@ class URMEllipseMeasure extends Ellipse {
     waitingResult = false;
     doFeatureFinish();
   }
+
+  void _recordSharp() {
+    UrmSharpCopyBoard.recordSharp(
+      UrmSharpCopyDataType.ellipse,
+      feature!.innerPoints,
+    );
+  }
 }
 
 class EllipsePerfusionImageFeature extends EllipseFeature {

+ 13 - 1
lib/process/primitives/urm_measure/urm_rect_measure.dart

@@ -15,6 +15,7 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_hist.dart
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_perfusion.dart';
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart';
 import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/primitives/utils/urm_sharp_copy.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
 import 'dart:ui' as ui;
@@ -120,7 +121,11 @@ class URMRectMeasure extends MeasureItem<URMRectFeature> {
 
   bool waitingResult = false;
 
-  void handleFinish() async {
+  void handleFinish({bool recordSharp = true}) async {
+    if (recordSharp) {
+      _recordSharp();
+    }
+
     feature!.isActive = false;
     waitingResult = true;
     await doCalculateAsync();
@@ -129,6 +134,13 @@ class URMRectMeasure extends MeasureItem<URMRectFeature> {
     waitingResult = false;
   }
 
+  void _recordSharp() {
+    UrmSharpCopyBoard.recordSharp(
+      UrmSharpCopyDataType.rect,
+      [feature!.startPoint, feature!.endPoint],
+    );
+  }
+
   @override
   bool onExecuteTouch(PointInfo args) {
     // TODO: implement onExecuteTouch

+ 13 - 1
lib/process/primitives/urm_measure/urm_shell_measure.dart

@@ -15,6 +15,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/process/primitives/utils/urm_sharp_copy.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:flutter/material.dart';
@@ -129,7 +130,11 @@ class URMShellMeasure extends Trace {
 
   bool waitingResult = false;
 
-  void handleFinish() async {
+  void handleFinish({bool recordSharp = true}) async {
+    if (recordSharp) {
+      _recordSharp();
+    }
+
     feature!.isActive = false;
     waitingResult = true;
     await doCalculateAsync();
@@ -138,6 +143,13 @@ class URMShellMeasure extends Trace {
     waitingResult = false;
   }
 
+  void _recordSharp() {
+    UrmSharpCopyBoard.recordSharp(
+      UrmSharpCopyDataType.rim,
+      feature!.innerPoints,
+    );
+  }
+
   /// 自动结束检测
   @override
   bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) {

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

@@ -13,6 +13,7 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_trace_perfusio
 import 'package:fis_measure/process/calcuators/urm_calcuators/urm_trace_vel_measure.dart';
 import 'package:fis_measure/process/primitives/area_abstract.dart';
 import 'package:fis_measure/process/primitives/trace.dart';
+import 'package:fis_measure/process/primitives/utils/urm_sharp_copy.dart';
 import 'package:fis_measure/utils/prompt_box.dart';
 import 'package:flutter/material.dart';
 import 'dart:ui' as ui;
@@ -127,7 +128,11 @@ class URMTraceMeasure extends Trace {
 
   bool waitingResult = false;
 
-  void handleFinish() async {
+  void handleFinish({bool recordSharp = true}) async {
+    if (recordSharp) {
+      _recordSharp();
+    }
+
     feature!.isActive = false;
     waitingResult = true;
     await doCalculateAsync();
@@ -136,6 +141,13 @@ class URMTraceMeasure extends Trace {
     waitingResult = false;
   }
 
+  void _recordSharp() {
+    UrmSharpCopyBoard.recordSharp(
+      UrmSharpCopyDataType.trace,
+      feature!.innerPoints,
+    );
+  }
+
   /// 自动结束检测
   @override
   bool checkAutoSnap(PointInfo current, [bool autoFinishFeature = true]) {

+ 98 - 0
lib/process/primitives/utils/urm_sharp_copy.dart

@@ -0,0 +1,98 @@
+import 'package:fis_common/event/event_type.dart';
+import 'package:fis_measure/interfaces/date_types/point.dart';
+
+enum UrmSharpCopyDataType {
+  rect,
+  trace,
+  ellipse,
+  rim,
+}
+
+class UrmSharpCopyActiveState {
+  final UrmSharpCopyDataType type;
+  final int index;
+
+  UrmSharpCopyActiveState(this.type, this.index);
+}
+
+class UrmSharpCopyBoard {
+  UrmSharpCopyBoard._();
+
+  static final _ins = UrmSharpCopyBoard._();
+
+  static UrmSharpCopyActiveState? activeState;
+
+  static final typeCacheChanged = FEventHandler<UrmSharpCopyDataType>();
+  static final activeStateChanged = FEventHandler<UrmSharpCopyActiveState?>();
+
+  static final _cacheMap = <UrmSharpCopyDataType, List<UrmSharpCopyData>>{};
+
+  static List<UrmSharpCopyData> getCachedList(UrmSharpCopyDataType type) {
+    final list = _findCacheListByType(type);
+    return list;
+  }
+
+  static void recordSharp(UrmSharpCopyDataType type, List<DPoint> points) {
+    final arr = points.map((e) => e.clone()).toList();
+    UrmSharpCopyData data = UrmSharpCopyData.create(type, arr);
+
+    final list = _findCacheListByType(type);
+    if (list.length == 2) {
+      final left = list.last;
+      list.clear();
+      list.add(left);
+    }
+    list.add(data);
+    typeCacheChanged.emit(_ins, type);
+  }
+
+  static List<UrmSharpCopyData> _findCacheListByType(
+      UrmSharpCopyDataType type) {
+    if (!_cacheMap.containsKey(type)) {
+      _cacheMap[type] = [];
+    }
+    return _cacheMap[type]!;
+  }
+
+  static switchActiveState(UrmSharpCopyActiveState? state) {
+    activeState = state;
+    activeStateChanged.emit(_ins, state);
+  }
+}
+
+class RectUrmSharpCopyData extends UrmSharpCopyData {
+  RectUrmSharpCopyData(super.type, super.points);
+}
+
+class TraceUrmSharpCopyData extends UrmSharpCopyData {
+  TraceUrmSharpCopyData(super.type, super.points);
+}
+
+class EllipseUrmSharpCopyData extends UrmSharpCopyData {
+  EllipseUrmSharpCopyData(super.type, super.points);
+}
+
+class RimUrmSharpCopyData extends UrmSharpCopyData {
+  RimUrmSharpCopyData(super.type, super.points);
+}
+
+class UrmSharpCopyData {
+  final UrmSharpCopyDataType type;
+  final List<DPoint> points;
+
+  UrmSharpCopyData(this.type, this.points);
+
+  static UrmSharpCopyData create(
+      UrmSharpCopyDataType type, List<DPoint> points) {
+    switch (type) {
+      case UrmSharpCopyDataType.rect:
+        return RectUrmSharpCopyData(type, points);
+      case UrmSharpCopyDataType.trace:
+        return TraceUrmSharpCopyData(type, points);
+      case UrmSharpCopyDataType.ellipse:
+        return EllipseUrmSharpCopyData(type, points);
+      case UrmSharpCopyDataType.rim:
+        return RimUrmSharpCopyData(type, points);
+    }
+  }
+}

+ 1 - 1
lib/process/workspace/measure_data_controller.dart

@@ -361,7 +361,7 @@ class MeasureDataController implements IMeasureDataController {
 
   void checkCursorColor(Color defaultColor) {
     Color cursorColor = defaultColor;
-    final value = _measureSystemSetting.cursorColor;
+    final value = _measureSystemSetting.measureColor;
     if (value != null) {
       if (value.startsWith("#")) {
         Color colorFromHex = Color(int.parse(value.substring(1), radix: 16));

+ 2 - 2
pubspec.lock

@@ -191,8 +191,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "6f1d87578b"
-      resolved-ref: "6f1d87578b23b0ac151297b7d7d5b6215bf65412"
+      ref: "6b6cb44"
+      resolved-ref: "6b6cb44f6e8477ccc1a5a30a80701fce60d92324"
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git"
     source: git
     version: "0.0.1"

+ 1 - 1
pubspec.yaml

@@ -100,7 +100,7 @@ dependency_overrides:
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_jsonrpc.git
-      ref: "6f1d87578b"
+      ref: "6b6cb44"
   fis_lib_business_components:
     git:
       url: http://git.ius.plus/Project-Wing/fis_lib_business_components.git