straightline.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import 'dart:ui';
  2. import 'package:fis_measure/interfaces/date_types/point.dart';
  3. import 'package:fis_measure/interfaces/enums/items.dart';
  4. import 'package:fis_measure/interfaces/process/items/item.dart';
  5. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  6. import 'package:fis_measure/interfaces/process/items/types.dart';
  7. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  8. import 'package:fis_measure/process/calcuators/time_motion.dart';
  9. import 'package:fis_measure/process/items/item.dart';
  10. import 'package:fis_measure/utils/canvas.dart';
  11. import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
  12. import 'package:fis_measure/view/gesture/positioned_cursor.dart';
  13. import 'package:get/get.dart';
  14. import 'package:vid/us/vid_us_mode.dart';
  15. import '../calcuators/distance.dart';
  16. import '../items/item_feature.dart';
  17. /// 直线
  18. class StraightLine extends MeasureItem<StraightLineFeature> {
  19. late final mouseState = Get.find<IMouseState>();
  20. StraightLine(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  21. static StraightLine createDistance(ItemMeta meta, [IMeasureItem? parent]) {
  22. StraightLine sraightLine = StraightLine(meta, parent);
  23. sraightLine.calculator = DistanceCal(sraightLine);
  24. return sraightLine;
  25. }
  26. static StraightLine createVerticalDistance(ItemMeta meta,
  27. [IMeasureItem? parent]) {
  28. StraightLine sraightLine = StraightLine(meta, parent);
  29. sraightLine.calculator = VerticalDistanceCal(sraightLine);
  30. return sraightLine;
  31. }
  32. static StraightLine createTimeSpan(ItemMeta meta, [IMeasureItem? parent]) {
  33. StraightLine sraightLine = StraightLine(meta, parent);
  34. sraightLine.calculator = TimeSpanCal(sraightLine);
  35. return sraightLine;
  36. }
  37. @override
  38. bool onExecuteMouse(PointInfo args) {
  39. if (state == ItemStates.finished) {
  40. if (args.pointType == PointInfoType.mouseDown) {
  41. state = ItemStates.waiting;
  42. }
  43. }
  44. if (state == ItemStates.waiting) {
  45. if (args.pointType == PointInfoType.mouseDown) {
  46. handleMouseDownWhileWaiting(args);
  47. }
  48. } else if (state == ItemStates.running) {
  49. if (args.pointType == PointInfoType.mouseUp) return false;
  50. feature?.endPoint = args;
  51. doCalculate();
  52. if (args.pointType == PointInfoType.mouseDown) {
  53. doFeatureFinish();
  54. ///重置十字样式
  55. mouseState.crossIndicatorStyleChanged
  56. .emit(this, CrossIndicatorStyle.nomal);
  57. }
  58. }
  59. return true;
  60. }
  61. PointInfo? startPoint;
  62. @override
  63. bool onExecuteTouch(PointInfo args) {
  64. if (state == ItemStates.finished) {
  65. if (args.pointType == PointInfoType.touchDown) {
  66. state = ItemStates.waiting;
  67. }
  68. }
  69. if (state == ItemStates.waiting) {
  70. switch (args.pointType) {
  71. case PointInfoType.touchDown:
  72. startPoint = args; // 设置线段起点
  73. break;
  74. case PointInfoType.touchUp:
  75. break; // 按下立即抬起无事发生
  76. case PointInfoType.touchMove:
  77. handleMouseDownWhileWaiting(startPoint!); // 通过设置的起点开始一个绘制事件
  78. break;
  79. default:
  80. break;
  81. }
  82. } else if (state == ItemStates.running) {
  83. if (args.pointType == PointInfoType.touchUp) {
  84. doFeatureFinish();
  85. }
  86. if (args.pointType == PointInfoType.touchMove) {
  87. doCalculate();
  88. feature?.endPoint = args;
  89. }
  90. }
  91. return true;
  92. }
  93. void handleMouseDownWhileWaiting(PointInfo args) {
  94. // TODO: 判断是否当前area
  95. // 转换为Area逻辑位置
  96. final point = args.toAreaLogicPoint();
  97. // feature = StraightLineFeature(this, point, point);
  98. if (args.hostVisualArea != null) {
  99. handleTissueTM(args.hostVisualArea!.mode.modeType, point);
  100. feature!.hostVisualArea = args.hostVisualArea;
  101. }
  102. state = ItemStates.running;
  103. }
  104. /// 处理TissueTimeMotion模式
  105. void handleTissueTM(VidUsModeType mode, DPoint point) {
  106. if (mode == VidUsModeType.TissueTM) {
  107. switch (meta.measureType) {
  108. case MeasureTypes.TimeSpen:
  109. feature = StraightLineTimeMotionFeature(this, point, point,
  110. ifHorizontal: false);
  111. mouseState.crossIndicatorStyleChanged
  112. .emit(this, CrossIndicatorStyle.vertical);
  113. break;
  114. case MeasureTypes.VerticalDistance:
  115. feature = StraightLineTimeMotionFeature(this, point, point);
  116. mouseState.crossIndicatorStyleChanged
  117. .emit(this, CrossIndicatorStyle.horizontal);
  118. break;
  119. default:
  120. }
  121. } else {
  122. feature = StraightLineFeature(this, point, point);
  123. }
  124. }
  125. }
  126. class StraightLineFeature extends MeasureItemFeature {
  127. StraightLineFeature(
  128. IMeasureItem refItem,
  129. DPoint startPoint,
  130. DPoint endPoint,
  131. ) : super(refItem) {
  132. innerPoints.add(startPoint);
  133. innerPoints.add(endPoint);
  134. }
  135. /// 起点
  136. DPoint get startPoint => innerPoints[0];
  137. set startPoint(DPoint value) => innerPoints[0] = value;
  138. /// 终点
  139. DPoint get endPoint => innerPoints[1];
  140. set endPoint(DPoint value) => innerPoints[1] = value;
  141. /// 长度
  142. double get length => (endPoint - startPoint).length;
  143. @override
  144. void paint(Canvas canvas, Size size) {
  145. if (startPoint == endPoint) return;
  146. var idText = '$id.${refItem.briefAnnotation}';
  147. drawId(canvas, size, idText);
  148. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  149. drawVertex(canvas, startOffset);
  150. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  151. canvas.drawDashLine(startOffset, endOffset, 1, 10, paintPan);
  152. drawVertex(canvas, endOffset, isActive);
  153. }
  154. }
  155. class StraightLineTimeMotionFeature extends StraightLineFeature {
  156. StraightLineTimeMotionFeature(
  157. IMeasureItem refItem, DPoint startPoint, DPoint endPoint,
  158. {this.ifHorizontal = true})
  159. : super(refItem, startPoint, endPoint);
  160. final bool ifHorizontal;
  161. @override
  162. void paint(Canvas canvas, Size size) {
  163. if (startPoint == endPoint) return;
  164. var idText = '$id';
  165. drawId(canvas, size, idText);
  166. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  167. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  168. if (ifHorizontal) {
  169. drawMark(canvas, startOffset);
  170. drawMark(canvas, Offset(startOffset.dx, endOffset.dy), isActive);
  171. } else {
  172. drawMark(canvas, startOffset, false, ifHorizontal);
  173. drawMark(
  174. canvas, Offset(endOffset.dx, startOffset.dy), isActive, ifHorizontal);
  175. }
  176. }
  177. }