straightline.dart 7.6 KB

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