|
@@ -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 {
|