using PaintDotNet; using PaintDotNet.Base.SettingModel; using PaintDotNet.Camera; using StageController; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Metis.AutoAnalysis { public partial class SampleStageManageDialog : PdnBaseForm { SampleStageControl _sampleStage; Dictionary _stageSettingList; SampleStageModel _stageSettingNow; bool _updateMesureRange = false; MeasureRangeControl _measureRange = new MeasureRangeControl(); LoadingStageModel _loadingStageModel; SampleStageModel StageSettingNow { set { _stageSettingNow = value; if (_stageSettingNow == null) { textBox1.Text = ""; textBox2.Text = ""; textBox3.Text = ""; _measureRange.Reset(); } else { textBox1.Text = _stageSettingNow.Diameter + ""; textBox2.Text = _stageSettingNow.Width + ""; textBox3.Text = _stageSettingNow.Height + ""; _updateMesureRange = true; } } } public SampleStageManageDialog() { _loadingStageModel = Startup.instance.loadingStageModel; InitializeComponent(); InitSmapleStageControl(); panel10.Controls.Add(_measureRange); _measureRange.Dock = DockStyle.Fill; panel8.SizeChanged += (s, e) => { if (_stageSettingNow != null) UpdateSmapleStageControl(); }; _measureRange.ChangeEvent += MeasureRange_ChangeEvent; } private void MeasureHorRange(int offset) { if (_stageSettingNow == null) return; var value = _stageSettingNow.Width; var r = float.TryParse(textBox2.Text, out value); value += offset; if (value <= 0) value = 1; textBox2.Text = value.ToString(); _stageSettingNow.Width = value; _updateMesureRange = true; } private void MeasureVerRange(int offset) { if (_stageSettingNow == null) return; var value = _stageSettingNow.Height; var r = float.TryParse(textBox3.Text, out value); value += offset; if (value <= 0) value = 1; textBox3.Text = value.ToString(); _stageSettingNow.Height = value; _updateMesureRange = true; } private void MeasureRange_ChangeEvent(object sender, EventArgs e) { switch (_measureRange.MovingMothed) { case MeasureRangeControl.MovingMethodEnum.Hor_Plus: MeasureHorRange(1); break; case MeasureRangeControl.MovingMethodEnum.Hor_Minus: MeasureHorRange(-1); break; case MeasureRangeControl.MovingMethodEnum.Ver_Plus: MeasureVerRange(1); break; case MeasureRangeControl.MovingMethodEnum.Ver_Minus: MeasureVerRange(-1); break; default: break; } } #region Load Close private void SampleStageManageDialog_Load(object sender, EventArgs e) { _stageSettingList = SampleStageManager.GetAll(); InitSampleButtonList(); CameraManager.FrameCallback += CallbackDraw; InitStage(); InitializeText(); } private void SampleStageManageDialog_FormClosing(object sender, FormClosingEventArgs e) { CameraManager.FrameCallback -= CallbackDraw; } void InitializeText() { this.Text = PdnResources.GetString("AutoAnalysis.StageManage"); groupBox1.Text = PdnResources.GetString("AutoAnalysis.StageManage"); groupBox3.Text = PdnResources.GetString("AutoAnalysis.WorkpointMark"); groupBox4.Text = PdnResources.GetString("AutoAnalysis.DetectRangeMark"); groupBox2.Text = PdnResources.GetString("AutoAnalysis.SameOperate"); groupBox5.Text = PdnResources.GetString("AutoAnalysis.DetectSketch"); label1.Text = PdnResources.GetString("AutoAnalysis.WorkRadius"); label2.Text = PdnResources.GetString("AutoAnalysis.WorkRange"); btnAdd.Text = PdnResources.GetString("AutoAnalysis.Button.New"); btnEdit.Text = PdnResources.GetString("AutoAnalysis.Button.Edit"); btnDelete.Text = PdnResources.GetString("AutoAnalysis.Button.Delete"); button1.Text = PdnResources.GetString("AutoAnalysis.Button.LoadStageConfig"); button2.Text = PdnResources.GetString("AutoAnalysis.Button.ToWorkpoint"); button3.Text = PdnResources.GetString("AutoAnalysis.Button.ResetStage"); button4.Text = PdnResources.GetString("AutoAnalysis.Button.ExportStageConfig"); button5.Text = PdnResources.GetString("AutoAnalysis.Button.Preview"); button6.Text = PdnResources.GetString("AutoAnalysis.Button.Save"); } #endregion #region Sample Select Button Button _last; /// /// 初始化样本按钮列表 /// void InitSampleButtonList() { foreach (var s in _stageSettingList.Keys) { Append(s); } } /// /// 添加新按钮控件 /// private void Append(string s) { var button = new Button(); button.Text = s; button.Name = s; button.Tag = _stageSettingList[s]; button.MouseDown += Button_MouseDown; panel9.Controls.Add(button); button.Dock = DockStyle.Top; } /// /// 选择样品 /// private void Button_MouseDown(object sender, MouseEventArgs e) { if (_last != null) _last.FlatStyle = FlatStyle.Standard; _last = sender as Button; StageSettingNow = _last.Tag as SampleStageModel; _last.FlatStyle = FlatStyle.Flat; UpdateSmapleStageControl(); } #endregion #region SampleStage void InitSmapleStageControl() { _sampleStage = new SampleStageControl(); panel8.Controls.Add(_sampleStage); } private void UpdateSmapleStageControl() { _sampleStage.Visible = true; _sampleStage.Update(_stageSettingNow); } #endregion private void MeasureRange_Paint(object sender, PaintEventArgs e) { } private void btnAdd_Click(object sender, EventArgs e) { var f = new AddSampleStageDialog(_stageSettingList); f.CallBack += (s) => { _stageSettingList.Add(s, new SampleStageModel()); Append(s); }; f.ShowDialog(); } private void btnEdit_Click(object sender, EventArgs e) { if (_last == null) return; var f = new ModifySampleStageDialog(_stageSettingList, _last.Text); f.CallBack += (s) => { _last.Text = s; }; f.ShowDialog(); } /// /// 保存 /// private void button6_Click(object sender, EventArgs e) { SampleStageManager.Save(_last.Name, _last.Text, _last.Tag as SampleStageModel); MessageBox.Show("保存配置成功"); } /// /// 删除 /// private void btnDelete_Click(object sender, EventArgs e) { if (_last == null) return; var name = _last.Text; _stageSettingList.Remove(name); Button b = null; foreach (var c in panel9.Controls) { if ((c as Button).Text == name) b = c as Button; } panel9.Controls.Remove(b); SampleStageManager.Delete(_last.Name); _last = null; _sampleStage.Visible = false; StageSettingNow = null; } /// /// 定时器 /// private void timer1_Tick(object sender, EventArgs e) { btnEdit.Enabled = _last != null; btnDelete.Enabled = _last != null; button1.Enabled = _last != null; button2.Enabled = _last != null && m_stage.IsOpen && !m_stage.IsMoving; button3.Enabled = m_stage.IsOpen && !m_stage.IsMoving; button4.Enabled = _last != null; button5.Enabled = _camera == null ? false : _camera.IsOpen(); button6.Enabled = _last != null; groupBox4.Enabled = _last != null; if (_updateMesureRange) { _updateMesureRange = false; _measureRange.InitGrid(_stageSettingNow); } } /// /// 导出按钮 /// /// /// private void button4_Click(object sender, EventArgs e) { try { var d = new SaveFileDialog(); d.Filter = "坐标文件(*.xml)|*.xml"; var r = d.ShowDialog(); if (r == DialogResult.OK) { var f = d.FileName; (_last.Tag as SampleStageModel).Save(f); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// /// 载入坐标文件 /// /// /// private void button1_Click(object sender, EventArgs e) { var d = new OpenFileDialog(); d.Filter = "坐标文件(*.xml)|*.xml"; var r = d.ShowDialog(); if (r != DialogResult.OK) return; var f = d.FileName; try { var set = SampleStageModel.Load(f); //范围校验 bool outrange = false; var tripx = int.Parse(_loadingStageModel.TripX) / 1000; var tripy = int.Parse(_loadingStageModel.TripY) / 1000; //Min value check var value = set.WorkPoits.Min((p) => p.X) - Math.Max(set.Width, set.Diameter) / 2; outrange |= value < 0; value = set.WorkPoits.Min((p) => p.Y) - Math.Max(set.Height, set.Diameter) / 2; outrange |= value < 0; //max value check value = set.WorkPoits.Max((p) => p.X) + Math.Max(set.Width, set.Diameter) / 2; outrange |= value > tripx; value = set.WorkPoits.Max((p) => p.Y) + Math.Max(set.Height, set.Diameter) / 2; outrange |= value > tripy; if (outrange) { MessageBox.Show("测量范围超出样品台行程", "载入失败"); return; } StageSettingNow = set; _last.Tag = _stageSettingNow; UpdateSmapleStageControl(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #region stage /// /// 移动到工位 /// private void button2_Click(object sender, EventArgs e) { try { ToWorkPoint(_sampleStage.SelectIndex); } catch { } } private void ToWorkPoint(int i) { var x = _stageSettingNow.WorkPoits[i].X * 1000; var y = _stageSettingNow.WorkPoits[i].Y * 1000; m_stage.To(x, y); } private void button3_Click(object sender, EventArgs e) { var dialog = TransferProgressDialog.CreatDialog("平台复位", "复位中...", null, "Stop"); m_stage.ResetStage( () => { this.Invoke(new Action(dialog.Close)); }); dialog.ShowDialog(); } public void InitStage() { m_stage = AxisController.GetInstance(); if (!m_stage.IsOpen) { // MessageBox.Show(PdnResources.GetString("Message.AxisController.NotConnected")); //grpWorkOperate.Enabled = false; return; } m_stage.SetWorkspeedXY(); } #endregion #region Preview private ICamera _camera => CameraManager.CurrentCamera; /// /// 显示相机 /// private void button5_Click(object sender, EventArgs e) { PreviewPure.StartPreiew(button5); } private Bitmap _imgNow; private AxisController m_stage; private void CallbackDraw(Bitmap obj) { CorrectPalette(ref obj); PreviewPure.ShowPrieview(obj); _imgNow = (Bitmap)obj.Clone(); } private void CorrectPalette(ref Bitmap bitmap) { if (bitmap.PixelFormat == PixelFormat.Format8bppIndexed) { ColorPalette palette = bitmap.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } bitmap.Palette = palette; } } #endregion private void textBox1_TextChanged(object sender, EventArgs e) { if (_stageSettingNow == null) return; var value = _stageSettingNow.Diameter; var r = float.TryParse(textBox1.Text, out value); if (!r) textBox1.Text = value.ToString(); _stageSettingNow.Diameter = value; _updateMesureRange = true; } private void textBox2_TextChanged(object sender, EventArgs e) { if (_stageSettingNow == null) return; var value = _stageSettingNow.Width; var r = float.TryParse(textBox2.Text, out value); if (!r) textBox2.Text = value.ToString(); _stageSettingNow.Width = value; _updateMesureRange = true; } private void textBox3_TextChanged(object sender, EventArgs e) { if (_stageSettingNow == null) return; var value = _stageSettingNow.Height; var r = float.TryParse(textBox3.Text, out value); if (!r) textBox3.Text = value.ToString(); _stageSettingNow.Height = value; _updateMesureRange = true; } } }