application.dart 7.5 KB

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