CaseImageView.xaml.cs 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. using System;
  2. using System.Collections.Specialized;
  3. using System.Runtime.InteropServices;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Input;
  7. using System.Windows.Media;
  8. using System.Windows.Shapes;
  9. namespace AIPractice.Labeller
  10. {
  11. /// <summary>
  12. /// Interaction logic for ImgCanvas.xaml
  13. /// </summary>
  14. public partial class CaseImageView : UserControl
  15. {
  16. private readonly Path _rulerPath;
  17. private readonly Grid _measuredValue;
  18. private readonly TextBlock _measuredValueText;
  19. private CaseImageViewModel _caseImageViewModel;
  20. private RoiViewModel _activeRoiViewModel;
  21. private double _currentScale = 1.0d;
  22. //private bool _isMeasuring;
  23. private bool _isDrawingRoi;
  24. //private Point _measureStartPoint;
  25. private Point _roiCurrentPosition;
  26. private Point _movingStartPosition;
  27. private Point _emptyPosition = new Point(0, 0);
  28. private TouchDevice _currentTouchDevice;
  29. public CaseImageView()
  30. {
  31. InitializeComponent();
  32. _rulerPath = new Path
  33. {
  34. Stroke = Brushes.Lime,
  35. StrokeThickness = 2
  36. };
  37. _measuredValueText = new TextBlock()
  38. {
  39. Foreground = Brushes.Lime,
  40. FontSize = 16,
  41. VerticalAlignment = VerticalAlignment.Center,
  42. HorizontalAlignment = HorizontalAlignment.Center,
  43. Margin = new Thickness(4,2,4,2),
  44. };
  45. _measuredValue = new Grid()
  46. {
  47. MinWidth = 48,
  48. };
  49. _measuredValue.Children.Add(new Border()
  50. {
  51. CornerRadius = new CornerRadius(4),
  52. BorderBrush = Brushes.DarkGray,
  53. BorderThickness = new Thickness(1),
  54. Background = Brushes.DarkGray,
  55. Opacity = 0.5,
  56. });
  57. _measuredValue.Children.Add(_measuredValueText);
  58. DataContextChanged += OnDataContextChanged;
  59. ControlGrid.SizeChanged += OnControlGridSizeChanged;
  60. ImageGrid.SizeChanged += OnRoiCanvasSizeChanged;
  61. ImageGrid.MouseLeftButtonDown += OnMouseLeftButtonDown;
  62. ImageGrid.MouseMove += OnMouseMove;
  63. ImageGrid.MouseLeftButtonUp += OnMouseLeftButtonUp;
  64. ImageGrid.TouchDown += OnTouchDown;
  65. ImageGrid.TouchMove += OnTouchMove;
  66. ImageGrid.TouchUp += OnTouchUp;
  67. ImageGrid.TouchLeave += OnTouchLeave;
  68. }
  69. private void OnTouchLeave(object sender, TouchEventArgs e)
  70. {
  71. e.Handled = true;
  72. if (_isDrawingRoi)
  73. {
  74. if (_caseImageViewModel.ActiveRoi != null)
  75. {
  76. _caseImageViewModel.ActiveRoi.IsPasued = true;
  77. if (_caseImageViewModel.ActiveRoi.ModifingStart)
  78. {
  79. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.StartPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.StartPoint.Y * _caseImageViewModel.Transform.ScaleY);
  80. }
  81. else
  82. {
  83. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.LastPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.LastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  84. }
  85. }
  86. }
  87. _currentTouchDevice = null;
  88. _movingStartPosition = _emptyPosition;
  89. }
  90. private void OnTouchDown(object sender, TouchEventArgs e)
  91. {
  92. e.Handled = true;
  93. var touchPoint = e.GetTouchPoint(ImageGrid);
  94. var position = touchPoint.Position;
  95. //DebugDownText.Text = $"Down Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}]";
  96. if (_currentTouchDevice == null)
  97. {
  98. _currentTouchDevice = e.TouchDevice;
  99. }
  100. if (_currentTouchDevice == e.TouchDevice)
  101. {
  102. if (_caseImageViewModel != null)
  103. {
  104. if (_caseImageViewModel.ActiveRoi == null)
  105. {
  106. var id = Guid.NewGuid().ToString("N").ToUpper();
  107. var roiViewModel = new RoiViewModel(id, _caseImageViewModel.Transform) { ModifingStart = true };
  108. if (_caseImageViewModel.Image != null)
  109. {
  110. roiViewModel.ParentWidth = _caseImageViewModel.Image.PixelWidth;
  111. roiViewModel.ParentHeight = _caseImageViewModel.Image.PixelHeight;
  112. }
  113. using (roiViewModel.CreateUpdateTranscation())
  114. {
  115. var startPoint = new Point();
  116. startPoint.X = position.X / _caseImageViewModel.Transform.ScaleX;
  117. startPoint.Y = position.Y / _caseImageViewModel.Transform.ScaleY;
  118. roiViewModel.Points.Add(startPoint);
  119. _caseImageViewModel.AddRoi(roiViewModel);
  120. }
  121. roiViewModel.IsEditing = true;
  122. _roiCurrentPosition = position;
  123. _isDrawingRoi = true;
  124. }
  125. else
  126. {
  127. if (_caseImageViewModel.ActiveRoi.IsEditing)
  128. {
  129. _caseImageViewModel.ActiveRoi.IsPasued = false;
  130. //DebugDownText.Text = $"Down Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] MoveStart:[{_movingStartPosition}]";
  131. }
  132. }
  133. }
  134. _movingStartPosition = position;
  135. }
  136. }
  137. private void OnTouchMove(object sender, TouchEventArgs e)
  138. {
  139. e.Handled = true;
  140. var touchPoint = e.GetTouchPoint(ImageGrid);
  141. //DebugMoveText.Text = $"Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] {Environment.NewLine} CurrentDeviceId:{_currentTouchDevice.Id} {Environment.NewLine} IsDrawingRoi:{_isDrawingRoi} {Environment.NewLine} RoiCurrentPosition:{_roiCurrentPosition} {Environment.NewLine} MovingStartPosition:{_movingStartPosition}";
  142. if (_currentTouchDevice == null)
  143. {
  144. _currentTouchDevice = e.TouchDevice;
  145. }
  146. if (e.TouchDevice == _currentTouchDevice)
  147. {
  148. if (_isDrawingRoi && _movingStartPosition != _emptyPosition)
  149. {
  150. if (_caseImageViewModel.ActiveRoi != null)
  151. {
  152. var currentTouchPosition = touchPoint.Position;
  153. var offset = currentTouchPosition - _movingStartPosition;
  154. var roiPosition = new Point(_roiCurrentPosition.X + offset.X, _roiCurrentPosition.Y + offset.Y);
  155. if (roiPosition.X > ImageGrid.ActualWidth)
  156. {
  157. roiPosition.X = ImageGrid.ActualWidth;
  158. }
  159. if (roiPosition.Y > ImageGrid.ActualHeight)
  160. {
  161. roiPosition.Y = ImageGrid.ActualHeight;
  162. }
  163. if (roiPosition.X < 0)
  164. {
  165. roiPosition.X = 0;
  166. }
  167. if (roiPosition.Y < 0)
  168. {
  169. roiPosition.Y = 0;
  170. }
  171. var roiPoint = new Point(roiPosition.X / _caseImageViewModel.Transform.ScaleX, roiPosition.Y / _caseImageViewModel.Transform.ScaleY);
  172. if (_caseImageViewModel.ActiveRoi.ModifingStart)
  173. {
  174. _caseImageViewModel.ActiveRoi.StartPoint = roiPoint;
  175. //DebugMoveText.Text = $"Move Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] OffSet:[{offset}] StartPoint:[{roiPoint}] IsDrawing:{_isDrawingRoi}";
  176. }
  177. else
  178. {
  179. var lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  180. var currentStoreRoiPoint = new System.Drawing.Point((int)roiPoint.X, (int)roiPoint.Y);
  181. var lastStoreRoiPoint = new System.Drawing.Point((int)lastPoint.X, (int)lastPoint.Y);
  182. if (_caseImageViewModel.ActiveRoi.Points.Count == 1 || currentStoreRoiPoint != lastStoreRoiPoint)
  183. {
  184. _caseImageViewModel.ActiveRoi.Points.Add(roiPoint);
  185. }
  186. var roiRect = _caseImageViewModel.ActiveRoi.RoiRect;
  187. if (!_caseImageViewModel.ActiveRoi.IsPasued)
  188. {
  189. if (roiRect.Width > 8 && roiRect.Height > 8 && _caseImageViewModel.ActiveRoi.Points.Count > 8)
  190. {
  191. var startPoint = _caseImageViewModel.ActiveRoi.StartPoint;
  192. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  193. var startPixelPoint = new Point(startPoint.X * _caseImageViewModel.Transform.ScaleX, startPoint.Y * _caseImageViewModel.Transform.ScaleY);
  194. var lastPixelPoint = new Point(lastPoint.X * _caseImageViewModel.Transform.ScaleX, lastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  195. var vector = lastPixelPoint - startPixelPoint;
  196. if (vector.Length < 8)
  197. {
  198. _caseImageViewModel.ActiveRoi.Points.Add(startPoint);
  199. _caseImageViewModel.ActiveRoi.IsPasued = true;
  200. _isDrawingRoi = false;
  201. }
  202. }
  203. }
  204. }
  205. }
  206. }
  207. }
  208. }
  209. private void OnTouchUp(object sender, TouchEventArgs e)
  210. {
  211. e.Handled = true;
  212. if (_isDrawingRoi)
  213. {
  214. if (_caseImageViewModel.ActiveRoi != null)
  215. {
  216. _caseImageViewModel.ActiveRoi.IsPasued = true;
  217. if (_caseImageViewModel.ActiveRoi.ModifingStart)
  218. {
  219. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.StartPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.StartPoint.Y * _caseImageViewModel.Transform.ScaleY);
  220. }
  221. else
  222. {
  223. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.LastPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.LastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  224. }
  225. }
  226. }
  227. if(e.TouchDevice == _currentTouchDevice)
  228. {
  229. _currentTouchDevice = null;
  230. }
  231. _movingStartPosition = _emptyPosition;
  232. //DebugDownText.Text = string.Empty;
  233. //DebugMoveText.Text = string.Empty;
  234. }
  235. private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  236. {
  237. e.Handled = true;
  238. var position = e.GetPosition(ImageGrid);
  239. if (_caseImageViewModel != null)
  240. {
  241. if (_caseImageViewModel.ActiveRoi == null)
  242. {
  243. var id = Guid.NewGuid().ToString("N").ToUpper();
  244. var roiViewModel = new RoiViewModel(id, _caseImageViewModel.Transform) { ModifingStart = true };
  245. if (_caseImageViewModel.Image != null)
  246. {
  247. roiViewModel.ParentWidth = _caseImageViewModel.Image.Width;
  248. roiViewModel.ParentHeight = _caseImageViewModel.Image.Height;
  249. }
  250. using (roiViewModel.CreateUpdateTranscation())
  251. {
  252. var startPoint = new Point();
  253. startPoint.X = position.X / _caseImageViewModel.Transform.ScaleX;
  254. startPoint.Y = position.Y / _caseImageViewModel.Transform.ScaleY;
  255. roiViewModel.Points.Add(startPoint);
  256. _caseImageViewModel.AddRoi(roiViewModel);
  257. //DebugDownText.Text = $"Down Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] StartPoint:[{startPoint} Transform:[{_caseImageViewModel.Transform.ScaleX}]";
  258. }
  259. roiViewModel.IsEditing = true;
  260. _roiCurrentPosition = position;
  261. _isDrawingRoi = true;
  262. }
  263. else
  264. {
  265. if (_caseImageViewModel.ActiveRoi.IsEditing)
  266. {
  267. _caseImageViewModel.ActiveRoi.IsPasued = false;
  268. //DebugDownText.Text = $"Down Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] MoveStart:[{_movingStartPosition}]";
  269. }
  270. }
  271. }
  272. _movingStartPosition = position;
  273. }
  274. private void OnMouseMove(object sender, MouseEventArgs e)
  275. {
  276. e.Handled = true;
  277. if (_isDrawingRoi && _movingStartPosition != _emptyPosition)
  278. {
  279. if (_caseImageViewModel.ActiveRoi != null)
  280. {
  281. var currentTouchPosition = e.GetPosition(ImageGrid);
  282. var offset = currentTouchPosition - _movingStartPosition;
  283. var roiPosition = new Point(_roiCurrentPosition.X + offset.X, _roiCurrentPosition.Y + offset.Y);
  284. if(roiPosition.X > ImageGrid.ActualWidth)
  285. {
  286. roiPosition.X = ImageGrid.ActualWidth;
  287. }
  288. if (roiPosition.Y > ImageGrid.ActualHeight)
  289. {
  290. roiPosition.Y = ImageGrid.ActualHeight;
  291. }
  292. if (roiPosition.X < 0 || double.IsNaN(roiPosition.X))
  293. {
  294. roiPosition.X = 0;
  295. }
  296. if(roiPosition.Y < 0 || double.IsNaN(roiPosition.Y))
  297. {
  298. roiPosition.Y = 0;
  299. }
  300. var roiPoint = new Point(roiPosition.X / _caseImageViewModel.Transform.ScaleX, roiPosition.Y / _caseImageViewModel.Transform.ScaleY);
  301. if (_caseImageViewModel.ActiveRoi.ModifingStart)
  302. {
  303. _caseImageViewModel.ActiveRoi.StartPoint = roiPoint;
  304. //DebugMoveText.Text = $"Move Device:{touchPoint.TouchDevice.Id} Position:[{touchPoint.Position}] OffSet:[{offset}] StartPoint:[{roiPoint}] IsDrawing:{_isDrawingRoi}";
  305. }
  306. else
  307. {
  308. var lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  309. var currentStoreRoiPoint = new System.Drawing.Point((int)roiPoint.X, (int)roiPoint.Y);
  310. var lastStoreRoiPoint = new System.Drawing.Point((int)lastPoint.X, (int)lastPoint.Y);
  311. if (_caseImageViewModel.ActiveRoi.Points.Count == 1 || currentStoreRoiPoint != lastStoreRoiPoint)
  312. {
  313. _caseImageViewModel.ActiveRoi.Points.Add(roiPoint);
  314. }
  315. var roiRect = _caseImageViewModel.ActiveRoi.RoiRect;
  316. if (!_caseImageViewModel.ActiveRoi.IsPasued)
  317. {
  318. if (roiRect.Width > 8 && roiRect.Height > 8 && _caseImageViewModel.ActiveRoi.Points.Count > 8)
  319. {
  320. var startPoint = _caseImageViewModel.ActiveRoi.StartPoint;
  321. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  322. var startPixelPoint = new Point(startPoint.X * _caseImageViewModel.Transform.ScaleX, startPoint.Y * _caseImageViewModel.Transform.ScaleY);
  323. var lastPixelPoint = new Point(lastPoint.X * _caseImageViewModel.Transform.ScaleX, lastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  324. var vector = lastPixelPoint - startPixelPoint;
  325. if (vector.Length < 8)
  326. {
  327. _caseImageViewModel.ActiveRoi.Points.Add(startPoint);
  328. _caseImageViewModel.ActiveRoi.IsPasued = true;
  329. _isDrawingRoi = false;
  330. }
  331. }
  332. }
  333. }
  334. }
  335. }
  336. }
  337. private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  338. {
  339. e.Handled = true;
  340. if (_isDrawingRoi)
  341. {
  342. if (_caseImageViewModel.ActiveRoi != null)
  343. {
  344. _caseImageViewModel.ActiveRoi.IsPasued = true;
  345. if (_caseImageViewModel.ActiveRoi.ModifingStart)
  346. {
  347. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.StartPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.StartPoint.Y * _caseImageViewModel.Transform.ScaleY);
  348. }
  349. else
  350. {
  351. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.LastPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.LastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  352. }
  353. }
  354. }
  355. _movingStartPosition = _emptyPosition;
  356. //DebugDownText.Text = string.Empty;
  357. //DebugMoveText.Text = string.Empty;
  358. }
  359. private void OnControlGridSizeChanged(object sender, SizeChangedEventArgs e)
  360. {
  361. ImageGrid.Width = double.NaN;
  362. ImageGrid.Height = double.NaN;
  363. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  364. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  365. UpdateRoiTransform();
  366. }
  367. private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
  368. {
  369. if (_caseImageViewModel != null)
  370. {
  371. _caseImageViewModel.ImageChanged -= OnImageChanged;
  372. _caseImageViewModel.Rois.CollectionChanged -= OnRoisCollectionChanged;
  373. _caseImageViewModel.ActiveRoiChanged -= OnActiveRoiChanged;
  374. }
  375. _caseImageViewModel = e.NewValue as CaseImageViewModel;
  376. if (_caseImageViewModel != null)
  377. {
  378. _caseImageViewModel.ImageChanged += OnImageChanged;
  379. _caseImageViewModel.Rois.CollectionChanged += OnRoisCollectionChanged;
  380. _caseImageViewModel.ActiveRoiChanged += OnActiveRoiChanged;
  381. }
  382. }
  383. private void OnActiveRoiChanged(object sender, EventArgs e)
  384. {
  385. if(_activeRoiViewModel != null)
  386. {
  387. _activeRoiViewModel.IsPasuedChanged -= OnActiveRoiIsPasuedChanged;
  388. }
  389. UndoRoi.Visibility = Visibility.Collapsed;
  390. _activeRoiViewModel = _caseImageViewModel.ActiveRoi;
  391. if (_activeRoiViewModel != null)
  392. {
  393. //MeasureSwitch.IsChecked = false;
  394. _activeRoiViewModel.IsPasuedChanged += OnActiveRoiIsPasuedChanged;
  395. OnActiveRoiIsPasuedChanged(_activeRoiViewModel, EventArgs.Empty);
  396. TouchFinish.Visibility = Visibility.Visible;
  397. TouchDelete.Visibility = Visibility.Visible;
  398. _roiCurrentPosition = new Point(_caseImageViewModel.ActiveRoi.LastPoint.X * _caseImageViewModel.Transform.ScaleX, _caseImageViewModel.ActiveRoi.LastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  399. }
  400. else
  401. {
  402. TouchFinish.Visibility = Visibility.Collapsed;
  403. TouchDelete.Visibility = Visibility.Collapsed;
  404. }
  405. }
  406. private void OnActiveRoiIsPasuedChanged(object sender, EventArgs e)
  407. {
  408. if(_activeRoiViewModel.IsEditing && !_activeRoiViewModel.IsPasued)
  409. {
  410. //_isDrawingRoi = true;
  411. }
  412. if(_activeRoiViewModel.IsPasued && _activeRoiViewModel.Points.Count > 1)
  413. {
  414. UndoRoi.Visibility = Visibility.Visible;
  415. }
  416. else
  417. {
  418. UndoRoi.Visibility = Visibility.Collapsed;
  419. }
  420. }
  421. private void OnRoisCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  422. {
  423. if (e.Action == NotifyCollectionChangedAction.Reset)
  424. {
  425. RoiCanvas.Children.Clear();
  426. }
  427. if (e.OldItems != null)
  428. {
  429. foreach (var oldItem in e.OldItems)
  430. {
  431. RoiView roiViewToRemove = null;
  432. foreach (var child in RoiCanvas.Children)
  433. {
  434. if (child is RoiView roiView)
  435. {
  436. if (roiView.DataContext == oldItem)
  437. {
  438. roiViewToRemove = roiView;
  439. }
  440. }
  441. }
  442. if (roiViewToRemove != null)
  443. {
  444. RoiCanvas.Children.Remove(roiViewToRemove);
  445. }
  446. }
  447. }
  448. if (e.NewItems != null)
  449. {
  450. foreach (var newItem in e.NewItems)
  451. {
  452. if (newItem is RoiViewModel roiViewModel)
  453. {
  454. var roiView = new RoiView();
  455. roiView.DataContext = newItem;
  456. RoiCanvas.Children.Add(roiView);
  457. }
  458. }
  459. }
  460. }
  461. private void OnImageChanged(object sender, EventArgs e)
  462. {
  463. if (_caseImageViewModel != null)
  464. {
  465. if (_caseImageViewModel.Image != null)
  466. {
  467. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  468. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  469. ImageGrid.Width = double.NaN;
  470. ImageGrid.Height = double.NaN;
  471. UpdateRoiTransform();
  472. }
  473. if (_caseImageViewModel.CaseImage is ImportedCaseImage)
  474. {
  475. ImageGrid.IsEnabled = false;
  476. }
  477. else
  478. {
  479. ImageGrid.IsEnabled = true;
  480. }
  481. }
  482. }
  483. private void OnRoiCanvasSizeChanged(object sender, SizeChangedEventArgs e)
  484. {
  485. UpdateRoiTransform();
  486. }
  487. private void UpdateRoiTransform()
  488. {
  489. if (_caseImageViewModel != null)
  490. {
  491. if (_caseImageViewModel.Image != null)
  492. {
  493. var imageWidth = _caseImageViewModel.Image.PixelWidth;
  494. var imageHeight = _caseImageViewModel.Image.PixelHeight;
  495. var canvasWidth = RoiCanvas.ActualWidth;
  496. var canvasHeight = RoiCanvas.ActualHeight;
  497. var scaleX = canvasWidth / imageWidth;
  498. var scaleY = canvasHeight / imageHeight;
  499. var newTransform = new ScaleTransform(scaleX, scaleY, 0, 0);
  500. if (_caseImageViewModel.Transform != null)
  501. {
  502. var roiCurrentPoint = new Point(_roiCurrentPosition.X / _caseImageViewModel.Transform.ScaleX, _roiCurrentPosition.Y / _caseImageViewModel.Transform.ScaleY);
  503. var movingStartPoint = new Point(_movingStartPosition.X / _caseImageViewModel.Transform.ScaleX, _movingStartPosition.Y / _caseImageViewModel.Transform.ScaleY);
  504. _roiCurrentPosition.X = roiCurrentPoint.X * newTransform.ScaleX;
  505. _roiCurrentPosition.Y = roiCurrentPoint.Y * newTransform.ScaleY;
  506. _movingStartPosition.X = movingStartPoint.X * newTransform.ScaleX;
  507. _movingStartPosition.Y = movingStartPoint.Y * newTransform.ScaleY;
  508. }
  509. _caseImageViewModel.Transform = newTransform;
  510. _currentScale = imageWidth < imageHeight ? scaleX : scaleY;
  511. CurrentScale.Text = $"缩放:{(int)(_currentScale * 100)}%";
  512. }
  513. }
  514. }
  515. //private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  516. //{
  517. // if (_isMeasuring)
  518. // {
  519. // _rulerPath.Data = null;
  520. // _rulerPath.InvalidateVisual();
  521. // _measuredValueText.Text = "0 px";
  522. // _measureStartPoint = e.GetPosition(ImageGrid);
  523. // if (!RoiCanvas.Children.Contains(_rulerPath))
  524. // {
  525. // RoiCanvas.Children.Add(_rulerPath);
  526. // }
  527. // if (!RoiCanvas.Children.Contains(_measuredValue))
  528. // {
  529. // RoiCanvas.Children.Add(_measuredValue);
  530. // }
  531. // }
  532. // else
  533. // {
  534. // if (_caseImageViewModel != null)
  535. // {
  536. // _isDrawingRoi = true;
  537. // var id = Guid.NewGuid().ToString("N").ToUpper();
  538. // var position = e.GetPosition(ImageGrid);
  539. // var roiViewModel = new RoiViewModel(id, _caseImageViewModel.Transform);
  540. // if (_caseImageViewModel.Image != null)
  541. // {
  542. // roiViewModel.ParentWidth = _caseImageViewModel.Image.Width;
  543. // roiViewModel.ParentHeight = _caseImageViewModel.Image.Height;
  544. // }
  545. // using (roiViewModel.CreateUpdateTranscation())
  546. // {
  547. // var startPoint = new Point();
  548. // startPoint.X = position.X / _caseImageViewModel.Transform.ScaleX;
  549. // startPoint.Y = position.Y / _caseImageViewModel.Transform.ScaleY;
  550. // roiViewModel.Points.Add(startPoint);
  551. // _caseImageViewModel.AddRoi(roiViewModel);
  552. // }
  553. // roiViewModel.IsEditing = true;
  554. // }
  555. // }
  556. //}
  557. //private void OnMouseMove(object sender, MouseEventArgs e)
  558. //{
  559. // if (_isMeasuring)
  560. // {
  561. // var currentPoint = e.GetPosition(ImageGrid);
  562. // var line = new LineGeometry
  563. // {
  564. // StartPoint = _measureStartPoint,
  565. // EndPoint = currentPoint
  566. // };
  567. // _rulerPath.Data = line;
  568. // _rulerPath.InvalidateVisual();
  569. // var vector1 = new Vector(_measureStartPoint.X / _caseImageViewModel.Transform.ScaleX,
  570. // _measureStartPoint.Y / _caseImageViewModel.Transform.ScaleY);
  571. // var vector2 = new Vector(currentPoint.X / _caseImageViewModel.Transform.ScaleX,
  572. // currentPoint.Y / _caseImageViewModel.Transform.ScaleY);
  573. // var length = Math.Abs((vector2 - vector1).Length);
  574. // _measuredValueText.Text = $"{(int)length} px";
  575. // var height = _measuredValue.ActualHeight;
  576. // Canvas.SetLeft(_measuredValue, currentPoint.X);
  577. // Canvas.SetTop(_measuredValue, currentPoint.Y - height - 2);
  578. // }
  579. // else if (_isDrawingRoi)
  580. // {
  581. // var currentPixelPoint = e.GetPosition(ImageGrid);
  582. // var roiPoint = new Point(currentPixelPoint.X / _caseImageViewModel.Transform.ScaleX, currentPixelPoint.Y / _caseImageViewModel.Transform.ScaleY);
  583. // var lastPoint = _caseImageViewModel.ActiveRoi.Points.Last();
  584. // var currentStoreRoiPoint = new System.Drawing.Point((int)roiPoint.X, (int)roiPoint.Y);
  585. // var lastStoreRoiPoint = new System.Drawing.Point((int)lastPoint.X, (int)lastPoint.Y);
  586. // if (currentStoreRoiPoint != lastStoreRoiPoint)
  587. // {
  588. // _caseImageViewModel.ActiveRoi.Points.Add(roiPoint);
  589. // }
  590. // var roiRect = _caseImageViewModel.ActiveRoi.RoiRect;
  591. // if (!_caseImageViewModel.ActiveRoi.IsPasued)
  592. // {
  593. // if (roiRect.Width > 8 && roiRect.Height > 8)
  594. // {
  595. // var startPoint = _caseImageViewModel.ActiveRoi.Points[0];
  596. // var startPixelPoint = new Point(startPoint.X * _caseImageViewModel.Transform.ScaleX, startPoint.Y * _caseImageViewModel.Transform.ScaleY);
  597. // var vector = currentPixelPoint - startPixelPoint;
  598. // if (vector.Length < 8)
  599. // {
  600. // var startScreenPosition = ImageGrid.PointToScreen(startPixelPoint);
  601. // SetCursorPos((int)startScreenPosition.X, (int)startScreenPosition.Y);
  602. // }
  603. // }
  604. // if (roiPoint == _caseImageViewModel.ActiveRoi.Points[0])
  605. // {
  606. // _caseImageViewModel.ActiveRoi.IsPasued = true;
  607. // _isDrawingRoi = false;
  608. // }
  609. // }
  610. // }
  611. //}
  612. //private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
  613. //{
  614. // if (_isMeasuring)
  615. // {
  616. // RoiCanvas.Children.Remove(_measuredValue);
  617. // RoiCanvas.Children.Remove(_rulerPath);
  618. // }
  619. // else if(_isDrawingRoi)
  620. // {
  621. // if(_caseImageViewModel.ActiveRoi != null)
  622. // {
  623. // _caseImageViewModel.ActiveRoi.IsPasued = true;
  624. // }
  625. // _isDrawingRoi = false;
  626. // }
  627. //}
  628. //private void OnMeasureChecked(object sender, RoutedEventArgs e)
  629. //{
  630. // if (_caseImageViewModel != null && _caseImageViewModel.ActiveRoi != null)
  631. // {
  632. // MeasureSwitch.IsChecked = false;
  633. // }
  634. // else
  635. // {
  636. // _isMeasuring = true;
  637. // }
  638. //}
  639. //private void OnMeasureUnchecked(object sender, RoutedEventArgs e)
  640. //{
  641. // _isMeasuring = false;
  642. // RoiCanvas.Children.Remove(_measuredValue);
  643. // RoiCanvas.Children.Remove(_rulerPath);
  644. //}
  645. private void OnImageGridMouseWheel(object sender, MouseWheelEventArgs e)
  646. {
  647. if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
  648. {
  649. e.Handled = true;
  650. var wheelPosition = e.GetPosition(ControlGrid);
  651. var step = e.Delta > 0 ? 5 : -5;
  652. if(step > 0)
  653. {
  654. if (_currentScale >= 4)
  655. {
  656. return;
  657. }
  658. }
  659. var increaseScale = (double)(step) / 100;
  660. var scale = increaseScale + _currentScale;
  661. if(scale > 4)
  662. {
  663. scale = 4;
  664. }
  665. var newWidth = _caseImageViewModel.Image.PixelWidth * scale;
  666. var newHeight = _caseImageViewModel.Image.PixelHeight * scale;
  667. var ratio = newWidth / newHeight;
  668. if (ControlGrid.ActualWidth < ControlGrid.ActualHeight)
  669. {
  670. if (newWidth < ControlGrid.ActualWidth)
  671. {
  672. newWidth = ControlGrid.ActualWidth;
  673. newHeight = newWidth / ratio;
  674. if (newHeight > ControlGrid.ActualHeight)
  675. {
  676. newHeight = ControlGrid.ActualHeight;
  677. newWidth = newHeight * ratio;
  678. }
  679. }
  680. }
  681. else
  682. {
  683. if (newHeight < ControlGrid.ActualHeight)
  684. {
  685. newHeight = ControlGrid.ActualHeight;
  686. newWidth = newHeight * ratio;
  687. if (newWidth > ControlGrid.ActualWidth)
  688. {
  689. newWidth = ControlGrid.ActualWidth;
  690. newHeight = newWidth / ratio;
  691. }
  692. }
  693. }
  694. var newY = wheelPosition.Y / ImageGrid.ActualHeight * newHeight;
  695. ImageGrid.Width = newWidth;
  696. ImageGrid.Height = newHeight;
  697. //var increaseWidth = _caseImageViewModel.Image.Width * (_currentScale - 1);
  698. //var increaseHeight = _caseImageViewModel.Image.Height * increaseScale;
  699. var offsetX = 0;// CanvasScroller.HorizontalOffset +increaseWidth;
  700. var offsetY = 0;// CanvasScroller.VerticalOffset + wheelPosition.Y - increaseHeight;
  701. if (ControlGrid.ActualWidth < ImageGrid.ActualWidth)
  702. {
  703. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
  704. if (offsetX > 0)
  705. {
  706. CanvasScroller.ScrollToHorizontalOffset(offsetX);
  707. }
  708. }
  709. else
  710. {
  711. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  712. }
  713. if (ControlGrid.ActualHeight < ImageGrid.ActualHeight)
  714. {
  715. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  716. if (offsetY > 0)
  717. {
  718. CanvasScroller.ScrollToVerticalOffset(offsetY);
  719. }
  720. }
  721. else
  722. {
  723. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  724. }
  725. }
  726. }
  727. private void OnResetScaleClick(object sender, RoutedEventArgs e)
  728. {
  729. ImageGrid.Width = double.NaN;
  730. ImageGrid.Height = double.NaN;
  731. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  732. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  733. }
  734. private void OnUndoRoiClick(object sender, RoutedEventArgs e)
  735. {
  736. if (_caseImageViewModel.ActiveRoi != null && _caseImageViewModel.ActiveRoi.Points.Count >= 7)
  737. {
  738. e.Handled = true;
  739. var lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  740. _caseImageViewModel.ActiveRoi.Points.Remove(lastPoint);
  741. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  742. _caseImageViewModel.ActiveRoi.Points.Remove(lastPoint);
  743. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  744. _caseImageViewModel.ActiveRoi.Points.Remove(lastPoint);
  745. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  746. _caseImageViewModel.ActiveRoi.Points.Remove(lastPoint);
  747. lastPoint = _caseImageViewModel.ActiveRoi.LastPoint;
  748. _roiCurrentPosition = new Point(lastPoint.X * _caseImageViewModel.Transform.ScaleX, lastPoint.Y * _caseImageViewModel.Transform.ScaleY);
  749. _isDrawingRoi = true;
  750. }
  751. }
  752. private void OnTouchFinishClick(object sender, RoutedEventArgs e)
  753. {
  754. if(_caseImageViewModel.ActiveRoi != null)
  755. {
  756. if(_caseImageViewModel.ActiveRoi.ModifingStart)
  757. {
  758. _caseImageViewModel.ActiveRoi.ModifingStart = false;
  759. }
  760. else
  761. {
  762. _caseImageViewModel.ActiveRoi.Finish();
  763. }
  764. }
  765. }
  766. private void OnTouchDeleteClick(object sender, RoutedEventArgs e)
  767. {
  768. if (_caseImageViewModel.ActiveRoi != null)
  769. {
  770. _caseImageViewModel.ActiveRoi.Delete();
  771. }
  772. }
  773. private void OnZoomOutClick(object sender, RoutedEventArgs e)
  774. {
  775. if (_caseImageViewModel == null || _caseImageViewModel.Image == null) return;
  776. var step = -5;
  777. var increaseScale = (double)(step) / 100;
  778. var scale = increaseScale + _currentScale;
  779. var newWidth = _caseImageViewModel.Image.PixelWidth * scale;
  780. var newHeight = _caseImageViewModel.Image.PixelHeight * scale;
  781. var ratio = newWidth / newHeight;
  782. if (ControlGrid.ActualWidth < ControlGrid.ActualHeight)
  783. {
  784. if (newWidth < ControlGrid.ActualWidth)
  785. {
  786. newWidth = ControlGrid.ActualWidth;
  787. newHeight = newWidth / ratio;
  788. if (newHeight > ControlGrid.ActualHeight)
  789. {
  790. newHeight = ControlGrid.ActualHeight;
  791. newWidth = newHeight * ratio;
  792. }
  793. }
  794. }
  795. else
  796. {
  797. if (newHeight < ControlGrid.ActualHeight)
  798. {
  799. newHeight = ControlGrid.ActualHeight;
  800. newWidth = newHeight * ratio;
  801. if (newWidth > ControlGrid.ActualWidth)
  802. {
  803. newWidth = ControlGrid.ActualWidth;
  804. newHeight = newWidth / ratio;
  805. }
  806. }
  807. }
  808. ImageGrid.Width = newWidth;
  809. ImageGrid.Height = newHeight;
  810. if (ControlGrid.ActualWidth < ImageGrid.ActualWidth)
  811. {
  812. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
  813. }
  814. else
  815. {
  816. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  817. }
  818. if (ControlGrid.ActualHeight < ImageGrid.ActualHeight)
  819. {
  820. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  821. }
  822. else
  823. {
  824. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  825. }
  826. }
  827. private void OnZoomInClick(object sender, RoutedEventArgs e)
  828. {
  829. if(_caseImageViewModel == null || _caseImageViewModel.Image == null) return;
  830. if (_currentScale >= 4)
  831. {
  832. return;
  833. }
  834. var step = 5;
  835. var increaseScale = (double)(step) / 100;
  836. var scale = increaseScale + _currentScale;
  837. if(scale > 4)
  838. {
  839. scale = 4;
  840. }
  841. var newWidth = _caseImageViewModel.Image.PixelWidth * scale;
  842. var newHeight = _caseImageViewModel.Image.PixelHeight * scale;
  843. var ratio = newWidth / newHeight;
  844. ImageGrid.Width = newWidth;
  845. ImageGrid.Height = newHeight;
  846. if (ControlGrid.ActualWidth < ImageGrid.ActualWidth)
  847. {
  848. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
  849. }
  850. else
  851. {
  852. CanvasScroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  853. }
  854. if (ControlGrid.ActualHeight < ImageGrid.ActualHeight)
  855. {
  856. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
  857. }
  858. else
  859. {
  860. CanvasScroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  861. }
  862. }
  863. }
  864. }