recorder.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import 'package:fis_measure/interfaces/enums/annotation.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/application.dart';
  3. import 'package:fis_measure/interfaces/process/workspace/recorder.dart';
  4. class MeasureRecorder implements IMeasureRecorder {
  5. int _lastId = 0;
  6. final List<_RecordModelBase> _records = [];
  7. late final IApplication _application;
  8. MeasureRecorder(IApplication application) {
  9. _application = application;
  10. }
  11. /// 获取一个新的记录Id
  12. @override
  13. int newRecordId() {
  14. return _lastId + 1;
  15. }
  16. /// 添加测量项记录
  17. ///
  18. /// [name] 测量项名称
  19. @override
  20. void recordMeasureItem(String name) {
  21. _records.add(_MeasureModel(name));
  22. _increaseId();
  23. }
  24. /// 添加注释记录
  25. ///
  26. /// [type] 注释类型
  27. @override
  28. void recordAnnotation(AnnotationType type) {
  29. _records.add(_AnnotationModel(type));
  30. // _increaseId();// 注释不占Id
  31. }
  32. /// 撤销一次操作
  33. bool undoOnce() {
  34. final record = _records.last;
  35. bool removed = false;
  36. if (record.recordType == MeasureRecordType.measure) {
  37. removed = _undoOnceMeasure(record as _MeasureModel);
  38. } else if (record.recordType == MeasureRecordType.annotation) {
  39. removed = _undoOnceAnnotation(record as _AnnotationModel);
  40. }
  41. if (removed) {
  42. _records.removeLast();
  43. _checkResetId();
  44. }
  45. return removed;
  46. }
  47. /// 清除所有记录
  48. void clear() {
  49. final len = _records.length;
  50. for (var i = 0; i < len; i++) {
  51. undoOnce();
  52. }
  53. _resetId();
  54. }
  55. bool _undoOnceMeasure(_MeasureModel record) {
  56. final matchs =
  57. _application.measureItems.where((e) => e.meta.name == record.name);
  58. if (matchs.isEmpty) return false;
  59. final count = matchs.length;
  60. for (var i = count - 1; i >= 0; i--) {
  61. final item = matchs.elementAt(i);
  62. if (item.feature != null) {
  63. item.cancelOnce();
  64. } else if (item.measuredFeatures.isNotEmpty) {
  65. item.measuredFeatures.removeLast();
  66. // item.calculator?.outputs.removeLast();
  67. }
  68. return true;
  69. }
  70. return false;
  71. }
  72. bool _undoOnceAnnotation(_AnnotationModel record) {
  73. final matchs =
  74. _application.annotationItems.where((e) => e.type == record.type);
  75. if (matchs.isEmpty) return false;
  76. final item = matchs.last;
  77. item.features.removeLast();
  78. return true;
  79. }
  80. void _resetId() {
  81. _lastId = 0;
  82. }
  83. void _increaseId() {
  84. _lastId++;
  85. }
  86. void _checkResetId() {
  87. if (_application.measureItems.isEmpty) {
  88. _resetId();
  89. } else {
  90. final isFeatureEmpty = _application.measureItems
  91. .every((e) => e.measuredFeatures.isEmpty && e.feature == null);
  92. if (isFeatureEmpty) {
  93. _resetId();
  94. }
  95. }
  96. }
  97. }
  98. class _MeasureModel extends _RecordModelBase {
  99. _MeasureModel(this.name) : super(MeasureRecordType.measure);
  100. String name;
  101. }
  102. class _AnnotationModel extends _RecordModelBase {
  103. _AnnotationModel(this.type) : super(MeasureRecordType.annotation);
  104. AnnotationType type;
  105. }
  106. class _RecordModelBase {
  107. _RecordModelBase(this.recordType);
  108. MeasureRecordType recordType;
  109. }
  110. enum MeasureRecordType {
  111. measure,
  112. annotation,
  113. }