urm_rect_measure.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. import 'dart:ui';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:fis_measure/interfaces/date_types/point.dart';
  4. import 'package:fis_measure/interfaces/enums/items.dart';
  5. import 'package:fis_measure/interfaces/process/items/item.dart';
  6. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  7. import 'package:fis_measure/interfaces/process/items/types.dart';
  8. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  9. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_den_measure.dart';
  10. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_den_vel_measure.dart';
  11. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_density.dart';
  12. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_fractal_dim.dart';
  13. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_hist.dart';
  14. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_perfusion.dart';
  15. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart';
  16. import 'package:fis_measure/process/items/item.dart';
  17. import 'package:fis_measure/process/primitives/utils/urm_sharp_copy.dart';
  18. import 'package:fis_measure/utils/canvas.dart';
  19. import 'package:fis_measure/utils/prompt_box.dart';
  20. import 'dart:ui' as ui;
  21. import '../../items/item_feature.dart';
  22. class URMRectMeasure extends MeasureItem<URMRectFeature> {
  23. URMRectMeasure(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  24. static URMRectMeasure createMeasureRect(ItemMeta meta,
  25. [IMeasureItem? parent]) {
  26. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  27. // measureRect.calculator = URMRectCal(measureRect, );
  28. return measureRect;
  29. }
  30. static URMRectMeasure createURMRectDensity(ItemMeta meta,
  31. [IMeasureItem? parent]) {
  32. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  33. measureRect.calculator = URMRectDensityCal(
  34. measureRect,
  35. );
  36. return measureRect;
  37. }
  38. static URMRectMeasure createURMRectFractalDim(ItemMeta meta,
  39. [IMeasureItem? parent]) {
  40. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  41. measureRect.calculator = URMRectFractalDimCal(
  42. measureRect,
  43. );
  44. return measureRect;
  45. }
  46. static URMRectMeasure createURMRectDenMeasure(ItemMeta meta,
  47. [IMeasureItem? parent]) {
  48. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  49. measureRect.calculator = URMRectDenMeasureCal(
  50. measureRect,
  51. );
  52. return measureRect;
  53. }
  54. static URMRectMeasure createURMRectPerfusion(ItemMeta meta,
  55. [IMeasureItem? parent]) {
  56. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  57. measureRect.calculator = URMRectPerfusionCal(
  58. measureRect,
  59. );
  60. return measureRect;
  61. }
  62. static URMRectMeasure createURMRectHist(ItemMeta meta,
  63. [IMeasureItem? parent]) {
  64. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  65. measureRect.calculator = URMRectHistCal(
  66. measureRect,
  67. );
  68. return measureRect;
  69. }
  70. static URMRectMeasure createURMRectDenVelMeasure(ItemMeta meta,
  71. [IMeasureItem? parent]) {
  72. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  73. measureRect.calculator = URMRectDenVelMeasureCal(
  74. measureRect,
  75. );
  76. return measureRect;
  77. }
  78. static URMRectMeasure createURMRectVelMeasure(ItemMeta meta,
  79. [IMeasureItem? parent]) {
  80. URMRectMeasure measureRectVel = URMRectMeasure(meta, parent);
  81. measureRectVel.calculator = URMRectVelMeasureCal(
  82. measureRectVel,
  83. );
  84. return measureRectVel;
  85. }
  86. @override
  87. bool onExecuteMouse(PointInfo args) {
  88. if (waitingResult) return false;
  89. if (state == ItemStates.finished) {
  90. if (args.pointType == PointInfoType.mouseDown) {
  91. state = ItemStates.waiting;
  92. }
  93. }
  94. if (state == ItemStates.waiting) {
  95. if (args.pointType == PointInfoType.mouseDown) {
  96. handleMouseDownWhileWaiting(args);
  97. }
  98. } else if (state == ItemStates.running) {
  99. if (args.pointType == PointInfoType.mouseUp) return false;
  100. feature?.endPoint = args;
  101. if (args.pointType == PointInfoType.mouseDown) {
  102. handleFinish();
  103. }
  104. }
  105. return true;
  106. }
  107. bool waitingResult = false;
  108. void handleFinish({bool recordSharp = true}) async {
  109. if (recordSharp) {
  110. _recordSharp();
  111. }
  112. feature!.isActive = false;
  113. waitingResult = true;
  114. await doCalculateAsync();
  115. doFeatureFinish();
  116. PromptBox.dismiss();
  117. waitingResult = false;
  118. }
  119. void _recordSharp() {
  120. UrmSharpCopyBoard.recordSharp(
  121. UrmSharpCopyDataType.rect,
  122. [feature!.startPoint, feature!.endPoint],
  123. );
  124. }
  125. @override
  126. bool onExecuteTouch(PointInfo args) {
  127. // TODO: implement onExecuteTouch
  128. throw UnimplementedError();
  129. }
  130. void handleMouseDownWhileWaiting(PointInfo args) {
  131. // TODO: 判断是否当前area
  132. // 转换为Area逻辑位置
  133. final point = args.toAreaLogicPoint();
  134. if (meta.measureType == MeasureTypes.URMRectPerfusion) {
  135. feature = RectPerfusionImageFeature(this, point, point);
  136. if (args.hostVisualArea != null) {
  137. feature!.hostVisualArea = args.hostVisualArea;
  138. }
  139. } else {
  140. feature = URMRectFeature(this, point, point);
  141. if (args.hostVisualArea != null) {
  142. feature!.hostVisualArea = args.hostVisualArea;
  143. }
  144. }
  145. state = ItemStates.running;
  146. }
  147. }
  148. class URMRectFeature extends MeasureItemFeature {
  149. URMRectFeature(
  150. IMeasureItem refItem,
  151. DPoint startPoint,
  152. DPoint endPoint,
  153. ) : super(refItem) {
  154. innerPoints.add(startPoint);
  155. innerPoints.add(endPoint);
  156. }
  157. /// 起点
  158. DPoint get startPoint => innerPoints[0];
  159. set startPoint(DPoint value) => innerPoints[0] = value;
  160. /// 终点
  161. DPoint get endPoint => innerPoints[1];
  162. set endPoint(DPoint value) => innerPoints[1] = value;
  163. List<List<Offset>> offsetsList = [];
  164. // List<List<Offset>> scaledOffsetsList = [];
  165. @override
  166. void paint(Canvas canvas, Size size) {
  167. if (startPoint == endPoint) return;
  168. drawId(canvas, size, idText);
  169. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  170. drawVertex(canvas, startOffset);
  171. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  172. canvas.drawDashRect(startOffset, endOffset, 1, 10, paintPan);
  173. drawVertex(canvas, endOffset, isActive);
  174. //绘制点集连线
  175. // scaledOffsetsList = offsetsList.map((e) {
  176. // return e.map((e) {
  177. // return e * refItem.scaleRatio;
  178. // }).toList();
  179. // }).toList();
  180. for (var offsets in offsetsList) {
  181. canvas.drawPointsLine(offsets, paintLinePan);
  182. }
  183. }
  184. /// 绘制灌注图
  185. @override
  186. void paintPerfusion(Canvas canvas, Size size) {}
  187. }
  188. class RectPerfusionImageFeature extends URMRectFeature {
  189. RectPerfusionImageFeature(
  190. IMeasureItem refItem,
  191. DPoint startPoint,
  192. DPoint endPoint,
  193. ) : super(refItem, startPoint, endPoint);
  194. ui.Image? perfusionImg;
  195. IntRect? perfusionPiexlRect;
  196. DPoint? leftTopPoint;
  197. DPoint? rightBottomPoint;
  198. /// 绘制灌注图
  199. @override
  200. void paintPerfusion(Canvas canvas, Size size) {
  201. if (perfusionImg != null) {
  202. Paint paint = Paint();
  203. Rect src = Rect.fromLTWH(
  204. 0,
  205. 0,
  206. perfusionImg!.width.toDouble(),
  207. perfusionImg!.height.toDouble(),
  208. );
  209. if (leftTopPoint == null || rightBottomPoint == null) {
  210. return;
  211. }
  212. DPoint leftTop = convert2ViewPoint(size, leftTopPoint!);
  213. DPoint rightBottom = convert2ViewPoint(size, rightBottomPoint!);
  214. convert2ViewPoint(size, rightBottomPoint!);
  215. Rect dst = Rect.fromPoints(
  216. Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
  217. canvas.drawImageRect(perfusionImg!, src, dst, paint);
  218. }
  219. }
  220. }