Browse Source

update(webview): 完成初始化时模型尺寸的计算

gavin.chen 2 years ago
parent
commit
887ed87000
2 changed files with 56 additions and 27 deletions
  1. 54 25
      lib/view/3d_view/measure_3d_view.dart
  2. 2 2
      lib/view/measure/measure_view.dart

+ 54 - 25
lib/view/3d_view/measure_3d_view.dart

@@ -2,10 +2,12 @@ import 'dart:async';
 import 'dart:convert';
 import 'dart:html' hide VoidCallback;
 import 'dart:math';
-
+import 'dart:ui' as ui;
+import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
 import 'package:fis_ui/index.dart';
 import 'package:flutter/material.dart' hide Image;
 import 'package:flutter/services.dart';
+import 'package:get/get.dart';
 import 'package:webviewx/webviewx.dart';
 
 /// [Carotid] webview下 initPage 方法需要 i18n 由 dart 触发
@@ -23,6 +25,8 @@ class Measure3DView extends StatefulWidget implements FWidget {
 
 class _Measure3DViewState extends State<Measure3DView> {
   late WebViewXController webviewController;
+  final measure3DViewController = Get.find<Measure3DViewController>();
+
   final executeJsErrorMessage = '脚本执行失败,请检查代码是否正确嵌入';
   Size get screenSize => MediaQuery.of(context).size;
   String documentFromAsset = "<h2> Hello webviewX ! <h2>";
@@ -222,38 +226,63 @@ class _Measure3DViewState extends State<Measure3DView> {
     ];
   }
 
+  ///初始化 mesh
   Future<void> _setSurface() async {
-    try {
-      await webviewController
-          .callJsMethod('setSurface', [759, 596, 397, "../3DWeb/FaceImage"]);
-    } catch (e) {
-      debugPrint(executeJsErrorMessage);
+    /// [Carotid] ✅长宽高可以由两张小图计算得到
+    final faceImages = measure3DViewController.carotidResult.surfaceImageList;
+    if (faceImages!.length == 6) {
+      final first = await loadImageSize(faceImages[0]);
+      final last = await loadImageSize(faceImages[5]);
+      final width = (last.width - 1).toInt();
+      final height = (last.height - 1).toInt();
+      final depth = (first.height - 1).toInt();
+      try {
+        await webviewController.callJsMethod(
+            'changeSurface', [width, height, depth, ...faceImages]);
+      } catch (e) {
+        debugPrint(executeJsErrorMessage);
+      }
     }
   }
 
   Future<void> _changeSurface() async {
-    /// [Carotid] faceImage 由 webviewController 提供
-    /// 长宽高可以 shell 计算
-    final faceImages = [
-      _loadRandomImage(100, 100),
-      _loadRandomImage(100, 100),
-      _loadRandomImage(100, 100),
-      _loadRandomImage(100, 100),
-      _loadRandomImage(100, 100),
-      _loadRandomImage(100, 100),
-    ];
-    // final faceList = faceImages.map((image) {
-    //   return "data:image/jpeg;base64," + image;
-    // }).toList();
-    // print([759, 596, 397, ...faceImages]);
-    try {
-      await webviewController
-          .callJsMethod('changeSurface', [759, 596, 397, ...faceImages]);
-    } catch (e) {
-      debugPrint(executeJsErrorMessage);
+    /// [Carotid] faceImage 由 measure3DViewController 提供
+    final faceImages = measure3DViewController.carotidResult.surfaceImageList;
+    if (faceImages!.length == 6) {
+      final first = await loadImageSize(faceImages[0]);
+      final last = await loadImageSize(faceImages[5]);
+      final width = (last.width - 1).toInt();
+      final height = (last.height - 1).toInt();
+      final depth = (first.height - 1).toInt();
+      try {
+        await webviewController.callJsMethod(
+            'changeSurface', [width, height, depth, ...faceImages]);
+      } catch (e) {
+        debugPrint(executeJsErrorMessage);
+      }
     }
   }
 
+  Future<Size> loadImageSize(String url) async {
+    ui.Image image = await getImage(url);
+    final width = image.width;
+    final height = image.height;
+    image.dispose();
+    return Size(width.toDouble(), height.toDouble());
+  }
+
+  Future<ui.Image> getImage(String path) async {
+    var completer = Completer<ImageInfo>();
+    var img = NetworkImage(path);
+    img
+        .resolve(const ImageConfiguration())
+        .addListener(ImageStreamListener((info, _) {
+      completer.complete(info);
+    }));
+    ImageInfo imageInfo = await completer.future;
+    return imageInfo.image;
+  }
+
   Future<void> _mdlFileLoaded() async {
     try {
       await webviewController

+ 2 - 2
lib/view/measure/measure_view.dart

@@ -107,10 +107,10 @@ class _MeasureMainPageState extends State<MeasureMainPage> {
         measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
 
         if (remedicalInfo.carotidResult != null) {
-          /// [Carotid] 详情传入测量信息
+          /// [Carotid] 详情传入测量信息
           measure3DViewController.carotidResult = remedicalInfo.carotidResult!;
 
-          /// [Carotid] 需要在此通知 controller 存在颈动脉信息
+          /// [Carotid] 需要在此通知 controller 存在颈动脉信息
           print(
               " 此图像颈动脉信息为:${measure3DViewController.carotidResult.toJson().toString()}");
           measure3DViewController.exist3DData = true;