FolderQuestionedImageViewer.xaml.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. using AIPlatform.Protocol.Entities;
  2. using AIPlatform.Protocol.Model;
  3. using AIPlatform.Protocol.Utilities;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. using System.Windows.Controls;
  12. using System.Windows.Input;
  13. using System.Windows.Media.Imaging;
  14. using static System.Windows.Forms.AxHost;
  15. namespace aipdev
  16. {
  17. /// <summary>
  18. /// Interaction logic for FolderQuestionedImageViewer.xaml
  19. /// </summary>
  20. public partial class FolderQuestionedImageViewer : Window
  21. {
  22. private long _folderId;
  23. private int _index;
  24. private LabeledUltrasoundFile _labeledUltrasoundFile;
  25. private readonly IList<long> _lstUltrasoundFileId;
  26. private readonly IList<long> _lstLatestLabeledUltrasoundFileId;
  27. private readonly ObservableCollection<LabelConclusion> _conclusions = new ObservableCollection<LabelConclusion>();
  28. private readonly ObservableCollection<ReviewerInfo> _reviewerInfos = new ObservableCollection<ReviewerInfo>();
  29. private readonly ObservableCollection<LabelerItem> _labelerItems = new ObservableCollection<LabelerItem>();
  30. private readonly ObservableCollection<LabeledUltrasoundFileInfoModel> _relabeledInfos = new ObservableCollection<LabeledUltrasoundFileInfoModel>();
  31. private List<LabeledUltrasoundFileInfo> _labeledUltrasoundFileInfos;
  32. public FolderQuestionedImageViewer(long folderId, int index, LabeledUltrasoundFile labeledUltrasoundImage, IList<long> lstFileId, IList<long> lstLabeledFileId)
  33. {
  34. InitializeComponent();
  35. _folderId = folderId;
  36. _index = index;
  37. _labeledUltrasoundFile = labeledUltrasoundImage;
  38. _lstUltrasoundFileId = lstFileId;
  39. _lstLatestLabeledUltrasoundFileId = lstLabeledFileId;
  40. Conclusions.ItemsSource = _conclusions;
  41. LabelerList.ItemsSource = _labelerItems;
  42. ReviewInfoList.ItemsSource = _reviewerInfos;
  43. RelabelInfoList.ItemsSource = _relabeledInfos;
  44. Loaded += OnLoaded;
  45. }
  46. private async Task LoadLabelerAsync()
  47. {
  48. try
  49. {
  50. _labelerItems.Clear();
  51. _labeledUltrasoundFileInfos = new List<LabeledUltrasoundFileInfo>();
  52. LabelerItem labelerItem = null;
  53. _labeledUltrasoundFileInfos = await DeveloperManager.Shared.GetLabeledFileInfosAsync(_folderId, _labeledUltrasoundFile.UltrasoundFileId);
  54. foreach (var item in _labeledUltrasoundFileInfos)
  55. {
  56. var state = item.LabeledUltrasoundFile.DeveloperItem.QuestionedState;
  57. _labelerItems.Add(new LabelerItem
  58. {
  59. Labeler = item.LabeledUltrasoundFile.Labeler,
  60. LabeledUltrasoundFileId = item.LabeledUltrasoundFile.Id,
  61. IsQuestioned = item.HasQuestioned,
  62. IsQuestionedFinished = item.LabeledUltrasoundFile.SourceLabeledUltrasoundFileId > 0,
  63. });
  64. labelerItem = _labelerItems.FirstOrDefault(x => x.LabeledUltrasoundFileId == _labeledUltrasoundFile.Id);
  65. }
  66. LabelerList.SelectedItem = labelerItem;
  67. }
  68. catch (Exception ex)
  69. {
  70. MessageBox.Show(this, $"加载标注人员失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  71. }
  72. }
  73. private void LoadImage()
  74. {
  75. try
  76. {
  77. _conclusions.Clear();
  78. _reviewerInfos.Clear();
  79. _relabeledInfos.Clear();
  80. var fileInfo = _labeledUltrasoundFileInfos.FirstOrDefault(x => x.LabeledUltrasoundFile.Id == _labeledUltrasoundFile.Id);
  81. var reviewerInfos = fileInfo.ReviewerInfos;
  82. var imageData = fileInfo.ImageData;
  83. foreach (var item in fileInfo.LabelConclusions)
  84. {
  85. _conclusions.Add(item);
  86. }
  87. #region 历史结果
  88. if (fileInfo.RelabeledInfos != null && fileInfo.RelabeledInfos.Count > 0)
  89. {
  90. for (int i = 0; i < fileInfo.RelabeledInfos.Count; i++)
  91. {
  92. var item = fileInfo.RelabeledInfos[i];
  93. var devItem = item.LabeledUltrasoundFile.DeveloperItem;
  94. var info = new LabeledUltrasoundFileInfoModel
  95. {
  96. LabeledResultHeader = $"标注结果{i + 1}",
  97. Labeler = item.Labeler,
  98. LabeledUltrasoundFile = item.LabeledUltrasoundFile,
  99. ImageData = item.ImageData,
  100. LabelConclusions = item.LabelConclusions,
  101. ReviewerInfos = item.ReviewerInfos,
  102. HasReviewedResult = item.ReviewerInfos != null,
  103. ReviewedResultHeader = $"审核结果{i + 1}",
  104. HasDeveloperItem = devItem.Id > 0,
  105. DeveloperItemHeader = $"状态{i + 1}",
  106. QuestionedState = "质疑:",
  107. ConfirmedState = "确认:",
  108. };
  109. switch (devItem.QuestionedState)
  110. {
  111. case QuestionedState.None:
  112. info.QuestionedState += "无";
  113. break;
  114. case QuestionedState.PendingAssigned:
  115. info.QuestionedState += "待分配";
  116. break;
  117. case QuestionedState.Assigned:
  118. info.QuestionedState += "已分配";
  119. break;
  120. case QuestionedState.Completed:
  121. info.QuestionedState += "已完成";
  122. break;
  123. default:
  124. break;
  125. }
  126. switch (devItem.ConfirmedState)
  127. {
  128. case ConfirmedState.None:
  129. info.ConfirmedState += "无";
  130. break;
  131. case ConfirmedState.Accepted:
  132. info.ConfirmedState += "接受";
  133. break;
  134. case ConfirmedState.Abandoned:
  135. info.ConfirmedState += "弃用";
  136. break;
  137. default:
  138. break;
  139. }
  140. _relabeledInfos.Add(info);
  141. }
  142. }
  143. #endregion
  144. _labeledUltrasoundFile = fileInfo.LabeledUltrasoundFile;
  145. ImageNameTextBox.Text = $"名称:{_labeledUltrasoundFile.Source.FileName}";
  146. ImageIdTextBox.Text = $"Id:{_labeledUltrasoundFile.Id}";
  147. ImageIndex.Visibility = Visibility.Collapsed;
  148. ImageIndex.Text = string.Empty;
  149. #region 质疑状态 & 确认状态
  150. btnWithdrawalQuestioned.Visibility = Visibility.Collapsed;
  151. btnAccepted.Visibility = Visibility.Collapsed;
  152. btnAbandoned.Visibility = Visibility.Collapsed;
  153. switch (_labeledUltrasoundFile.DeveloperItem.QuestionedState)
  154. {
  155. case QuestionedState.None:
  156. txtQuestionedState.Text = "无";
  157. break;
  158. case QuestionedState.PendingAssigned:
  159. txtQuestionedState.Text = "待分配";
  160. if (_labeledUltrasoundFile.DeveloperItem.Id == DeveloperManager.Shared.Session.AccountId)
  161. {
  162. btnWithdrawalQuestioned.Visibility = Visibility.Visible;
  163. }
  164. break;
  165. case QuestionedState.Assigned:
  166. txtQuestionedState.Text = "已分配";
  167. break;
  168. case QuestionedState.Completed:
  169. txtQuestionedState.Text = "已完成";
  170. if (_labeledUltrasoundFile.SourceLabeledUltrasoundFileId > 0 && _labeledUltrasoundFile.DeveloperItem.Id == DeveloperManager.Shared.Session.AccountId)
  171. {
  172. btnAccepted.Visibility = Visibility.Visible;
  173. btnAbandoned.Visibility = Visibility.Visible;
  174. }
  175. break;
  176. default:
  177. break;
  178. }
  179. switch (_labeledUltrasoundFile.DeveloperItem.ConfirmedState)
  180. {
  181. case ConfirmedState.None:
  182. txtConfirmedState.Text = "无";
  183. if (_labeledUltrasoundFile.SourceLabeledUltrasoundFileId > 0)
  184. {
  185. btnAccepted.Visibility = Visibility.Visible;
  186. btnAbandoned.Visibility = Visibility.Visible;
  187. }
  188. break;
  189. case ConfirmedState.Accepted:
  190. txtConfirmedState.Text = "接受";
  191. if (_labeledUltrasoundFile.SourceLabeledUltrasoundFileId > 0)
  192. {
  193. btnAbandoned.Visibility = Visibility.Visible;
  194. }
  195. break;
  196. case ConfirmedState.Abandoned:
  197. txtConfirmedState.Text = "弃用";
  198. if (_labeledUltrasoundFile.SourceLabeledUltrasoundFileId > 0)
  199. {
  200. btnAccepted.Visibility = Visibility.Visible;
  201. }
  202. break;
  203. default:
  204. break;
  205. }
  206. #endregion
  207. #region imageData
  208. if (imageData != null)
  209. {
  210. var bitmapImage = new BitmapImage();
  211. bitmapImage.BeginInit();
  212. bitmapImage.StreamSource = new MemoryStream(imageData);
  213. bitmapImage.EndInit();
  214. Image.Source = bitmapImage;
  215. }
  216. #endregion
  217. #region reviewedResult
  218. if (reviewerInfos != null && reviewerInfos.Count > 0)
  219. {
  220. foreach (var item in reviewerInfos)
  221. {
  222. _reviewerInfos.Add(new ReviewerInfo
  223. {
  224. Reviewer = item.Reviewer,
  225. IsPassed = item.IsPassed,
  226. Results = item.Results,
  227. });
  228. }
  229. }
  230. #endregion
  231. ReviewInfoGroup.Visibility = _reviewerInfos.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
  232. RelabelInfoGroup.Visibility = _relabeledInfos.Count > 0 ? Visibility.Visible : Visibility.Collapsed;
  233. }
  234. catch (Exception ex)
  235. {
  236. MessageBox.Show(this, $"加载图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  237. }
  238. finally
  239. {
  240. PreviousImage.IsEnabled = _index > 0;
  241. NextImage.IsEnabled = _index < _lstUltrasoundFileId.Count - 1;
  242. }
  243. }
  244. private async void OnLoaded(object sender, RoutedEventArgs e)
  245. {
  246. try
  247. {
  248. Waiting.StartWaiting();
  249. await LoadLabelerAsync();
  250. LoadImage();
  251. }
  252. catch (Exception ex)
  253. {
  254. MessageBox.Show(this, $"加载图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  255. }
  256. finally
  257. {
  258. Waiting.StopWaiting();
  259. }
  260. }
  261. private async void OnPreviousImageClick(object sender, RoutedEventArgs e)
  262. {
  263. try
  264. {
  265. Waiting.StartWaiting();
  266. var index = _lstUltrasoundFileId.IndexOf(_labeledUltrasoundFile.UltrasoundFileId);
  267. _index = index - 1;
  268. var labeledImageId = _lstLatestLabeledUltrasoundFileId[_index];
  269. _labeledUltrasoundFile = await DeveloperManager.Shared.GetLabeledUltrasoundFileAsync(labeledImageId);
  270. await LoadLabelerAsync();
  271. LoadImage();
  272. }
  273. catch (Exception ex)
  274. {
  275. MessageBox.Show(this, $"加载上一张图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  276. }
  277. finally
  278. {
  279. Waiting.StopWaiting();
  280. }
  281. }
  282. private async void OnNextImageClick(object sender, RoutedEventArgs e)
  283. {
  284. try
  285. {
  286. Waiting.StartWaiting();
  287. var index = _lstUltrasoundFileId.IndexOf(_labeledUltrasoundFile.UltrasoundFileId);
  288. _index = index + 1;
  289. var labeledImageId = _lstLatestLabeledUltrasoundFileId[_index];
  290. _labeledUltrasoundFile = await DeveloperManager.Shared.GetLabeledUltrasoundFileAsync(labeledImageId);
  291. await LoadLabelerAsync();
  292. LoadImage();
  293. }
  294. catch (Exception ex)
  295. {
  296. MessageBox.Show(this, $"加载下一张图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  297. }
  298. finally
  299. {
  300. Waiting.StopWaiting();
  301. }
  302. }
  303. private async void OnLabelerMouseLeftButtonDownAsync(object sender, MouseButtonEventArgs e)
  304. {
  305. try
  306. {
  307. if (e.OriginalSource as FrameworkElement == null)
  308. {
  309. return;
  310. }
  311. if (e.OriginalSource as Border == null && e.OriginalSource as TextBlock == null)
  312. {
  313. return;
  314. }
  315. Waiting.StartWaiting();
  316. var labelerItem = (e.OriginalSource as FrameworkElement).DataContext as LabelerItem;
  317. _labeledUltrasoundFile = await DeveloperManager.Shared.GetLabeledUltrasoundFileAsync(labelerItem.LabeledUltrasoundFileId);
  318. LoadImage();
  319. }
  320. catch (Exception ex)
  321. {
  322. Waiting.StopWaiting();
  323. MessageBox.Show(this, $"切换标注人员失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  324. }
  325. finally
  326. {
  327. Waiting.StopWaiting();
  328. }
  329. }
  330. private void OnRelabelResultClick(object sender, RoutedEventArgs e)
  331. {
  332. try
  333. {
  334. Waiting.StartWaiting();
  335. var button = (Button)sender;
  336. var dataContext = button.DataContext;
  337. if (dataContext is LabeledUltrasoundFileInfoModel relabeledInfo)
  338. {
  339. var imageData = relabeledInfo.ImageData;
  340. if (imageData != null)
  341. {
  342. var bitmapImage = new BitmapImage();
  343. bitmapImage.BeginInit();
  344. bitmapImage.StreamSource = new MemoryStream(imageData);
  345. bitmapImage.EndInit();
  346. Image.Source = bitmapImage;
  347. }
  348. foreach (var item in _relabeledInfos)
  349. {
  350. item.IsSelected = false;
  351. if (item == relabeledInfo)
  352. {
  353. item.IsSelected = true;
  354. }
  355. }
  356. }
  357. }
  358. catch (Exception ex)
  359. {
  360. MessageBox.Show(this, $"加载历史图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  361. }
  362. finally
  363. {
  364. Waiting.StopWaiting();
  365. }
  366. }
  367. private async void OnWithdrawalQuestionedFileClick(object sender, RoutedEventArgs e)
  368. {
  369. var result = MessageBox.Show(Application.Current.MainWindow, "确认撤销质疑该标注人员图像吗?", "质疑", MessageBoxButton.YesNo, MessageBoxImage.Question);
  370. if (result == MessageBoxResult.Yes)
  371. {
  372. try
  373. {
  374. Waiting.StartWaiting();
  375. await DeveloperManager.Shared.WithdrawalQuestionedDeveloperFolderFileAsync(_labeledUltrasoundFile.Id, _labeledUltrasoundFile.UltrasoundFileId, _labeledUltrasoundFile.ImageCaseId, _labeledUltrasoundFile.Labeler);
  376. _labeledUltrasoundFile.DeveloperItem.QuestionedState = QuestionedState.None;
  377. txtQuestionedState.Text = "无";
  378. btnWithdrawalQuestioned.Visibility = Visibility.Collapsed;
  379. }
  380. catch (Exception ex)
  381. {
  382. MessageBox.Show(Application.Current.MainWindow, $"撤销质疑图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  383. }
  384. finally
  385. {
  386. Waiting.StopWaiting();
  387. }
  388. }
  389. }
  390. private async void OnAcceptedFileClick(object sender, RoutedEventArgs e)
  391. {
  392. var result = MessageBox.Show(Application.Current.MainWindow, "确认接受该标注人员图像吗?", "质疑", MessageBoxButton.YesNo, MessageBoxImage.Question);
  393. if (result == MessageBoxResult.Yes)
  394. {
  395. try
  396. {
  397. Waiting.StartWaiting();
  398. await DeveloperManager.Shared.UpdateQuestionedDeveloperFolderFileConfirmedStateAsync(_labeledUltrasoundFile.Id, _labeledUltrasoundFile.SourceLabeledUltrasoundFileId, ConfirmedState.Accepted);
  399. _labeledUltrasoundFile.DeveloperItem.ConfirmedState = ConfirmedState.Accepted;
  400. txtConfirmedState.Text = "接受";
  401. btnAccepted.Visibility = Visibility.Collapsed;
  402. btnAbandoned.Visibility = Visibility.Visible;
  403. }
  404. catch (Exception ex)
  405. {
  406. MessageBox.Show(Application.Current.MainWindow, $"接受图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  407. }
  408. finally
  409. {
  410. Waiting.StopWaiting();
  411. }
  412. }
  413. }
  414. private async void OnAbandonedFileClick(object sender, RoutedEventArgs e)
  415. {
  416. var result = MessageBox.Show(Application.Current.MainWindow, "确认弃用该标注人员图像吗?", "质疑", MessageBoxButton.YesNo, MessageBoxImage.Question);
  417. if (result == MessageBoxResult.Yes)
  418. {
  419. try
  420. {
  421. Waiting.StartWaiting();
  422. await DeveloperManager.Shared.UpdateQuestionedDeveloperFolderFileConfirmedStateAsync(_labeledUltrasoundFile.Id, _labeledUltrasoundFile.SourceLabeledUltrasoundFileId, ConfirmedState.Abandoned);
  423. _labeledUltrasoundFile.DeveloperItem.ConfirmedState = ConfirmedState.Abandoned;
  424. txtConfirmedState.Text = "弃用";
  425. btnAccepted.Visibility = Visibility.Visible;
  426. btnAbandoned.Visibility = Visibility.Collapsed;
  427. }
  428. catch (Exception ex)
  429. {
  430. MessageBox.Show(Application.Current.MainWindow, $"弃用图像失败:{ex.Translate()}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  431. }
  432. finally
  433. {
  434. Waiting.StopWaiting();
  435. }
  436. }
  437. }
  438. }
  439. }