application.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import 'dart:math';
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:fis_jsonrpc/services/aIDiagnosis.m.dart';
  5. import 'package:fis_measure/interfaces/date_types/point.dart';
  6. import 'package:fis_measure/interfaces/process/urm/urm_data_processor.dart';
  7. import 'package:fis_measure/process/workspace/rpc_bridge.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:vid/us/vid_us_probe.dart';
  10. import '../application.dart';
  11. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  12. /// URM 专业应用
  13. class URMApplication extends Application {
  14. URMApplication(
  15. VidUsProbe probe, {
  16. required this.resultWidth,
  17. required this.resultHeight,
  18. required this.urmDataProcessor,
  19. this.onUpdateChart,
  20. }) : super(probe);
  21. IURMDataProcessor urmDataProcessor;
  22. int resultWidth; // 分析结果图像宽度
  23. int resultHeight; // 分析结果图像高度
  24. final ValueChanged<URMChartParams>? onUpdateChart;
  25. @override
  26. PointInfo createPointInfo(Offset offset, PointInfoType type) {
  27. final width = urmDataProcessor.showLeftRight
  28. ? displaySize.width / 2
  29. : displaySize.width;
  30. final height = displaySize.height;
  31. final x = offset.dx / width;
  32. final y = offset.dy / height;
  33. Rect zoomArea = urmDataProcessor.measureAreaInFullVisual;
  34. Offset percentOffset = Offset(x, y);
  35. percentOffset = pointPctOutRect(zoomArea, percentOffset);
  36. final info = PointInfo.fromOffset(percentOffset, type);
  37. info.hostVisualArea = currentVisualArea; // 未切换区域则沿用当前区域
  38. if (isAnnotationWorking) {
  39. activeAnnotationItem?.execute(info);
  40. } else {
  41. activeMeasureItem?.execute(info);
  42. if (type == PointInfoType.touchMove) {
  43. mobileTouchEvent.emit(this, offset); // 传出移动事件
  44. }
  45. if (type == PointInfoType.touchUp) {
  46. mobileTouchEndEvent.emit(this, offset); // 传出触摸结束事件
  47. }
  48. }
  49. return info;
  50. }
  51. @override
  52. double get displayScaleRatio {
  53. // return max(
  54. // 1,
  55. // min(displaySize.width / resultWidth,
  56. // displaySize.height / resultHeight));
  57. return 1.0;
  58. }
  59. void loadURMVisuals() {
  60. loadVisuals();
  61. }
  62. Future<URMMeasureProcessResult?> getURMMeasureResult({
  63. required URMMeasureType urmMeasureType,
  64. required URMROIType rOIType,
  65. List<UrmPoint>? srcDPoints,
  66. double? cMlength,
  67. double shellWidth = 0,
  68. }) async {
  69. try {
  70. print("调接口获取测量值 getURMMeasureResult");
  71. URMMeasureParams params = urmDataProcessor.getURMMeasureParams();
  72. URMMeasureProcessResult result =
  73. await RPCBridge.ins.rpc.aIDiagnosis.uRMMeasureProcessAsync(
  74. URMMeasureProcessRequest(
  75. remedicalCode: params.remedicalCode,
  76. token: RPCBridge.ins.userToken,
  77. urmMeasureType: urmMeasureType, // 手动传入
  78. rOIType: rOIType, // 手动传入
  79. srcDPoints: srcDPoints, // 手动传入
  80. cMlength: cMlength, // 手动传入
  81. shellWidth: shellWidth, // 手动传入
  82. phywidth: urmDataProcessor.phywidth, // 手动计算
  83. urmImageType: params.urmImageType, // 手动取值
  84. urmBlend: params.urmBlend, // 手动取值
  85. downsampleIndex: params.downsampleIndex, // 手动取值
  86. intPowerDen: params.intPowerDen, // 手动取值
  87. intPowerDir: params.intPowerDir, // 手动取值
  88. sigmaGauss: params.sigmaGauss, // 手动取值
  89. vessScale: params.vessScale, // 手动取值
  90. velMaxScaler: params.velMaxScaler, // 手动取值
  91. velMinScaler: params.velMinScaler, // 手动取值
  92. iterations: params.iterations, // 手动取值
  93. imgProcessVer: params.imgProcessVer, // 手动取值
  94. zoomOn: params.zoomOn, // 手动取值
  95. zoomRoix: params.zoomRoix, // 手动取值
  96. zoomRoiy: params.zoomRoiy, // 手动取值
  97. zoomRoiwidth: params.zoomRoiwidth, // 手动取值
  98. zoomRoiheight: params.zoomRoiheight, // 手动取值
  99. roix: params.roix, // 手动取值
  100. roiy: params.roiy, // 手动取值
  101. roiwidth: params.roiwidth, // 手动取值
  102. roiheight: params.roiheight, // 手动取值
  103. leftRight: params.leftRight, // 手动取值
  104. upDown: params.upDown, // 手动取值
  105. screenWidth: params.screenWidth, // 手动取值
  106. screenHeight: params.screenHeight, // 手动取值
  107. urmTraceDPoints: params.urmTraceDPoints, // 手动取值
  108. ),
  109. );
  110. return result;
  111. } catch (e) {
  112. logger.e("URM measure error($e)");
  113. print("getURMMeasureResult error: $e");
  114. return null;
  115. }
  116. }
  117. Offset pointPctOutRect(Rect r, Offset p) {
  118. double xPctInR = p.dx * r.width + r.left;
  119. double yPctInR = p.dy * r.height + r.top;
  120. return Offset(xPctInR, yPctInR);
  121. }
  122. Offset pointPctInRect(Rect r, Offset p) {
  123. double xPctOutR = (p.dx - r.left) / r.width;
  124. double yPctOutR = (p.dy - r.top) / r.height;
  125. return Offset(xPctOutR, yPctOutR);
  126. }
  127. // 本地完整图像内归一化坐标转视图(接口中 screenWidth、screenHeight 指代区域)内归一化坐标
  128. UrmPoint localToView(DPoint point) {
  129. Rect urmScreen = urmDataProcessor.urmScreenInFullVisual;
  130. Offset percentOffset = Offset(point.x, point.y);
  131. percentOffset = pointPctInRect(urmScreen, percentOffset);
  132. return UrmPoint(x: percentOffset.dx, y: percentOffset.dy);
  133. }
  134. // 视图(接口中 screenWidth、screenHeight 指代区域)内归一化坐标转本地完整图像内归一化坐标
  135. DPoint viewToLocal(UrmPoint point) {
  136. Rect urmScreen = urmDataProcessor.urmScreenInFullVisual;
  137. Offset percentOffset = Offset(point.x, point.y);
  138. percentOffset = pointPctOutRect(urmScreen, percentOffset);
  139. return DPoint(percentOffset.dx, percentOffset.dy);
  140. }
  141. // 视图(接口中 screenWidth、screenHeight 指代区域)内归一化矩形转本地完整图像内归一化矩形
  142. Rect viewToLocalRect(DRect point) {
  143. DPoint p1 = viewToLocal(UrmPoint(x: point.left, y: point.top));
  144. DPoint p2 = viewToLocal(UrmPoint(x: point.right, y: point.bottom));
  145. return Rect.fromLTRB(p1.x, p1.y, p2.x, p2.y);
  146. }
  147. // 类型转换
  148. List<UrmPoint> dPointsToUrmPoints(List<DPoint>? points) {
  149. if (points == null) return [];
  150. List<UrmPoint> urmPoints = [];
  151. for (var point in points) {
  152. urmPoints.add(localToView(point));
  153. }
  154. return urmPoints;
  155. }
  156. // 类型转换
  157. List<DPoint> urmPointsToDPoints(List<UrmPoint>? points) {
  158. if (points == null) return [];
  159. List<DPoint> urmPoints = [];
  160. for (var point in points) {
  161. urmPoints.add(viewToLocal(point));
  162. }
  163. return urmPoints;
  164. }
  165. }
  166. class URMChartParams {
  167. final List<Point> points;
  168. final double cmlength;
  169. final int maxPointIndex;
  170. final int minPointIndex;
  171. URMChartParams({
  172. required this.points,
  173. required this.cmlength,
  174. required this.maxPointIndex,
  175. required this.minPointIndex,
  176. });
  177. }
  178. class URMSimpleMeasureParams {
  179. final URMMeasureType urmMeasureType;
  180. final URMROIType rOIType;
  181. final List<UrmPoint>? srcDPoints;
  182. final double? cMlength;
  183. double? shellWidth = 0;
  184. URMSimpleMeasureParams({
  185. required this.urmMeasureType,
  186. required this.rOIType,
  187. this.srcDPoints,
  188. this.cMlength,
  189. this.shellWidth,
  190. });
  191. }