GridSettingForm.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. using PaintDotNet;
  2. using PaintDotNet.Base.CommTool;
  3. using PaintDotNet.Base.SettingModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. namespace Metis.Setting
  15. {
  16. internal partial class GridSettingForm : PdnBaseForm
  17. {
  18. /// <summary>
  19. /// 主控件
  20. /// </summary>
  21. private AppWorkspace appWorkspace;
  22. /// <summary>
  23. /// 网格设置的model
  24. /// </summary>
  25. private GridModel gridModel = Startup.instance.gridModel;
  26. /// <summary>
  27. /// 单位标尺
  28. /// </summary>
  29. private double unitLength = 1;
  30. /// <summary>
  31. /// 网格调色板
  32. /// </summary>
  33. PaintDotNet.ColorsForm colorsFormGrid;
  34. /// <summary>
  35. /// 正方形调色板
  36. /// </summary>
  37. PaintDotNet.ColorsForm colorsFormRect;
  38. /// <summary>
  39. /// 圆形调色板
  40. /// </summary>
  41. PaintDotNet.ColorsForm colorsFormCircular;
  42. /// <summary>
  43. /// 网格样式的增改删,0-添加、1-修改、2-删除
  44. /// </summary>
  45. private int operation = -1;
  46. public GridSettingForm(AppWorkspace appWorkspace)
  47. {
  48. this.appWorkspace = appWorkspace;
  49. InitializeComponent();
  50. InitParameterData();
  51. InitializeComponent2();
  52. InitializationDataGridView();
  53. UnitData();
  54. }
  55. /// <summary>
  56. /// 给下拉集合赋值
  57. /// </summary>
  58. private void InitParameterData()
  59. {
  60. this.comboBox_Grid.Items.AddRange(InvariantData.dashStyles);
  61. this.comboBox_Circular.Items.AddRange(InvariantData.dashStyles);
  62. this.comboBox_Square.Items.AddRange(InvariantData.dashStyles);
  63. }
  64. /// <summary>
  65. /// 网格样式列表初始化
  66. /// </summary>
  67. private void InitializationDataGridView()
  68. {
  69. this.dataGridView1.Rows.Clear();
  70. //keyValuePairs.Clear();
  71. int serveNameID = 0;
  72. this.dataGridView1.ReadOnly = true;
  73. List<string> fileNames = FileOperationHelper.GetFileList(Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\");
  74. if (fileNames.Count > 0)
  75. {
  76. for (int i = 0; i < fileNames.Count; i++)
  77. {
  78. GridModel gselectRidModel = XmlSerializeHelper.DESerializer<GridModel>(FileOperationHelper.ReadStringFromFile(Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + fileNames[i], FileMode.Open));
  79. DataGridViewRow row = new DataGridViewRow();
  80. foreach (DataGridViewColumn c in this.dataGridView1.Columns)
  81. {
  82. row.Cells.Add(c.CellTemplate.Clone() as DataGridViewCell);
  83. }
  84. row.Cells[0].Value = gselectRidModel.gridName;
  85. if (gselectRidModel.gridName.Equals(Startup.instance.configModel.GridName))
  86. {
  87. serveNameID = i;
  88. }
  89. this.dataGridView1.Rows.Add(row);
  90. }
  91. if (operation != 2)
  92. {
  93. this.dataGridView1.CurrentCell = this.dataGridView1[0, serveNameID];
  94. }
  95. else
  96. {
  97. this.dataGridView1.CurrentCell = this.dataGridView1[0, 0];
  98. }
  99. RefreshDataGridView();
  100. }
  101. }
  102. private string serveName = string.Empty;
  103. /// <summary>
  104. /// 刷新网格样式列表
  105. /// </summary>
  106. private void RefreshDataGridView()
  107. {
  108. if (this.dataGridView1.SelectedRows.Count > 0 && this.dataGridView1.CurrentCell != null)
  109. {
  110. serveName = this.dataGridView1.CurrentCell.Value.ToString();
  111. //string selectName = this.dataGridView1.CurrentCell.Value.ToString() + ".xml";
  112. GridModel gselectRidModel = XmlSerializeHelper.DESerializer<GridModel>(FileOperationHelper.ReadStringFromFile(Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + serveName + ".xml", FileMode.Open));
  113. this.textBox1.Text = serveName;
  114. //网格
  115. this.numericUpDown1.Value = gselectRidModel.grid.ActualLength > 0 ? gselectRidModel.grid.ActualLength : 1;
  116. this.numericUpDown2.Value = gselectRidModel.grid.ActualHeight > 0 ? gselectRidModel.grid.ActualHeight : 1;
  117. this.numericUpDown4.Value = gselectRidModel.grid.HorizontalNum > 0 ? gselectRidModel.grid.HorizontalNum : 1;
  118. this.numericUpDown3.Value = gselectRidModel.grid.VerticalNum > 0 ? gselectRidModel.grid.VerticalNum : 1;
  119. this.comboBox_Grid.SelectedIndex = gselectRidModel.grid.DashStyle;
  120. this.numericUpDown7.Value = gselectRidModel.grid.Thickness > 0 ? gselectRidModel.grid.Thickness : 1;
  121. this.gridPanel.BackColor = Color.FromArgb(gselectRidModel.grid.Color);
  122. //正方形
  123. this.comboBox_Square.SelectedIndex = gselectRidModel.rectangle.DashStyle;
  124. this.numericUpDown9.Value = gselectRidModel.rectangle.Thickness > 0 ? gselectRidModel.rectangle.Thickness : 1;
  125. this.numericUpDown6.Value = gselectRidModel.rectangle.ActualLength > 0 ? gselectRidModel.rectangle.ActualLength : 1;
  126. this.rectPanel.BackColor = Color.FromArgb(gselectRidModel.rectangle.Color);
  127. //圆形
  128. this.comboBox_Circular.SelectedIndex = gselectRidModel.round.DashStyle;
  129. this.numericUpDown8.Value = gselectRidModel.round.Thickness > 0 ? gselectRidModel.round.Thickness : 1;
  130. this.numericUpDown5.Value = gselectRidModel.round.ActualDiameter > 0 ? gselectRidModel.round.ActualDiameter : 1;
  131. this.circularPanel.BackColor = Color.FromArgb(gselectRidModel.round.Color);
  132. if (gselectRidModel.grid.Unit == 6)
  133. comboBox7.Text = "px";
  134. else if (gselectRidModel.grid.Unit == 4)
  135. comboBox7.Text = "μm";
  136. }
  137. }
  138. /// <summary>
  139. /// 初始化组件
  140. /// </summary>
  141. private void InitializeComponent2()
  142. {
  143. this.textBox1.Text = gridModel.gridName;
  144. this.numericUpDown1.Value = gridModel.grid.ActualLength > 0 ? gridModel.grid.ActualLength : 1;
  145. this.numericUpDown2.Value = gridModel.grid.ActualHeight > 0 ? gridModel.grid.ActualHeight : 1;
  146. this.numericUpDown4.Value = gridModel.grid.HorizontalNum > 0 ? gridModel.grid.HorizontalNum : 1;
  147. this.numericUpDown3.Value = gridModel.grid.VerticalNum > 0 ? gridModel.grid.VerticalNum : 1;
  148. this.comboBox_Grid.SelectedIndex = gridModel.grid.DashStyle;
  149. this.numericUpDown7.Value = gridModel.grid.Thickness > 0 ? gridModel.grid.Thickness : 1;
  150. this.gridPanel.BackColor = Color.FromArgb(gridModel.grid.Color);
  151. this.numericUpDown6.Value = gridModel.rectangle.sideLength > 0 ? gridModel.rectangle.sideLength : 80;
  152. this.comboBox_Square.SelectedIndex = gridModel.rectangle.DashStyle;
  153. this.numericUpDown9.Value = gridModel.rectangle.Thickness > 0 ? gridModel.rectangle.Thickness : 1;
  154. this.rectPanel.BackColor = Color.FromArgb(gridModel.rectangle.Color);
  155. this.numericUpDown5.Value = gridModel.round.diameter > 0 ? gridModel.round.diameter : 70;
  156. this.comboBox_Circular.SelectedIndex = gridModel.round.DashStyle;
  157. this.numericUpDown8.Value = gridModel.round.Thickness > 0 ? gridModel.round.Thickness : 1;
  158. this.circularPanel.BackColor = Color.FromArgb(gridModel.round.Color);
  159. this.colorsFormGrid = new ColorsForm();
  160. this.colorsFormGrid.StartPosition = FormStartPosition.CenterScreen;
  161. this.colorsFormGrid.UserPrimaryColorChanged += new ColorEventHandler(this.colorsFormUserPrimaryColorChanged);
  162. this.colorsFormRect = new ColorsForm();
  163. this.colorsFormRect.StartPosition = FormStartPosition.CenterScreen;
  164. this.colorsFormRect.UserPrimaryColorChanged += new ColorEventHandler(this.colorsFormUserPrimaryColorChanged);
  165. this.colorsFormCircular = new ColorsForm();
  166. this.colorsFormCircular.StartPosition = FormStartPosition.CenterScreen;
  167. this.colorsFormCircular.UserPrimaryColorChanged += new ColorEventHandler(this.colorsFormUserPrimaryColorChanged);
  168. //this.groupBox2.Enabled = false;
  169. //this.groupBox3.Enabled = false;
  170. //this.groupBox4.Enabled = false;
  171. }
  172. /// <summary>
  173. /// 单位设置初始化
  174. /// </summary>
  175. private void UnitData()
  176. {
  177. this.appWorkspace.getMeasureInfo().TryGetValue(MeasurementUnit.Micron, out unitLength);//获取系统标尺-微米
  178. if (gridModel.grid.Unit == 6)
  179. comboBox7.Text = "px";
  180. else if (gridModel.grid.Unit == 4)
  181. comboBox7.Text = "μm";
  182. }
  183. /// <summary>
  184. /// 调色板回调函数
  185. /// </summary>
  186. /// <param name="sender"></param>
  187. /// <param name="ce"></param>
  188. private void colorsFormUserPrimaryColorChanged(object sender, ColorEventArgs ce)
  189. {
  190. }
  191. #region 宽度
  192. private void trackBar1_Scroll(object sender, EventArgs e)
  193. {
  194. this.numericUpDown1.Value = this.trackBar1.Value;
  195. }
  196. private void numericUpDown1_ValueChanged(object sender, EventArgs e)
  197. {
  198. this.trackBar1.Value = Convert.ToInt32(this.numericUpDown1.Value);
  199. }
  200. #endregion
  201. #region 高度
  202. private void trackBar2_Scroll(object sender, EventArgs e)
  203. {
  204. this.numericUpDown2.Value = this.trackBar2.Value;
  205. }
  206. private void numericUpDown2_ValueChanged(object sender, EventArgs e)
  207. {
  208. this.trackBar2.Value = Convert.ToInt32(this.numericUpDown2.Value);
  209. }
  210. #endregion
  211. #region 列数
  212. private void trackBar3_Scroll(object sender, EventArgs e)
  213. {
  214. this.numericUpDown3.Value = this.trackBar3.Value;
  215. }
  216. private void numericUpDown3_ValueChanged(object sender, EventArgs e)
  217. {
  218. this.trackBar3.Value = Convert.ToInt32(this.numericUpDown3.Value);
  219. }
  220. #endregion
  221. #region 行数
  222. private void trackBar4_Scroll(object sender, EventArgs e)
  223. {
  224. this.numericUpDown4.Value = this.trackBar4.Value;
  225. }
  226. private void numericUpDown4_ValueChanged(object sender, EventArgs e)
  227. {
  228. this.trackBar4.Value = Convert.ToInt32(this.numericUpDown4.Value);
  229. }
  230. #endregion
  231. #region 直径
  232. private void trackBar5_Scroll(object sender, EventArgs e)
  233. {
  234. this.numericUpDown5.Value = this.trackBar5.Value;
  235. }
  236. private void numericUpDown5_ValueChanged(object sender, EventArgs e)
  237. {
  238. this.trackBar5.Value = Convert.ToInt32(this.numericUpDown5.Value);
  239. }
  240. #endregion
  241. #region 边长
  242. private void trackBar6_Scroll(object sender, EventArgs e)
  243. {
  244. this.numericUpDown6.Value = this.trackBar6.Value;
  245. }
  246. private void numericUpDown6_ValueChanged(object sender, EventArgs e)
  247. {
  248. this.trackBar6.Value = Convert.ToInt32(this.numericUpDown6.Value);
  249. }
  250. #endregion
  251. private void gridPanel_Click(object sender, EventArgs e)
  252. {
  253. this.colorsFormGrid.UserPrimaryColor = ColorBgra.FromColor(this.gridPanel.BackColor);
  254. this.colorsFormGrid.setSaveBtn_Click(new System.EventHandler(this.gridColorChanged));
  255. this.colorsFormGrid.ShowDialog();
  256. }
  257. private void circularPanel_Click(object sender, EventArgs e)
  258. {
  259. this.colorsFormCircular.UserPrimaryColor = ColorBgra.FromColor(this.circularPanel.BackColor);
  260. this.colorsFormCircular.setSaveBtn_Click(new System.EventHandler(this.circularColorChanged));
  261. this.colorsFormCircular.ShowDialog();
  262. }
  263. private void rectPanel_Click(object sender, EventArgs e)
  264. {
  265. this.colorsFormRect.UserPrimaryColor = ColorBgra.FromColor(this.rectPanel.BackColor);
  266. this.colorsFormRect.setSaveBtn_Click(new System.EventHandler(this.rectColorChanged));
  267. this.colorsFormRect.ShowDialog();
  268. }
  269. /// <summary>
  270. /// 网格Panel的调色板颜色改变
  271. /// </summary>
  272. /// <param name="sender"></param>
  273. /// <param name="e"></param>
  274. private void gridColorChanged(object sender, EventArgs e)
  275. {
  276. this.gridPanel.BackColor = this.colorsFormGrid.UserPrimaryColor.ToColor();
  277. // this.measureStyleModel.backColor = this.colorsForm.UserPrimaryColor.ToColor().ToArgb();
  278. this.colorsFormGrid.Close();
  279. }
  280. /// <summary>
  281. /// 矩形Panel的调色板颜色改变
  282. /// </summary>
  283. /// <param name="sender"></param>
  284. /// <param name="e"></param>
  285. private void rectColorChanged(object sender, EventArgs e)
  286. {
  287. this.rectPanel.BackColor = this.colorsFormRect.UserPrimaryColor.ToColor();
  288. // this.measureStyleModel.backColor = this.colorsForm.UserPrimaryColor.ToColor().ToArgb();
  289. this.colorsFormRect.Close();
  290. }
  291. /// <summary>
  292. /// 圆形Panel的调色板颜色改变
  293. /// </summary>
  294. /// <param name="sender"></param>
  295. /// <param name="e"></param>
  296. private void circularColorChanged(object sender, EventArgs e)
  297. {
  298. this.circularPanel.BackColor = this.colorsFormCircular.UserPrimaryColor.ToColor();
  299. // this.measureStyleModel.backColor = this.colorsForm.UserPrimaryColor.ToColor().ToArgb();
  300. this.colorsFormCircular.Close();
  301. }
  302. private void dataGridView1_SelectionChanged(object sender, EventArgs e)
  303. {
  304. RefreshDataGridView();
  305. }
  306. private void btnSaveAs_Click(object sender, EventArgs e)
  307. {
  308. operation = 0;
  309. }
  310. private void btnSave_Click(object sender, EventArgs e)
  311. {
  312. string userInfoXml = XmlSerializeHelper.XmlSerialize<GridModel>(CurrentGridModel());
  313. if (operation == -1)
  314. {
  315. string updateName = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + this.dataGridView1.CurrentCell.Value + ".xml";
  316. System.IO.File.Delete(updateName);
  317. //FileOperationHelper.DeleteFolder(updateName);
  318. //保存到xml
  319. string gridFilePath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + this.textBox1.Text + ".xml";
  320. if (System.IO.File.Exists(gridFilePath))
  321. {
  322. MessageBox.Show(PdnResources.GetString("Menu.Thefilenandmodify.text"));
  323. return;
  324. }
  325. if (!FileOperationHelper.WriteStringToFile(userInfoXml, gridFilePath, FileMode.Create))
  326. {
  327. MessageBox.Show(PdnResources.GetString("Menu.idinformationsavin.Text"));
  328. }
  329. this.dataGridView1.SelectedCells[0].Value = this.textBox1.Text;
  330. }
  331. else if (operation == 0)
  332. {
  333. //保存到xml
  334. string gridFilePath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + this.textBox1.Text + ".xml";
  335. if (System.IO.File.Exists(gridFilePath))
  336. {
  337. MessageBox.Show(PdnResources.GetString("Menu.Thefilenandmodify.text"));
  338. return;
  339. }
  340. else
  341. {
  342. if (!FileOperationHelper.WriteStringToFile(userInfoXml, gridFilePath, FileMode.Create))
  343. {
  344. MessageBox.Show(PdnResources.GetString("Menu.idinformationsavin.Text"));
  345. }
  346. InitializationDataGridView();
  347. }
  348. operation = -1;
  349. //this.button1.Text = PdnResources.GetString("Menu.application.text");
  350. }
  351. //InitializationDataGridView();
  352. }
  353. /// <summary>
  354. /// 获取model
  355. /// </summary>
  356. /// <returns></returns>
  357. private GridModel CurrentGridModel()
  358. {
  359. //临时model,根据应用场景运用
  360. GridModel temporarygridModel = new GridModel();
  361. temporarygridModel.grid = new GridModel.Grid();
  362. temporarygridModel.rectangle = new GridModel.Rectangle();
  363. temporarygridModel.round = new GridModel.Round();
  364. temporarygridModel.gridName = this.textBox1.Text;
  365. if ("px".Equals(comboBox7.Text))
  366. {
  367. temporarygridModel.grid.SideLength = (int)this.numericUpDown1.Value;
  368. temporarygridModel.grid.SideHeight = (int)this.numericUpDown2.Value;
  369. temporarygridModel.rectangle.sideLength = (int)this.numericUpDown6.Value;
  370. temporarygridModel.round.diameter = (int)this.numericUpDown5.Value;
  371. }
  372. else if ("μm".Equals(comboBox7.Text))
  373. {
  374. temporarygridModel.grid.SideLength = int.Parse(((double)this.numericUpDown1.Value / unitLength).ToString("F0"));
  375. temporarygridModel.grid.SideHeight = int.Parse(((double)this.numericUpDown2.Value / unitLength).ToString("F0"));
  376. temporarygridModel.rectangle.sideLength = int.Parse(((double)this.numericUpDown6.Value / unitLength).ToString("F0"));
  377. temporarygridModel.round.diameter = int.Parse(((double)this.numericUpDown5.Value / unitLength).ToString("F0"));
  378. }
  379. temporarygridModel.grid.HorizontalNum = (int)this.numericUpDown4.Value;
  380. temporarygridModel.grid.VerticalNum = (int)this.numericUpDown3.Value;
  381. temporarygridModel.grid.DashStyle = this.comboBox_Grid.SelectedIndex;
  382. temporarygridModel.grid.Thickness = (int)this.numericUpDown7.Value;
  383. temporarygridModel.grid.Color = this.gridPanel.BackColor.ToArgb();
  384. if ("px".Equals(comboBox7.Text))
  385. {
  386. temporarygridModel.grid.Unit = (int)MeasurementUnit.Pixel;
  387. }
  388. else if ("μm".Equals(comboBox7.Text))
  389. {
  390. temporarygridModel.grid.Unit = (int)MeasurementUnit.Micron;
  391. }
  392. temporarygridModel.rectangle.DashStyle = this.comboBox_Square.SelectedIndex;
  393. temporarygridModel.rectangle.Thickness = (int)this.numericUpDown9.Value;
  394. temporarygridModel.rectangle.Color = this.rectPanel.BackColor.ToArgb();
  395. temporarygridModel.round.DashStyle = this.comboBox_Circular.SelectedIndex;
  396. temporarygridModel.round.Thickness = (int)this.numericUpDown8.Value;
  397. temporarygridModel.round.Color = this.circularPanel.BackColor.ToArgb();
  398. temporarygridModel.grid.ActualLength = (int)this.numericUpDown1.Value;
  399. temporarygridModel.grid.ActualHeight = (int)this.numericUpDown2.Value;
  400. temporarygridModel.rectangle.ActualLength = (int)this.numericUpDown6.Value;
  401. temporarygridModel.round.ActualDiameter = (int)this.numericUpDown5.Value;
  402. return temporarygridModel;
  403. }
  404. /// <summary>
  405. /// 删除
  406. /// </summary>
  407. /// <param name="sender"></param>
  408. /// <param name="e"></param>
  409. private void btnDel_Click(object sender, EventArgs e)
  410. {
  411. if (this.dataGridView1.Rows.Count > 1)
  412. {
  413. DialogResult dr = MessageBox.Show(PdnResources.GetString("Menu.Areyousuretcteddata.text") + "?", PdnResources.GetString("Menu.ensure.text"), MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
  414. if (dr == DialogResult.OK)
  415. {
  416. operation = 2;
  417. string updateName = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\GridConfig\\" + this.dataGridView1.CurrentCell.Value.ToString() + ".xml";
  418. System.IO.File.Delete(updateName);
  419. InitializationDataGridView();
  420. operation = -1;
  421. }
  422. }
  423. else
  424. {
  425. MessageBox.Show("只有一条数据,不可删除!");
  426. return;
  427. }
  428. }
  429. /// <summary>
  430. /// 激活
  431. /// </summary>
  432. /// <param name="sender"></param>
  433. /// <param name="e"></param>
  434. private void button1_Click(object sender, EventArgs e)
  435. {
  436. Startup.instance.gridModel = CurrentGridModel();
  437. string userInfoXml = XmlSerializeHelper.XmlSerialize<GridModel>(CurrentGridModel());
  438. Startup.instance.configModel.GridName = this.textBox1.Text;
  439. string configXml = XmlSerializeHelper.XmlSerialize<ConfigModel>(Startup.instance.configModel);
  440. string configPath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\Config.xml";
  441. FileOperationHelper.WriteStringToFile(configXml, configPath, FileMode.Create);
  442. string filePath = Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\Grid.xml";
  443. if (!FileOperationHelper.WriteStringToFile(userInfoXml, filePath, FileMode.Create))
  444. MessageBox.Show(PdnResources.GetString("Menu.idinformationsavin.Text"));
  445. if (appWorkspace.ActiveDocumentWorkspace != null)
  446. appWorkspace.ActiveDocumentWorkspace.Refresh();
  447. if (operation != -1) operation = -1;
  448. }
  449. }
  450. }