Kaynağa Gözat

完善URM测量项

gavin.chen 10 ay önce
ebeveyn
işleme
1f5de72b60

+ 3 - 0
lib/interfaces/process/calculators/calculator.dart

@@ -8,4 +8,7 @@ abstract class ICalculator<TValue> {
 
   /// 结束一次测算
   void finishOnce();
+
+  /// 异步计算
+  Future<void> calculateAsync();
 }

+ 3 - 0
lib/process/calcuators/calculator.dart

@@ -24,6 +24,9 @@ abstract class Calculator<T extends IMeasureItem, TValue>
   @override
   void finishOnce() {}
 
+  @override
+  Future<void> calculateAsync() async {}
+
   @protected
   FloatValue? updateFloatValue(
     double value, {

+ 132 - 27
lib/process/calcuators/urm.dart

@@ -1,24 +1,29 @@
-import 'dart:convert';
 import 'dart:ui';
 
 import 'package:fis_common/logger/logger.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/process/items/types.dart';
+import 'package:fis_measure/process/primitives/area_abstract.dart';
 import 'package:fis_measure/process/primitives/location.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
 import 'package:fis_measure/process/primitives/urm_rect.dart';
-import 'package:fis_measure/process/workspace/rpc_bridge.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import 'calculator.dart';
 
 class URMRectCal extends Calculator<URMRect, double> {
-  URMRectCal(URMRect ref, this.type) : super(ref);
-  String type = '';
+  URMRectCal(
+    URMRect ref, {
+    required this.type,
+  }) : super(ref);
+  final String type;
   @override
-  void calculate() {
+  void calculate() {}
+
+  @override
+  Future<void> calculateAsync() async {
     if (ref.feature == null) return;
     Size urmResultSize = const Size(0, 0);
     try {
@@ -36,31 +41,25 @@ class URMRectCal extends Calculator<URMRect, double> {
       //右下顶点
       final rightBottomPercent =
           DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
-      //画布尺寸
-      final canavsSize = ref.application.displaySize;
 
       final startPoint = leftTopPercent.scale2Size(urmResultSize);
       final endPoint = rightBottomPercent.scale2Size(urmResultSize);
 
-      print("URM Measure canavsSize: $canavsSize");
-      print("URM Measure type: $type");
-
       String description = "URM\n Calculating...";
       updateStringValue(description);
 
-      /// [URM] ✅在此处通知 Server 计算,获取 description
       switch (type) {
         case MeasureTypes.SRRoiDensity:
-          getSRRoiDensityResult(urmApplication, startPoint, endPoint);
+          await getSRRoiDensityResult(urmApplication, startPoint, endPoint);
           break;
         case MeasureTypes.SRRoiFractalDim:
-          getSRRoiFractalDimResult(urmApplication, startPoint, endPoint);
+          await getSRRoiFractalDimResult(urmApplication, startPoint, endPoint);
           break;
         case MeasureTypes.SRRoiVel:
-          getSRRoiVelResult(urmApplication, startPoint, endPoint);
+          await getSRRoiVelResult(urmApplication, startPoint, endPoint);
           break;
         case MeasureTypes.URMVelMeasure:
-          getURMVelMeasureResult(urmApplication, startPoint, endPoint);
+          await getURMVelMeasureResult(urmApplication, startPoint, endPoint);
           break;
         default:
       }
@@ -71,7 +70,7 @@ class URMRectCal extends Calculator<URMRect, double> {
   }
 
   // URM 测量项 2
-  void getSRRoiDensityResult(
+  Future<void> getSRRoiDensityResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -90,7 +89,7 @@ class URMRectCal extends Calculator<URMRect, double> {
   }
 
   // URM 测量项 3
-  void getSRRoiFractalDimResult(
+  Future<void> getSRRoiFractalDimResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -109,7 +108,7 @@ class URMRectCal extends Calculator<URMRect, double> {
   }
 
   // URM 测量项 7
-  void getSRRoiVelResult(
+  Future<void> getSRRoiVelResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -128,7 +127,7 @@ class URMRectCal extends Calculator<URMRect, double> {
   }
 
   // URM 测量项 9
-  void getURMVelMeasureResult(
+  Future<void> getURMVelMeasureResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -152,7 +151,10 @@ class URMLocationCal extends Calculator<Location, double> {
   URMLocationCal(Location ref) : super(ref);
 
   @override
-  void calculate() {
+  void calculate() {}
+
+  @override
+  Future<void> calculateAsync() async {
     if (ref.feature == null) return;
     Size urmResultSize = const Size(0, 0);
     try {
@@ -167,7 +169,8 @@ class URMLocationCal extends Calculator<Location, double> {
       final point = ref.feature!.point.clone();
       final startPoint = point.scale2Size(urmResultSize);
       print("URM Measure startPoint: $startPoint");
-      getSRLoactionVelResult(urmApplication, startPoint);
+      await getSRLoactionVelResult(urmApplication, startPoint);
+      return;
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
@@ -175,7 +178,8 @@ class URMLocationCal extends Calculator<Location, double> {
   }
 
   // URM 测量项 6
-  void getSRLoactionVelResult(URMApplication app, DPoint startPoint) async {
+  Future<void> getSRLoactionVelResult(
+      URMApplication app, DPoint startPoint) async {
     String description = "URM\n Measuring";
     try {
       GetSRLoactionVelResult? result =
@@ -194,10 +198,16 @@ class URMLocationCal extends Calculator<Location, double> {
 }
 
 class URMStraightLineCal extends Calculator<StraightLine, double> {
-  URMStraightLineCal(StraightLine ref) : super(ref);
+  URMStraightLineCal(
+    StraightLine ref, {
+    required this.type,
+  }) : super(ref);
+  final String type;
+  @override
+  void calculate() {}
 
   @override
-  void calculate() {
+  Future<void> calculateAsync() async {
     if (ref.feature == null) return;
     try {
       if (ref.application is! URMApplication) {
@@ -217,7 +227,15 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
       final startPoint = leftTopPercent.scale2Size(urmResultSize);
       final endPoint = rightBottomPercent.scale2Size(urmResultSize);
 
-      getSRCurvatureResult(urmApplication, startPoint, endPoint);
+      switch (type) {
+        case MeasureTypes.SRCurvature:
+          await getSRCurvatureResult(urmApplication, startPoint, endPoint);
+          break;
+        case MeasureTypes.URMDensityMeasure:
+          await getURMDenMeasureResult(urmApplication, startPoint, endPoint);
+          break;
+        default:
+      }
     } catch (e) {
       logger.e('URM Measure error: $e');
       return;
@@ -225,7 +243,7 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
   }
 
   // URM 测量项 1
-  void getSRCurvatureResult(
+  Future<void> getSRCurvatureResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -245,7 +263,7 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
   }
 
   // URM 测量项 8
-  void getURMDenMeasureResult(
+  Future<void> getURMDenMeasureResult(
       URMApplication app, DPoint startPoint, DPoint endPoint) async {
     String description = "URM\n Measuring";
     try {
@@ -264,3 +282,90 @@ class URMStraightLineCal extends Calculator<StraightLine, double> {
     ref.application.updateRenderReady.emit(this, null);
   }
 }
+
+class URMTraceCal extends Calculator<AreaItemAbstract, double> {
+  URMTraceCal(
+    AreaItemAbstract ref, {
+    required this.type,
+  }) : super(ref);
+  final String type;
+
+  @override
+  void calculate() {}
+
+  @override
+  Future<void> calculateAsync() async {
+    if (ref.feature == null) return;
+    final feature = ref.feature!;
+    try {
+      if (ref.application is! URMApplication) {
+        return;
+      }
+      Size urmResultSize = const Size(0, 0);
+      final URMApplication urmApplication = ref.application as URMApplication;
+      urmResultSize = Size(urmApplication.resultWidth.toDouble(),
+          urmApplication.resultHeight.toDouble());
+      final List<DPoint> points =
+          feature.innerPoints.map((e) => e.scale2Size(urmResultSize)).toList();
+
+      switch (type) {
+        case MeasureTypes.SRTraceDensity:
+          await getSRTraceVelResult(urmApplication, convertPoints(points));
+          break;
+        case MeasureTypes.SRTraceFD:
+          await getSRTraceFractalDimResult(
+              urmApplication, convertPoints(points));
+          break;
+        default:
+      }
+    } catch (e) {
+      logger.e('URM Measure error: $e');
+      return;
+    }
+  }
+
+  // URM 测量项 4
+  Future<void> getSRTraceVelResult(
+      URMApplication app, List<UrmPoint> points) async {
+    String description = "URM\n Measuring";
+    try {
+      GetSRTraceVelResult? result = await app.getSRTraceVelResult(points);
+      if (result != null) {
+        print("URM Measure output: ${result.output} ");
+        description = "${(result.output).toStringAsFixed(2)}mm/s ...";
+      }
+    } catch (e) {
+      description = " ";
+      return;
+    }
+    updateStringValue(description);
+    ref.application.updateRenderReady.emit(this, null);
+  }
+
+  // URM 测量项 5
+  Future<void> getSRTraceFractalDimResult(
+      URMApplication app, List<UrmPoint> points) async {
+    String description = "URM\n Measuring";
+    try {
+      GetSRTraceFractalDimResult? result =
+          await app.getSRTraceFractalDimResult(points);
+      if (result != null) {
+        print("URM Measure output: ${result.output} ");
+        description = "${(result.output).toStringAsFixed(2)}mm/s ...";
+      }
+    } catch (e) {
+      description = " ";
+      return;
+    }
+    updateStringValue(description);
+    ref.application.updateRenderReady.emit(this, null);
+  }
+
+  List<UrmPoint> convertPoints(List<DPoint> points) {
+    List<UrmPoint> urmPoints = [];
+    for (var point in points) {
+      urmPoints.add(UrmPoint(x: point.x, y: point.y));
+    }
+    return urmPoints;
+  }
+}

+ 9 - 2
lib/process/items/factory.dart

@@ -35,6 +35,7 @@ import 'package:fis_measure/process/primitives/twoline_angle.dart';
 import 'package:fis_measure/process/primitives/urm_location.dart';
 import 'package:fis_measure/process/primitives/urm_rect.dart';
 import 'package:fis_measure/process/primitives/urm_straightline.dart';
+import 'package:fis_measure/process/primitives/urm_trace.dart';
 
 /// 测量项创建器
 ///
@@ -247,8 +248,14 @@ class MeasureItemFactory {
       MeasureTypes.SRRoiFractalDim,
       URMRect.createMeasureRect,
     );
-    // TODO SRTraceDensity
-    // TODO SRTraceFD
+    _singleton._register(
+      MeasureTypes.SRTraceDensity,
+      URMTrace.createURMTrace,
+    );
+    _singleton._register(
+      MeasureTypes.SRTraceFD,
+      URMTrace.createURMTrace,
+    );
     _singleton._register(
       MeasureTypes.SRLoactionVel,
       URMLoaction.createURMLocation,

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

@@ -201,6 +201,11 @@ abstract class MeasureItem<T extends MeasureItemFeature> extends IMeasureItem {
     calculator?.calculate();
   }
 
+  @protected
+  Future<void> doCalculateAsync() async {
+    await calculator?.calculateAsync();
+  }
+
   /// 拖动目标是否超出区域
   @protected
   bool isMoveTargetOutOfRange(PointInfo args) {

+ 15 - 9
lib/process/primitives/urm_location.dart

@@ -1,16 +1,10 @@
-import 'dart:ui';
-
-import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/urm.dart';
-import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/process/primitives/location.dart';
-import 'package:fis_measure/utils/canvas.dart';
-
-import '../items/item_feature.dart';
+import 'package:fis_measure/utils/prompt_box.dart';
 
 class URMLoaction extends Location {
   URMLoaction(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
@@ -26,6 +20,7 @@ class URMLoaction extends Location {
 
   @override
   bool onExecuteMouse(PointInfo args) {
+    if (waitingResult) return false;
     if (state == ItemStates.finished || state == ItemStates.waiting) {
       if (args.pointType == PointInfoType.mouseMove) {
         handleMouseMoveWhileFinish(args);
@@ -36,13 +31,24 @@ class URMLoaction extends Location {
 
       feature?.point = args;
       if (args.pointType == PointInfoType.mouseDown) {
-        doCalculate();
-        doFeatureFinish();
+        handleFinish();
       }
     }
     return true;
   }
 
+  bool waitingResult = false;
+
+  void handleFinish() async {
+    feature!.isActive = false;
+    PromptBox.loading("分析中...");
+    waitingResult = true;
+    await doCalculateAsync();
+    doFeatureFinish();
+    PromptBox.dismiss();
+    waitingResult = false;
+  }
+
   @override
   bool onExecuteTouch(PointInfo args) {
     if (state == ItemStates.finished || state == ItemStates.waiting) {

+ 16 - 10
lib/process/primitives/urm_rect.dart

@@ -8,6 +8,7 @@ import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/urm.dart';
 import 'package:fis_measure/process/items/item.dart';
 import 'package:fis_measure/utils/canvas.dart';
+import 'package:fis_measure/utils/prompt_box.dart';
 
 import '../items/item_feature.dart';
 
@@ -16,12 +17,13 @@ class URMRect extends MeasureItem<URMRectFeature> {
 
   static URMRect createMeasureRect(ItemMeta meta, [IMeasureItem? parent]) {
     URMRect measureRect = URMRect(meta, parent);
-    measureRect.calculator = URMRectCal(measureRect, meta.name);
+    measureRect.calculator = URMRectCal(measureRect, type: meta.name);
     return measureRect;
   }
 
   @override
   bool onExecuteMouse(PointInfo args) {
+    if (waitingResult) return false;
     if (state == ItemStates.finished) {
       if (args.pointType == PointInfoType.mouseDown) {
         state = ItemStates.waiting;
@@ -37,20 +39,24 @@ class URMRect extends MeasureItem<URMRectFeature> {
 
       feature?.endPoint = args;
       if (args.pointType == PointInfoType.mouseDown) {
-        doCalculate();
-
-        feature!.isActive = false;
-        state = ItemStates.finished;
-
-        ///TODO 能否可以不加 delay,直接执行(此处是为了 cal 内 ref.feature!.lowerPoints = lowerPoints; 能够执行完成)
-        Future.delayed(const Duration(milliseconds: 500), () {
-          doFeatureFinish();
-        });
+        handleFinish();
       }
     }
     return true;
   }
 
+  bool waitingResult = false;
+
+  void handleFinish() async {
+    feature!.isActive = false;
+    PromptBox.loading("分析中...");
+    waitingResult = true;
+    await doCalculateAsync();
+    doFeatureFinish();
+    PromptBox.dismiss();
+    waitingResult = false;
+  }
+
   @override
   bool onExecuteTouch(PointInfo args) {
     // TODO: implement onExecuteTouch

+ 16 - 11
lib/process/primitives/urm_straightline.dart

@@ -1,17 +1,10 @@
-import 'dart:ui';
-
-import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/items/item_metas.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
 import 'package:fis_measure/process/calcuators/urm.dart';
-import 'package:fis_measure/process/items/item.dart';
-import 'package:fis_measure/process/primitives/location.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
-import 'package:fis_measure/utils/canvas.dart';
-
-import '../items/item_feature.dart';
+import 'package:fis_measure/utils/prompt_box.dart';
 
 class URMStraightLine extends StraightLine {
   URMStraightLine(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
@@ -20,12 +13,13 @@ class URMStraightLine extends StraightLine {
       [IMeasureItem? parent]) {
     URMStraightLine sraightLine = URMStraightLine(meta, parent);
     sraightLine.repeatableEditable = true;
-    sraightLine.calculator = URMStraightLineCal(sraightLine);
+    sraightLine.calculator = URMStraightLineCal(sraightLine, type: meta.name);
     return sraightLine;
   }
 
   @override
   bool onExecuteMouse(PointInfo args) {
+    if (waitingResult) return false;
     if (state == ItemStates.finished) {
       if (args.pointType == PointInfoType.mouseDown) {
         state = ItemStates.waiting;
@@ -43,8 +37,7 @@ class URMStraightLine extends StraightLine {
 
       feature?.endPoint = args;
       if (args.pointType == PointInfoType.mouseDown) {
-        doCalculate();
-        doFeatureFinish();
+        handleFinish();
 
         /// 重置十字样式
         // changeCrossIndicatorStyle(CrossIndicatorStyle.nomal);
@@ -52,4 +45,16 @@ class URMStraightLine extends StraightLine {
     }
     return true;
   }
+
+  bool waitingResult = false;
+
+  void handleFinish() async {
+    feature!.isActive = false;
+    PromptBox.loading("分析中...");
+    waitingResult = true;
+    await doCalculateAsync();
+    doFeatureFinish();
+    PromptBox.dismiss();
+    waitingResult = false;
+  }
 }

+ 56 - 0
lib/process/primitives/urm_trace.dart

@@ -0,0 +1,56 @@
+import 'package:fis_measure/interfaces/enums/items.dart';
+import 'package:fis_measure/interfaces/process/items/item.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
+import 'package:fis_measure/process/calcuators/urm.dart';
+import 'package:fis_measure/process/primitives/trace.dart';
+import 'package:fis_measure/utils/prompt_box.dart';
+
+class URMTrace extends Trace {
+  URMTrace(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
+
+  static URMTrace createURMTrace(ItemMeta meta, [IMeasureItem? parent]) {
+    URMTrace trace = URMTrace(meta, parent);
+    trace.calculator = URMTraceCal(trace, type: meta.name);
+    trace.isClosed = false;
+    return trace;
+  }
+
+  @override
+  bool onExecuteMouse(PointInfo args) {
+    if (waitingResult) return false;
+    if (state == ItemStates.finished) {
+      if (args.pointType == PointInfoType.mouseDown) {
+        state = ItemStates.waiting;
+      }
+    }
+
+    if (state == ItemStates.waiting) {
+      if (args.pointType == PointInfoType.mouseDown) {
+        handleMouseDownWhileWaiting(args);
+      }
+    } else if (state == ItemStates.running) {
+      if (args.pointType == PointInfoType.mouseUp) return false;
+
+      feature?.adopt(args);
+      if (args.pointType == PointInfoType.mouseDown) {
+        handleFinish();
+      } else {
+        checkAutoSnap(args);
+      }
+    }
+    return true;
+  }
+
+  bool waitingResult = false;
+
+  void handleFinish() async {
+    feature!.isActive = false;
+    PromptBox.loading("分析中...");
+    waitingResult = true;
+    await doCalculateAsync();
+    doFeatureFinish();
+    PromptBox.dismiss();
+    waitingResult = false;
+  }
+}

+ 13 - 1
lib/utils/prompt_box.dart

@@ -4,6 +4,7 @@ import 'package:fis_ui/utils/sizer/sizer.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_easyloading/flutter_easyloading.dart';
 import 'package:get/get.dart';
+import 'package:fis_theme/theme.dart';
 
 ///弹出框位置
 enum PromptBoxSnackbarPosition {
@@ -51,7 +52,18 @@ class PromptBox {
 
     _setLoadingStyle();
     EasyLoading.show(
-      indicator: LoadingWidget(text: text ?? '${i18nBook.common.loading.t}...'),
+      indicator: Theme(
+        data: ThemeData.light().copyWith(
+          primaryColor: const Color(0xFF4A5468),
+          textTheme: TextTheme(
+            displayLarge:
+                TextStyle(fontFamily: FTheme.ins.localeSetting.fontFamily),
+          ),
+        ),
+        child: LoadingWidget(
+          text: text ?? '${i18nBook.common.loading.t}...',
+        ),
+      ),
       maskType: EasyLoadingMaskType.custom,
       status: "",
     );

+ 4 - 4
pubspec.lock

@@ -218,8 +218,8 @@ packages:
     dependency: transitive
     description:
       path: "."
-      ref: "^1.0.0.2"
-      resolved-ref: "6a2455596179bc8a62092be343bfb0632c4dcf2d"
+      ref: "23644f6"
+      resolved-ref: "23644f6e06a10a2c2c57dfe6a1a958c9252246b7"
       url: "http://git.ius.plus:88/Project-Wing/fis_lib_theme.git"
     source: git
     version: "0.0.1"
@@ -227,8 +227,8 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "0907b06"
-      resolved-ref: "0907b06b78c04442368a5ad049294ea49e3297bf"
+      ref: "1847d58"
+      resolved-ref: "1847d58413bbc6139ee9fae39c9bdadd93543632"
       url: "http://git.ius.plus/Project-Wing/fis_lib_ui.git"
     source: git
     version: "0.0.1"

+ 1 - 1
pubspec.yaml

@@ -82,7 +82,7 @@ dependency_overrides:
   fis_ui:
     git:
       url: http://git.ius.plus/Project-Wing/fis_lib_ui.git
-      ref: 0907b06
+      ref: 1847d58
     #path: ../fis_lib_ui
   vid:
     git: