application.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. import 'dart:math';
  2. import 'package:fis_common/logger/logger.dart';
  3. import 'package:fis_jsonrpc/services/aIDiagnosis.m.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/interfaces/process/visuals/visual.dart';
  7. import 'package:fis_measure/process/visual/v2d_visual.dart';
  8. import 'package:fis_measure/process/workspace/rpc_bridge.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:vid/us/vid_us_probe.dart';
  11. import '../application.dart';
  12. import 'package:fis_measure/interfaces/date_types/rect_region.dart';
  13. import 'package:vid/us/vid_us_2d_visual.dart';
  14. import 'package:vid/us/vid_us_logical_coordinate.dart';
  15. import 'package:vid/us/vid_us_physical_coordinate.dart';
  16. import 'package:vid/us/vid_us_visual.dart';
  17. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  18. /// URM 专业应用
  19. class URMApplication extends Application {
  20. URMApplication(
  21. VidUsProbe probe, {
  22. required this.resultWidth,
  23. required this.resultHeight,
  24. required this.urmDataProcessor,
  25. this.onUpdateChart,
  26. }) : super(probe);
  27. IURMDataProcessor urmDataProcessor;
  28. int resultWidth; // 分析结果图像宽度
  29. int resultHeight; // 分析结果图像高度
  30. final ValueChanged<URMChartParams>? onUpdateChart;
  31. @override
  32. PointInfo createPointInfo(Offset offset, PointInfoType type) {
  33. // 当前获取到的 displaysize 是错误的,需要手动转一道,将 offset 转为正确的屏幕百分比坐标
  34. final width = displaySize.width;
  35. final height = displaySize.height;
  36. final x = offset.dx / width;
  37. final y = offset.dy / height;
  38. final percentOffset = Offset(x, y);
  39. final info = PointInfo.fromOffset(percentOffset, type);
  40. info.hostVisualArea = currentVisualArea; // 未切换区域则沿用当前区域
  41. if (isAnnotationWorking) {
  42. activeAnnotationItem?.execute(info);
  43. } else {
  44. activeMeasureItem?.execute(info);
  45. if (type == PointInfoType.touchMove) {
  46. mobileTouchEvent.emit(this, offset); // 传出移动事件
  47. }
  48. if (type == PointInfoType.touchUp) {
  49. mobileTouchEndEvent.emit(this, offset); // 传出触摸结束事件
  50. }
  51. }
  52. return info;
  53. }
  54. @override
  55. double get displayScaleRatio {
  56. // return max(
  57. // 1,
  58. // min(displaySize.width / resultWidth,
  59. // displaySize.height / resultHeight));
  60. return 1.0;
  61. }
  62. void loadURMVisuals() {
  63. loadVisuals();
  64. }
  65. Future<URMMeasureProcessResult?> getURMMeasureResult({
  66. required URMMeasureType urmMeasureType,
  67. required URMROIType rOIType,
  68. List<UrmPoint>? srcDPoints,
  69. double? cMlength,
  70. double shellWidth = 0,
  71. }) async {
  72. try {
  73. print("调接口获取测量值 getURMMeasureResult");
  74. URMMeasureParams params = urmDataProcessor.getURMMeasureParams();
  75. URMMeasureProcessResult result =
  76. await RPCBridge.ins.rpc.aIDiagnosis.uRMMeasureProcessAsync(
  77. URMMeasureProcessRequest(
  78. remedicalCode: params.remedicalCode,
  79. token: RPCBridge.ins.userToken,
  80. urmMeasureType: urmMeasureType, // 手动传入
  81. rOIType: rOIType, // 手动传入
  82. srcDPoints: srcDPoints, // 手动传入
  83. cMlength: cMlength, // 手动传入
  84. shellWidth: shellWidth, // 手动传入
  85. phywidth: 1, // TODO 手动计算
  86. urmImageType: params.urmImageType, // 手动取值
  87. urmBlend: params.urmBlend, // 手动取值
  88. downsampleIndex: params.downsampleIndex, // 手动取值
  89. intPowerDen: params.intPowerDen, // 手动取值
  90. intPowerDir: params.intPowerDir, // 手动取值
  91. sigmaGauss: params.sigmaGauss, // 手动取值
  92. vessScale: params.vessScale, // 手动取值
  93. velMaxScaler: params.velMaxScaler, // 手动取值
  94. velMinScaler: params.velMinScaler, // 手动取值
  95. iterations: params.iterations, // 手动取值
  96. imgProcessVer: params.imgProcessVer, // 手动取值
  97. zoomOn: params.zoomOn, // 手动取值
  98. zoomRoix: params.zoomRoix, // 手动取值
  99. zoomRoiy: params.zoomRoiy, // 手动取值
  100. zoomRoiwidth: params.zoomRoiwidth, // 手动取值
  101. zoomRoiheight: params.zoomRoiheight, // 手动取值
  102. roix: params.roix, // 手动取值
  103. roiy: params.roiy, // 手动取值
  104. roiwidth: params.roiwidth, // 手动取值
  105. roiheight: params.roiheight, // 手动取值
  106. leftRight: params.leftRight, // 手动取值
  107. upDown: params.upDown, // 手动取值
  108. screenWidth: params.screenWidth, // 手动取值
  109. screenHeight: params.screenHeight, // 手动取值
  110. urmTraceDPoints: params.urmTraceDPoints, // 手动取值
  111. ),
  112. );
  113. return result;
  114. } catch (e) {
  115. logger.e("URM measure error($e)");
  116. print("getURMMeasureResult error: $e");
  117. return null;
  118. }
  119. }
  120. // Future<GetSRRoiVelResult?> getSRRoiVelResult(
  121. // DPoint startPoint, DPoint endPoint) async {
  122. // try {
  123. // print("调接口获取测量值 getSRRoiVelAsync");
  124. // GetSRRoiVelResult result =
  125. // await RPCBridge.ins.rpc.aIDiagnosis.getSRRoiVelAsync(
  126. // GetSRRoiVelRequest(
  127. // remedicalCode: remedicalCode,
  128. // measureMode: 5,
  129. // dataWidth: resultWidth,
  130. // dataHeight: resultHeight,
  131. // startPointX: startPoint.x,
  132. // startPointY: startPoint.y,
  133. // endPointX: endPoint.x,
  134. // endPointY: endPoint.y,
  135. // token: RPCBridge.ins.userToken,
  136. // ),
  137. // );
  138. // return result;
  139. // } catch (e) {
  140. // return null;
  141. // }
  142. // }
  143. // Future<GetSRRoiFractalDimResult?> getSRRoiFractalDimResult(
  144. // DPoint startPoint, DPoint endPoint) async {
  145. // try {
  146. // print("调接口获取测量值 getSRRoiFractalDimAsync");
  147. // GetSRRoiFractalDimResult result =
  148. // await RPCBridge.ins.rpc.aIDiagnosis.getSRRoiFractalDimAsync(
  149. // GetSRRoiFractalDimRequest(
  150. // remedicalCode: remedicalCode,
  151. // measureMode: 5,
  152. // dataWidth: resultWidth,
  153. // dataHeight: resultHeight,
  154. // startPointX: startPoint.x,
  155. // startPointY: startPoint.y,
  156. // endPointX: endPoint.x,
  157. // endPointY: endPoint.y,
  158. // token: RPCBridge.ins.userToken,
  159. // ),
  160. // );
  161. // return result;
  162. // } catch (e) {
  163. // return null;
  164. // }
  165. // }
  166. // Future<GetSRTraceVelResult?> getSRTraceVelResult(
  167. // List<UrmPoint> points,
  168. // ) async {
  169. // try {
  170. // print("调接口获取测量值 getSRTraceVelResult");
  171. // GetSRTraceVelResult result =
  172. // await RPCBridge.ins.rpc.aIDiagnosis.getSRTraceVelAsync(
  173. // GetSRTraceVelRequest(
  174. // remedicalCode: remedicalCode,
  175. // measureMode: 5,
  176. // dataWidth: resultWidth,
  177. // dataHeight: resultHeight,
  178. // inputPoints: points,
  179. // token: RPCBridge.ins.userToken,
  180. // ),
  181. // );
  182. // return result;
  183. // } catch (e) {
  184. // return null;
  185. // }
  186. // }
  187. // Future<GetSRTraceFractalDimResult?> getSRTraceFractalDimResult(
  188. // List<UrmPoint> points,
  189. // ) async {
  190. // try {
  191. // print("调接口获取测量值 getSRTraceFractalDimAsync");
  192. // GetSRTraceFractalDimResult result =
  193. // await RPCBridge.ins.rpc.aIDiagnosis.getSRTraceFractalDimAsync(
  194. // GetSRTraceFractalDimRequest(
  195. // remedicalCode: remedicalCode,
  196. // measureMode: 5,
  197. // dataWidth: resultWidth,
  198. // dataHeight: resultHeight,
  199. // inputPoints: points,
  200. // token: RPCBridge.ins.userToken,
  201. // ),
  202. // );
  203. // return result;
  204. // } catch (e) {
  205. // return null;
  206. // }
  207. // }
  208. // Future<GetSRLoactionVelResult?> getSRLoactionVelResult(
  209. // DPoint point,
  210. // ) async {
  211. // try {
  212. // print("调接口获取测量值 getSRLoactionVelAsync");
  213. // GetSRLoactionVelResult result =
  214. // await RPCBridge.ins.rpc.aIDiagnosis.getSRLoactionVelAsync(
  215. // GetSRLoactionVelRequest(
  216. // remedicalCode: remedicalCode,
  217. // measureMode: 6,
  218. // dataWidth: resultWidth,
  219. // dataHeight: resultHeight,
  220. // startPointX: point.x,
  221. // startPointY: point.y,
  222. // token: RPCBridge.ins.userToken,
  223. // ),
  224. // );
  225. // return result;
  226. // } catch (e) {
  227. // return null;
  228. // }
  229. // }
  230. // Future<GetSRRoiSpeedResult?> getSRRoiSpeedResult(
  231. // DPoint startPoint,
  232. // DPoint endPoint,
  233. // ) async {
  234. // try {
  235. // print("调接口获取测量值 getSRRoiSpeedAsync");
  236. // GetSRRoiSpeedResult result =
  237. // await RPCBridge.ins.rpc.aIDiagnosis.getSRRoiSpeedAsync(
  238. // GetSRRoiSpeedRequest(
  239. // remedicalCode: remedicalCode,
  240. // measureMode: 6,
  241. // dataWidth: resultWidth,
  242. // dataHeight: resultHeight,
  243. // startPointX: startPoint.x,
  244. // startPointY: startPoint.y,
  245. // endPointX: endPoint.x,
  246. // endPointY: endPoint.y,
  247. // token: RPCBridge.ins.userToken,
  248. // ),
  249. // );
  250. // return result;
  251. // } catch (e) {
  252. // return null;
  253. // }
  254. // }
  255. // Future<GetURMDenMeasureResult?> getURMDenMeasureResult(
  256. // DPoint startPoint, DPoint endPoint) async {
  257. // try {
  258. // print("调接口获取测量值 getURMDenMeasureAsync");
  259. // GetURMDenMeasureResult result =
  260. // await RPCBridge.ins.rpc.aIDiagnosis.getURMDenMeasureAsync(
  261. // GetURMDenMeasureRequest(
  262. // remedicalCode: remedicalCode,
  263. // measureMode: 5,
  264. // dataWidth: resultWidth,
  265. // dataHeight: resultHeight,
  266. // startPointX: startPoint.x,
  267. // startPointY: startPoint.y,
  268. // endPointX: endPoint.x,
  269. // endPointY: endPoint.y,
  270. // areaScaler: areaScaler,
  271. // token: RPCBridge.ins.userToken,
  272. // ),
  273. // );
  274. // return result;
  275. // } catch (e) {
  276. // return null;
  277. // }
  278. // }
  279. // Future<GetURMVelMeasureResult?> getURMVelMeasureResult(
  280. // DPoint startPoint, DPoint endPoint) async {
  281. // try {
  282. // print("调接口获取测量值 getURMVelMeasureAsync");
  283. // GetURMVelMeasureResult result =
  284. // await RPCBridge.ins.rpc.aIDiagnosis.getURMVelMeasureAsync(
  285. // GetURMVelMeasureRequest(
  286. // remedicalCode: remedicalCode,
  287. // measureMode: 6,
  288. // dataWidth: resultWidth,
  289. // dataHeight: resultHeight,
  290. // startPointX: startPoint.x,
  291. // startPointY: startPoint.y,
  292. // endPointX: endPoint.x,
  293. // endPointY: endPoint.y,
  294. // areaScaler: areaScaler,
  295. // token: RPCBridge.ins.userToken,
  296. // ),
  297. // );
  298. // return result;
  299. // } catch (e) {
  300. // return null;
  301. // }
  302. // }
  303. // Future<GetUrmVessMeasureResult?> getURMVessMeasureResult(
  304. // DPoint startPoint, DPoint endPoint, double cmlength) async {
  305. // try {
  306. // print("调接口获取测量值 getURMVelMeasureAsync");
  307. // GetUrmVessMeasureResult result =
  308. // await RPCBridge.ins.rpc.aIDiagnosis.getUrmVessMeasureAsync(
  309. // GetUrmVessMeasureRequest(
  310. // remedicalCode: remedicalCode,
  311. // measureMode: 6,
  312. // dataWidth: resultWidth,
  313. // dataHeight: resultHeight,
  314. // startPointX: startPoint.x,
  315. // startPointY: startPoint.y,
  316. // endPointX: endPoint.x,
  317. // endPointY: endPoint.y,
  318. // areaScaler: pixelscaler,
  319. // cmLength: cmlength,
  320. // token: RPCBridge.ins.userToken,
  321. // ),
  322. // );
  323. // return result;
  324. // } catch (e) {
  325. // return null;
  326. // }
  327. // }
  328. }
  329. class URMChartParams {
  330. final List<Point> points;
  331. final double cmlength;
  332. final int maxPointIndex;
  333. final int minPointIndex;
  334. URMChartParams({
  335. required this.points,
  336. required this.cmlength,
  337. required this.maxPointIndex,
  338. required this.minPointIndex,
  339. });
  340. }