straightline.dart 6.6 KB

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