Browse Source

测试多幅多模式测量计算

melon.yin 2 years ago
parent
commit
b252abee25

+ 4 - 1
lib/measure_page_test.dart

@@ -43,7 +43,10 @@ class MeasureTestPage extends StatefulWidget {
 class _MeasureTestPageState extends State<MeasureTestPage> {
   static const C_LINEAR_TISSUE =
       // "http://43.138.119.65:9303/Flyinsono-BJ-1300984704.VCS.AP-BeiJing/9eb581250c6845b7800f0ba00218e043.VID";
-      "http://cdn-bj.fis.plus/0B344F48BA574ECD82B7FEDB8848421A.vid";
+      // "http://cdn-bj.fis.plus/0B344F48BA574ECD82B7FEDB8848421A.vid";//单幅TM
+      // "http://cdn-bj.fis.plus/6B6E069659D14E7299EB9F6EFCDE9C8C.vid"; //双幅单TissueConvex
+      // "http://cdn-bj.fis.plus/062643B82365437DB95F3811580AF3ED.vid"; //四幅单模式
+      "http://cdn-bj.fis.plus/EA90D146049D416E8E466B7446E00001.vid"; //四幅Doppler
   static const C_CONVEX_TISSUE =
       "http://43.138.119.65:9303/Flyinsono-BJ-1300984704.VCS.AP-BeiJing/9f74db43fd3b4fc486edc59106ae96ae.VID";
 

+ 6 - 4
lib/process/calcuators/distance.dart

@@ -17,10 +17,12 @@ class DistanceCal extends Calculator<StraightLine, double> {
     final viewport = ref.feature!.hostVisualArea!.viewport!;
     final p1 = ref.feature!.startPoint;
     final p2 = ref.feature!.endPoint;
-    final pp1 =
-        DPoint(p1.x * viewport.region.width, p1.y * viewport.region.height);
-    final pp2 =
-        DPoint(p2.x * viewport.region.width, p2.y * viewport.region.height);
+    final pp1 = viewport.convert(p1);
+    final pp2 = viewport.convert(p2);
+    // final pp1 =
+    //     DPoint(p1.x * viewport.region.width, p1.y * viewport.region.height);
+    // final pp2 =
+    //     DPoint(p2.x * viewport.region.width, p2.y * viewport.region.height);
 
     final value = (pp2 - pp1).length.abs();
     // final value =  ref.feature!.length;

+ 3 - 2
lib/process/primitives/location.dart

@@ -8,6 +8,7 @@ import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
 import 'package:fis_measure/interfaces/process/workspace/application.dart';
 import 'package:fis_measure/interfaces/process/workspace/point_info.dart';
+import 'package:fis_measure/process/visual/tissue_area.dart';
 import 'package:fis_measure/utils/canvas.dart';
 import 'package:get/get.dart';
 import 'package:vid/us/vid_us_probe.dart';
@@ -49,8 +50,8 @@ class Location extends MeasureItem<LocationFeature> {
     // TODO: 判断是否当前area
     // 转换为Area逻辑位置
     final point = args.toAreaLogicPoint();
-    final probeType = Get.find<IApplication>().probe.type;
-    if (probeType == VidUsProbeType.Convex) {
+    final isProbeConvex = (args.hostVisualArea! as TissueArea).isConvex;
+    if (isProbeConvex) {
       feature = TissueConvexLocationFeature(this, point);
     } else {
       feature = LocationFeature(this, point);

+ 6 - 1
lib/process/viewports/viewport.dart

@@ -70,7 +70,12 @@ abstract class ViewPort<TV extends IVisualArea, T extends IPhysicalCoordinate>
 
   @override
   DPoint convert(DPoint point) {
-    return DPoint(point.x * region.width, point.y * region.height);
+    double x = point.x * region.width;
+    double y = point.y * region.height;
+    x /= area.displayRegion.width;
+    y /= area.displayRegion.height;
+    return DPoint(x, y);
+    // return DPoint(point.x * region.width, point.y * region.height);
   }
 
   @override

+ 9 - 11
lib/process/visual/flow_area.dart

@@ -1,14 +1,12 @@
-import 'package:fis_measure/interfaces/process/modes/mode.dart';
-import 'package:fis_measure/interfaces/process/visuals/tissue_area.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual.dart';
+import 'package:fis_measure/process/visual/tissue_area.dart';
+import 'package:vid/us/vid_us_mode.dart';
+import 'package:vid/us/vid_us_visual_area_type.dart';
 
-import 'visual_area.dart';
-
-class FlowArea extends VisualArea implements ITissueArea {
-  FlowArea(IVisual visual, IMode mode) : super(visual, mode);
-
-  @override
-  void loadData() {
-    // TODO: implement loadData
-  }
+class FlowArea extends TissueArea {
+  FlowArea(
+    IVisual visual,
+    VidUsVisualAreaType areaType,
+    VidUsModeType modeType,
+  ) : super(visual, areaType, modeType);
 }

+ 7 - 1
lib/process/visual/time_motion_area.dart

@@ -9,12 +9,18 @@ import 'package:fis_measure/process/physical_coordinates/doppler.dart';
 import 'package:fis_measure/process/physical_coordinates/tissue_time_motion.dart';
 import 'package:fis_measure/process/viewports/time_motion_viewport.dart';
 import 'package:vid/us/vid_us_2d_visual.dart';
+import 'package:vid/us/vid_us_mode.dart';
 import 'package:vid/us/vid_us_physical_coordinate.dart';
+import 'package:vid/us/vid_us_visual_area_type.dart';
 
 import 'visual_area.dart';
 
 class TimeMotionArea extends VisualArea implements ITimeMotionArea {
-  TimeMotionArea(IVisual visual, IMode mode) : super(visual, mode);
+  TimeMotionArea(
+    IVisual visual,
+    VidUsVisualAreaType areaType,
+    VidUsModeType modeType,
+  ) : super(visual, areaType, modeType);
 
   @override
   void loadData() {

+ 14 - 1
lib/process/visual/tissue_area.dart

@@ -8,6 +8,7 @@ import 'package:fis_measure/process/layout/section.dart';
 import 'package:fis_measure/process/physical_coordinates/doppler.dart';
 import 'package:fis_measure/process/viewports/tissue_viewport.dart';
 import 'package:vid/us/vid_us_2d_visual.dart';
+import 'package:vid/us/vid_us_mode.dart';
 import 'package:vid/us/vid_us_physical_coordinate.dart';
 import 'package:vid/us/vid_us_visual_area_type.dart';
 
@@ -16,7 +17,19 @@ import '../physical_coordinates/linear_tissue.dart';
 import 'visual_area.dart';
 
 class TissueArea extends VisualArea implements ITissueArea {
-  TissueArea(IVisual visual, IMode mode) : super(visual, mode);
+  TissueArea(
+    IVisual visual,
+    VidUsVisualAreaType areaType,
+    VidUsModeType modeType,
+  ) : super(visual, areaType, modeType);
+
+  /// 是否扇形图
+  bool get isConvex =>
+      viewport?.physical?.runtimeType
+          .toString()
+          .toLowerCase()
+          .contains("convex") ==
+      true;
 
   @override
   void loadData() {

+ 7 - 8
lib/process/visual/v2d_visual.dart

@@ -2,9 +2,6 @@ import 'package:fis_measure/interfaces/date_types/rect_region.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
 import 'package:fis_measure/process/visual/time_motion_area.dart';
 import 'package:fis_measure/process/visual/tissue_area.dart';
-import 'package:fis_measure/process/visual/visual_area.dart';
-
-import 'package:fis_measure/interfaces/process/viewports/viewport.dart';
 import 'package:vid/us/vid_us_2d_visual.dart';
 import 'package:vid/us/vid_us_mode.dart';
 import 'package:vid/us/vid_us_visual.dart';
@@ -17,24 +14,25 @@ class V2dVisual extends VisualBase {
       : super(visualData, region);
 
   @override
-  void loadAreas(List<VisualArea<IViewPort>> areas) {
+  List<IVisualArea> loadAreas() {
+    List<IVisualArea> visualAreas = [];
     for (var areaType in visualData.physicalCoordinates.keys) {
       IVisualArea? area;
       switch (areaType) {
         case VidUsVisualAreaType.Tissue:
         case VidUsVisualAreaType.ZoomTissue:
-          area = TissueArea(this, matchAreaMode(VidUsModeType.Tissue));
+          area = TissueArea(this, areaType, VidUsModeType.Tissue);
           break;
         case VidUsVisualAreaType.Flow:
         case VidUsVisualAreaType.ZoomFlow:
-          area = TissueArea(this, matchAreaMode(VidUsModeType.Doppler));
+          area = TissueArea(this, areaType, VidUsModeType.Flow);
           break;
         case VidUsVisualAreaType.TimeMotion:
         case VidUsVisualAreaType.TissueTimeMotion:
-          area = TimeMotionArea(this, matchAreaMode(VidUsModeType.TissueTM));
+          area = TimeMotionArea(this, areaType, VidUsModeType.TissueTM);
           break;
         case VidUsVisualAreaType.Doppler:
-          area = TimeMotionArea(this, matchAreaMode(VidUsModeType.Doppler));
+          area = TimeMotionArea(this, areaType, VidUsModeType.Doppler);
           break;
         case VidUsVisualAreaType.Trace:
         case VidUsVisualAreaType.Colorbar:
@@ -47,6 +45,7 @@ class V2dVisual extends VisualBase {
         visualAreas.add(area);
       }
     }
+    return visualAreas;
   }
 
   @override

+ 2 - 1
lib/process/visual/v3d_visual.dart

@@ -11,7 +11,8 @@ class V3dVisual extends VisualBase {
       : super(visualData, region);
 
   @override
-  void loadAreas(List<VisualArea<IViewPort>> areas) {
+  List<VisualArea<IViewPort>> loadAreas() {
     // TODO: implement loadAreas
+    return [];
   }
 }

+ 3 - 13
lib/process/visual/visual.dart

@@ -20,16 +20,17 @@ import 'visual_area.dart';
 
 abstract class VisualBase implements IVisual {
   late final VidUsVisual _visualData;
-  late final List<IVisualArea> _visualAreas = [];
+  late final List<IVisualArea> _visualAreas;
   late final RectRegion _region;
 
   VisualBase(VidUsVisual visualData, RectRegion region) {
     _visualData = visualData;
     _region = region;
+    _visualAreas = loadAreas();
   }
 
   /// 装载区域
-  void loadAreas(List<VisualArea> areas);
+  List<IVisualArea> loadAreas();
 
   @override
   bool get isActive => visualAreas.any((e) => e.isActive);
@@ -65,15 +66,4 @@ abstract class VisualBase implements IVisual {
       area.isActive = false;
     }
   }
-
-  @protected
-  ModeBase matchAreaMode(VidUsModeType type) {
-    final modeInfo = visualData.modes.firstWhere((e) => e.type == type);
-    final mode = ModeBase(
-      modeInfo.name,
-      ModeTypeEnum.doppler,
-      this,
-    );
-    return mode;
-  }
 }

+ 24 - 5
lib/process/visual/visual_area.dart

@@ -7,7 +7,9 @@ import 'package:fis_measure/interfaces/process/viewports/viewport.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
 import 'package:fis_measure/process/layout/configuration.dart';
+import 'package:fis_measure/process/modes/mode_base.dart';
 import 'package:flutter/foundation.dart';
+import 'package:vid/us/vid_us_mode.dart';
 import 'package:vid/us/vid_us_visual_area_type.dart';
 
 abstract class VisualArea<T extends IViewPort> implements IVisualArea {
@@ -19,14 +21,17 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
   RectRegion? _layoutRegion;
   RectRegion _displayRegion = RectRegion.fill(0, 0, 1, 1);
 
-  VisualArea(IVisual visual, IMode mode) {
+  VisualArea(
+    IVisual visual,
+    VidUsVisualAreaType areaType,
+    VidUsModeType modeType,
+  ) {
     _visual = visual;
-    _mode = mode;
+    _areaType = areaType;
+    _mode = matchAreaMode(modeType);
+    loadData();
   }
 
-  /// 加载数据
-  void loadData();
-
   @override
   bool get isActive => _isActive;
   @override
@@ -71,6 +76,9 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
   @override
   var isActiveChanged = FEventHandler<bool>();
 
+  /// 加载数据
+  void loadData();
+
   @protected
   RectRegion findRegion(String section) {
     final displayMode =
@@ -85,6 +93,17 @@ abstract class VisualArea<T extends IViewPort> implements IVisualArea {
     return areaRegion;
   }
 
+  @protected
+  ModeBase matchAreaMode(VidUsModeType type) {
+    final modeInfo = visual.visualData.modes.firstWhere((e) => e.type == type);
+    final mode = ModeBase(
+      modeInfo.name,
+      ModeTypeEnum.doppler,
+      visual,
+    );
+    return mode;
+  }
+
   void _updateDisplayRegion() {
     if (layoutRegion == null) {
       _displayRegion = RectRegion.fill(0, 0, 1, 1);

+ 2 - 3
lib/process/workspace/application.dart

@@ -17,6 +17,7 @@ import 'package:fis_measure/process/annotations/input_annotation.dart';
 import 'package:fis_measure/process/annotations/label_annotation.dart';
 import 'package:fis_measure/process/primitives/location.dart';
 import 'package:fis_measure/process/primitives/straightline.dart';
+import 'package:fis_measure/process/visual/tissue_area.dart';
 import 'package:flutter/painting.dart';
 import 'package:vid/us/vid_us_image.dart';
 import 'package:vid/us/vid_us_probe.dart';
@@ -278,6 +279,7 @@ class Application implements IApplication {
       return;
     }
     if (name == MeasureTerms.Depth) {
+      final isProbeConvex = (currentVisualArea as TissueArea).isConvex;
       final Location Function(ItemMeta, [IMeasureItem?]) fn = isProbeConvex
           ? Location.createTissueConvexDepth
           : Location.createTissueDepth;
@@ -370,9 +372,6 @@ class Application implements IApplication {
 
   void _loadVisuals() {
     _clearVisuals();
-    // for (final data in frameData!.visuals) {
-    //   _visuals!.add(VisualBase(data));
-    // }
     _visuals = VisualsLoader(frameData!.visuals).load();
   }