urm_rect_measure.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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.running && feature == null) {
  84. state = ItemStates.waiting;
  85. }
  86. if (state == ItemStates.finished) {
  87. if (args.pointType == PointInfoType.mouseDown) {
  88. state = ItemStates.waiting;
  89. }
  90. }
  91. if (state == ItemStates.waiting) {
  92. if (args.pointType == PointInfoType.mouseDown) {
  93. handleMouseDownWhileWaiting(args);
  94. }
  95. } else if (state == ItemStates.running) {
  96. if (args.pointType == PointInfoType.mouseUp) return false;
  97. feature?.endPoint = args;
  98. if (args.pointType == PointInfoType.mouseDown) {
  99. handleFinish();
  100. }
  101. }
  102. return true;
  103. }
  104. bool waitingResult = false;
  105. void handleFinish({bool recordSharp = true}) async {
  106. if (recordSharp) {
  107. _recordSharp();
  108. }
  109. feature!.isActive = false;
  110. waitingResult = true;
  111. await doCalculateAsync();
  112. doFeatureFinish();
  113. doFeatureUpdate(); // 若不执行,子测量将无法自动切换
  114. PromptBox.dismiss();
  115. waitingResult = false;
  116. }
  117. void _recordSharp() {
  118. if (feature == null) return;
  119. UrmSharpCopyBoard.recordSharp(
  120. UrmSharpCopyDataType.rect,
  121. [feature!.startPoint, feature!.endPoint],
  122. );
  123. }
  124. @override
  125. bool onExecuteTouch(PointInfo args) {
  126. // TODO: implement onExecuteTouch
  127. throw UnimplementedError();
  128. }
  129. void handleMouseDownWhileWaiting(PointInfo args) {
  130. // TODO: 判断是否当前area
  131. // 转换为Area逻辑位置
  132. final point = args.toAreaLogicPoint();
  133. if (meta.measureType == MeasureTypes.URMRectPerfusion) {
  134. feature = RectPerfusionImageFeature(this, point, point);
  135. if (args.hostVisualArea != null) {
  136. feature!.hostVisualArea = args.hostVisualArea;
  137. }
  138. } else {
  139. feature = URMRectFeature(this, point, point);
  140. if (args.hostVisualArea != null) {
  141. feature!.hostVisualArea = args.hostVisualArea;
  142. }
  143. }
  144. state = ItemStates.running;
  145. }
  146. }
  147. class URMRectFeature extends MeasureItemFeature {
  148. URMRectFeature(
  149. IMeasureItem refItem,
  150. DPoint startPoint,
  151. DPoint endPoint,
  152. ) : super(refItem) {
  153. innerPoints.add(startPoint);
  154. innerPoints.add(endPoint);
  155. }
  156. /// 起点
  157. DPoint get startPoint => innerPoints[0];
  158. set startPoint(DPoint value) => innerPoints[0] = value;
  159. /// 终点
  160. DPoint get endPoint => innerPoints[1];
  161. set endPoint(DPoint value) => innerPoints[1] = value;
  162. List<List<Offset>> offsetsList = [];
  163. // List<List<Offset>> scaledOffsetsList = [];
  164. @override
  165. void paint(Canvas canvas, Size size) {
  166. if (startPoint == endPoint) return;
  167. drawId(canvas, size, idText);
  168. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  169. drawVertex(canvas, startOffset);
  170. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  171. canvas.drawDashRect(startOffset, endOffset, 1, 10, paintPan);
  172. drawVertex(canvas, endOffset, isActive);
  173. //绘制点集连线
  174. // scaledOffsetsList = offsetsList.map((e) {
  175. // return e.map((e) {
  176. // return e * refItem.scaleRatio;
  177. // }).toList();
  178. // }).toList();
  179. for (var offsets in offsetsList) {
  180. canvas.drawPointsLine(offsets, paintLinePan);
  181. }
  182. }
  183. /// 绘制灌注图
  184. @override
  185. void paintPerfusion(Canvas canvas, Size size) {}
  186. }
  187. class RectPerfusionImageFeature extends URMRectFeature {
  188. RectPerfusionImageFeature(
  189. IMeasureItem refItem,
  190. DPoint startPoint,
  191. DPoint endPoint,
  192. ) : super(refItem, startPoint, endPoint);
  193. ui.Image? perfusionImg;
  194. IntRect? perfusionPiexlRect;
  195. DPoint? leftTopPoint;
  196. DPoint? rightBottomPoint;
  197. /// 绘制灌注图
  198. @override
  199. void paintPerfusion(Canvas canvas, Size size) {
  200. if (perfusionImg != null) {
  201. Paint paint = Paint();
  202. Rect src = Rect.fromLTWH(
  203. 0,
  204. 0,
  205. perfusionImg!.width.toDouble(),
  206. perfusionImg!.height.toDouble(),
  207. );
  208. if (leftTopPoint == null || rightBottomPoint == null) {
  209. return;
  210. }
  211. DPoint leftTop = convert2ViewPoint(size, leftTopPoint!);
  212. DPoint rightBottom = convert2ViewPoint(size, rightBottomPoint!);
  213. convert2ViewPoint(size, rightBottomPoint!);
  214. Rect dst = Rect.fromPoints(
  215. Offset(leftTop.x, leftTop.y), Offset(rightBottom.x, rightBottom.y));
  216. canvas.drawImageRect(perfusionImg!, src, dst, paint);
  217. }
  218. }
  219. }