application.dart 7.8 KB

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