SampleStageManageDialog.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. using PaintDotNet;
  2. using PaintDotNet.Base.SettingModel;
  3. using PaintDotNet.Camera;
  4. using StageController;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Drawing.Imaging;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. namespace Metis.AutoAnalysis
  16. {
  17. public partial class SampleStageManageDialog : PdnBaseForm
  18. {
  19. SampleStageControl _sampleStage;
  20. Dictionary<string, SampleStageModel> _stageSettingList;
  21. SampleStageModel _stageSettingNow;
  22. bool _updateMesureRange = false;
  23. MeasureRangeControl _measureRange = new MeasureRangeControl();
  24. LoadingStageModel _loadingStageModel;
  25. SampleStageModel StageSettingNow
  26. {
  27. set
  28. {
  29. _stageSettingNow = value;
  30. if (_stageSettingNow == null)
  31. {
  32. textBox1.Text = "";
  33. textBox2.Text = "";
  34. textBox3.Text = "";
  35. _measureRange.Reset();
  36. }
  37. else
  38. {
  39. textBox1.Text = _stageSettingNow.Diameter + "";
  40. textBox2.Text = _stageSettingNow.Width + "";
  41. textBox3.Text = _stageSettingNow.Height + "";
  42. _updateMesureRange = true;
  43. }
  44. }
  45. }
  46. public SampleStageManageDialog()
  47. {
  48. _loadingStageModel = Startup.instance.loadingStageModel;
  49. InitializeComponent();
  50. InitSmapleStageControl();
  51. panel10.Controls.Add(_measureRange); _measureRange.Dock = DockStyle.Fill;
  52. panel8.SizeChanged += (s, e) =>
  53. {
  54. if (_stageSettingNow != null)
  55. UpdateSmapleStageControl();
  56. };
  57. _measureRange.ChangeEvent += MeasureRange_ChangeEvent;
  58. }
  59. private void MeasureHorRange(int offset)
  60. {
  61. if (_stageSettingNow == null)
  62. return;
  63. var value = _stageSettingNow.Width;
  64. var r = float.TryParse(textBox2.Text, out value);
  65. value += offset;
  66. if (value <= 0)
  67. value = 1;
  68. textBox2.Text = value.ToString();
  69. _stageSettingNow.Width = value;
  70. _updateMesureRange = true;
  71. }
  72. private void MeasureVerRange(int offset)
  73. {
  74. if (_stageSettingNow == null)
  75. return;
  76. var value = _stageSettingNow.Height;
  77. var r = float.TryParse(textBox3.Text, out value);
  78. value += offset;
  79. if (value <= 0)
  80. value = 1;
  81. textBox3.Text = value.ToString();
  82. _stageSettingNow.Height = value;
  83. _updateMesureRange = true;
  84. }
  85. private void MeasureRange_ChangeEvent(object sender, EventArgs e)
  86. {
  87. switch (_measureRange.MovingMothed)
  88. {
  89. case MeasureRangeControl.MovingMethodEnum.Hor_Plus:
  90. MeasureHorRange(1);
  91. break;
  92. case MeasureRangeControl.MovingMethodEnum.Hor_Minus:
  93. MeasureHorRange(-1);
  94. break;
  95. case MeasureRangeControl.MovingMethodEnum.Ver_Plus:
  96. MeasureVerRange(1);
  97. break;
  98. case MeasureRangeControl.MovingMethodEnum.Ver_Minus:
  99. MeasureVerRange(-1);
  100. break;
  101. default:
  102. break;
  103. }
  104. }
  105. #region Load Close
  106. private void SampleStageManageDialog_Load(object sender, EventArgs e)
  107. {
  108. _stageSettingList = SampleStageManager.GetAll();
  109. InitSampleButtonList();
  110. CameraManager.FrameCallback += CallbackDraw;
  111. InitStage();
  112. InitializeText();
  113. }
  114. private void SampleStageManageDialog_FormClosing(object sender, FormClosingEventArgs e)
  115. {
  116. CameraManager.FrameCallback -= CallbackDraw;
  117. }
  118. void InitializeText()
  119. {
  120. this.Text = PdnResources.GetString("AutoAnalysis.StageManage");
  121. groupBox1.Text = PdnResources.GetString("AutoAnalysis.StageManage");
  122. groupBox3.Text = PdnResources.GetString("AutoAnalysis.WorkpointMark");
  123. groupBox4.Text = PdnResources.GetString("AutoAnalysis.DetectRangeMark");
  124. groupBox2.Text = PdnResources.GetString("AutoAnalysis.SameOperate");
  125. groupBox5.Text = PdnResources.GetString("AutoAnalysis.DetectSketch");
  126. label1.Text = PdnResources.GetString("AutoAnalysis.WorkRadius");
  127. label2.Text = PdnResources.GetString("AutoAnalysis.WorkRange");
  128. btnAdd.Text = PdnResources.GetString("AutoAnalysis.Button.New");
  129. btnEdit.Text = PdnResources.GetString("AutoAnalysis.Button.Edit");
  130. btnDelete.Text = PdnResources.GetString("AutoAnalysis.Button.Delete");
  131. button1.Text = PdnResources.GetString("AutoAnalysis.Button.LoadStageConfig");
  132. button2.Text = PdnResources.GetString("AutoAnalysis.Button.ToWorkpoint");
  133. button3.Text = PdnResources.GetString("AutoAnalysis.Button.ResetStage");
  134. button4.Text = PdnResources.GetString("AutoAnalysis.Button.ExportStageConfig");
  135. button5.Text = PdnResources.GetString("AutoAnalysis.Button.Preview");
  136. button6.Text = PdnResources.GetString("AutoAnalysis.Button.Save");
  137. }
  138. #endregion
  139. #region Sample Select Button
  140. Button _last;
  141. /// <summary>
  142. /// 初始化样本按钮列表
  143. /// </summary>
  144. void InitSampleButtonList()
  145. {
  146. foreach (var s in _stageSettingList.Keys)
  147. {
  148. Append(s);
  149. }
  150. }
  151. /// <summary>
  152. /// 添加新按钮控件
  153. /// </summary>
  154. private void Append(string s)
  155. {
  156. var button = new Button();
  157. button.Text = s;
  158. button.Name = s;
  159. button.Tag = _stageSettingList[s];
  160. button.MouseDown += Button_MouseDown;
  161. panel9.Controls.Add(button);
  162. button.Dock = DockStyle.Top;
  163. }
  164. /// <summary>
  165. /// 选择样品
  166. /// </summary>
  167. private void Button_MouseDown(object sender, MouseEventArgs e)
  168. {
  169. if (_last != null) _last.FlatStyle = FlatStyle.Standard;
  170. _last = sender as Button;
  171. StageSettingNow = _last.Tag as SampleStageModel;
  172. _last.FlatStyle = FlatStyle.Flat;
  173. UpdateSmapleStageControl();
  174. }
  175. #endregion
  176. #region SampleStage
  177. void InitSmapleStageControl()
  178. {
  179. _sampleStage = new SampleStageControl();
  180. panel8.Controls.Add(_sampleStage);
  181. }
  182. private void UpdateSmapleStageControl()
  183. {
  184. _sampleStage.Visible = true;
  185. _sampleStage.Update(_stageSettingNow);
  186. }
  187. #endregion
  188. private void MeasureRange_Paint(object sender, PaintEventArgs e)
  189. {
  190. }
  191. private void btnAdd_Click(object sender, EventArgs e)
  192. {
  193. var f = new AddSampleStageDialog(_stageSettingList);
  194. f.CallBack += (s) =>
  195. {
  196. _stageSettingList.Add(s, new SampleStageModel());
  197. Append(s);
  198. };
  199. f.ShowDialog();
  200. }
  201. private void btnEdit_Click(object sender, EventArgs e)
  202. {
  203. if (_last == null)
  204. return;
  205. var f = new ModifySampleStageDialog(_stageSettingList, _last.Text);
  206. f.CallBack += (s) =>
  207. {
  208. _last.Text = s;
  209. };
  210. f.ShowDialog();
  211. }
  212. /// <summary>
  213. /// 保存
  214. /// </summary>
  215. private void button6_Click(object sender, EventArgs e)
  216. {
  217. SampleStageManager.Save(_last.Name, _last.Text, _last.Tag as SampleStageModel);
  218. MessageBox.Show("保存配置成功");
  219. }
  220. /// <summary>
  221. /// 删除
  222. /// </summary>
  223. private void btnDelete_Click(object sender, EventArgs e)
  224. {
  225. if (_last == null)
  226. return;
  227. var name = _last.Text;
  228. _stageSettingList.Remove(name);
  229. Button b = null;
  230. foreach (var c in panel9.Controls)
  231. {
  232. if ((c as Button).Text == name)
  233. b = c as Button;
  234. }
  235. panel9.Controls.Remove(b);
  236. SampleStageManager.Delete(_last.Name);
  237. _last = null;
  238. _sampleStage.Visible = false;
  239. StageSettingNow = null;
  240. }
  241. /// <summary>
  242. /// 定时器
  243. /// </summary>
  244. private void timer1_Tick(object sender, EventArgs e)
  245. {
  246. btnEdit.Enabled = _last != null;
  247. btnDelete.Enabled = _last != null;
  248. button1.Enabled = _last != null;
  249. button2.Enabled = _last != null && m_stage.IsOpen && !m_stage.IsMoving;
  250. button3.Enabled = m_stage.IsOpen && !m_stage.IsMoving;
  251. button4.Enabled = _last != null;
  252. button5.Enabled = _camera == null ? false : _camera.IsOpen();
  253. button6.Enabled = _last != null;
  254. groupBox4.Enabled = _last != null;
  255. if (_updateMesureRange)
  256. {
  257. _updateMesureRange = false;
  258. _measureRange.InitGrid(_stageSettingNow);
  259. }
  260. }
  261. /// <summary>
  262. /// 导出按钮
  263. /// </summary>
  264. /// <param name="sender"></param>
  265. /// <param name="e"></param>
  266. private void button4_Click(object sender, EventArgs e)
  267. {
  268. try
  269. {
  270. var d = new SaveFileDialog();
  271. d.Filter = "坐标文件(*.xml)|*.xml";
  272. var r = d.ShowDialog();
  273. if (r == DialogResult.OK)
  274. {
  275. var f = d.FileName;
  276. (_last.Tag as SampleStageModel).Save(f);
  277. }
  278. }
  279. catch (Exception ex)
  280. {
  281. MessageBox.Show(ex.Message);
  282. }
  283. }
  284. /// <summary>
  285. /// 载入坐标文件
  286. /// </summary>
  287. /// <param name="sender"></param>
  288. /// <param name="e"></param>
  289. private void button1_Click(object sender, EventArgs e)
  290. {
  291. var d = new OpenFileDialog();
  292. d.Filter = "坐标文件(*.xml)|*.xml";
  293. var r = d.ShowDialog();
  294. if (r != DialogResult.OK) return;
  295. var f = d.FileName;
  296. try
  297. {
  298. var set = SampleStageModel.Load(f);
  299. //范围校验
  300. bool outrange = false;
  301. var tripx = int.Parse(_loadingStageModel.TripX) / 1000;
  302. var tripy = int.Parse(_loadingStageModel.TripY) / 1000;
  303. //Min value check
  304. var value = set.WorkPoits.Min((p) => p.X) - Math.Max(set.Width, set.Diameter) / 2;
  305. outrange |= value < 0;
  306. value = set.WorkPoits.Min((p) => p.Y) - Math.Max(set.Height, set.Diameter) / 2;
  307. outrange |= value < 0;
  308. //max value check
  309. value = set.WorkPoits.Max((p) => p.X) + Math.Max(set.Width, set.Diameter) / 2;
  310. outrange |= value > tripx;
  311. value = set.WorkPoits.Max((p) => p.Y) + Math.Max(set.Height, set.Diameter) / 2;
  312. outrange |= value > tripy;
  313. if (outrange)
  314. {
  315. MessageBox.Show("测量范围超出样品台行程", "载入失败");
  316. return;
  317. }
  318. StageSettingNow = set;
  319. _last.Tag = _stageSettingNow;
  320. UpdateSmapleStageControl();
  321. }
  322. catch (Exception ex)
  323. {
  324. MessageBox.Show(ex.Message);
  325. }
  326. }
  327. #region stage
  328. /// <summary>
  329. /// 移动到工位
  330. /// </summary>
  331. private void button2_Click(object sender, EventArgs e)
  332. {
  333. try
  334. {
  335. ToWorkPoint(_sampleStage.SelectIndex);
  336. }
  337. catch { }
  338. }
  339. private void ToWorkPoint(int i)
  340. {
  341. var x = _stageSettingNow.WorkPoits[i].X * 1000;
  342. var y = _stageSettingNow.WorkPoits[i].Y * 1000;
  343. m_stage.To(x, y);
  344. }
  345. private void button3_Click(object sender, EventArgs e)
  346. {
  347. var dialog = TransferProgressDialog.CreatDialog("平台复位", "复位中...", null, "Stop");
  348. m_stage.ResetStage(
  349. () =>
  350. {
  351. this.Invoke(new Action(dialog.Close));
  352. });
  353. dialog.ShowDialog();
  354. }
  355. public void InitStage()
  356. {
  357. m_stage = AxisController.GetInstance();
  358. if (!m_stage.IsOpen)
  359. {
  360. // MessageBox.Show(PdnResources.GetString("Message.AxisController.NotConnected"));
  361. //grpWorkOperate.Enabled = false;
  362. return;
  363. }
  364. m_stage.SetWorkspeedXY();
  365. }
  366. #endregion
  367. #region Preview
  368. private ICamera _camera => CameraManager.CurrentCamera;
  369. /// <summary>
  370. /// 显示相机
  371. /// </summary>
  372. private void button5_Click(object sender, EventArgs e)
  373. {
  374. PreviewPure.StartPreiew(button5);
  375. }
  376. private Bitmap _imgNow;
  377. private AxisController m_stage;
  378. private void CallbackDraw(Bitmap obj)
  379. {
  380. CorrectPalette(ref obj);
  381. PreviewPure.ShowPrieview(obj);
  382. _imgNow = (Bitmap)obj.Clone();
  383. }
  384. private void CorrectPalette(ref Bitmap bitmap)
  385. {
  386. if (bitmap.PixelFormat == PixelFormat.Format8bppIndexed)
  387. {
  388. ColorPalette palette = bitmap.Palette;
  389. for (int i = 0; i < 256; i++)
  390. {
  391. palette.Entries[i] = Color.FromArgb(i, i, i);
  392. }
  393. bitmap.Palette = palette;
  394. }
  395. }
  396. #endregion
  397. private void textBox1_TextChanged(object sender, EventArgs e)
  398. {
  399. if (_stageSettingNow == null) return;
  400. var value = _stageSettingNow.Diameter;
  401. var r = float.TryParse(textBox1.Text, out value);
  402. if (!r) textBox1.Text = value.ToString();
  403. _stageSettingNow.Diameter = value;
  404. _updateMesureRange = true;
  405. }
  406. private void textBox2_TextChanged(object sender, EventArgs e)
  407. {
  408. if (_stageSettingNow == null) return;
  409. var value = _stageSettingNow.Width;
  410. var r = float.TryParse(textBox2.Text, out value);
  411. if (!r) textBox2.Text = value.ToString();
  412. _stageSettingNow.Width = value;
  413. _updateMesureRange = true;
  414. }
  415. private void textBox3_TextChanged(object sender, EventArgs e)
  416. {
  417. if (_stageSettingNow == null) return;
  418. var value = _stageSettingNow.Height;
  419. var r = float.TryParse(textBox3.Text, out value);
  420. if (!r) textBox3.Text = value.ToString();
  421. _stageSettingNow.Height = value;
  422. _updateMesureRange = true;
  423. }
  424. }
  425. }