|
@@ -9,6 +9,7 @@ import 'package:fis_measure/view/mobile_view/widgets/throttle.dart' as utils;
|
|
|
import 'package:flutter/gestures.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:get/get.dart';
|
|
|
+import 'package:vid/us/vid_us_image.dart';
|
|
|
|
|
|
class AiResultModifierController extends GetxController {
|
|
|
final rpcHelper = Get.find<RPCHelper>();
|
|
@@ -17,10 +18,10 @@ class AiResultModifierController extends GetxController {
|
|
|
// final languageService = Get.find<LanguageService>();
|
|
|
final state = AiResultModifierState();
|
|
|
|
|
|
- /// 传入的图像参数
|
|
|
- // String patientCode = "";
|
|
|
- String remedicalCode = "";
|
|
|
- // String recordCode = "";
|
|
|
+ /// 传入参数 [图像code,图像帧下标,图像元数据]
|
|
|
+ final String remedicalCode;
|
|
|
+ final int currFrameIndex;
|
|
|
+ final VidUsImage currFrame;
|
|
|
|
|
|
/// 初次查询到的完整数据
|
|
|
AIDiagnosisPerImageDTO resultDTO = AIDiagnosisPerImageDTO();
|
|
@@ -81,7 +82,12 @@ class AiResultModifierController extends GetxController {
|
|
|
/// 测量语言包
|
|
|
final measureLanguage = MeasureLanguage();
|
|
|
|
|
|
- AiResultModifierController();
|
|
|
+ AiResultModifierController(
|
|
|
+ {required this.remedicalCode,
|
|
|
+ required this.currFrameIndex,
|
|
|
+ required this.currFrame}) {
|
|
|
+ print('创建 AiResultModifierController');
|
|
|
+ }
|
|
|
|
|
|
/// 多个ai病灶
|
|
|
List<AIDetectedObject> get aiDetectedObjectList =>
|
|
@@ -131,7 +137,7 @@ class AiResultModifierController extends GetxController {
|
|
|
GetRemedicalDiagnosisDataRequest(
|
|
|
token: rpcHelper.userToken,
|
|
|
remedicalCode: remedicalCode,
|
|
|
- frameIndex: 0,
|
|
|
+ frameIndex: currFrameIndex,
|
|
|
),
|
|
|
);
|
|
|
resultDTO = AIDiagnosisPerImageDTO.fromJson(jsonDecode(result));
|
|
@@ -149,9 +155,10 @@ class AiResultModifierController extends GetxController {
|
|
|
}
|
|
|
}
|
|
|
keyPoints = await _queryAllKeyPoints();
|
|
|
+ _canvasAffectedKeyPoints.clear();
|
|
|
_updateCurrContoursPoints();
|
|
|
_updateCurrKeyPoints();
|
|
|
- _getDiagnosisEnumItemsAsync();
|
|
|
+ await _getDiagnosisEnumItemsAsync();
|
|
|
update(['ai_result_canvas', 'ai_result_panel']);
|
|
|
} catch (e) {
|
|
|
print(e);
|
|
@@ -164,31 +171,12 @@ class AiResultModifierController extends GetxController {
|
|
|
print("AiResultModifierController close");
|
|
|
}
|
|
|
|
|
|
- /// 图像尺寸加载完成的回调
|
|
|
- void onFrameDataLoaded(Size _frameSize) {
|
|
|
- print("图像尺寸 $_frameSize");
|
|
|
- frameSize = _frameSize;
|
|
|
- final RenderBox box =
|
|
|
- framePlayerKey.currentContext!.findRenderObject() as RenderBox;
|
|
|
- final framePlayerSize = Size(box.size.width, box.size.height);
|
|
|
- print("容器尺寸 $framePlayerSize");
|
|
|
- _scale = min(framePlayerSize.width / frameSize.width,
|
|
|
- framePlayerSize.height / frameSize.height);
|
|
|
- aiCanvasSize = Size(frameSize.width * _scale, frameSize.height * _scale);
|
|
|
- print("缩放比 $_scale");
|
|
|
-
|
|
|
- /// 更新交互层尺寸
|
|
|
- update(["ai_result_modifier_interactive_layer"]);
|
|
|
- }
|
|
|
-
|
|
|
@override
|
|
|
void onInit() {
|
|
|
super.onInit();
|
|
|
print("AiResultModifierController init");
|
|
|
- // 获取传递的参数
|
|
|
- final Map<String, String> args = Get.arguments;
|
|
|
- remedicalCode = args["remedicalCode"] ?? "";
|
|
|
- print(args);
|
|
|
+ _updateModifierInteractiveLayerSize();
|
|
|
+ loadAIResult();
|
|
|
}
|
|
|
|
|
|
/// 鼠标拖拽
|
|
@@ -247,6 +235,12 @@ class AiResultModifierController extends GetxController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// 鼠标离开区域
|
|
|
+ void onMouseExit(PointerExitEvent e) async {
|
|
|
+ print('onMouseExit');
|
|
|
+ _canvasAffectedKeyPoints.clear();
|
|
|
+ update(['ai_result_canvas']);
|
|
|
+ }
|
|
|
/// 鼠标悬浮移动
|
|
|
void onMouseHover(PointerHoverEvent e) async {
|
|
|
if (keyPoints.isEmpty) return;
|
|
@@ -257,7 +251,6 @@ class AiResultModifierController extends GetxController {
|
|
|
}, 'onMouseHover', 100);
|
|
|
break;
|
|
|
case AiResultModifierMode.pen:
|
|
|
- print("画笔模式,遍历查找最近的点");
|
|
|
utils.throttle(() {
|
|
|
_onPenModeCallHoverFunction(e.localPosition);
|
|
|
}, 'onMouseHover', 10);
|
|
@@ -294,6 +287,26 @@ class AiResultModifierController extends GetxController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// 更新交互层尺寸
|
|
|
+ void _updateModifierInteractiveLayerSize() {
|
|
|
+ frameSize = Size(currFrame.width.toDouble(), currFrame.height.toDouble());
|
|
|
+ print("图像尺寸 $frameSize");
|
|
|
+ // 在首帧渲染完成后获取容器尺寸
|
|
|
+ WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
+ final RenderBox box =
|
|
|
+ framePlayerKey.currentContext!.findRenderObject() as RenderBox;
|
|
|
+ final framePlayerSize = Size(box.size.width, box.size.height);
|
|
|
+ print("容器尺寸 $framePlayerSize");
|
|
|
+ _scale = min(framePlayerSize.width / frameSize.width,
|
|
|
+ framePlayerSize.height / frameSize.height);
|
|
|
+ aiCanvasSize = Size(frameSize.width * _scale, frameSize.height * _scale);
|
|
|
+ print("缩放比 $_scale");
|
|
|
+
|
|
|
+ /// 更新交互层尺寸
|
|
|
+ update(["ai_result_modifier_interactive_layer"]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
/// 自动吸附闭合判断
|
|
|
void _autoCloseContours() async {
|
|
|
if (_canvasNewContoursPoints.length < 6) return;
|
|
@@ -310,9 +323,7 @@ class AiResultModifierController extends GetxController {
|
|
|
nearestKeyPointIndex = i;
|
|
|
}
|
|
|
}
|
|
|
- print("最小距离 $minDistance");
|
|
|
if (minDistance < 6) {
|
|
|
- print("吸附成功");
|
|
|
_canvasPenModeKeyPointIndexes.add(nearestKeyPointIndex);
|
|
|
_canvasNewContoursPoints.add(canvasContoursPoints[nearestKeyPointIndex]);
|
|
|
_isDrawingNewContours = false;
|
|
@@ -404,7 +415,6 @@ class AiResultModifierController extends GetxController {
|
|
|
),
|
|
|
);
|
|
|
_diagnosisEnumItems = getDiagnosisEnumItems.source ?? [];
|
|
|
- update(['ai_result_panel']);
|
|
|
}
|
|
|
|
|
|
void _initData() {
|
|
@@ -413,7 +423,7 @@ class AiResultModifierController extends GetxController {
|
|
|
|
|
|
/// 在拖拽模式下触发拖拽事件【每隔100ms触发一次】
|
|
|
void _onDragModeCallDragFunction(Offset pos) async {
|
|
|
- print("鼠标拖拽 $_dragStartPoint -> $pos");
|
|
|
+ // print("鼠标拖拽 $_dragStartPoint -> $pos");
|
|
|
AIDiagnosisPoint2D startPoint = AIDiagnosisPoint2D(
|
|
|
x: _dragStartPoint.dx ~/ _scale, y: _dragStartPoint.dy ~/ _scale);
|
|
|
AIDiagnosisPoint2D endPoint =
|
|
@@ -432,7 +442,7 @@ class AiResultModifierController extends GetxController {
|
|
|
final mousePos = AIDiagnosisPoint2D(
|
|
|
x: localPosition.dx ~/ _scale, y: localPosition.dy ~/ _scale);
|
|
|
affectedKeyPointIndexes = await _queryAffectedKeyPoints(mousePos);
|
|
|
- print("影响到的关键点数量:${affectedKeyPointIndexes.length}");
|
|
|
+ // print("影响到的关键点数量:${affectedKeyPointIndexes.length}");
|
|
|
_updateCurrAffectedKeyPoints();
|
|
|
update(["ai_result_canvas"]);
|
|
|
}
|
|
@@ -443,7 +453,7 @@ class AiResultModifierController extends GetxController {
|
|
|
// 点间距【疏密程度】
|
|
|
const double pointDistance = 8;
|
|
|
final double distance = (pos - _canvasNewContoursPoints.last).distance;
|
|
|
- print("当前点到上一个点的距离:$distance");
|
|
|
+ // print("当前点到上一个点的距离:$distance");
|
|
|
if (distance >= pointDistance) {
|
|
|
int numPointsToInsert = (distance / pointDistance).ceil() - 1; // 需要插入的点数
|
|
|
for (int i = 0; i < numPointsToInsert; i++) {
|
|
@@ -459,7 +469,7 @@ class AiResultModifierController extends GetxController {
|
|
|
_canvasNewContoursPoints.add(pos);
|
|
|
update(["ai_result_canvas"]);
|
|
|
}
|
|
|
- print("当前轮廓点数量:${_canvasNewContoursPoints.length}");
|
|
|
+ // print("当前轮廓点数量:${_canvasNewContoursPoints.length}");
|
|
|
_autoCloseContours();
|
|
|
}
|
|
|
|
|
@@ -540,7 +550,7 @@ class AiResultModifierController extends GetxController {
|
|
|
keyPoints = result.dstKeyPoints ?? [];
|
|
|
contours = result.dstContours ?? [];
|
|
|
affectedKeyPointIndexes = result.affectedKeyPointIndexes!;
|
|
|
- print("拖拽结果:${keyPoints.length} ${contours.length}");
|
|
|
+ // print("拖拽结果:${keyPoints.length} ${contours.length}");
|
|
|
return true;
|
|
|
} catch (e) {
|
|
|
print(e);
|
|
@@ -559,19 +569,19 @@ class AiResultModifierController extends GetxController {
|
|
|
keyPoints[i].point!.y.toDouble() * _scale));
|
|
|
}
|
|
|
}
|
|
|
- print("受影响的点数:${_canvasAffectedKeyPoints.length}");
|
|
|
+ // print("受影响的点数:${_canvasAffectedKeyPoints.length}");
|
|
|
}
|
|
|
|
|
|
/// [⭐ _canvasContoursPoints ] 更新当前轮廓点
|
|
|
void _updateCurrContoursPoints() {
|
|
|
_canvasContoursPoints = _convertPoints(contours);
|
|
|
- print("轮廓点数:${_canvasContoursPoints.length}");
|
|
|
+ // print("轮廓点数:${_canvasContoursPoints.length}");
|
|
|
}
|
|
|
|
|
|
/// [⭐ _canvasKeyPoints ] 更新当前关键点
|
|
|
void _updateCurrKeyPoints() async {
|
|
|
_canvasKeyPoints = _convertKeyPoints(keyPoints);
|
|
|
- print("关键点数:${_canvasKeyPoints.length}");
|
|
|
+ // print("关键点数:${_canvasKeyPoints.length}");
|
|
|
}
|
|
|
}
|
|
|
|