|
@@ -1,5 +1,9 @@
|
|
|
+import 'package:fis_jsonrpc/rpc.dart';
|
|
|
+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_calcuators/urm_ellipse_den_measure.dart';
|
|
|
import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_den_vel_measure.dart';
|
|
|
import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_density.dart';
|
|
@@ -8,10 +12,15 @@ import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_hist.d
|
|
|
import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_perfusion.dart';
|
|
|
import 'package:fis_measure/process/calcuators/urm_calcuators/urm_ellipse_vel_measure.dart';
|
|
|
import 'package:fis_measure/process/primitives/ellipse.dart';
|
|
|
+import 'package:fis_measure/utils/prompt_box.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'dart:ui' as ui;
|
|
|
|
|
|
class URMEllipseMeasure extends Ellipse {
|
|
|
URMEllipseMeasure(super.meta, super.parent);
|
|
|
|
|
|
+ static bool needPerfusion = false;
|
|
|
+
|
|
|
static URMEllipseMeasure createURMEllipseDenMeasure(ItemMeta meta,
|
|
|
[IMeasureItem? parent]) {
|
|
|
URMEllipseMeasure measureEllipse = URMEllipseMeasure(meta, parent);
|
|
@@ -70,10 +79,108 @@ class URMEllipseMeasure extends Ellipse {
|
|
|
|
|
|
static URMEllipseMeasure createURMEllipsePerfusion(ItemMeta meta,
|
|
|
[IMeasureItem? parent]) {
|
|
|
+ needPerfusion = true;
|
|
|
URMEllipseMeasure measureEllipsePerfusion = URMEllipseMeasure(meta, parent);
|
|
|
measureEllipsePerfusion.calculator = URMEllipsePerfusionCal(
|
|
|
measureEllipsePerfusion,
|
|
|
);
|
|
|
return measureEllipsePerfusion;
|
|
|
}
|
|
|
+
|
|
|
+ @override
|
|
|
+ bool onExecuteMouse(PointInfo args) {
|
|
|
+ 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 (feature == null) return false;
|
|
|
+ final f = feature! as EllipseFeature;
|
|
|
+ final activeIndex = f.activeIndex;
|
|
|
+
|
|
|
+ switch (args.pointType) {
|
|
|
+ case PointInfoType.mouseMove:
|
|
|
+ f.innerPoints[activeIndex] = args;
|
|
|
+ f.adjustPoints(args);
|
|
|
+ break;
|
|
|
+ case PointInfoType.mouseDown:
|
|
|
+ if (activeIndex == 1) {
|
|
|
+ if (f.xAxisEnd == f.xAxisStart) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ f.adjustPoints(args);
|
|
|
+ f.activeIndex = 2;
|
|
|
+ } else if (activeIndex == 2) {
|
|
|
+ doFeatureFinish();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ doCalculate();
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void handleMouseDownWhileWaiting(PointInfo args) {
|
|
|
+ if (needPerfusion) {
|
|
|
+ final point = args.toAreaLogicPoint();
|
|
|
+ feature = EllipsePerfusionImageFeature(this, point);
|
|
|
+ } else {
|
|
|
+ super.handleMouseDownWhileWaiting(args);
|
|
|
+ }
|
|
|
+ state = ItemStates.running;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool waitingResult = false;
|
|
|
+
|
|
|
+ void handleFinish() async {
|
|
|
+ feature!.isActive = false;
|
|
|
+ PromptBox.loading("计算中...");
|
|
|
+ waitingResult = true;
|
|
|
+ await doCalculateAsync();
|
|
|
+ doFeatureFinish();
|
|
|
+ PromptBox.dismiss();
|
|
|
+ waitingResult = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class EllipsePerfusionImageFeature extends EllipseFeature {
|
|
|
+ EllipsePerfusionImageFeature(Ellipse refItem, DPoint point)
|
|
|
+ : super(refItem, point);
|
|
|
+
|
|
|
+ ui.Image? perfusionImg;
|
|
|
+ IntRect? perfusionPiexlRect;
|
|
|
+ Rect? perfusionScaleDRect;
|
|
|
+ @override
|
|
|
+ void paint(Canvas canvas, Size size) {
|
|
|
+ if (perfusionImg != null) {
|
|
|
+ Paint paint = Paint();
|
|
|
+
|
|
|
+ Rect src = Rect.fromLTWH(
|
|
|
+ 0,
|
|
|
+ 0,
|
|
|
+ perfusionImg!.width.toDouble(),
|
|
|
+ perfusionImg!.height.toDouble(),
|
|
|
+ );
|
|
|
+ Rect dst = Rect.fromLTWH(
|
|
|
+ perfusionScaleDRect!.left.toDouble() * size.width,
|
|
|
+ perfusionScaleDRect!.top.toDouble() * size.height,
|
|
|
+ perfusionScaleDRect!.width.toDouble() * size.width,
|
|
|
+ perfusionScaleDRect!.height.toDouble() * size.height,
|
|
|
+ );
|
|
|
+ canvas.drawImageRect(perfusionImg!, src, dst, paint);
|
|
|
+ }
|
|
|
+ super.paint(canvas, size);
|
|
|
+ }
|
|
|
}
|