calibration_controller.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import 'package:fis_common/event/event_type.dart';
  2. import 'package:fis_measure/interfaces/date_types/point.dart';
  3. import 'package:fis_measure/interfaces/process/standard_line/calibration.dart';
  4. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  5. import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter/painting.dart';
  8. import 'package:get/get.dart';
  9. import 'standard_line.dart';
  10. /// 参考线校准控制器
  11. class StandardLineCalibrationController
  12. implements IStandardLineCalibrationController {
  13. final IApplication application;
  14. final StandardLine standardLine;
  15. StandardLineCalibrationEditState _editState =
  16. StandardLineCalibrationEditState.inactive;
  17. final List<DPoint> _drawPoints = [];
  18. StandardLineCalibrationController(
  19. this.application,
  20. this.standardLine,
  21. ) {
  22. updateReady = FEventHandler<void>();
  23. editStateChanged = FEventHandler<StandardLineCalibrationEditState>();
  24. }
  25. @override
  26. StandardLineCalibrationEditState get editState => _editState;
  27. @override
  28. bool get isEditing => editState != StandardLineCalibrationEditState.inactive;
  29. @override
  30. List<DPoint> get drawPoints => _drawPoints;
  31. @override
  32. double get displayLengthInPhysics {
  33. final pixelLengthInPhysics =
  34. standardLine.pixelLength / standardLine.physicsLength;
  35. final length = application.displayScaleRatio * pixelLengthInPhysics;
  36. return length;
  37. }
  38. @override
  39. late final FEventHandler<void> updateReady;
  40. @override
  41. late final FEventHandler<StandardLineCalibrationEditState> editStateChanged;
  42. @override
  43. void enterEditMode() {
  44. drawPoints.clear();
  45. _changeState(StandardLineCalibrationEditState.ready);
  46. }
  47. @override
  48. void cancelEdit() {
  49. _changeState(StandardLineCalibrationEditState.inactive);
  50. }
  51. @override
  52. void confirmEdit(double physicalLength) {
  53. standardLine.pixelLength = _getPixelLength();
  54. standardLine.physicsLength = physicalLength;
  55. _changeState(StandardLineCalibrationEditState.done);
  56. Future.delayed(const Duration(milliseconds: 100), () {
  57. _changeState(StandardLineCalibrationEditState.inactive);
  58. });
  59. }
  60. @override
  61. void executeGesturePoint(Offset offset, PointInfoType type) {
  62. if (editState != StandardLineCalibrationEditState.ready &&
  63. editState != StandardLineCalibrationEditState.drawing) {
  64. return;
  65. }
  66. if (editState == StandardLineCalibrationEditState.ready) {
  67. _changeState(StandardLineCalibrationEditState.drawing);
  68. }
  69. final point = _convert2Point(offset);
  70. if (type == PointInfoType.mouseDown) {
  71. if (drawPoints.length >= 2) {
  72. drawPoints[1] = point;
  73. _doLineDrawn();
  74. } else {
  75. drawPoints.add(point);
  76. _update();
  77. }
  78. } else if (type == PointInfoType.mouseMove) {
  79. if (drawPoints.length == 2) {
  80. drawPoints[1] = point;
  81. } else if (drawPoints.length == 1) {
  82. drawPoints.add(point);
  83. }
  84. _update();
  85. }
  86. }
  87. void _doLineDrawn() {
  88. _changeState(StandardLineCalibrationEditState.drawn);
  89. }
  90. void _changeState(StandardLineCalibrationEditState state) {
  91. _editState = state;
  92. editStateChanged.emit(this, state);
  93. _update();
  94. }
  95. void _update() {
  96. updateReady.emit(this, null);
  97. }
  98. double _getPixelLength() {
  99. final frame = application.frameData!;
  100. final size = Size(frame.width.toDouble(), frame.height.toDouble());
  101. final p1 = drawPoints[0].scale2Size(size);
  102. final p2 = drawPoints[1].scale2Size(size);
  103. final length = (p2 - p1).length.abs();
  104. return length;
  105. }
  106. DPoint _convert2Point(Offset offset) {
  107. final displaySize = application.displaySize;
  108. final x = offset.dx / displaySize.width;
  109. final y = offset.dy / displaySize.height;
  110. return DPoint(x, y);
  111. }
  112. }