straightline.dart 7.6 KB

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