PictureUserControl.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. using System;
  2. using System.Drawing;
  3. using System.Threading.Tasks;
  4. using System.Windows.Forms;
  5. using static System.Windows.Forms.ImageList;
  6. using OpenCvSharp;
  7. using PaintDotNet.Adjust;
  8. using System.Threading;
  9. namespace PaintDotNet.GeneralAnalysis.CustomInterface
  10. {
  11. internal class PictureUserControl : UserControl
  12. {
  13. #region 控件
  14. private GroupBox groupBox1;
  15. private Panel panel1;
  16. public PanelEx pictureBox1;
  17. public PlayUserContrtol playUserContrtol;
  18. private ToolUserContrtol toolUserContrtol;
  19. #endregion
  20. /// <summary>
  21. /// 图像
  22. /// </summary>
  23. public Bitmap bitmap;
  24. /// <summary>
  25. /// 对照模式的图片
  26. /// </summary>
  27. private Bitmap comBitmap;
  28. /// <summary>
  29. /// 1对照图像 2图谱图片
  30. /// </summary>
  31. private int type = 1;
  32. /// <summary>
  33. /// 图像集合
  34. /// </summary>
  35. private ImageCollection imageCollection;
  36. /// <summary>
  37. /// 当前图片
  38. /// </summary>
  39. private int currentPosition;
  40. /// <summary>
  41. /// 已经按下
  42. /// </summary>
  43. private bool MoveFlag = false;
  44. /// <summary>
  45. /// 当前x坐标
  46. /// </summary>
  47. private int xPos;
  48. /// <summary>
  49. /// 当前y坐标
  50. /// </summary>
  51. private int yPos;
  52. /// <summary>
  53. /// 1选择 2平移
  54. /// </summary>
  55. private int pointerType = 1;
  56. /// <summary>
  57. /// 初始化按钮事件
  58. /// </summary>
  59. private bool initButtonEvent = false;
  60. /// <summary>
  61. /// 对照窗体
  62. /// </summary>
  63. private AtlasComparisonDialog atlasComparisonDialog;
  64. /// <summary>
  65. /// 画笔颜色,用来绘制边框
  66. /// </summary>
  67. private Pen pen = new Pen(Color.Red);
  68. /// <summary>
  69. /// panel的选中状态
  70. /// </summary>
  71. public bool selectFlag = false;
  72. /// <summary>
  73. /// sizemode 借用picturebox的枚举
  74. /// </summary>
  75. private PictureBoxSizeMode pictureBoxSizeMode = PictureBoxSizeMode.Zoom;
  76. /// <summary>
  77. /// 缩放比例
  78. /// </summary>
  79. private float scaleFactor = 1f;
  80. public Bitmap Bitmap
  81. {
  82. set
  83. {
  84. this.bitmap = value;
  85. if(this.bitmap!=null)
  86. {
  87. CalcScaleFactor();
  88. }
  89. this.pictureBox1.Refresh();
  90. }
  91. get
  92. {
  93. return this.bitmap;
  94. }
  95. }
  96. public Bitmap ComBitmap
  97. {
  98. set
  99. {
  100. this.comBitmap = value;
  101. this.pictureBox1.Refresh();
  102. }
  103. get
  104. {
  105. return this.comBitmap;
  106. }
  107. }
  108. public ImageCollection ImageCollection
  109. {
  110. set
  111. {
  112. this.imageCollection = value;
  113. }
  114. }
  115. public int CurrentPosition
  116. {
  117. set
  118. {
  119. this.currentPosition = value;
  120. SetCurrentImageAndPositionAndText();
  121. }
  122. get
  123. {
  124. return this.currentPosition;
  125. }
  126. }
  127. private void SetCurrentImageAndPositionAndText()
  128. {
  129. if (this.imageCollection != null && this.imageCollection.Count > 0)
  130. {
  131. if (this.imageCollection.Count >= this.currentPosition)
  132. {
  133. this.Bitmap = this.atlasComparisonDialog.atlasModels.Find(a => a.id.Equals(this.imageCollection.Keys[this.currentPosition - 1])).bitmap;
  134. this.playUserContrtol.SetCollectionText(this.currentPosition, this.imageCollection.Count);
  135. }
  136. else
  137. {
  138. this.Bitmap = null;
  139. this.playUserContrtol.SetCollectionText(0, 0);
  140. }
  141. this.pictureBox1.Refresh();
  142. }
  143. }
  144. public PictureUserControl(int type, AtlasComparisonDialog atlasComparisonDialog)
  145. {
  146. this.type = type;
  147. this.atlasComparisonDialog = atlasComparisonDialog;
  148. InitializeComponent();
  149. InitializeLanguageText();
  150. InitializeTools();
  151. InitializePictureEvent();
  152. }
  153. private void pictureBox1_Paint(object sender, PaintEventArgs e)
  154. {
  155. if (!this.initButtonEvent && this.bitmap != null)
  156. {
  157. this.initButtonEvent = true;
  158. _ = Task.Run(() =>
  159. {
  160. Thread.Sleep(200);
  161. InitializeButtonEvent();
  162. });
  163. }
  164. if (this.bitmap != null)
  165. {
  166. if (this.pictureBoxSizeMode == PictureBoxSizeMode.Zoom)
  167. {
  168. e.Graphics.DrawImage(this.bitmap, CalcRectangle(this.bitmap));
  169. }
  170. else
  171. {
  172. e.Graphics.DrawImage(this.bitmap, CalcRectangle(this.bitmap));
  173. }
  174. }
  175. if (this.comBitmap != null)
  176. {
  177. e.Graphics.DrawImage(this.comBitmap, CalcRectangle(this.comBitmap));
  178. }
  179. if (this.selectFlag)
  180. {
  181. e.Graphics.DrawRectangle(pen, e.ClipRectangle.X, e.ClipRectangle.Y,
  182. e.ClipRectangle.X + e.ClipRectangle.Width - 1,
  183. e.ClipRectangle.Y + e.ClipRectangle.Height - 1);
  184. }
  185. }
  186. /// <summary>
  187. /// 计算缩放比例
  188. /// 需要区分是适合大小还是
  189. /// </summary>
  190. private void CalcScaleFactor()
  191. {
  192. if (this.pictureBox1.Width > this.pictureBox1.Height)
  193. {
  194. if (this.bitmap.Width > this.pictureBox1.Width || this.bitmap.Height > this.pictureBox1.Height)
  195. {
  196. float a = this.bitmap.Height * 1.0f / this.pictureBox1.Height;
  197. float b = this.bitmap.Width * 1.0f / this.pictureBox1.Width;
  198. if (a < b)
  199. {
  200. this.scaleFactor = this.pictureBox1.Width * 1.0f / this.bitmap.Width;
  201. }
  202. else
  203. {
  204. this.scaleFactor = this.pictureBox1.Height * 1.0f / this.bitmap.Height;
  205. }
  206. }
  207. else
  208. {
  209. this.scaleFactor = 1.0f;
  210. }
  211. }
  212. else
  213. {
  214. if (this.bitmap.Width > this.pictureBox1.Width || this.bitmap.Height > this.pictureBox1.Height)
  215. {
  216. float a = this.bitmap.Height * 1.0f / this.pictureBox1.Height;
  217. float b = this.bitmap.Width * 1.0f / this.pictureBox1.Width;
  218. if (a < b)
  219. {
  220. this.scaleFactor = this.pictureBox1.Width * 1.0f / this.bitmap.Width;
  221. }
  222. else
  223. {
  224. this.scaleFactor = this.pictureBox1.Height * 1.0f / this.bitmap.Height;
  225. }
  226. }
  227. else
  228. {
  229. this.scaleFactor = 1.0f;
  230. }
  231. }
  232. }
  233. /// <summary>
  234. /// 计算绘制的图像合适大小
  235. /// </summary>
  236. /// <returns></returns>
  237. private RectangleF CalcRectangle(Bitmap bmp)
  238. {
  239. RectangleF rect = new RectangleF();
  240. rect.X = (this.pictureBox1.Width - bmp.Width * this.scaleFactor) / 2;
  241. rect.Y = (this.pictureBox1.Height - bmp.Height * this.scaleFactor) / 2;
  242. rect.Width = bmp.Width * this.scaleFactor;
  243. rect.Height = bmp.Height * this.scaleFactor;
  244. return rect;
  245. }
  246. /// <summary>
  247. /// 初始化按钮事件
  248. /// </summary>
  249. private void InitializeButtonEvent()
  250. {
  251. if (this.type == 1)
  252. {
  253. this.toolUserContrtol.button1.Click += new EventHandler(this.ZoomInButton_click);
  254. this.toolUserContrtol.button2.Click += new EventHandler(this.ZoomOutButton_click);
  255. this.toolUserContrtol.button3.Click += new EventHandler(this.PointerButton_click);
  256. this.toolUserContrtol.button4.Click += new EventHandler(this.MoveButton_click);
  257. this.toolUserContrtol.button5.Click += new EventHandler(this.FitSizeButton_click);
  258. this.toolUserContrtol.button6.Click += new EventHandler(this.OriginSizeButton_click);
  259. this.toolUserContrtol.button7.Click += new EventHandler(this.Rotate90Button_click);
  260. this.toolUserContrtol.button8.Click += new EventHandler(this.Rotate_90Button_click);
  261. }
  262. else if(this.type == 2)
  263. {
  264. this.playUserContrtol.button1.Click += new EventHandler(this.FirstButton_click);
  265. this.playUserContrtol.button3.Click += new EventHandler(this.PrevButton_click);
  266. this.playUserContrtol.button7.Click += new EventHandler(this.NextButton_click);
  267. this.playUserContrtol.button8.Click += new EventHandler(this.FinalButton_click);
  268. }
  269. }
  270. /// <summary>
  271. /// 初始化图片事件
  272. /// </summary>
  273. private void InitializePictureEvent()
  274. {
  275. this.pictureBox1.MouseDown += new MouseEventHandler(this.PictureBox_MouseDown);
  276. this.pictureBox1.MouseMove += new MouseEventHandler(this.PictureBox_MouseMove);
  277. this.pictureBox1.MouseUp += new MouseEventHandler(this.PictureBox_MouseUp);
  278. }
  279. /// <summary>
  280. /// 按下事件
  281. /// </summary>
  282. /// <param name="sender"></param>
  283. /// <param name="e"></param>
  284. private void PictureBox_MouseDown(object sender, MouseEventArgs e)
  285. {
  286. if (this.pointerType == 2)
  287. {
  288. MoveFlag = true;
  289. xPos = e.X;
  290. yPos = e.Y;
  291. }
  292. if(this.type == 2 && this.bitmap!=null)
  293. {
  294. this.atlasComparisonDialog.SetSelectFlag();
  295. this.selectFlag = true;
  296. this.pictureBox1.Refresh();
  297. }
  298. }
  299. /// <summary>
  300. /// 移动事件
  301. /// </summary>
  302. /// <param name="sender"></param>
  303. /// <param name="e"></param>
  304. private void PictureBox_MouseMove(object sender, MouseEventArgs e)
  305. {
  306. if (MoveFlag)
  307. {
  308. this.pictureBox1.Left += e.X - xPos;
  309. this.pictureBox1.Top += e.Y - yPos;
  310. }
  311. }
  312. /// <summary>
  313. /// 抬起事件
  314. /// </summary>
  315. /// <param name="sender"></param>
  316. /// <param name="e"></param>
  317. private void PictureBox_MouseUp(object sender, MouseEventArgs e)
  318. {
  319. MoveFlag = false;
  320. }
  321. /// <summary>
  322. /// 放大按钮,picture最大宽高65535
  323. /// </summary>
  324. /// <param name="sender"></param>
  325. /// <param name="e"></param>
  326. private void ZoomInButton_click(object sender, EventArgs e)
  327. {
  328. if (!this.atlasComparisonDialog.RelatedPic)
  329. {
  330. ZoomIn();
  331. }
  332. else
  333. {
  334. this.atlasComparisonDialog.ZoomInButton_click();
  335. }
  336. }
  337. /// <summary>
  338. /// 放大
  339. /// </summary>
  340. public void ZoomIn()
  341. {
  342. this.scaleFactor = this.scaleFactor * 1.1f;
  343. this.pictureBox1.Refresh();
  344. }
  345. /// <summary>
  346. /// 缩小按钮
  347. /// </summary>
  348. /// <param name="sender"></param>
  349. /// <param name="e"></param>
  350. private void ZoomOutButton_click(object sender, EventArgs e)
  351. {
  352. if (!this.atlasComparisonDialog.RelatedPic)
  353. {
  354. ZoomOut();
  355. }
  356. else
  357. {
  358. this.atlasComparisonDialog.ZoomOutButton_click();
  359. }
  360. }
  361. /// <summary>
  362. /// 缩小
  363. /// </summary>
  364. public void ZoomOut()
  365. {
  366. this.scaleFactor = this.scaleFactor * 0.9f;
  367. this.pictureBox1.Refresh();
  368. }
  369. /// <summary>
  370. /// 选择
  371. /// </summary>
  372. /// <param name="sender"></param>
  373. /// <param name="e"></param>
  374. private void PointerButton_click(object sender, EventArgs e)
  375. {
  376. this.pointerType = 1;
  377. this.pictureBox1.Cursor = Cursors.Default;
  378. }
  379. /// <summary>
  380. /// 平移
  381. /// </summary>
  382. /// <param name="sender"></param>
  383. /// <param name="e"></param>
  384. private void MoveButton_click(object sender, EventArgs e)
  385. {
  386. this.pictureBox1.Cursor = Cursors.Hand;
  387. this.pointerType = 2;
  388. }
  389. /// <summary>
  390. /// 适合大小
  391. /// </summary>
  392. /// <param name="sender"></param>
  393. /// <param name="e"></param>
  394. private void FitSizeButton_click(object sender, EventArgs e)
  395. {
  396. this.PointerButton_click(null, null);
  397. this.pictureBoxSizeMode = PictureBoxSizeMode.Zoom;
  398. this.pictureBox1.Width = this.groupBox1.Width - 6;
  399. this.pictureBox1.Height = this.groupBox1.Height - 41 - 9;
  400. this.pictureBox1.Left = 6;
  401. this.pictureBox1.Top = 21;
  402. if (this.bitmap != null)
  403. {
  404. CalcScaleFactor();
  405. }
  406. this.pictureBox1.Refresh();
  407. }
  408. /// <summary>
  409. /// 原始大小
  410. /// </summary>
  411. /// <param name="sender"></param>
  412. /// <param name="e"></param>
  413. private void OriginSizeButton_click(object sender, EventArgs e)
  414. {
  415. this.pictureBoxSizeMode = PictureBoxSizeMode.Normal;
  416. /*if (this.bitmap != null)
  417. {
  418. CalcScaleFactor();
  419. }*/
  420. this.scaleFactor = 1.0f;
  421. this.Refresh();
  422. }
  423. /// <summary>
  424. /// 顺时针旋转90度
  425. /// </summary>
  426. /// <param name="sender"></param>
  427. /// <param name="e"></param>
  428. private void Rotate90Button_click(object sender, EventArgs e)
  429. {
  430. if (!this.atlasComparisonDialog.RelatedPic)
  431. {
  432. Rotate90();
  433. }
  434. else
  435. {
  436. this.atlasComparisonDialog.Rotate90Button_click();
  437. }
  438. }
  439. /// <summary>
  440. /// 顺时针90度
  441. /// </summary>
  442. public void Rotate90()
  443. {
  444. if (this.bitmap != null)
  445. {
  446. Mat src = PaintDotNet.Camera.Tools.ToMat(this.bitmap);
  447. Mat dst = new Mat();
  448. GeometryIntent.ImageRotate(src, dst, FlipMode.Y);
  449. this.Bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst);
  450. this.pictureBox1.Refresh();
  451. }
  452. }
  453. /// <summary>
  454. /// 逆时针旋转90度
  455. /// </summary>
  456. /// <param name="sender"></param>
  457. /// <param name="e"></param>
  458. private void Rotate_90Button_click(object sender, EventArgs e)
  459. {
  460. if (!this.atlasComparisonDialog.RelatedPic)
  461. {
  462. Rotate_90();
  463. }
  464. else
  465. {
  466. this.atlasComparisonDialog.Rotate_90Button_click();
  467. }
  468. }
  469. /// <summary>
  470. /// 逆时针旋转90度
  471. /// </summary>
  472. public void Rotate_90()
  473. {
  474. if (this.bitmap != null)
  475. {
  476. Mat src = PaintDotNet.Camera.Tools.ToMat(this.bitmap);
  477. Mat dst = new Mat();
  478. GeometryIntent.ImageRotate(src, dst, FlipMode.X);
  479. this.Bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst);
  480. this.pictureBox1.Refresh();
  481. }
  482. }
  483. /// <summary>
  484. /// 第一个
  485. /// </summary>
  486. /// <param name="sender"></param>
  487. /// <param name="e"></param>
  488. private void FirstButton_click(object sender, EventArgs e)
  489. {
  490. if (imageCollection!=null && imageCollection.Count>0)
  491. {
  492. this.currentPosition = 1;
  493. this.Bitmap = this.atlasComparisonDialog.atlasModels.Find(a => a.id.Equals(this.imageCollection.Keys[0])).bitmap;
  494. this.pictureBox1.Refresh();
  495. this.playUserContrtol.SetCollectionText(1, this.imageCollection.Count);
  496. }
  497. }
  498. /// <summary>
  499. /// 上一个
  500. /// </summary>
  501. /// <param name="sender"></param>
  502. /// <param name="e"></param>
  503. private void PrevButton_click(object sender, EventArgs e)
  504. {
  505. if (imageCollection != null && imageCollection.Count > 0)
  506. {
  507. if(this.currentPosition>1)
  508. {
  509. this.currentPosition -= 1;
  510. this.Bitmap = this.atlasComparisonDialog.atlasModels.Find(a => a.id.Equals(this.imageCollection.Keys[this.currentPosition - 1])).bitmap;
  511. this.pictureBox1.Refresh();
  512. this.playUserContrtol.SetCollectionText(this.currentPosition, this.imageCollection.Count);
  513. }
  514. }
  515. }
  516. /// <summary>
  517. /// 下一个
  518. /// </summary>
  519. /// <param name="sender"></param>
  520. /// <param name="e"></param>
  521. private void NextButton_click(object sender, EventArgs e)
  522. {
  523. if (imageCollection != null && imageCollection.Count > 0)
  524. {
  525. if (this.currentPosition < imageCollection.Count)
  526. {
  527. this.currentPosition += 1;
  528. this.Bitmap = this.atlasComparisonDialog.atlasModels.Find(a => a.id.Equals(this.imageCollection.Keys[this.currentPosition - 1])).bitmap;
  529. this.pictureBox1.Refresh();
  530. this.playUserContrtol.SetCollectionText(this.currentPosition, this.imageCollection.Count);
  531. }
  532. }
  533. }
  534. /// <summary>
  535. /// 最后一个
  536. /// </summary>
  537. /// <param name="sender"></param>
  538. /// <param name="e"></param>
  539. private void FinalButton_click(object sender, EventArgs e)
  540. {
  541. if (imageCollection != null && imageCollection.Count > 0)
  542. {
  543. this.currentPosition = imageCollection.Count;
  544. this.Bitmap = this.atlasComparisonDialog.atlasModels.Find(a => a.id.Equals(this.imageCollection.Keys[this.currentPosition - 1])).bitmap;
  545. this.pictureBox1.Refresh();
  546. this.playUserContrtol.SetCollectionText(this.currentPosition, this.imageCollection.Count);
  547. }
  548. }
  549. /// <summary>
  550. /// 初始化工具栏
  551. /// </summary>
  552. private void InitializeTools()
  553. {
  554. if (this.type==1)
  555. {
  556. this.groupBox1.Text = PdnResources.GetString("Menu.Generalanalysis.Atlascomparison.Controlimage.text");
  557. this.toolUserContrtol = new ToolUserContrtol();
  558. this.panel1.Controls.Add(this.toolUserContrtol);
  559. }
  560. else
  561. {
  562. this.groupBox1.Text = PdnResources.GetString("Menu.Generalanalysis.Atlascomparison.Atlasimage.text");
  563. this.playUserContrtol = new PlayUserContrtol();
  564. this.panel1.Controls.Add(this.playUserContrtol);
  565. }
  566. }
  567. private void InitializeLanguageText()
  568. {
  569. this.groupBox1.Text = PdnResources.GetString("Menu.Mapimage.Text");
  570. }
  571. private void InitializeComponent()
  572. {
  573. this.groupBox1 = new System.Windows.Forms.GroupBox();
  574. this.panel1 = new System.Windows.Forms.Panel();
  575. this.pictureBox1 = new PanelEx();
  576. this.groupBox1.SuspendLayout();
  577. this.SuspendLayout();
  578. //
  579. // groupBox1
  580. //
  581. this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  582. | System.Windows.Forms.AnchorStyles.Left)
  583. | System.Windows.Forms.AnchorStyles.Right)));
  584. this.groupBox1.Controls.Add(this.panel1);
  585. this.groupBox1.Controls.Add(this.pictureBox1);
  586. this.groupBox1.Location = new System.Drawing.Point(4, 4);
  587. this.groupBox1.Name = "groupBox1";
  588. this.groupBox1.Size = new System.Drawing.Size(300, 319);
  589. this.groupBox1.TabIndex = 0;
  590. this.groupBox1.TabStop = false;
  591. this.groupBox1.Text = "图谱图片";
  592. //
  593. // panel1
  594. //
  595. this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
  596. | System.Windows.Forms.AnchorStyles.Right)));
  597. this.panel1.Location = new System.Drawing.Point(7, 272);
  598. this.panel1.Name = "panel1";
  599. this.panel1.Size = new System.Drawing.Size(287, 41);
  600. this.panel1.TabIndex = 1;
  601. //
  602. // pictureBox1
  603. //
  604. this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  605. | System.Windows.Forms.AnchorStyles.Left)
  606. | System.Windows.Forms.AnchorStyles.Right)));
  607. this.pictureBox1.Location = new System.Drawing.Point(6, 21);
  608. this.pictureBox1.Name = "pictureBox1";
  609. this.pictureBox1.Size = new System.Drawing.Size(288, 245);
  610. this.pictureBox1.TabIndex = 0;
  611. this.pictureBox1.TabStop = false;
  612. this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
  613. //
  614. // PictureUserControl
  615. //
  616. this.Controls.Add(this.groupBox1);
  617. this.Name = "PictureUserControl";
  618. this.Size = new System.Drawing.Size(307, 326);
  619. this.groupBox1.ResumeLayout(false);
  620. this.ResumeLayout(false);
  621. }
  622. }
  623. }