carotid_imt.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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/workspace/point_info.dart';
  7. import 'package:fis_measure/process/calcuators/carotid_imt.dart';
  8. import 'package:fis_measure/process/items/item.dart';
  9. import 'package:fis_measure/utils/canvas.dart';
  10. import '../items/item_feature.dart';
  11. class CarotidIMT extends MeasureItem<CarotidIMTFeature> {
  12. CarotidIMT(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
  13. static CarotidIMT createMeasureRect(ItemMeta meta, [IMeasureItem? parent]) {
  14. CarotidIMT measureRect = CarotidIMT(meta, parent);
  15. measureRect.calculator = CarotidCal(measureRect, meta.name);
  16. return measureRect;
  17. }
  18. @override
  19. bool onExecuteMouse(PointInfo args) {
  20. if (state == ItemStates.finished) {
  21. if (args.pointType == PointInfoType.mouseDown) {
  22. state = ItemStates.waiting;
  23. }
  24. }
  25. if (state == ItemStates.waiting) {
  26. if (args.pointType == PointInfoType.mouseDown) {
  27. handleMouseDownWhileWaiting(args);
  28. }
  29. } else if (state == ItemStates.running) {
  30. if (args.pointType == PointInfoType.mouseUp) return false;
  31. feature?.endPoint = args;
  32. if (args.pointType == PointInfoType.mouseDown) {
  33. doCalculate();
  34. feature!.isActive = false;
  35. state = ItemStates.finished;
  36. ///TODO 能否可以不加 delay,直接执行(此处是为了 cal 内 ref.feature!.lowerPoints = lowerPoints; 能够执行完成)
  37. Future.delayed(const Duration(milliseconds: 500), () {
  38. doFeatureFinish();
  39. });
  40. }
  41. }
  42. return true;
  43. }
  44. @override
  45. bool onExecuteTouch(PointInfo args) {
  46. // TODO: implement onExecuteTouch
  47. throw UnimplementedError();
  48. }
  49. void handleMouseDownWhileWaiting(PointInfo args) {
  50. // TODO: 判断是否当前area
  51. // 转换为Area逻辑位置
  52. final point = args.toAreaLogicPoint();
  53. feature = CarotidIMTFeature(this, point, point);
  54. if (args.hostVisualArea != null) {
  55. feature!.hostVisualArea = args.hostVisualArea;
  56. }
  57. state = ItemStates.running;
  58. }
  59. }
  60. class CarotidIMTFeature extends MeasureItemFeature {
  61. CarotidIMTFeature(
  62. IMeasureItem refItem,
  63. DPoint startPoint,
  64. DPoint endPoint,
  65. ) : super(refItem) {
  66. innerPoints.add(startPoint);
  67. innerPoints.add(endPoint);
  68. }
  69. /// 起点
  70. DPoint get startPoint => innerPoints[0];
  71. set startPoint(DPoint value) => innerPoints[0] = value;
  72. /// 终点
  73. DPoint get endPoint => innerPoints[1];
  74. set endPoint(DPoint value) => innerPoints[1] = value;
  75. List<List<Offset>> offsetsList = [];
  76. List<List<Offset>> scaledOffsetsList = [];
  77. @override
  78. void paint(Canvas canvas, Size size) {
  79. if (startPoint == endPoint) return;
  80. drawId(canvas, size, idText);
  81. final startOffset = convert2ViewPoint(size, startPoint).toOffset();
  82. drawVertex(canvas, startOffset);
  83. final endOffset = convert2ViewPoint(size, endPoint).toOffset();
  84. canvas.drawDashRect(startOffset, endOffset, 1, 10, paintPan);
  85. drawVertex(canvas, endOffset, isActive);
  86. //绘制点集连线
  87. scaledOffsetsList = offsetsList.map((e) {
  88. return e.map((e) {
  89. return e * refItem.scaleRatio;
  90. }).toList();
  91. }).toList();
  92. for (var offsets in scaledOffsetsList) {
  93. canvas.drawPointsLine(offsets, paintLinePan);
  94. }
  95. }
  96. }