shell_calcuator.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import 'dart:convert';
  2. import 'dart:ui';
  3. import 'package:fis_measure/interfaces/date_types/point.dart';
  4. import 'package:fis_measure/interfaces/process/items/measure_terms.dart';
  5. import 'package:fis_measure/process/primitives/carotid_imt.dart';
  6. import 'package:fis_measure/utils/js_utils.dart';
  7. import 'package:vid/us/vid_us_unit.dart';
  8. import 'calculator.dart';
  9. class ShellCal extends Calculator<CarotidIMT, double> {
  10. ShellCal(CarotidIMT ref) : super(ref);
  11. @override
  12. void calculate() {
  13. if (ref.feature == null) return;
  14. final p1 = ref.feature!.startPoint;
  15. final p2 = ref.feature!.endPoint;
  16. //左上顶点
  17. final leftTopPoint =
  18. DPoint(p1.x < p2.x ? p1.x : p2.x, p1.y < p2.y ? p1.y : p2.y);
  19. //右下顶点
  20. final rightBottomPoint =
  21. DPoint(p1.x > p2.x ? p1.x : p2.x, p1.y > p2.y ? p1.y : p2.y);
  22. final outputItem = createOutput(MeasureTerms.Distance, 0.0, VidUsUnit.cm);
  23. //图片尺寸
  24. final imageSize = ref.application.carotid2DSize;
  25. //画布尺寸
  26. final canavsSize = ref.application.displaySize;
  27. //图像缩放比
  28. final imageScale = ref.application.displayScaleRatio;
  29. //标准画布尺寸
  30. final stdCanavsSize =
  31. Size(canavsSize.width / imageScale, canavsSize.height / imageScale);
  32. final imageLeftTopPoint = DPoint(
  33. (stdCanavsSize.width - imageSize.width) / 2,
  34. (stdCanavsSize.height - imageSize.height) / 2);
  35. final imageRightBottomPoint = DPoint(imageLeftTopPoint.x + imageSize.width,
  36. imageLeftTopPoint.y + imageSize.height);
  37. final rectLeftTopPoint = DPoint(stdCanavsSize.width * leftTopPoint.x,
  38. stdCanavsSize.height * leftTopPoint.y);
  39. final rectRightBottomPoint = DPoint(
  40. stdCanavsSize.width * rightBottomPoint.x,
  41. stdCanavsSize.height * rightBottomPoint.y);
  42. /// 在图像外的点改到图像边缘上
  43. if (rectLeftTopPoint.x < imageLeftTopPoint.x) {
  44. rectLeftTopPoint.x = imageLeftTopPoint.x;
  45. }
  46. if (rectLeftTopPoint.x > imageRightBottomPoint.x) {
  47. rectLeftTopPoint.x = imageRightBottomPoint.x;
  48. }
  49. if (rectLeftTopPoint.y < imageLeftTopPoint.y) {
  50. rectLeftTopPoint.y = imageLeftTopPoint.y;
  51. }
  52. if (rectLeftTopPoint.y > imageRightBottomPoint.y) {
  53. rectLeftTopPoint.y = imageRightBottomPoint.y;
  54. }
  55. if (rectRightBottomPoint.x > imageRightBottomPoint.x) {
  56. rectRightBottomPoint.x = imageRightBottomPoint.x;
  57. }
  58. if (rectRightBottomPoint.x < imageLeftTopPoint.x) {
  59. rectRightBottomPoint.x = imageLeftTopPoint.x;
  60. }
  61. if (rectRightBottomPoint.y > imageRightBottomPoint.y) {
  62. rectRightBottomPoint.y = imageRightBottomPoint.y;
  63. }
  64. if (rectRightBottomPoint.y < imageLeftTopPoint.y) {
  65. rectRightBottomPoint.y = imageLeftTopPoint.y;
  66. }
  67. final rectLeft = (rectLeftTopPoint.x - imageLeftTopPoint.x).round();
  68. final rectTop = (rectLeftTopPoint.y - imageLeftTopPoint.y).round();
  69. final rectWidth = (rectRightBottomPoint.x - rectLeftTopPoint.x).round();
  70. final rectHeight = (rectRightBottomPoint.y - rectLeftTopPoint.y).round();
  71. final params =
  72. "{'MeasureItemType':'AntMeasureItem','IntimaRect':{'Left':$rectLeft,'Top':$rectTop,'Width':$rectWidth,'Height':$rectHeight}}";
  73. String description = "IMT\n Measuring";
  74. /// [Carotid] ✅在此处通知 Shell 计算,获取 description,touch/mouse finished 时绘制结果
  75. try {
  76. callShellMethod('getMeasureResult', [params]).callMethod(
  77. 'then',
  78. [
  79. (result) {
  80. // print("getMeasureResult: $result");
  81. final res = jsonDecode(result);
  82. // print("getMeasureResult: $res");
  83. // print("getMeasureResult: ${res['ErrorCode']}");
  84. if (res['ErrorCode'].toString() == "1000") {
  85. description =
  86. "Ant.CCA IMT\n Max: ${res['MaxThickness'].toStringAsFixed(2)}mm\n Min: ${res['MinThickness'].toStringAsFixed(2)}mm\n Avg: ${res['AverageThickness'].toStringAsFixed(2)}mm\n SD: ${res['SdThickness'].toStringAsFixed(2)}mm";
  87. List<Offset> lowerPoints = [];
  88. List<Offset> upperPoints = [];
  89. for (var i = 0; i < res['PointLower'].length; i++) {
  90. final xyStr = res['PointLower'][i].split(',');
  91. lowerPoints.add(Offset(
  92. (double.parse(xyStr[0]) + imageLeftTopPoint.x) * imageScale,
  93. (double.parse(xyStr[1]) + imageLeftTopPoint.y) *
  94. imageScale));
  95. }
  96. for (var i = 0; i < res['PointUpper'].length; i++) {
  97. final xyStr = res['PointUpper'][i].split(',');
  98. upperPoints.add(Offset(
  99. (double.parse(xyStr[0]) + imageLeftTopPoint.x) * imageScale,
  100. (double.parse(xyStr[1]) + imageLeftTopPoint.y) *
  101. imageScale));
  102. }
  103. ref.feature!.offsetsList.add(lowerPoints);
  104. ref.feature!.offsetsList.add(upperPoints);
  105. } else {
  106. description = "Ant.CCA IMT\n Measure failed";
  107. }
  108. outputs.add(outputItem);
  109. outputs.last.updateDescription(description: description);
  110. /// [Carotid] ✅在此处通知canvas 重绘结果
  111. ref.application.updateRenderReady.emit(this, null);
  112. },
  113. ],
  114. );
  115. } catch (e) {
  116. outputs.add(outputItem);
  117. outputs.last
  118. .updateDescription(description: "Ant.CCA IMT\n Measure failed");
  119. print(e);
  120. }
  121. }
  122. }