Browse Source

新增 V3 的 URM 测量项

gavin.chen 9 months ago
parent
commit
52b4300b72

+ 62 - 0
lib/interfaces/process/urm/urm_data_processor.dart

@@ -0,0 +1,62 @@
+import 'package:fis_jsonrpc/services/aIDiagnosis.m.dart';
+
+abstract class IURMDataProcessor {
+  URMMeasureParams getURMMeasureParams();
+}
+
+class URMMeasureParams {
+  String remedicalCode = ""; // 手动取值
+  String urmImageType = "1"; // 手动取值
+  bool urmBlend = false; // 手动取值
+  double downsampleIndex = 0; // 手动取值
+  double intPowerDen = 0; // 手动取值
+  double intPowerDir = 0; // 手动取值
+  double sigmaGauss = 0; // 手动取值
+  double vessScale = 0; // 手动取值
+  double velMaxScaler = 0; // 手动取值
+  double velMinScaler = 0; // 手动取值
+  double iterations = 0; // 手动取值
+  int imgProcessVer = 0; // 手动取值
+  bool zoomOn = false; // 手动取值
+  double zoomRoix = 0; // 手动取值
+  double zoomRoiy = 0; // 手动取值
+  double zoomRoiwidth = 0; // 手动取值
+  double zoomRoiheight = 0; // 手动取值
+  int roix = 0; // 手动取值
+  int roiy = 0; // 手动取值
+  int roiwidth = 0; // 手动取值
+  int roiheight = 0; // 手动取值
+  bool leftRight = false; // 手动取值
+  bool upDown = false; // 手动取值
+  int screenWidth = 0; // 手动取值
+  int screenHeight = 0; // 手动取值
+  List<UrmPoint>? urmTraceDPoints; // 手动取值
+  URMMeasureParams({
+    required this.remedicalCode,
+    required this.urmImageType,
+    required this.urmBlend,
+    required this.downsampleIndex,
+    required this.intPowerDen,
+    required this.intPowerDir,
+    required this.sigmaGauss,
+    required this.vessScale,
+    required this.velMaxScaler,
+    required this.velMinScaler,
+    required this.iterations,
+    required this.imgProcessVer,
+    required this.zoomOn,
+    required this.zoomRoix,
+    required this.zoomRoiy,
+    required this.zoomRoiwidth,
+    required this.zoomRoiheight,
+    required this.roix,
+    required this.roiy,
+    required this.roiwidth,
+    required this.roiheight,
+    required this.leftRight,
+    required this.upDown,
+    required this.screenWidth,
+    required this.screenHeight,
+    required this.urmTraceDPoints,
+  });
+}

+ 57 - 49
lib/process/calcuators/urm.dart

@@ -300,29 +300,31 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
       final rightBottomPercent =
           DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
 
-      final startPoint = leftTopPercent.scale2Size(urmResultSize);
-      final endPoint = rightBottomPercent.scale2Size(urmResultSize);
-
-      // switch (type) {
-      //   case MeasureTypes.SRCurvature:
-      //     await getSRCurvatureResult(urmApplication, startPoint, endPoint);
-      //     break;
-      //   case MeasureTypes.URMDensityMeasure:
-      //     await getURMDenMeasureResult(urmApplication, startPoint, endPoint);
-      //     break;
-      //   case MeasureTypes.URMVesselMeasure:
-      //     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 cmlength = (pp2 - pp1).length.abs();
-      //     await getURMVessMeasureResult(
-      //         urmApplication, startPoint, endPoint, cmlength);
-      //     break;
-      //   default:
-      // }
+      // final startPoint = leftTopPercent.scale2Size(urmResultSize);
+      // final endPoint = rightBottomPercent.scale2Size(urmResultSize);
+      final startPoint = DPoint(0.478335, 0.315384);
+      final endPoint = DPoint(0.538395, 0.526373);
+
+      switch (type) {
+        case MeasureTypes.SRCurvature:
+          await getSRCurvatureResult(urmApplication, startPoint, endPoint);
+          break;
+        // case MeasureTypes.URMDensityMeasure:
+        //   await getURMDenMeasureResult(urmApplication, startPoint, endPoint);
+        //   break;
+        // case MeasureTypes.URMVesselMeasure:
+        //   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 cmlength = (pp2 - pp1).length.abs();
+        //   await getURMVessMeasureResult(
+        //       urmApplication, startPoint, endPoint, cmlength);
+        //   break;
+        default:
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
@@ -330,32 +332,38 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
   }
 
   // // ✅ URM 测量项 1
-  // Future<void> getSRCurvatureResult(
-  //     URMApplication app, DPoint startPoint, DPoint endPoint) async {
-  //   String description = "URM\n Measuring";
-  //   try {
-  //     GetSRCurvatureResult? result =
-  //         await app.getSRCurvatureResult(startPoint, endPoint);
-  //     if (result != null) {
-  //       print(
-  //           "URM Measure curvature: ${result.curvature} nums: ${result.outPointsNum}");
-  //       final feature = ref.feature!;
-  //       for (var output in ref.meta.outputs) {
-  //         if (output.name == MeasureTerms.SRCurvature) {
-  //           output.unit = VidUsUnit.None;
-  //           feature.updateFloatValue(output, result.curvature, output.unit);
-  //         }
-  //       }
-  //     } else {
-  //       throw Exception("URM Measure API error");
-  //     }
-  //   } catch (e) {
-  //     description = " ";
-  //     updateStringValue(description);
-  //     return;
-  //   }
-  //   ref.application.updateRenderReady.emit(this, null);
-  // }
+  Future<void> getSRCurvatureResult(
+      URMApplication app, DPoint startPoint, DPoint endPoint) async {
+    String description = "URM\n Measuring";
+    try {
+      URMMeasureProcessResult? result = await app.getURMMeasureResult(
+        urmMeasureType: URMMeasureType.URMCurvature,
+        rOIType: URMROIType.placeHolder_0,
+        srcDPoints: [
+          UrmPoint(x: startPoint.x, y: startPoint.y),
+          UrmPoint(x: endPoint.x, y: endPoint.y)
+        ],
+      );
+      if (result != null) {
+        print("URM Measure curvature: ${result} nums: ${result.resultDPoints}");
+        // TODO 将返回的视图百分比区域的点集转换为全图百分比点集,然会然后绘制
+        final feature = ref.feature!;
+        for (var output in ref.meta.outputs) {
+          if (output.name == MeasureTerms.SRCurvature) {
+            output.unit = VidUsUnit.None;
+            feature.updateFloatValue(output, 999.0, output.unit);
+          }
+        }
+      } else {
+        throw Exception("URM Measure API error");
+      }
+    } catch (e) {
+      description = " ";
+      updateStringValue(description);
+      return;
+    }
+    ref.application.updateRenderReady.emit(this, null);
+  }
 
   // //✅ URM 测量项 8
   // Future<void> getURMDenMeasureResult(

+ 65 - 112
lib/process/workspace/urm/application.dart

@@ -1,6 +1,8 @@
 import 'dart:math';
+import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/services/aIDiagnosis.m.dart';
 import 'package:fis_measure/interfaces/date_types/point.dart';
+import 'package:fis_measure/interfaces/process/urm/urm_data_processor.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual.dart';
 import 'package:fis_measure/process/visual/v2d_visual.dart';
 import 'package:fis_measure/process/workspace/rpc_bridge.dart';
@@ -18,104 +20,23 @@ import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 class URMApplication extends Application {
   URMApplication(
     VidUsProbe probe, {
-    required this.beams,
-    required this.samples,
-    required this.roiRect,
     required this.resultWidth,
     required this.resultHeight,
-    required this.remedicalCode,
-    required this.originVisuals,
+    required this.urmDataProcessor,
     this.onUpdateChart,
   }) : super(probe);
 
-  @override
-  bool get isThirdPart => true;
-
-  List<IVisual> originVisuals; // 原始的视图坐标系
-
-  int beams; // 原图有效的beam数量
-
-  int samples; // 原图有效的sample数量
-
-  Rect roiRect; // ROI区域
+  IURMDataProcessor urmDataProcessor;
 
   int resultWidth; // 分析结果图像宽度
 
   int resultHeight; // 分析结果图像高度
 
-  String remedicalCode; // 图像 Code
-
-  bool syncDisplay = false; // 是否开启同步显示
-
-  double urmPhysicalwidth = 1.0; // URM 结果物理宽度
-
-  double urmPhysicalheight = 1.0; // URM 结果物理高度
-
-  double areaScaler =
-      1.0; // URM 画幅缩放比例  (UrmPhysicalwidth / resultWidth) * (UrmPhysicalheight / resultHeight);
-
-  double pixelscaler = 1.0; // URM 像素缩放比例 UrmPhysicalwidth / resultWidth
-
-  double urmMinVel = 1.0; // TODO 从分析结果获取该值
-
   final ValueChanged<URMChartParams>? onUpdateChart;
 
-  @override
-  List<IVisual> convertVisuals() {
-    var urmVisuals = originVisuals;
-    double beamsPercent = 1;
-    Size physicalSize = Size.zero;
-    if (originVisuals.isNotEmpty) {
-      IVisual visual = originVisuals[0];
-      if (visual is V2dVisual) {
-        VidUsVisual visualData = visual.visualData;
-        if (visualData is VidUs2DVisual) {
-          if (visualData.logicalCoordinates.isNotEmpty &&
-              visualData.physicalCoordinates.isNotEmpty) {
-            beamsPercent = getBeamsPercent(
-              visualData.logicalCoordinates.entries.first.value,
-              visualData.physicalCoordinates.entries.first.value,
-            );
-            physicalSize = getPhysicalSize(
-                visualData.physicalCoordinates.entries.first.value);
-          }
-        }
-
-        double scaleX = roiRect.width / beams * beamsPercent;
-        double scaleY = roiRect.height / samples;
-        urmPhysicalwidth = physicalSize.width * roiRect.width / beams;
-        urmPhysicalheight = physicalSize.height * scaleY;
-        areaScaler = (urmPhysicalwidth / resultWidth) *
-            (urmPhysicalheight / resultHeight);
-        pixelscaler = urmPhysicalwidth / resultWidth;
-        RectRegion region =
-            RectRegion(left: 0, top: 0, right: 1 / scaleX, bottom: 1 / scaleY);
-        V2dVisual v2dVisual = V2dVisual(visualData, region);
-        urmVisuals = [v2dVisual];
-      }
-    }
-    return urmVisuals;
-  }
-
-  double getBeamsPercent(VidUsLogicalCoordinate logicalCoordinate,
-      VidUsPhysicalCoordinate physicalCoordinates) {
-    if (physicalCoordinates is VidUsTissuePhysicalCoordinate) {
-      return (physicalCoordinates.width /
-          (logicalCoordinate.region.right - logicalCoordinate.region.left));
-    }
-    return 1;
-  }
-
-  Size getPhysicalSize(VidUsPhysicalCoordinate physicalCoordinates) {
-    if (physicalCoordinates is VidUsTissuePhysicalCoordinate) {
-      return Size(physicalCoordinates.width,
-          physicalCoordinates.depthEnd - physicalCoordinates.depthStart);
-    }
-    return Size.zero;
-  }
-
   @override
   PointInfo createPointInfo(Offset offset, PointInfoType type) {
+    // 当前获取到的 displaysize 是错误的,需要手动转一道,将 offset 转为正确的屏幕百分比坐标
     final width = displaySize.width;
     final height = displaySize.height;
     final x = offset.dx / width;
@@ -140,40 +61,72 @@ class URMApplication extends Application {
 
   @override
   double get displayScaleRatio {
-    return max(
-        1,
-        min(displaySize.width / resultWidth,
-            displaySize.height / resultHeight));
-    // return 1.0;
+    // return max(
+    //     1,
+    //     min(displaySize.width / resultWidth,
+    //         displaySize.height / resultHeight));
+    return 1.0;
   }
 
   void loadURMVisuals() {
     loadVisuals();
   }
 
-  // Future<GetSRCurvatureResult?> getSRCurvatureResult(
-  //     DPoint startPoint, DPoint endPoint) async {
-  //   try {
-  //     print("调接口获取测量值 getSRCurvatureAsync");
-  //     GetSRCurvatureResult result =
-  //         await RPCBridge.ins.rpc.aIDiagnosis.getSRCurvatureAsync(
-  //       GetSRCurvatureRequest(
-  //         remedicalCode: remedicalCode,
-  //         measureMode: 5, // 5-URM测量Den,6-URM测量Vel
-  //         dataWidth: resultWidth,
-  //         dataHeight: resultHeight,
-  //         startPointX: startPoint.x,
-  //         startPointY: startPoint.y,
-  //         endPointX: endPoint.x,
-  //         endPointY: endPoint.y,
-  //         token: RPCBridge.ins.userToken,
-  //       ),
-  //     );
-  //     return result;
-  //   } catch (e) {
-  //     return null;
-  //   }
-  // }
+  Future<URMMeasureProcessResult?> getURMMeasureResult({
+    required URMMeasureType urmMeasureType,
+    required URMROIType rOIType,
+    List<UrmPoint>? srcDPoints,
+    double? cMlength,
+    double shellWidth = 0,
+  }) async {
+    try {
+      print("调接口获取测量值 getURMMeasureResult");
+      URMMeasureParams params = urmDataProcessor.getURMMeasureParams();
+      URMMeasureProcessResult result =
+          await RPCBridge.ins.rpc.aIDiagnosis.uRMMeasureProcessAsync(
+        URMMeasureProcessRequest(
+          remedicalCode: params.remedicalCode,
+          token: RPCBridge.ins.userToken,
+          urmMeasureType: urmMeasureType, // 手动传入
+          rOIType: rOIType, // 手动传入
+          srcDPoints: srcDPoints, // 手动传入
+          cMlength: cMlength, // 手动传入
+          shellWidth: shellWidth, // 手动传入
+          phywidth: 1, // TODO 手动计算
+          urmImageType: params.urmImageType, // 手动取值
+          urmBlend: params.urmBlend, // 手动取值
+          downsampleIndex: params.downsampleIndex, // 手动取值
+          intPowerDen: params.intPowerDen, // 手动取值
+          intPowerDir: params.intPowerDir, // 手动取值
+          sigmaGauss: params.sigmaGauss, // 手动取值
+          vessScale: params.vessScale, // 手动取值
+          velMaxScaler: params.velMaxScaler, // 手动取值
+          velMinScaler: params.velMinScaler, // 手动取值
+          iterations: params.iterations, // 手动取值
+          imgProcessVer: params.imgProcessVer, // 手动取值
+          zoomOn: params.zoomOn, // 手动取值
+          zoomRoix: params.zoomRoix, // 手动取值
+          zoomRoiy: params.zoomRoiy, // 手动取值
+          zoomRoiwidth: params.zoomRoiwidth, // 手动取值
+          zoomRoiheight: params.zoomRoiheight, // 手动取值
+          roix: params.roix, // 手动取值
+          roiy: params.roiy, // 手动取值
+          roiwidth: params.roiwidth, // 手动取值
+          roiheight: params.roiheight, // 手动取值
+          leftRight: params.leftRight, // 手动取值
+          upDown: params.upDown, // 手动取值
+          screenWidth: params.screenWidth, // 手动取值
+          screenHeight: params.screenHeight, // 手动取值
+          urmTraceDPoints: params.urmTraceDPoints, // 手动取值
+        ),
+      );
+      return result;
+    } catch (e) {
+      logger.e("URM measure error($e)");
+      print("getURMMeasureResult error: $e");
+      return null;
+    }
+  }
 
   // Future<GetSRRoiVelResult?> getSRRoiVelResult(
   //     DPoint startPoint, DPoint endPoint) async {

+ 2 - 2
pubspec.lock

@@ -191,8 +191,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "73f1b16"
-      resolved-ref: "73f1b1647fb191684b8c04b8cdf65530562f399d"
+      ref: "9ecd100"
+      resolved-ref: "9ecd100964bb61833ce2f011988e41054d9821c4"
       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: "73f1b16"
+      ref: "9ecd100"
   fis_lib_business_components:
     git:
       url: http://git.ius.plus/Project-Wing/fis_lib_business_components.git