recorder.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. }
  44. return removed;
  45. }
  46. /// 清除所有记录
  47. void clear() {
  48. final len = _records.length;
  49. for (var i = 0; i < len; i++) {
  50. undoOnce();
  51. }
  52. }
  53. bool _undoOnceMeasure(_MeasureModel record) {
  54. final matchs =
  55. _application.measureItems.where((e) => e.meta.name == record.name);
  56. if (matchs.isEmpty) return false;
  57. final item = matchs.last;
  58. item.measuredFeatures.removeLast();
  59. item.calculator?.outputs.removeLast();
  60. return true;
  61. }
  62. bool _undoOnceAnnotation(_AnnotationModel record) {
  63. final matchs =
  64. _application.annotationItems.where((e) => e.type == record.type);
  65. if (matchs.isEmpty) return false;
  66. final item = matchs.last;
  67. item.features.removeLast();
  68. return true;
  69. }
  70. void _increaseId() {
  71. _lastId++;
  72. }
  73. }
  74. class _MeasureModel extends _RecordModelBase {
  75. _MeasureModel(this.name) : super(MeasureRecordType.measure);
  76. String name;
  77. }
  78. class _AnnotationModel extends _RecordModelBase {
  79. _AnnotationModel(this.type) : super(MeasureRecordType.annotation);
  80. AnnotationType type;
  81. }
  82. class _RecordModelBase {
  83. _RecordModelBase(this.recordType);
  84. MeasureRecordType recordType;
  85. }
  86. enum MeasureRecordType {
  87. measure,
  88. annotation,
  89. }