Browse Source

add MeasureRecorder

melon.yin 2 years ago
parent
commit
41efe9707f

+ 4 - 0
lib/interfaces/process/workspace/application.dart

@@ -12,6 +12,7 @@ import '../viewports/viewport.dart';
 import '../visuals/visual.dart';
 import '../visuals/visual_area.dart';
 import 'point_info.dart';
+import 'recorder.dart';
 
 /// 测量应用
 abstract class IApplication {
@@ -67,6 +68,9 @@ abstract class IApplication {
   /// 注释项集合
   Set<IAnnotationItem> get annotationItems;
 
+  /// 测量记录器
+  IMeasureRecorder get recorder;
+
   /// 显示尺寸
   Size get displaySize;
   set displaySize(Size value);

+ 16 - 0
lib/interfaces/process/workspace/recorder.dart

@@ -0,0 +1,16 @@
+import 'package:fis_measure/interfaces/enums/annotation.dart';
+
+abstract class IMeasureRecorder {
+  /// 获取一个新的记录Id
+  int newRecordId();
+
+  /// 添加测量项记录
+  ///
+  /// [name] 测量项名称
+  void recordMeasureItem(String name);
+
+  /// 添加注释记录
+  ///
+  /// [type] 注释类型
+  void recordAnnotation(AnnotationType type);
+}

+ 22 - 0
lib/measure_page_test.dart

@@ -142,6 +142,28 @@ class _MeasureTestPageState extends State<MeasureTestPage> {
       backgroundColor: const Color.fromARGB(255, 53, 55, 51),
       appBar: AppBar(
         actions: [
+          TextButton(
+            onPressed: () {
+              Get.find<IApplication>().clearRecords();
+            },
+            child: const Text(
+              "清空",
+              style: TextStyle(
+                color: Colors.white,
+              ),
+            ),
+          ),
+          TextButton(
+            onPressed: () {
+              Get.find<IApplication>().undoRecord();
+            },
+            child: const Text(
+              "撤销",
+              style: TextStyle(
+                color: Colors.white,
+              ),
+            ),
+          ),
           TextButton(
             onPressed: () {
               final c = Get.find<IStandardLineCalibrationController>();

+ 9 - 0
lib/process/annotations/annotation.dart

@@ -2,9 +2,11 @@ import 'package:fis_common/event/event_type.dart';
 import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
 import 'package:fis_measure/interfaces/process/annotations/annotation.dart';
+import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/painting.dart';
+import 'package:get/get.dart';
 
 abstract class AnnotationItem<T extends AnnotationItemFeature>
     implements IAnnotationItem {
@@ -13,6 +15,7 @@ abstract class AnnotationItem<T extends AnnotationItemFeature>
   final List<IAnnotationItemFeature> _features = [];
   T? _feature;
   String? _text;
+  final application = Get.find<IApplication>();
 
   @override
   late final FEventHandler<IAnnotationItemFeature?> featureUpdated;
@@ -93,6 +96,7 @@ abstract class AnnotationItem<T extends AnnotationItemFeature>
     if (saveFeature && feature != null) {
       feature!.isActive = false;
       features.add(feature!);
+      _recordHistory();
     }
     feature = null;
     state = AnnotationStates.finish;
@@ -102,6 +106,11 @@ abstract class AnnotationItem<T extends AnnotationItemFeature>
   void doFeatureUpdate() {
     featureUpdated.emit(this, feature);
   }
+
+  void _recordHistory() {
+    final recorder = application.recorder;
+    recorder.recordAnnotation(type);
+  }
 }
 
 abstract class AnnotationItemFeature extends IAnnotationItemFeature {

+ 9 - 0
lib/process/items/item.dart

@@ -3,8 +3,10 @@ import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/calculators/calculator.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_feature.dart';
+import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:flutter/foundation.dart';
+import 'package:get/get.dart';
 
 import 'item_feature.dart';
 
@@ -15,6 +17,7 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
   ICalculator? _calculator;
   T? _feature;
   final List<IMeasureItemFeature> _measuredFeatures = [];
+  final application = Get.find<IApplication>();
 
   MeasureItem(ItemMeta meta, [IMeasureItem? parent]) {
     _parent = parent;
@@ -119,6 +122,7 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
       feature!.isActive = false;
       measuredFeatures.add(feature!);
       calculator?.finishOnce();
+      _recordHistory();
     }
     feature = null;
     state = ItemStates.finished;
@@ -136,4 +140,9 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
 
   @override
   List<IMeasureItemFeature> get measuredFeatures => _measuredFeatures;
+
+  void _recordHistory() {
+    final recorder = application.recorder;
+    recorder.recordMeasureItem(meta.name);
+  }
 }

+ 15 - 4
lib/process/workspace/application.dart

@@ -1,4 +1,3 @@
-import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/annotation.dart';
 import 'package:fis_measure/interfaces/enums/operate.dart';
 import 'package:fis_measure/interfaces/process/annotations/annotation.dart';
@@ -12,6 +11,7 @@ import 'package:fis_measure/interfaces/process/modes/mode.dart';
 import 'package:fis_common/event/event_type.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
+import 'package:fis_measure/interfaces/process/workspace/recorder.dart';
 import 'package:fis_measure/process/annotations/arrow_annotation.dart';
 import 'package:fis_measure/process/annotations/input_annotation.dart';
 import 'package:fis_measure/process/annotations/label_annotation.dart';
@@ -25,7 +25,7 @@ import 'package:vid/us/vid_us_probe.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import '../primitives/poyline.dart';
-import '../visual/visual.dart';
+import 'recorder.dart';
 import 'visual_loader.dart';
 
 class Application implements IApplication {
@@ -42,6 +42,7 @@ class Application implements IApplication {
   MeasureOperateType _currOpType = MeasureOperateType.measure;
   final Set<IMeasureItem> _measureItems = {};
   final Set<IAnnotationItem> _annotationItems = {};
+  late final _recorder = MeasureRecorder(this);
 
   Application(VidUsProbe probe) {
     _probe = probe;
@@ -177,6 +178,9 @@ class Application implements IApplication {
   bool get isAnnotationWorking =>
       currentOperateType == MeasureOperateType.annotation;
 
+  @override
+  IMeasureRecorder get recorder => _recorder;
+
   @override
   late final FEventHandler<IMode> currentModeChanged;
 
@@ -362,10 +366,17 @@ class Application implements IApplication {
   }
 
   @override
-  void undoRecord() {}
+  void undoRecord() {
+    if (_recorder.undoOnce()) {
+      _updateRender();
+    }
+  }
 
   @override
-  void clearRecords() {}
+  void clearRecords() {
+    _recorder.clear();
+    _updateRender();
+  }
 
   @protected
   List<IVisual> convertVisuals() {

+ 107 - 0
lib/process/workspace/recorder.dart

@@ -0,0 +1,107 @@
+import 'package:fis_measure/interfaces/enums/annotation.dart';
+import 'package:fis_measure/interfaces/process/workspace/application.dart';
+import 'package:fis_measure/interfaces/process/workspace/recorder.dart';
+
+class MeasureRecorder implements IMeasureRecorder {
+  int _lastId = 0;
+  final List<_RecordModelBase> _records = [];
+  late final IApplication _application;
+
+  MeasureRecorder(IApplication application) {
+    _application = application;
+  }
+
+  /// 获取一个新的记录Id
+  @override
+  int newRecordId() {
+    return _lastId + 1;
+  }
+
+  /// 添加测量项记录
+  ///
+  /// [name] 测量项名称
+  @override
+  void recordMeasureItem(String name) {
+    _records.add(_MeasureModel(name));
+    _increaseId();
+  }
+
+  /// 添加注释记录
+  ///
+  /// [type] 注释类型
+  @override
+  void recordAnnotation(AnnotationType type) {
+    _records.add(_AnnotationModel(type));
+    // _increaseId();// 注释不占Id
+  }
+
+  /// 撤销一次操作
+  bool undoOnce() {
+    final record = _records.last;
+    bool removed = false;
+    if (record.recordType == MeasureRecordType.measure) {
+      removed = _undoOnceMeasure(record as _MeasureModel);
+    } else if (record.recordType == MeasureRecordType.annotation) {
+      removed = _undoOnceAnnotation(record as _AnnotationModel);
+    }
+    if (removed) {
+      _records.removeLast();
+    }
+    return removed;
+  }
+
+  /// 清除所有记录
+  void clear() {
+    final len = _records.length;
+    for (var i = 0; i < len; i++) {
+      undoOnce();
+    }
+  }
+
+  bool _undoOnceMeasure(_MeasureModel record) {
+    final matchs =
+        _application.measureItems.where((e) => e.meta.name == record.name);
+    if (matchs.isEmpty) return false;
+
+    final item = matchs.last;
+    item.measuredFeatures.removeLast();
+    item.calculator?.outputs.removeLast();
+    return true;
+  }
+
+  bool _undoOnceAnnotation(_AnnotationModel record) {
+    final matchs =
+        _application.annotationItems.where((e) => e.type == record.type);
+    if (matchs.isEmpty) return false;
+
+    final item = matchs.last;
+    item.features.removeLast();
+    return true;
+  }
+
+  void _increaseId() {
+    _lastId++;
+  }
+}
+
+class _MeasureModel extends _RecordModelBase {
+  _MeasureModel(this.name) : super(MeasureRecordType.measure);
+
+  String name;
+}
+
+class _AnnotationModel extends _RecordModelBase {
+  _AnnotationModel(this.type) : super(MeasureRecordType.annotation);
+
+  AnnotationType type;
+}
+
+class _RecordModelBase {
+  _RecordModelBase(this.recordType);
+  MeasureRecordType recordType;
+}
+
+enum MeasureRecordType {
+  measure,
+  annotation,
+}

+ 0 - 8
lib/process/workspace/visual_loader.dart

@@ -1,15 +1,7 @@
-import 'package:fis_measure/interfaces/date_types/point.dart';
-import 'package:fis_measure/interfaces/date_types/rect.dart';
 import 'package:fis_measure/interfaces/date_types/rect_region.dart';
-import 'package:fis_measure/interfaces/date_types/size.dart';
-import 'package:fis_measure/interfaces/enums/display_mode.dart';
-import 'package:fis_measure/interfaces/enums/visual_area_type.dart';
-import 'package:fis_measure/process/layout/configuration.dart';
-import 'package:fis_measure/process/layout/section.dart';
 import 'package:fis_measure/process/visual/v2d_visual.dart';
 import 'package:fis_measure/process/visual/v3d_visual.dart';
 import 'package:fis_measure/process/visual/visual.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:vid/us/vid_us_2d_visual.dart';
 import 'package:vid/us/vid_us_3d_visual.dart';
 import 'package:vid/us/vid_us_visual.dart';

+ 1 - 0
lib/values/strings.dart

@@ -4,4 +4,5 @@ class MeasureStrings {
   static const PackageName = "fis_measure";
   static const LayoutConfigurationAsset =
       "packages/$PackageName/assets/layout.json";
+  // "assets/layout.json"; //TODO: melon - wait remove
 }

+ 0 - 1
lib/view/standard_line/calibration_canvas.dart

@@ -116,7 +116,6 @@ class _ViewLinePainter extends CustomPainter {
 
   @override
   void paint(Canvas canvas, Size size) {
-    print('_ViewLinePainter rebuild at ${DateTime.now()}');
     final markHeight = (C_MARK_HEIGHT / 100) * size.height;
 
     final lineLength = length * physicalLength;