using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using OxfordExtenderWrapper; using System.Configuration; using System.Runtime.Remoting.Channels.Ipc; using System.Runtime.Remoting.Channels; using System.Drawing.Imaging; using System.Runtime.Remoting; using System.Threading; namespace OxfordExtenderWrapper { public partial class Form1 : Form { ExtenderIpcUI iExtender ; bool silentRun = false; public Form1(string[] args) { InitializeComponent(); if (args.Length > 0) { if (args[0] == "hide") { silentRun = true; } } } private void Form1_Load(object sender, EventArgs e) { OTSMeasureOutputNlog logWindow = new OTSMeasureOutputNlog(); logWindow.Show(); if (silentRun) { logWindow.Hide(); this.Hide(); } PrepareIpcServer(); if (iExtender == null) { IpcClientChannel channel = new IpcClientChannel(); //Register the channel with ChannelServices. ChannelServices.RegisterChannel(channel, false); iExtender = (ExtenderIpcUI)Activator.GetObject(typeof(ExtenderIpcUI), "ipc://ExtenderServerChannel/ExtenderIpcUI"); } } //获取电压 private void button1_Click(object sender, EventArgs e) { tBHV.Text = iExtender.GetSEMVoltage().ToString(); } //输入限制只能是数字 private void textBox_KeyPress(string text, object sender, KeyPressEventArgs e) { //允许输入数字、小数点、删除键和负号 if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != (char)('.') && e.KeyChar != (char)('-')) { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } if (e.KeyChar == (char)('-')) { if (text != "") { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } } //小数点只能输入一次 if (e.KeyChar == (char)('.') && ((TextBox)sender).Text.IndexOf('.') != -1) { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } //第一位不能为小数点 if (e.KeyChar == (char)('.') && ((TextBox)sender).Text == "") { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } //第一位是0,第二位必须为小数点 if (e.KeyChar != (char)('.') && ((TextBox)sender).Text == "0") { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } //第一位是负号,第二位不能为小数点 if (((TextBox)sender).Text == "-" && e.KeyChar == (char)('.')) { MessageBox.Show("请输入正确的数字"); text = ""; e.Handled = true; } } //设定电压 private void button2_Click(object sender, EventArgs e) { iExtender.SetSEMVoltage(float.Parse(tBHVIn.Text)); } //电压输入限制 private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBHVIn.Text, sender, e); } //获取工作距离 private void button3_Click(object sender, EventArgs e) { tBWD.Text = iExtender.GetWorkingDistance().ToString(); } //获取放大倍数 private void button4_Click(object sender, EventArgs e) { tBMag.Text = iExtender.GetMagnification().ToString(); } //获取亮度 private void button5_Click(object sender, EventArgs e) { tBBright.Text = iExtender.GetBrightness().ToString(); } //获取对比度 private void button6_Click(object sender, EventArgs e) { tBContast.Text = iExtender.GetContrast().ToString(); } //设定工作距离 private void button7_Click(object sender, EventArgs e) { iExtender.SetWorkingDistance(float.Parse(tBWDIn.Text)); } //设定放大倍数 private void button8_Click(object sender, EventArgs e) { iExtender.SetMagnification(float.Parse(tBMagIn.Text)); } //设定亮度 private void button9_Click(object sender, EventArgs e) { iExtender.SetBrightness(float.Parse(tBrightIn.Text)); } //设定对比度 private void button10_Click(object sender, EventArgs e) { iExtender.SetContrast(float.Parse(tBContrastIn.Text)); } private void tBWDIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBWDIn.Text, sender, e); } private void tBMagIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBMagIn.Text, sender, e); } private void tBrightIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBrightIn.Text, sender, e); } private void tBContrastIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBContrastIn.Text, sender, e); } //获取X private void button11_Click(object sender, EventArgs e) { tBX.Text = iExtender.GetStageAtX().ToString(); } //获取Y private void button12_Click(object sender, EventArgs e) { tBY.Text = iExtender.GetStageAtY().ToString(); } //获取Z private void button13_Click(object sender, EventArgs e) { tBZ.Text = iExtender.GetStageAtZ().ToString(); } //获取T private void button14_Click(object sender, EventArgs e) { tBT.Text = iExtender.GetStageAtT().ToString(); } //获取R private void button15_Click(object sender, EventArgs e) { tBR.Text = iExtender.GetStageAtR().ToString(); } //获取全部 private void button21_Click(object sender, EventArgs e) { tBX.Text = iExtender.GetStageAtX().ToString(); tBY.Text = iExtender.GetStageAtY().ToString(); tBZ.Text = iExtender.GetStageAtZ().ToString(); tBT.Text = iExtender.GetStageAtT().ToString(); tBR.Text = iExtender.GetStageAtR().ToString(); } //设定XY private void button22_Click(object sender, EventArgs e) { iExtender.MoveStageXY(float.Parse(tBXIn.Text), float.Parse(tBYIn.Text)); } //设定全部 private void button23_Click(object sender, EventArgs e) { float[] pos = new float[5]; pos[0] = float.Parse(tBXIn.Text); pos[1] = float.Parse(tBYIn.Text); pos[2] = float.Parse(tBZIn.Text); pos[3] = float.Parse(tBTIn.Text); pos[4] = float.Parse(tBRIn.Text); iExtender.SetStagePosition(pos); } //设定X private void button16_Click(object sender, EventArgs e) { var x = float.Parse(tBXIn.Text); var y = float.Parse(tBYIn.Text); iExtender.MoveStageXY(x, y); } //设定Y private void button17_Click(object sender, EventArgs e) { iExtender.SetStageGotoY(float.Parse(tBYIn.Text)); } //设定Z private void button18_Click(object sender, EventArgs e) { iExtender.SetStageGotoZ(float.Parse(tBZIn.Text)); } //设定T private void button19_Click(object sender, EventArgs e) { iExtender.SetStageGotoT(float.Parse(tBTIn.Text)); } //设定R private void button20_Click(object sender, EventArgs e) { iExtender.SetStageGotoR(float.Parse(tBRIn.Text)); } private void tBXIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBXIn.Text, sender, e); } private void tBYIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBYIn.Text, sender, e); } private void tBZIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBZIn.Text, sender, e); } private void tBTIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBTIn.Text, sender, e); } private void tBRIn_KeyPress(object sender, KeyPressEventArgs e) { textBox_KeyPress(tBRIn.Text, sender, e); } Bitmap ToGrayBitmap(byte[] data, int width, int height) { // 申请目标位图的变量,并将其内存区域锁定 Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); //BitmapData这部分内容 需要 using System.Drawing.Imaging; BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); // 获取图像参数 // 扫描线的宽度 int stride = bmpData.Stride; // 显示宽度与扫描线宽度的间隙 int offset = stride - width; // 获取bmpData的内存起始位置 IntPtr iptr = bmpData.Scan0; // 用stride宽度,表示这是内存区域的大小 int scanBytes = stride * height; // 下面把原始的显示大小字节数组转换为内存中实际存放的字节数组 int posScan = 0; int posReal = 0;// 分别设置两个位置指针,指向源数组和目标数组 byte[] pixelValues = new byte[scanBytes]; //为目标数组分配内存 for (int x = 0; x < height; x++) { int startIndex = x * width; //// 下面的循环节是模拟行扫描 for (int y = 0; y < width; y++) { pixelValues[posScan++] = data[posReal++]; } posScan += offset; //行扫描结束,要将目标位置指针移过那段“间隙” } // 用Marshal的Copy方法,将刚才得到的内存字节数组复制到BitmapData中 System.Runtime.InteropServices.Marshal.Copy(pixelValues, 0, iptr, scanBytes); bmp.UnlockBits(bmpData); // 解锁内存区域 // 下面的代码是为了修改生成位图的索引表,从伪彩修改为灰度 ColorPalette tempPalette; using (Bitmap tempBmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed)) { tempPalette = tempBmp.Palette; } for (int i = 0; i < 256; i++) { tempPalette.Entries[i] = Color.FromArgb(i, i, i); } bmp.Palette = tempPalette; return bmp; } private void button24_Click(object sender, EventArgs e) { try { string path = System.Environment.CurrentDirectory; ImageAquistionParam p = new ImageAquistionParam(); p.height = Convert.ToInt32(txtBSEHeight.Text); p.width = Convert.ToInt32(txtBSEWidth.Text); p.DwellTime = Convert.ToInt32(txtBSEDwell.Text); if (cboSource.Text == "BSE") { p.sourceType = ExtenderIpcUI.ImageInputSourceType.Bse; } else { p.sourceType = ExtenderIpcUI.ImageInputSourceType.SE; } p.ImageData = new byte[0]; var tr = new Thread(() => { iExtender.AquisitionImage(ref p); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } var m_Bitmap = ToGrayBitmap(p.ImageData, p.width, p.height); if (m_Bitmap != null) { pBImage.Image = m_Bitmap; } } catch (Exception r) { MessageBox.Show(r.Message); } // 图像对象 } //点采集 private void button25_Click(object sender, EventArgs e) { if (iExtender.DImagePixelsize == 0) { MessageBox.Show("Please take the Image first!"); return; } Dictionary listElement = new Dictionary(); PointXrayParam p = new PointXrayParam(); p.x = Convert.ToInt32(txtpx1.Text); p.y = Convert.ToInt32(txtpy1.Text); p.XrayData= new uint[2000]; p.listElement = listElement; p.dMilliSecondsTime = 500; p.b_quant = true; var tr = new Thread(() => { iExtender.XrayPointCollecting(ref p); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } ShowData(p.XrayData,p. listElement); } void ShowData(uint[] XrayData, Dictionary listElement) { Series series = chart1.Series[0]; series.Points.Clear(); for (int i = 0; i < 2000; i++) { series.Points.AddXY(i, XrayData[i]); } this.dataGridView1.Rows.Clear(); int index = 0; var ie = listElement.GetEnumerator(); while (ie.MoveNext()) { this.dataGridView1.Rows.Add(); this.dataGridView1.Rows[index].Cells[0].Value = ie.Current.Key; this.dataGridView1.Rows[index].Cells[1].Value = ie.Current.Value; index++; } } void ShowReadData(long[] XrayData) { Series series = chart1.Series[1]; series.Points.Clear(); for (int i = 0; i < 2000; i++) { series.Points.AddXY(i, XrayData[i]); } } //面采集 private void button26_Click(object sender, EventArgs e) { if (iExtender.DImagePixelsize == 0) { MessageBox.Show("Please take the Image first!"); return; } long[] XrayData = new long[2000]; Dictionary listElement = new Dictionary(); List listSeg = new List(); Segment seg1 = new Segment(); seg1.X = 1; seg1.Y = 1; seg1.Length = 10; listSeg.Add(seg1); Segment seg2 = new Segment(); seg2.X = 1; seg2.Y = 10; seg2.Length = 10; listSeg.Add(seg2); AreaXrayParam p = new AreaXrayParam(); p.a_listChord = listSeg; p.dMilliSecondsTime = 500; p.XrayData = new uint[2000]; p.listElement = listElement; p.b_quant = true; var tr = new Thread(() => { iExtender.XrayAreaCollecting(ref p); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } ShowData(p.XrayData, p.listElement); } private void btnTest_Click(object sender, EventArgs e) { if (iExtender.DImagePixelsize == 0) { MessageBox.Show("Please take the Image first!"); return; } List listPoints = new List(); listPoints.Add(new Point(Convert.ToInt32(txtpx1.Text), Convert.ToInt32(txtpy1.Text))); listPoints.Add(new Point(Convert.ToInt32(txtpx2.Text), Convert.ToInt32(txtpy2.Text))); listPoints.Add(new Point(Convert.ToInt32(txtpx3.Text), Convert.ToInt32(txtpy3.Text))); listPoints.Add(new Point(Convert.ToInt32(txtpx4.Text), Convert.ToInt32(txtpy4.Text))); listPoints.Add(new Point(Convert.ToInt32(txtpx5.Text), Convert.ToInt32(txtpy5.Text))); List points = new List(); //点扫描数据存储 for(int i=0;i { //Your code here iExtender.CollectXrayByPoints(ref points, 100, true); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } ShowData(points[0].XrayData, points[0].listElement); } List pname = new List(); public static void PrepareIpcServer() { //Instantiate our server channel. IpcServerChannel channel = new IpcServerChannel("ExtenderServerChannel"); //Register the server channel. ChannelServices.RegisterChannel(channel, false); //Register this service type. RemotingConfiguration.RegisterWellKnownServiceType(typeof(ExtenderIpcUI), "ExtenderIpcUI", WellKnownObjectMode.Singleton); } private void button27_Click(object sender, EventArgs e) { try { iExtender.SetSemScanExternal(false); } catch (Exception x) { MessageBox.Show("oxford 控制失败" + x.Message); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //窗体关闭原因为单击"关闭"按钮或Alt+F4 if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; //取消关闭操作 表现为不关闭窗体 this.Hide(); //隐藏窗体 } //if (iExtender != null) //{ // iExtender.CloseExtender(); //} } private void button29_Click(object sender, EventArgs e) { if (iExtender.DImagePixelsize == 0) { MessageBox.Show("Please take the Image first!"); return; } Dictionary listElement = new Dictionary(); Segment seg1 = new Segment(); seg1.X = Convert.ToInt32(textRegionX1.Text); seg1.Y = Convert.ToInt32(textRegionY1.Text); seg1.Length = Convert.ToInt32(textRegionwidth1.Text); int h = Convert.ToInt32(textRegionHeight.Text); List listSeg = new List(); for (int i = 0; i < h; i++) { Segment seg2 = new Segment(); seg2.X = seg1.X; seg2.Y = seg1.Y + i; seg2.Length = seg1.Length; listSeg.Add(seg2); } var fea = new AreaXrayParam(); fea.a_listChord = listSeg; fea.dMilliSecondsTime = Convert.ToInt32(textTime.Text); fea.b_quant = true; var tr = new Thread(() => { iExtender.XrayAreaCollecting(ref fea); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } ShowData(fea.XrayData, fea.listElement); } private void button28_Click(object sender, EventArgs e) { if (iExtender.DImagePixelsize == 0) { MessageBox.Show("Please take the Image first!"); return; } List> listFeature = new List>(); List ls = new List(); Segment sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea1x1.Text); sgt.Y = Convert.ToInt32(txtarea1y1.Text); sgt.Length = Convert.ToInt32(txtarea1l1.Text); ls.Add(sgt); sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea1x2.Text); sgt.Y = Convert.ToInt32(txtarea1y2.Text); sgt.Length = Convert.ToInt32(txtarea1l2.Text); ls.Add(sgt); sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea1x3.Text); sgt.Y = Convert.ToInt32(txtarea1y3.Text); sgt.Length = Convert.ToInt32(txtarea1l3.Text); ls.Add(sgt); listFeature.Add(ls); ls = new List(); sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea2x1.Text); sgt.Y = Convert.ToInt32(txtarea2y1.Text); sgt.Length = Convert.ToInt32(txtarea2l1.Text); ls.Add(sgt); sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea2x2.Text); sgt.Y = Convert.ToInt32(txtarea2y2.Text); sgt.Length = Convert.ToInt32(txtarea2l2.Text); ls.Add(sgt); sgt = new Segment(); sgt.X = Convert.ToInt32(txtarea2x3.Text); sgt.Y = Convert.ToInt32(txtarea2y3.Text); sgt.Length = Convert.ToInt32(txtarea2l3.Text); ls.Add(sgt); listFeature.Add(ls); //面扫描数据存储 var features = new List(); foreach (List listSeg in listFeature) { var p = new AreaXrayParam(); p.dMilliSecondsTime = 100; p.a_listChord = listSeg; p.b_quant = true; features.Add(p); } var tr = new Thread(() => { //Your code here iExtender.CollectXrayByFeatures(ref features, 100, true); } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } ShowData(features[0].XrayData, features[0].listElement); } private void 显示ToolStripMenuItem_Click(object sender, EventArgs e) { this.Show();//窗体显示 this.WindowState = FormWindowState.Normal; //窗体状态默认大小 this.Activate(); //激活窗体给予焦点 } private void 隐藏ToolStripMenuItem_Click(object sender, EventArgs e) { this.Hide(); //隐藏窗体} } private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { //点击"是(YES)"退出程序 if (MessageBox.Show("确定要退出程序?", "安全提示", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes) { notifyIcon_wrapper.Visible = false; //设置图标不可见 this.Close(); //关闭窗体 this.Dispose(); //释放资源 Application.Exit(); //关闭应用程序窗体 } } public void appExit() { notifyIcon_wrapper.Visible = false; //设置图标不可见 this.Close(); //关闭窗体 this.Dispose(); //释放资源 Application.Exit(); } private void notifyIcon_wrapper_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { this.Visible = true; //窗体可见 this.WindowState = FormWindowState.Normal; //窗体默认大小 this.notifyIcon_wrapper.Visible = true; //设置图标可见 } } private void btnConn_Click(object sender, EventArgs e) { try { var tr = new Thread(() => { if (iExtender.ConnectToEDSHardware()) { MessageBox.Show("连接成功"); } else { MessageBox.Show("连接失败"); } } ); tr.IsBackground = true; tr.Start(); while (tr.IsAlive) { Application.DoEvents(); } } catch (Exception x) { MessageBox.Show("oxford 控制失败" + x.Message); } } } }