urm_rect_measure.dart 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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/workspace/point_info.dart';
  8. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_den_measure.dart';
  9. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_den_vel_measure.dart';
  10. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_density.dart';
  11. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_fractal_dim.dart';
  12. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_hist.dart';
  13. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_perfusion.dart';
  14. import 'package:fis_measure/process/calcuators/urm_calcuators/urm_rect_vel_measure.dart';
  15. import 'package:fis_measure/process/items/item.dart';
  16. import 'package:fis_measure/utils/canvas.dart';
  17. import 'package:fis_measure/utils/prompt_box.dart';
  18. import 'dart:ui' as ui;
  19. import '../../items/item_feature.dart';
  20. class URMRectMeasure extends MeasureItem<URMRectFeature> {
  21. URMRectMeasure(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  22. static bool needPerfusion = false;
  23. static URMRectMeasure createMeasureRect(ItemMeta meta,
  24. [IMeasureItem? parent]) {
  25. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  26. // measureRect.calculator = URMRectCal(measureRect, );
  27. return measureRect;
  28. }
  29. static URMRectMeasure createURMRectDensity(ItemMeta meta,
  30. [IMeasureItem? parent]) {
  31. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  32. measureRect.calculator = URMRectDensityCal(
  33. measureRect,
  34. );
  35. return measureRect;
  36. }
  37. static URMRectMeasure createURMRectFractalDim(ItemMeta meta,
  38. [IMeasureItem? parent]) {
  39. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  40. measureRect.calculator = URMRectFractalDimCal(
  41. measureRect,
  42. );
  43. return measureRect;
  44. }
  45. static URMRectMeasure createURMRectDenMeasure(ItemMeta meta,
  46. [IMeasureItem? parent]) {
  47. URMRectMeasure measureRect = URMRectMeasure(meta, parent);
  48. measureRect.calculator = URMRectDenMeasureCal(
  49. measureRect,
  50. );
  51. return measureRect;
  52. }
  53. static URMRectMeasure createURMRectPerfusion(ItemMeta meta,
  54. [IMeasureItem? parent]) {
  55. needPerfusion = true;
  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() async {
  109. feature!.isActive = false;
  110. PromptBox.loading("计算中...");
  111. waitingResult = true;
  112. await doCalculateAsync();
  113. doFeatureFinish();
  114. PromptBox.dismiss();
  115. waitingResult = false;
  116. }
  117. @override
  118. bool onExecuteTouch(PointInfo args) {
  119. // TODO: implement onExecuteTouch
  120. throw UnimplementedError();
  121. }
  122. void handleMouseDownWhileWaiting(PointInfo args) {
  123. // TODO: 判断是否当前area
  124. // 转换为Area逻辑位置
  125. final point = args.toAreaLogicPoint();
  126. if (needPerfusion) {
  127. feature = RectPerfusionImageFeature(this, point, point);
  128. if (args.hostVisualArea != null) {
  129. feature!.hostVisualArea = args.hostVisualArea;
  130. }
  131. } else {
  132. feature = URMRectFeature(this, point, point);
  133. if (args.hostVisualArea != null) {
  134. feature!.hostVisualArea = args.hostVisualArea;
  135. }
  136. }
  137. state = ItemStates.running;
  138. }
  139. }
  140. class URMRectFeature extends MeasureItemFeature {
  141. URMRectFeature(
  142. IMeasureItem refItem,
  143. DPoint startPoint,
  144. DPoint endPoint,
  145. ) : super(refItem) {
  146. innerPoints.add(startPoint);
  147. innerPoints.add(endPoint);
  148. }
  149. /// 起点
  150. DPoint get startPoint => innerPoints[0];
  151. set startPoint(DPoint value) => innerPoints[0] = value;
  152. /// 终点
  153. DPoint get endPoint => innerPoints[1];
  154. set endPoint(DPoint value) => innerPoints[1] = value;
  155. List<List<Offset>> offsetsList = [];
  156. // List<List<Offset>> scaledOffsetsList = [];
  157. @override
  158. void paint(Canvas canvas, Size size) {
  159. if (startPoint == endPoint) return;
  160. drawId(canvas, size, idText);
  161. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  162. drawVertex(canvas, startOffset);
  163. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  164. canvas.drawDashRect(startOffset, endOffset, 1, 10, paintPan);
  165. drawVertex(canvas, endOffset, isActive);
  166. //绘制点集连线
  167. // scaledOffsetsList = offsetsList.map((e) {
  168. // return e.map((e) {
  169. // return e * refItem.scaleRatio;
  170. // }).toList();
  171. // }).toList();
  172. for (var offsets in offsetsList) {
  173. canvas.drawPointsLine(offsets, paintLinePan);
  174. }
  175. }
  176. }
  177. class RectPerfusionImageFeature extends URMRectFeature {
  178. RectPerfusionImageFeature(
  179. IMeasureItem refItem,
  180. DPoint startPoint,
  181. DPoint endPoint,
  182. ) : super(refItem, startPoint, endPoint);
  183. ui.Image? perfusionImg;
  184. IntRect? perfusionPiexlRect;
  185. Rect? perfusionScaleDRect;
  186. @override
  187. void paint(Canvas canvas, Size size) {
  188. if (perfusionImg != null) {
  189. Paint paint = Paint();
  190. Rect src = Rect.fromLTWH(
  191. 0,
  192. 0,
  193. perfusionImg!.width.toDouble(),
  194. perfusionImg!.height.toDouble(),
  195. );
  196. Rect dst = Rect.fromLTWH(
  197. perfusionScaleDRect!.left.toDouble() * size.width,
  198. perfusionScaleDRect!.top.toDouble() * size.height,
  199. perfusionScaleDRect!.width.toDouble() * size.width,
  200. perfusionScaleDRect!.height.toDouble() * size.height,
  201. );
  202. canvas.drawImageRect(perfusionImg!, src, dst, paint);
  203. }
  204. super.paint(canvas, size);
  205. }
  206. }