urm_rect_measure.dart 7.4 KB

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