ai_result.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_measure/index.dart';
  3. import 'package:fis_measure/interfaces/process/player/play_controller.dart';
  4. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  5. import 'package:fis_measure/process/workspace/measure_handler.dart';
  6. import 'package:fis_measure/view/ai_result_modifier/view.dart';
  7. import 'package:fis_measure/view/paint/ai_patint_controller.dart';
  8. import 'package:fis_measure/view/paint/date_structure.dart';
  9. import 'package:fis_measure/view/paint/parts/ai_resul_info.dart';
  10. import 'package:fis_measure/view/paint/parts/feature_analysis.dart';
  11. import 'package:flutter/material.dart';
  12. import 'package:get/get.dart';
  13. import 'package:vid/us/vid_us_image.dart';
  14. class AIResultPanel extends StatefulWidget {
  15. final List<AIDetectedObject> aiDetectedObject;
  16. /// ai部位
  17. final DiagnosisOrganEnum diagnosisOrgan;
  18. const AIResultPanel(
  19. this.aiDetectedObject,
  20. this.diagnosisOrgan, {
  21. Key? key,
  22. }) : super(key: key);
  23. @override
  24. State<AIResultPanel> createState() => _AIResultPanelState();
  25. }
  26. class _AIResultPanelState extends State<AIResultPanel> {
  27. late AIDetectedObject aiDetectedObjectItem;
  28. final aiPatintController = Get.find<AiPatintController>();
  29. MeasureDataController get measureData => Get.find<MeasureDataController>();
  30. VidPlayerController get playerController =>
  31. Get.find<IPlayerController>() as VidPlayerController;
  32. String get remedicalCode => measureData.measureImageData.remedicalCode ?? "";
  33. int get currFrameIndex => playerController.currentFrameIndex;
  34. VidUsImage get currFrame => playerController.currentFrame!;
  35. @override
  36. Widget build(BuildContext context) {
  37. return Row(
  38. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  39. children: [
  40. Expanded(child: Container()),
  41. SizedBox(
  42. /// TODO:[Gavin] 多语言-UI-整合
  43. width: i18nBook.isCurrentChinese ? 210 : 270,
  44. child: Column(
  45. crossAxisAlignment: CrossAxisAlignment.start,
  46. children: [
  47. if (widget.aiDetectedObject.length > 1)
  48. Container(
  49. child: Wrap(
  50. spacing: 2.0, // 主轴(水平)方向间距
  51. runSpacing: 2.0, // 纵轴(垂直)方向间距
  52. direction: Axis.horizontal,
  53. alignment: WrapAlignment.start,
  54. children: List<Widget>.generate(
  55. widget.aiDetectedObject.length,
  56. (index) {
  57. return GestureDetector(
  58. onTap: () {
  59. aiPatintController.state.aiResultIndex = index;
  60. },
  61. child: Obx(
  62. () => Container(
  63. decoration: BoxDecoration(
  64. color: aiPatintController.state.aiResultIndex ==
  65. index
  66. ? const Color.fromRGBO(54, 169, 206, 1)
  67. : Colors.grey,
  68. ),
  69. width: 38,
  70. height: 35,
  71. child: Center(
  72. child: Text(
  73. '${index + 1}',
  74. style: const TextStyle(
  75. color: Colors.white,
  76. ),
  77. ),
  78. ),
  79. ),
  80. ),
  81. );
  82. },
  83. ),
  84. ),
  85. color: Colors.transparent,
  86. ),
  87. const SizedBox(
  88. height: 10,
  89. ),
  90. Obx(() {
  91. try {
  92. aiDetectedObjectItem = widget
  93. .aiDetectedObject[aiPatintController.state.aiResultIndex];
  94. if (aiDetectedObjectItem.label != 0) {
  95. return Column(
  96. children: [
  97. ResultInfo(
  98. widget.aiDetectedObject,
  99. ),
  100. const SizedBox(
  101. height: 10,
  102. ),
  103. aiDetectedObjectItem.descriptions?.isNotEmpty ?? false
  104. ? FeatureAnalysis(
  105. aiDetectedObjectItem.descriptions,
  106. )
  107. : const SizedBox(),
  108. const SizedBox(
  109. height: 10,
  110. ),
  111. if (aiDetectedObjectItem.descriptions?.isNotEmpty ??
  112. false)
  113. InkWell(
  114. onTap: () {
  115. Get.dialog(
  116. AiResultModifierDialog(
  117. remedicalCode: remedicalCode,
  118. currFrameIndex: currFrameIndex,
  119. currFrame: currFrame,
  120. ),
  121. );
  122. },
  123. child: const Text(
  124. "编辑AI结果",
  125. style: TextStyle(
  126. color: Colors.white,
  127. decoration: TextDecoration.underline,
  128. ),
  129. ),
  130. ),
  131. ],
  132. );
  133. } else {
  134. return const SizedBox();
  135. }
  136. } catch (e) {
  137. return const SizedBox();
  138. }
  139. })
  140. ],
  141. ),
  142. ),
  143. ],
  144. );
  145. }
  146. }