浏览代码

update(measure): support HIP

gavin.chen 2 年之前
父节点
当前提交
f25fa8ed47

+ 2 - 2
lib/measure_page_test.dart

@@ -100,8 +100,8 @@ class _MeasureTestPageState extends State<MeasureTestPage> {
       // "http://cdn-bj.fis.plus/974BABA5113640639FD749E06DD7DA5B.vid"; //B CF CW
       // "http://cdn-bj.fis.plus/0B344F48BA574ECD82B7FEDB8848421A.vid"; //单幅TM
       // "http://cdn-bj.fis.plus/3379F38302884C2991D90FBDFB0DEA7E.dat"; //单幅TM(2)
-      "http://cdn-bj.fis.plus/6A99AD2530864616B64355A8EA9AE3EC.vid";
-  // "http://cdn-bj.fis.plus/F26C6E5D57A7472A97E9EB543DF0D16C.vid"; // 单幅Convex
+      // "http://cdn-bj.fis.plus/6A99AD2530864616B64355A8EA9AE3EC.vid";
+      "http://cdn-bj.fis.plus/F26C6E5D57A7472A97E9EB543DF0D16C.vid"; // 单幅Convex
   // "http://cdn-bj.fis.plus/6B6E069659D14E7299EB9F6EFCDE9C8C.vid"; //双幅单TissueConvex
   // "http://cdn-bj.fis.plus/062643B82365437DB95F3811580AF3ED.vid"; //四幅单模式
   // "http://cdn-bj.fis.plus/EA90D146049D416E8E466B7446E00001.vid"; //四幅Doppler

+ 4 - 0
lib/process/items/factory.dart

@@ -6,8 +6,10 @@ import 'package:fis_measure/process/primitives/combos/afi.dart';
 import 'package:fis_measure/process/primitives/combos/area_straightline.dart';
 import 'package:fis_measure/process/primitives/combos/depth2baseline.dart';
 import 'package:fis_measure/process/primitives/combos/lwh_straightline.dart';
+import 'package:fis_measure/process/primitives/combos/three_ray.dart';
 import 'package:fis_measure/process/primitives/combos/two_area.dart';
 import 'package:fis_measure/process/primitives/combos/two_location.dart';
+import 'package:fis_measure/process/primitives/combos/two_ray.dart';
 import 'package:fis_measure/process/primitives/combos/two_straightline.dart';
 import 'package:fis_measure/process/primitives/ellipse.dart';
 import 'package:fis_measure/process/primitives/location.dart';
@@ -168,5 +170,7 @@ class MeasureItemFactory {
     // Specific
     _singleton._register(MeasureTypes.Afi, Afi.createAfi);
     _singleton._register(MeasureTypes.HR, StraightLine.createHeartRate);
+    _singleton._register(MeasureTypes.HipOneRay, TwoRay.createTwoRay);
+    _singleton._register(MeasureTypes.HipTwoRay, ThreeRay.createThreeRay);
   }
 }

+ 72 - 0
lib/process/primitives/combos/three_ray.dart

@@ -0,0 +1,72 @@
+import 'package:fis_measure/interfaces/process/items/item.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/process/calcuators/ray.dart';
+import 'package:fis_measure/process/items/top_item_feature.dart';
+import 'package:fis_measure/process/primitives/ray.dart';
+import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/items/item_feature.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+
+abstract class ThreeRayAbstract<T extends MeasureItemFeature>
+    extends TopMeasureItem<T> {
+  ThreeRayAbstract(ItemMeta meta) : super(meta);
+
+  MeasureItem get child1;
+  MeasureItem get child2;
+  MeasureItem get child3;
+}
+
+class ThreeRay extends ThreeRayAbstract<ThreeRayFeature> {
+  @override
+  bool get ifAutoFinish => true;
+  @override
+  bool get ifAutoStart => true;
+
+  late final Ray x;
+  late final Ray y;
+  late final Ray z;
+
+  ThreeRay(ItemMeta meta) : super(meta) {
+    final metaX = meta.childItems[0];
+    final metaY = meta.childItems[1];
+    final metaZ = meta.childItems[2];
+
+    x = Ray.createRay(metaX, this);
+    y = Ray.createRay(metaY, this);
+    z = Ray.createRay(metaZ, this);
+    //TODO:[Gavin] angle 没有传来,暂时写死
+    y.initializeAngle = 45;
+    z.initializeAngle = 45;
+
+    childItems.add(x);
+    childItems.add(y);
+    childItems.add(z);
+  }
+
+  @override
+  Ray get child1 => x;
+
+  @override
+  Ray get child2 => y;
+
+  @override
+  Ray get child3 => z;
+
+  @override
+  ThreeRayFeature buildFeature() => ThreeRayFeature(this);
+
+  @override
+  void onCancelingOnce() {}
+
+  static ThreeRay createThreeRay(ItemMeta meta, [IMeasureItem? parent]) {
+    ThreeRay threeRay = ThreeRay(meta);
+    threeRay.calculator = RayDepthCal(threeRay.child1);
+    return threeRay;
+  }
+}
+
+class ThreeRayFeature extends TopMeasureItemFeature {
+  ThreeRayFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 62 - 0
lib/process/primitives/combos/two_ray.dart

@@ -0,0 +1,62 @@
+import 'package:fis_measure/interfaces/process/items/item.dart';
+import 'package:fis_measure/interfaces/process/items/item_metas.dart';
+import 'package:fis_measure/process/calcuators/ray.dart';
+import 'package:fis_measure/process/items/top_item_feature.dart';
+import 'package:fis_measure/process/primitives/ray.dart';
+import 'package:fis_measure/process/items/item.dart';
+import 'package:fis_measure/process/items/item_feature.dart';
+import 'package:fis_measure/process/items/top_item.dart';
+
+abstract class TwoRayAbstract<T extends MeasureItemFeature>
+    extends TopMeasureItem<T> {
+  TwoRayAbstract(ItemMeta meta) : super(meta);
+
+  MeasureItem get child1;
+  MeasureItem get child2;
+}
+
+class TwoRay extends TwoRayAbstract<TwoRayFeature> {
+  @override
+  bool get ifAutoFinish => true;
+  @override
+  bool get ifAutoStart => true;
+
+  late final Ray x;
+  late final Ray y;
+
+  TwoRay(ItemMeta meta) : super(meta) {
+    final metaX = meta.childItems[0];
+    final metaY = meta.childItems[1];
+
+    x = Ray.createRay(metaX, this);
+    y = Ray.createRay(metaY, this);
+    //TODO:[Gavin] angle 没有传来,暂时写死
+    y.initializeAngle = 45;
+    childItems.add(x);
+    childItems.add(y);
+  }
+
+  @override
+  Ray get child1 => x;
+
+  @override
+  Ray get child2 => y;
+
+  @override
+  TwoRayFeature buildFeature() => TwoRayFeature(this);
+
+  @override
+  void onCancelingOnce() {}
+
+  static TwoRay createTwoRay(ItemMeta meta, [IMeasureItem? parent]) {
+    TwoRay twoRay = TwoRay(meta);
+    twoRay.calculator = RayDepthCal(twoRay.child1);
+    return twoRay;
+  }
+}
+
+class TwoRayFeature extends TopMeasureItemFeature {
+  TwoRayFeature(
+    ITopMeasureItem refItem,
+  ) : super(refItem);
+}

+ 58 - 24
lib/process/primitives/ray.dart

@@ -2,6 +2,7 @@ import 'dart:ui';
 import 'dart:math' as math;
 
 import 'package:fis_measure/interfaces/date_types/point.dart';
+import 'package:fis_measure/interfaces/date_types/rect_region.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';
@@ -15,9 +16,7 @@ class Ray extends MeasureItem<RayFeature> {
   double _initializeAngle = 0;
   double _initializeAngleVal = 0;
   bool _switchInitialAngle = false;
-  Ray(ItemMeta meta, IMeasureItem? parent) : super(meta, parent) {
-    initializeAngle = 45;
-  }
+  Ray(ItemMeta meta, IMeasureItem? parent) : super(meta, parent);
 
   double get initializeAngle => _initializeAngle;
   set initializeAngle(double value) {
@@ -105,30 +104,65 @@ class RayFeature extends MeasureItemFeature {
     }
   }
 
+  RectRegion get viewRegion => hostVisualArea!.viewport!.area.layoutRegion!;
+
   @override
   void paint(Canvas canvas, Size size) {
     if (innerPoints.isEmpty) return;
-
+    final curItemName = refItem.displayName;
     final offset = convert2ViewPoint(size, point).toOffset();
-    final left = Offset(0, offset.dy);
-    final right = Offset(size.width, offset.dy);
-
-    // final center = Offset(size.width / 2, size.height / 2);
-    // if (angle != 0) {
-    //   canvas.save();
-    //   canvas.translate(center.dx, center.dy);
-    //   final rotateRad = angle * math.pi / 180;
-    //   canvas.rotate(rotateRad);
-    //   canvas.translate(-center.dx, -center.dy);
-    // }
-
-    canvas.drawDashLine(left, right, 1, 10, paintPan);
-
-    // if (angle != 0) {
-    //   canvas.restore();
-    // }
-
-    var idText = '$id.${refItem.displayName}';
-    drawCustomId(canvas, size, right, idText);
+    final rect = Rect.fromLTWH(
+        viewRegion.left * size.width,
+        viewRegion.top * size.height,
+        viewRegion.width * size.width,
+        viewRegion.height * size.height);
+    List<Offset> twoPoint = [const Offset(0, 0), const Offset(0, 0)];
+    final idText = '$id.${refItem.displayName}';
+    switch (curItemName) {
+      case "Baseline":
+        twoPoint = calcLinePoint(rect, offset, 0);
+        drawCustomId(canvas, size, twoPoint[1], idText);
+        break;
+      case "Line α":
+        twoPoint = calcLinePoint(rect, offset, angle);
+        drawCustomId(canvas, size, twoPoint[1], idText);
+        break;
+      case "Line β":
+        twoPoint = calcLinePoint(rect, offset, 180 - angle);
+        drawCustomId(canvas, size, twoPoint[0], idText);
+        break;
+      default:
+        print("Unkonw name RayFeature: $curItemName");
+        break;
+    }
+    canvas.drawDashLine(twoPoint[0], twoPoint[1], 1, 10, paintPan);
+  }
+
+  List<Offset> calcLinePoint(Rect rect, Offset innerPoint, double angle) {
+    List<Offset> twoPoint = [const Offset(0, 0), const Offset(0, 0)];
+    if (!rect.contains(innerPoint)) return twoPoint;
+    final tan = math.tan(angle * math.pi / 180);
+    final x = innerPoint.dx;
+    final y = innerPoint.dy;
+    final d1 = x - y / tan;
+    twoPoint[0] = Offset(d1, 0);
+    final d2 = (rect.height - y) / tan + x;
+    twoPoint[1] = Offset(d2, rect.height);
+    if (angle <= 90) {
+      if (d1 < rect.left) {
+        twoPoint[0] = Offset(rect.left, y - tan * (x - rect.left));
+      }
+      if (d2 > rect.right) {
+        twoPoint[1] = Offset(rect.right, y + tan * (rect.right - x));
+      }
+    } else {
+      if (d1 > rect.right) {
+        twoPoint[0] = Offset(rect.right, y - tan * (x - rect.right));
+      }
+      if (d2 < rect.left) {
+        twoPoint[1] = Offset(rect.left, y + tan * (rect.left - x));
+      }
+    }
+    return twoPoint;
   }
 }