straightline.dart 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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/heart_rate.dart';
  10. import 'package:fis_measure/process/calcuators/time_motion.dart';
  11. import 'package:fis_measure/process/items/item.dart';
  12. import 'package:fis_measure/process/primitives/combos/depth2baseline.dart';
  13. import 'package:fis_measure/process/primitives/location.dart';
  14. import 'package:fis_measure/utils/canvas.dart';
  15. import 'package:fis_measure/view/gesture/cross_position_indicator.dart';
  16. import 'package:fis_measure/view/gesture/positioned_cursor.dart';
  17. import 'package:get/get.dart';
  18. import 'package:vid/us/vid_us_mode.dart';
  19. import '../calcuators/distance.dart';
  20. import '../items/item_feature.dart';
  21. /// 直线
  22. class StraightLine extends MeasureItem<StraightLineFeature> {
  23. late final mouseState = Get.find<IMouseState>();
  24. StraightLine(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  25. static StraightLine createDistance(ItemMeta meta, [IMeasureItem? parent]) {
  26. StraightLine sraightLine = StraightLine(meta, parent);
  27. sraightLine.calculator = DistanceCal(sraightLine);
  28. return sraightLine;
  29. }
  30. static StraightLine createSlope(ItemMeta meta, [IMeasureItem? parent]) {
  31. StraightLine sraightLine = StraightLine(meta, parent);
  32. sraightLine.calculator = SlopeCal(sraightLine);
  33. return sraightLine;
  34. }
  35. static StraightLine createSlopeDoppler(ItemMeta meta,
  36. [IMeasureItem? parent]) {
  37. StraightLine sraightLine = StraightLine(meta, parent);
  38. sraightLine.calculator = SlopeDopplerCal(sraightLine);
  39. return sraightLine;
  40. }
  41. static StraightLine createVerticalDistance(ItemMeta meta,
  42. [IMeasureItem? parent]) {
  43. StraightLine sraightLine = StraightLine(meta, parent);
  44. sraightLine.calculator = VerticalDistanceCal(sraightLine);
  45. return sraightLine;
  46. }
  47. static StraightLine createTimeSpan(ItemMeta meta, [IMeasureItem? parent]) {
  48. StraightLine sraightLine = StraightLine(meta, parent);
  49. sraightLine.calculator = TimeSpanCal(sraightLine);
  50. return sraightLine;
  51. }
  52. @override
  53. bool onExecuteMouse(PointInfo args) {
  54. if (state == ItemStates.finished) {
  55. if (args.pointType == PointInfoType.mouseDown) {
  56. state = ItemStates.waiting;
  57. } else {
  58. return false;
  59. }
  60. }
  61. if (state == ItemStates.waiting) {
  62. if (args.pointType == PointInfoType.mouseDown) {
  63. handleMouseDownWhileWaiting(args);
  64. }
  65. } else if (state == ItemStates.running) {
  66. if (args.pointType == PointInfoType.mouseUp) return false;
  67. feature?.endPoint = args;
  68. doCalculate();
  69. if (args.pointType == PointInfoType.mouseDown) {
  70. doFeatureFinish();
  71. ///重置十字样式
  72. mouseState.crossIndicatorStyleChanged
  73. .emit(this, CrossIndicatorStyle.nomal);
  74. }
  75. }
  76. return true;
  77. }
  78. PointInfo? startPoint;
  79. @override
  80. bool onExecuteTouch(PointInfo args) {
  81. if (state == ItemStates.finished) {
  82. if (args.pointType == PointInfoType.touchDown) {
  83. state = ItemStates.waiting;
  84. }
  85. }
  86. if (state == ItemStates.waiting) {
  87. switch (args.pointType) {
  88. case PointInfoType.touchDown:
  89. startPoint = args; // 设置线段起点
  90. break;
  91. case PointInfoType.touchUp:
  92. break; // 按下立即抬起无事发生
  93. case PointInfoType.touchMove:
  94. handleMouseDownWhileWaiting(startPoint!); // 通过设置的起点开始一个绘制事件
  95. break;
  96. default:
  97. break;
  98. }
  99. } else if (state == ItemStates.running) {
  100. if (args.pointType == PointInfoType.touchUp) {
  101. doFeatureFinish();
  102. }
  103. if (args.pointType == PointInfoType.touchMove) {
  104. doCalculate();
  105. feature?.endPoint = args;
  106. }
  107. }
  108. return true;
  109. }
  110. void handleMouseDownWhileWaiting(PointInfo args) {
  111. // TODO: 判断是否当前area
  112. // 转换为Area逻辑位置
  113. final point = args.toAreaLogicPoint();
  114. // feature = StraightLineFeature(this, point, point);
  115. if (args.hostVisualArea != null) {
  116. handleTissueTM(args.hostVisualArea!.mode.modeType, point);
  117. feature!.hostVisualArea = args.hostVisualArea;
  118. }
  119. state = ItemStates.running;
  120. }
  121. /// 处理TissueTimeMotion模式
  122. void handleTissueTM(VidUsModeType mode, DPoint point) {
  123. if (mode == VidUsModeType.TissueTM || mode == VidUsModeType.Doppler) {
  124. switch (meta.measureType) {
  125. case MeasureTypes.TimeSpan:
  126. feature = StraightLineTimeMotionFeature(this, point, point,
  127. ifHorizontal: false);
  128. mouseState.crossIndicatorStyleChanged
  129. .emit(this, CrossIndicatorStyle.vertical);
  130. break;
  131. case MeasureTypes.VerticalDistance:
  132. feature = StraightLineTimeMotionFeature(this, point, point);
  133. mouseState.crossIndicatorStyleChanged
  134. .emit(this, CrossIndicatorStyle.horizontal);
  135. break;
  136. case MeasureTypes.Slope:
  137. feature = StraightLineSlopeFeature(this, point, point);
  138. break;
  139. case MeasureTypes.SlopeDoppler:
  140. feature = StraightLineSlopeFeature(this, point, point);
  141. break;
  142. case MeasureTypes.Pht:
  143. feature = StraightLinePhtFeature(this, point, point);
  144. mouseState.crossIndicatorStyleChanged
  145. .emit(this, CrossIndicatorStyle.vertical);
  146. break;
  147. default:
  148. }
  149. } else {
  150. feature = StraightLineFeature(this, point, point);
  151. }
  152. }
  153. }
  154. class StraightLineFeature extends MeasureItemFeature {
  155. StraightLineFeature(
  156. IMeasureItem refItem,
  157. DPoint startPoint,
  158. DPoint endPoint,
  159. ) : super(refItem) {
  160. innerPoints.add(startPoint);
  161. innerPoints.add(endPoint);
  162. }
  163. /// 起点
  164. DPoint get startPoint => innerPoints[0];
  165. set startPoint(DPoint value) => innerPoints[0] = value;
  166. /// 终点
  167. DPoint get endPoint => innerPoints[1];
  168. set endPoint(DPoint value) => innerPoints[1] = value;
  169. /// 长度
  170. double get length => (endPoint - startPoint).length;
  171. @override
  172. void paint(Canvas canvas, Size size) {
  173. if (startPoint == endPoint) return;
  174. drawId(canvas, size, idText);
  175. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  176. drawVertex(canvas, startOffset);
  177. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  178. canvas.drawDashLine(startOffset, endOffset, 1, 10, paintLinePan);
  179. drawVertex(canvas, endOffset, isActive);
  180. }
  181. }
  182. class StraightLineTimeMotionFeature extends StraightLineFeature {
  183. StraightLineTimeMotionFeature(
  184. IMeasureItem refItem, DPoint startPoint, DPoint endPoint,
  185. {this.ifHorizontal = true})
  186. : super(refItem, startPoint, endPoint);
  187. final bool ifHorizontal;
  188. @override
  189. void paint(Canvas canvas, Size size) {
  190. if (startPoint == endPoint) return;
  191. drawId(canvas, size, idText);
  192. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  193. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  194. if (ifHorizontal) {
  195. drawMark(canvas, startOffset);
  196. drawMark(canvas, Offset(startOffset.dx, endOffset.dy), isActive);
  197. } else {
  198. drawMark(canvas, startOffset, false, ifHorizontal);
  199. drawMark(
  200. canvas, Offset(endOffset.dx, startOffset.dy), isActive, ifHorizontal);
  201. }
  202. }
  203. }
  204. class StraightLineSlopeFeature extends StraightLineFeature {
  205. StraightLineSlopeFeature(
  206. IMeasureItem refItem, DPoint startPoint, DPoint endPoint)
  207. : super(refItem, startPoint, endPoint);
  208. @override
  209. void paint(Canvas canvas, Size size) {
  210. if (startPoint == endPoint) return;
  211. drawId(canvas, size, idText);
  212. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  213. drawVertex(canvas, startOffset);
  214. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  215. canvas.drawDashLine(startOffset, endOffset, 1, 10, paintLinePan);
  216. drawVertex(canvas, endOffset, isActive);
  217. }
  218. }
  219. class StraightLinePhtFeature extends StraightLineFeature {
  220. StraightLinePhtFeature(
  221. IMeasureItem refItem, DPoint startPoint, DPoint endPoint)
  222. : super(refItem, startPoint, endPoint);
  223. DPoint get regionCenter => hostVisualArea!.displayRegion.center;
  224. @override
  225. void paint(Canvas canvas, Size size) {
  226. if (startPoint == endPoint) return;
  227. drawId(canvas, size, idText);
  228. final distanceToCenter = (startPoint.y - regionCenter.y);
  229. //TODO:[Gavin] 偏移量比例系数待精确
  230. final endPointY = startPoint.y - distanceToCenter / 4;
  231. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  232. final endOffset =
  233. convert2ViewPoint(size, DPoint(endPoint.x, endPointY)).toOffset();
  234. drawVertex(canvas, startOffset, false);
  235. canvas.drawDashLine(startOffset, endOffset, 1, 10, paintLinePan);
  236. drawVertex(canvas, endOffset, isActive);
  237. }
  238. }