application.dart 7.8 KB

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