| LB_SmartVision/Forms/Pages/CameraPage/CreateCameraForm.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| LB_SmartVision/ProcessRun/ProcessContext.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| LB_VisionFlowNode/IFlowContext.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| LB_VisionProcesses/Cameras/2DCameraForm.Designer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| LB_VisionProcesses/Cameras/2DCameraForm.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| LB_VisionProcesses/Cameras/HRCamera.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
LB_SmartVision/Forms/Pages/CameraPage/CreateCameraForm.cs
@@ -27,7 +27,7 @@ // ç¦æ¢ä¿®æ¹çªå£å¤§å° this.FormBorderStyle = FormBorderStyle.FixedDialog; if (camera == null) //camera = new HRCamera(); camera = new HRCamera(); uiButtonCreate.Enabled = false; } @@ -96,7 +96,7 @@ switch (brand) { case CameraBrand.HRCamera: //camera = new HRCamera(); camera = new HRCamera(); break; case CameraBrand.LBCamera: //camera = new LBCamera(); LB_SmartVision/ProcessRun/ProcessContext.cs
@@ -533,6 +533,18 @@ } } #region 注åå·¥å ·äºä»¶ [Node("ç¸æºåå¾", "ååå·¥å ·", "Basic", "ç¸æºåå¾")] public void ç¸æºåå¾(FlowNode node) { RunNodeAsync(node); } #endregion [Node("å¼å§", "æ§å¶", "Logic", "å¼å§")] public override void å¼å§(FlowNode node) { LB_VisionFlowNode/IFlowContext.cs
@@ -1,6 +1,7 @@ using LB_VisionProcesses; using System; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Text.Json.Nodes; @@ -20,7 +21,7 @@ public string Group { get; set; } public string Description { get; set; } } public abstract class IFlowContext public class IFlowContext { public readonly Dictionary<string, MethodInfo> _nodeMethods = new Dictionary<string, MethodInfo>(); @@ -31,33 +32,10 @@ public readonly Dictionary<string, Func<FlowNode, bool>> _nodeDelegates = new Dictionary<string, Func<FlowNode, bool>>(); // èªå¨çæçæä»¶èç¹æ¹æ³ä¿¡æ¯ public readonly Dictionary<string, PluginNodeMethodInfo> _pluginNodeMethods = new Dictionary<string, PluginNodeMethodInfo>(); // å¨ææ¹æ³çå è£ ï¼ç¨äºæ¨¡æMethodInfoï¼ private readonly Dictionary<string, DynamicMethodWrapper> _dynamicMethodWrappers = new Dictionary<string, DynamicMethodWrapper>(); // æ¯å¦å·²èªå¨çææä»¶èç¹ private bool _pluginNodesGenerated = false; // å¨ææ¹æ³å è£ ç±» public class DynamicMethodWrapper { public string DisplayName { get; set; } public string Category { get; set; } public string Group { get; set; } public string Description { get; set; } public Func<FlowNode, bool> Execute { get; set; } // 模æMethodInfoçå¿ è¦å±æ§ public string Name => DisplayName; } public void InitializeMethods() { // 1. å å¤çèªèº«çNodeç¹æ§æ¹æ³ var methods = GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (var method in methods) { var nodeAttr = method.GetCustomAttribute<NodeAttribute>(); @@ -74,269 +52,28 @@ _groupedMethods[nodeAttr.Group].Add(method); } } // 2. èªå¨ä¸ºIProcesså·¥å ·çæå¨æèç¹æ¹æ³ GeneratePluginNodeMethods(); } /// <summary> /// èªå¨ä¸ºIProcesså·¥å ·çæèç¹æ¹æ³ï¼æ ¸å¿æ¹æ³ï¼ /// </summary> private void GeneratePluginNodeMethods() { if (_pluginNodesGenerated) return; try { // ç¡®ä¿IProcessçæä»¶ç®¡çå¨å·²åå§å if (IProcess.dicProcesses == null || IProcess.dicProcesses.Count == 0) { var _ = IProcess.dicProcesses; // 触ååå§å } // æ¸ ç©ºç°æçæä»¶èç¹æ¹æ³ _pluginNodeMethods.Clear(); _dynamicMethodWrappers.Clear(); // éåææIProcesså·¥å · foreach (var processKvp in IProcess.dicProcesses) { string toolName = processKvp.Key; string className = processKvp.Value; // è·åå·¥å ·çåç±» string category = GetCategoryForTool(toolName); string group = GetGroupForCategory(category); // æ ¹æ®å类确å®ç» string description = $"{toolName}"; // å建æä»¶èç¹æ¹æ³ä¿¡æ¯ var pluginNode = new PluginNodeMethodInfo { DisplayName = toolName, FullTypeName = className, Category = category, Group = group, Description = description }; _pluginNodeMethods[toolName] = pluginNode; // åå»ºå¨ææ§è¡å§æ Func<FlowNode, bool> executeDelegate = (node) => { try { // å建IProcesså®ä¾ IProcess process = IProcess.CreateProcess(toolName); if (process == null) { Debug.WriteLine($"æ æ³åå»ºå·¥å ·å®ä¾: {toolName}"); node.Result = false; return false; } // åå§åè¿è¡åæ° process.InitRunParams(); // æ§è¡å·¥å ·çRunæ¹æ³ bool runResult = process.Run(); // 设置èç¹ç»æ node.Result = runResult; node.BranchIndex = "0"; // é»è®¤åæ¯ // éæ¾èµæº process.Dispose(); Debug.WriteLine($"æä»¶å·¥å · {toolName} æ§è¡å®æï¼ç»æ: {runResult}"); return runResult; } catch (Exception ex) { Debug.WriteLine($"æä»¶å·¥å · {toolName} æ§è¡å¤±è´¥: {ex.Message}"); node.Result = false; return false; } }; // åå»ºå¨ææ¹æ³å è£ var dynamicMethod = new DynamicMethodWrapper { DisplayName = toolName, Category = category, Group = group, Description = description, Execute = executeDelegate }; _dynamicMethodWrappers[description] = dynamicMethod; // ********** å ³é®ï¼å°å¨ææ¹æ³æ·»å å°_nodeMethodså_groupedMethods ********** // æ¹å¼ï¼çæå¨æMethodInfoï¼ä½¿ç¨Emitï¼ï¼æè 模æï¼è¿éç¨Emitçæçå®çMethodInfoï¼ MethodInfo dynamicMethodInfo = CreateDynamicMethod(toolName, group, description); // æ·»å å°_nodeMethodsï¼é®æ¯descriptionï¼ _nodeMethods[description] = dynamicMethodInfo; // æ·»å å°_groupedMethods if (!_groupedMethods.ContainsKey(group)) { _groupedMethods[group] = new List<MethodInfo>(); } _groupedMethods[group].Add(dynamicMethodInfo); // æ·»å å°_nodeDelegates _nodeDelegates[description] = executeDelegate; Debug.WriteLine($"èªå¨çææä»¶èç¹: {toolName} (åç±»: {category}, ç»: {group})"); } _pluginNodesGenerated = true; } catch (Exception ex) { Debug.WriteLine($"èªå¨çææä»¶èç¹æ¹æ³å¤±è´¥: {ex.Message}"); } } /// <summary> /// 使ç¨Reflection.Emitçæå¨æMethodInfoï¼æ¨¡æNodeç¹æ§æ¹æ³ /// </summary> /// <param name="toolName">å·¥å ·åç§°</param> /// <param name="group">ç»å</param> /// <param name="description">æè¿°</param> /// <returns>卿çæçMethodInfo</returns> private MethodInfo CreateDynamicMethod(string toolName, string group, string description) { // 1. å®ä¹å¨ææ¹æ³çåæ°åè¿åç±»å Type flowNodeType = typeof(FlowNode); DynamicMethod dynamicMethod = new DynamicMethod( toolName, // æ¹æ³å typeof(void), // è¿åç±»åï¼ååæNodeæ¹æ³ä¸è´ï¼ new[] { typeof(FlowNode) }, // åæ°ç±»å GetType(), // æå±ç±»å true); // è·³è¿JITå¯è§æ§æ£æ¥ // 2. çæIL代ç ï¼è°ç¨å¨æå§æ ILGenerator il = dynamicMethod.GetILGenerator(); // å è½½åæ°ï¼FlowNodeï¼ il.Emit(OpCodes.Ldarg_1); // 注æï¼å®ä¾æ¹æ³ç第ä¸ä¸ªåæ°æ¯thisï¼Ldarg_0ï¼ï¼è¿éå¨ææ¹æ³æ¯éæçï¼æä»¥Ldarg_0æ¯FlowNode // è°ç¨å§æï¼è¿éç®åï¼ç´æ¥è®¾ç½®Result为trueï¼ il.Emit(OpCodes.Ldflda, flowNodeType.GetProperty("Result").GetSetMethod()); il.Emit(OpCodes.Ldc_I4_1); il.Emit(OpCodes.Callvirt, flowNodeType.GetProperty("Result").GetSetMethod()); // 设置BranchIndex il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldflda, flowNodeType.GetProperty("BranchIndex").GetSetMethod()); il.Emit(OpCodes.Ldstr, "0"); il.Emit(OpCodes.Callvirt, flowNodeType.GetProperty("BranchIndex").GetSetMethod()); // è¿å il.Emit(OpCodes.Ret); // 3. å°DynamicMethodå è£ ä¸ºMethodInfoï¼DynamicMethodç»§æ¿èªMethodInfoï¼ return dynamicMethod; } /// <summary> /// æ ¹æ®å·¥å ·åç§°æ¨æåç±»ï¼å®åé»è¾ï¼ /// </summary> private string GetCategoryForTool(string toolName) { if (string.IsNullOrWhiteSpace(toolName)) return "æªåç±»"; toolName = toolName.ToLower(); if (toolName.Contains("ç¸æº") || toolName.Contains("åå¾")) return "ç¸æºå·¥å ·"; else if (toolName.Contains("é讯") || toolName.Contains("command")) return "éè®¯å·¥å ·"; else if (toolName.Contains("opencvsharp")) return "OpencvSharpç®æ³"; else if (toolName.Contains("halcon")) return "Halconç®æ³"; else if (toolName.Contains("yolo") || toolName.Contains("tensorrt") || toolName.Contains("ocr") || toolName.Contains("deeplearning") || toolName.Contains("大模å")) return "深度å¦ä¹ "; else if (toolName.Contains("å¾åå¤ç") || toolName.Contains("ç¹äº") || toolName.Contains("线线交ç¹")) return "å¾åå¤çå·¥å ·"; else if (toolName.Contains("æµè¯") || toolName.Contains("æ£æ¥") || toolName.Contains("端å£") || toolName.Contains("å±å¹") || toolName.Contains("å·¥åº") || toolName.Contains("转产")) return "èªå®ä¹å·¥å ·"; else if (toolName.Contains("èæ¬") || toolName.Contains("忝") || toolName.Contains("å»¶æ¶") || toolName.Contains("ç»å¶")) return "å·¥å ·"; else if (toolName.Contains("åºå®è·é") || toolName.Contains("fixture")) return "å·¥å ·"; else return "æä»¶å·¥å ·"; } /// <summary> /// æ ¹æ®å类确å®ç»å /// </summary> private string GetGroupForCategory(string category) { switch (category) { case "éè®¯å·¥å ·": return "Basic"; case "ç®æ³": return "Basic"; case "深度å¦ä¹ ": return "Basic"; case "å¾åå¤çå·¥å ·": return "Basic"; case "èªå®ä¹å·¥å ·": return "Basic"; case "å·¥å ·": return "Basic"; default: return "Plugin"; } } public void InitializeDelegates() { // 1. å¤çèªèº«çNodeæ¹æ³ foreach (var kvp in _nodeMethods) { var method = kvp.Value; var parameters = method.GetParameters(); //妿æ¯å¨ææ¹æ³ï¼DynamicMethodï¼ï¼è·³è¿ï¼å·²ç»å¨GeneratePluginNodeMethods䏿·»å äºå§æï¼ if (method is DynamicMethod) { // ä»å¨ææ¹æ³å è£ ä¸è·å对åºçå§æ if (_dynamicMethodWrappers.TryGetValue(kvp.Key, out var wrapper)) { // ç´æ¥ä½¿ç¨å è£ ä¸çExecuteå§æ _nodeDelegates[kvp.Key] = wrapper.Execute; } else { // å¦ææ²¡ææ¾å°å è£ ï¼å建ä¸ä¸ªé»è®¤çæ§è¡å§æ _nodeDelegates[kvp.Key] = (node) => { Debug.WriteLine($"æ§è¡å¨ææ¹æ³: {kvp.Key}"); node.Result = true; node.BranchIndex = "0"; return true; }; } continue; } if (parameters.Length == 0) { // æ åæ°æ¹æ³ var action = (Action)Delegate.CreateDelegate(typeof(Action), this, method); _nodeDelegates[kvp.Key] = (node) => { action(); return node.Result; }; } else if (parameters.Length == 1 && parameters[0].ParameterType == typeof(FlowNode)) { // 带FlowNodeåæ°çæ¹æ³ var action = (Action<FlowNode>)Delegate.CreateDelegate(typeof(Action<FlowNode>), this, method); _nodeDelegates[kvp.Key] = (node) => { action(node); return node.Result; }; } } // 2. ç¡®ä¿å¨ææ¹æ³çå§æå·²æ·»å ï¼GeneratePluginNodeMethodsä¸å·²å¤çï¼ } public virtual bool ExecuteNode(FlowNode node) @@ -344,7 +81,7 @@ if (string.IsNullOrEmpty(node.Description)) return false; // ä¼å æ£æ¥å¨æå§æ // 使ç¨å§æç¼åï¼é¿å åå°å¼é if (_nodeDelegates.TryGetValue(node.Description, out var nodeDelegate)) { try @@ -358,7 +95,6 @@ } } // å ¼å®¹åæé»è¾ return false; } @@ -370,7 +106,7 @@ ); } // è·åæç»åç»çå¯ç¨èç¹ï¼å å«å¨æçæçæä»¶èç¹ï¼ // è·åæç»åç»çå¯ç¨èç¹ public Dictionary<string, List<ToolStripMenuItem>> GetGroupedMenuItems(EventHandler clickHandler) { var groupedMenuItems = new Dictionary<string, List<ToolStripMenuItem>>(); @@ -381,30 +117,12 @@ foreach (var method in group.Value) { string menuText; string toolTip; // 夿æ¯éææ¹æ³è¿æ¯å¨ææ¹æ³ if (method is DynamicMethod dynamicMethod) { // å¨ææ¹æ³ï¼æä»¶å·¥å ·ï¼ var pluginNode = _pluginNodeMethods.Values.FirstOrDefault(p => p.DisplayName == dynamicMethod.Name); menuText = pluginNode?.DisplayName ?? dynamicMethod.Name; toolTip = pluginNode?.Description ?? $"å¨æå·¥å ·: {dynamicMethod.Name}"; } else { // éææ¹æ³ï¼åæNodeç¹æ§æ¹æ³ï¼ var nodeAttr = method.GetCustomAttribute<NodeAttribute>(); menuText = nodeAttr?.Name ?? method.Name; toolTip = nodeAttr?.Description ?? method.Name; } var menuItem = new ToolStripMenuItem { Text = menuText, Tag = menuText, // åå¨æè¿°ä½ä¸ºæ è¯ ToolTipText = toolTip Text = nodeAttr.Name, Tag = nodeAttr.Description, // åå¨æè¿°ä½ä¸ºæ è¯ ToolTipText = nodeAttr.Description }; if (clickHandler != null) @@ -421,17 +139,15 @@ return groupedMenuItems; } // è·åæç±»å«åç»çèå项ï¼å å«å¨æçæçæä»¶èç¹ï¼ // è·åæç±»å«åç»çèå项 public Dictionary<string, List<ToolStripMenuItem>> GetCategorizedMenuItems(EventHandler clickHandler) { var categorizedMethods = new Dictionary<string, List<MethodInfo>>(); // 1. å¤çåæNodeæ¹æ³ foreach (var method in _nodeMethods.Values.Where(m => !(m is DynamicMethod))) foreach (var method in _nodeMethods.Values) { var nodeAttr = method.GetCustomAttribute<NodeAttribute>(); if (nodeAttr == null) continue; if (!categorizedMethods.ContainsKey(nodeAttr.Category)) { categorizedMethods[nodeAttr.Category] = new List<MethodInfo>(); @@ -439,54 +155,20 @@ categorizedMethods[nodeAttr.Category].Add(method); } // 2. å¤ç卿æä»¶æ¹æ³ foreach (var pluginNode in _pluginNodeMethods.Values) { if (!categorizedMethods.ContainsKey(pluginNode.Category)) { categorizedMethods[pluginNode.Category] = new List<MethodInfo>(); } // æ¾å°å¯¹åºç卿MethodInfo var dynamicMethod = _nodeMethods.Values .OfType<DynamicMethod>() .FirstOrDefault(m => m.Name == pluginNode.DisplayName); if (dynamicMethod != null) { categorizedMethods[pluginNode.Category].Add(dynamicMethod); } } // çæèå项 var categorizedMenuItems = new Dictionary<string, List<ToolStripMenuItem>>(); foreach (var category in categorizedMethods) { var menuItems = new List<ToolStripMenuItem>(); foreach (var method in category.Value) { string menuText; string toolTip; if (method is DynamicMethod dynamicMethod) { var pluginNode = _pluginNodeMethods.Values.FirstOrDefault(p => p.DisplayName == dynamicMethod.Name); menuText = pluginNode?.DisplayName ?? dynamicMethod.Name; toolTip = pluginNode?.Description ?? $"å¨æå·¥å ·: {dynamicMethod.Name}"; } else { var nodeAttr = method.GetCustomAttribute<NodeAttribute>(); menuText = nodeAttr?.Name ?? method.Name; toolTip = $"{nodeAttr?.Group} - {nodeAttr?.Description}"; } var menuItem = new ToolStripMenuItem { Text = menuText, Tag = menuText, ToolTipText = toolTip Text = nodeAttr.Name, Tag = nodeAttr.Description, ToolTipText = $"{nodeAttr.Group} - {nodeAttr.Description}" }; if (clickHandler != null) @@ -503,7 +185,6 @@ return categorizedMenuItems; } // åæNodeæ¹æ³ [Node("å¼å§", "æ§å¶", "Logic", "å¼å§")] public virtual void å¼å§(FlowNode node) { node.Result = true; } @@ -538,7 +219,6 @@ [Node("å¹¶è¡åæ¯ç»æ", "æ§å¶", "Logic", "å¹¶è¡åæ¯ç»æ")] public virtual void å¹¶è¡åæ¯ç»æ(FlowNode node) { node.Result = true; } } public class FlowContext : IFlowContext { /// <summary> @@ -573,9 +253,11 @@ public FlowContext() { //GenerateFixedNodeMethods(); InitializeMethods(); InitializeDelegates(); } // ç»ä¸ç卿èç¹æ§è¡è¾ 婿¹æ³ï¼å¯éï¼ private void RunNodeAsync(FlowNode node) @@ -672,9 +354,6 @@ } } // ä¿çåææµè¯æ¹æ³ï¼å¯éï¼ä¹å¯ä»¥ç§»é¤ï¼ç±å¨æçææ¿ä»£ï¼ [Node("æµè¯å·¥å ·", "ç®æ³", "Basic", "æµè¯å·¥å ·")] public void æµè¯å·¥å ·(FlowNode node) { RunNodeAsync(node); } } } LB_VisionProcesses/Cameras/2DCameraForm.Designer.cs
@@ -104,18 +104,20 @@ // cmbBrand.Dock = DockStyle.Fill; cmbBrand.FormattingEnabled = true; cmbBrand.Location = new Point(53, 3); cmbBrand.Location = new Point(68, 4); cmbBrand.Margin = new Padding(4); cmbBrand.Name = "cmbBrand"; cmbBrand.Size = new Size(297, 25); cmbBrand.Size = new Size(381, 28); cmbBrand.TabIndex = 0; // // cmbSN // cmbSN.Dock = DockStyle.Fill; cmbSN.FormattingEnabled = true; cmbSN.Location = new Point(53, 3); cmbSN.Location = new Point(68, 4); cmbSN.Margin = new Padding(4); cmbSN.Name = "cmbSN"; cmbSN.Size = new Size(297, 25); cmbSN.Size = new Size(381, 28); cmbSN.TabIndex = 1; cmbSN.SelectedIndexChanged += cmbSN_SelectedIndexChanged; cmbSN.MouseDown += cmbSN_MouseDown; @@ -124,9 +126,10 @@ // label1.AutoSize = true; label1.Dock = DockStyle.Fill; label1.Location = new Point(3, 0); label1.Location = new Point(4, 0); label1.Margin = new Padding(4, 0, 4, 0); label1.Name = "label1"; label1.Size = new Size(44, 34); label1.Size = new Size(56, 39); label1.TabIndex = 2; label1.Text = "åç"; label1.TextAlign = ContentAlignment.MiddleCenter; @@ -135,9 +138,10 @@ // label2.AutoSize = true; label2.Dock = DockStyle.Fill; label2.Location = new Point(3, 0); label2.Location = new Point(4, 0); label2.Margin = new Padding(4, 0, 4, 0); label2.Name = "label2"; label2.Size = new Size(44, 34); label2.Size = new Size(56, 39); label2.TabIndex = 3; label2.Text = "SN"; label2.TextAlign = ContentAlignment.MiddleCenter; @@ -146,9 +150,10 @@ // btnStartGrab.Dock = DockStyle.Fill; btnStartGrab.ForeColor = SystemColors.ControlText; btnStartGrab.Location = new Point(91, 3); btnStartGrab.Location = new Point(117, 4); btnStartGrab.Margin = new Padding(4); btnStartGrab.Name = "btnStartGrab"; btnStartGrab.Size = new Size(82, 28); btnStartGrab.Size = new Size(105, 31); btnStartGrab.TabIndex = 5; btnStartGrab.Text = "è¿ç»éé"; btnStartGrab.UseVisualStyleBackColor = true; @@ -158,9 +163,10 @@ // btnCloseGrab.Dock = DockStyle.Fill; btnCloseGrab.ForeColor = SystemColors.Desktop; btnCloseGrab.Location = new Point(179, 3); btnCloseGrab.Location = new Point(230, 4); btnCloseGrab.Margin = new Padding(4); btnCloseGrab.Name = "btnCloseGrab"; btnCloseGrab.Size = new Size(82, 28); btnCloseGrab.Size = new Size(105, 31); btnCloseGrab.TabIndex = 6; btnCloseGrab.Text = "å ³ééé"; btnCloseGrab.UseVisualStyleBackColor = true; @@ -170,9 +176,10 @@ // btnGrabOnce.Dock = DockStyle.Fill; btnGrabOnce.ForeColor = SystemColors.ControlText; btnGrabOnce.Location = new Point(3, 3); btnGrabOnce.Location = new Point(4, 4); btnGrabOnce.Margin = new Padding(4); btnGrabOnce.Name = "btnGrabOnce"; btnGrabOnce.Size = new Size(82, 28); btnGrabOnce.Size = new Size(105, 31); btnGrabOnce.TabIndex = 7; btnGrabOnce.Text = "åå¼ éé"; btnGrabOnce.UseVisualStyleBackColor = true; @@ -182,9 +189,10 @@ // btnOpen.Dock = DockStyle.Fill; btnOpen.ForeColor = SystemColors.ControlText; btnOpen.Location = new Point(3, 3); btnOpen.Location = new Point(4, 4); btnOpen.Margin = new Padding(4); btnOpen.Name = "btnOpen"; btnOpen.Size = new Size(82, 28); btnOpen.Size = new Size(105, 31); btnOpen.TabIndex = 8; btnOpen.Text = "æå¼"; btnOpen.UseVisualStyleBackColor = true; @@ -194,9 +202,10 @@ // btnClose.Dock = DockStyle.Fill; btnClose.ForeColor = SystemColors.ControlText; btnClose.Location = new Point(91, 3); btnClose.Location = new Point(117, 4); btnClose.Margin = new Padding(4); btnClose.Name = "btnClose"; btnClose.Size = new Size(82, 28); btnClose.Size = new Size(105, 31); btnClose.TabIndex = 9; btnClose.Text = "å ³é"; btnClose.UseVisualStyleBackColor = true; @@ -206,9 +215,10 @@ // label5.AutoSize = true; label5.Dock = DockStyle.Fill; label5.Location = new Point(3, 0); label5.Location = new Point(4, 0); label5.Margin = new Padding(4, 0, 4, 0); label5.Name = "label5"; label5.Size = new Size(114, 34); label5.Size = new Size(146, 39); label5.TabIndex = 15; label5.Text = "å徿°éï¼"; label5.TextAlign = ContentAlignment.MiddleCenter; @@ -217,9 +227,10 @@ // lblPicCount.AutoSize = true; lblPicCount.Dock = DockStyle.Fill; lblPicCount.Location = new Point(123, 0); lblPicCount.Location = new Point(158, 0); lblPicCount.Margin = new Padding(4, 0, 4, 0); lblPicCount.Name = "lblPicCount"; lblPicCount.Size = new Size(227, 34); lblPicCount.Size = new Size(291, 39); lblPicCount.TabIndex = 16; lblPicCount.Text = "0"; lblPicCount.TextAlign = ContentAlignment.MiddleLeft; @@ -227,18 +238,20 @@ // txtGain // txtGain.Dock = DockStyle.Fill; txtGain.Location = new Point(53, 3); txtGain.Location = new Point(68, 4); txtGain.Margin = new Padding(4); txtGain.Name = "txtGain"; txtGain.Size = new Size(297, 23); txtGain.Size = new Size(381, 27); txtGain.TabIndex = 21; txtGain.TextChanged += txtGain_TextChanged; // // txtExp // txtExp.Dock = DockStyle.Fill; txtExp.Location = new Point(53, 3); txtExp.Location = new Point(68, 4); txtExp.Margin = new Padding(4); txtExp.Name = "txtExp"; txtExp.Size = new Size(297, 23); txtExp.Size = new Size(381, 27); txtExp.TabIndex = 20; txtExp.TextChanged += txtExp_TextChanged; // @@ -246,9 +259,10 @@ // label4.AutoSize = true; label4.Dock = DockStyle.Fill; label4.Location = new Point(3, 0); label4.Location = new Point(4, 0); label4.Margin = new Padding(4, 0, 4, 0); label4.Name = "label4"; label4.Size = new Size(44, 34); label4.Size = new Size(56, 39); label4.TabIndex = 19; label4.Text = "å¢ç"; label4.TextAlign = ContentAlignment.MiddleCenter; @@ -257,9 +271,10 @@ // label3.AutoSize = true; label3.Dock = DockStyle.Fill; label3.Location = new Point(3, 0); label3.Location = new Point(4, 0); label3.Margin = new Padding(4, 0, 4, 0); label3.Name = "label3"; label3.Size = new Size(44, 34); label3.Size = new Size(56, 39); label3.TabIndex = 18; label3.Text = "æå "; label3.TextAlign = ContentAlignment.MiddleCenter; @@ -271,8 +286,10 @@ groupBox1.Dock = DockStyle.Fill; groupBox1.ForeColor = SystemColors.Control; groupBox1.Location = new Point(0, 0); groupBox1.Margin = new Padding(4); groupBox1.Name = "groupBox1"; groupBox1.Size = new Size(486, 591); groupBox1.Padding = new Padding(4); groupBox1.Size = new Size(626, 695); groupBox1.TabIndex = 17; groupBox1.TabStop = false; groupBox1.Text = "宿¶éé"; @@ -280,18 +297,20 @@ // panel_Picture // panel_Picture.Dock = DockStyle.Fill; panel_Picture.Location = new Point(3, 19); panel_Picture.Location = new Point(4, 24); panel_Picture.Margin = new Padding(4); panel_Picture.Name = "panel_Picture"; panel_Picture.Size = new Size(480, 569); panel_Picture.Size = new Size(618, 667); panel_Picture.TabIndex = 0; // // radioButtonSoft // radioButtonSoft.AutoSize = true; radioButtonSoft.Dock = DockStyle.Fill; radioButtonSoft.Location = new Point(3, 123); radioButtonSoft.Location = new Point(4, 145); radioButtonSoft.Margin = new Padding(4); radioButtonSoft.Name = "radioButtonSoft"; radioButtonSoft.Size = new Size(353, 34); radioButtonSoft.Size = new Size(453, 39); radioButtonSoft.TabIndex = 23; radioButtonSoft.TabStop = true; radioButtonSoft.Text = "软触å"; @@ -302,9 +321,10 @@ // radioButtonHard.AutoSize = true; radioButtonHard.Dock = DockStyle.Fill; radioButtonHard.Location = new Point(3, 203); radioButtonHard.Location = new Point(4, 239); radioButtonHard.Margin = new Padding(4); radioButtonHard.Name = "radioButtonHard"; radioButtonHard.Size = new Size(353, 34); radioButtonHard.Size = new Size(453, 39); radioButtonHard.TabIndex = 24; radioButtonHard.TabStop = true; radioButtonHard.Text = "硬触å"; @@ -313,7 +333,8 @@ // splitContainer1 // splitContainer1.Dock = DockStyle.Fill; splitContainer1.Location = new Point(5, 5); splitContainer1.Location = new Point(6, 6); splitContainer1.Margin = new Padding(4); splitContainer1.Name = "splitContainer1"; // // splitContainer1.Panel1 @@ -323,8 +344,9 @@ // splitContainer1.Panel2 // splitContainer1.Panel2.Controls.Add(groupBox1); splitContainer1.Size = new Size(855, 591); splitContainer1.SplitterDistance = 365; splitContainer1.Size = new Size(1100, 695); splitContainer1.SplitterDistance = 469; splitContainer1.SplitterWidth = 5; splitContainer1.TabIndex = 19; // // groupBox2 @@ -334,9 +356,11 @@ groupBox2.Dock = DockStyle.Fill; groupBox2.ForeColor = SystemColors.Control; groupBox2.Location = new Point(0, 0); groupBox2.MinimumSize = new Size(261, 61); groupBox2.Margin = new Padding(4); groupBox2.MinimumSize = new Size(336, 72); groupBox2.Name = "groupBox2"; groupBox2.Size = new Size(365, 591); groupBox2.Padding = new Padding(4); groupBox2.Size = new Size(469, 695); groupBox2.TabIndex = 0; groupBox2.TabStop = false; groupBox2.Text = "ç¸æºåæ°"; @@ -360,7 +384,8 @@ tableLayoutPanel2.Controls.Add(tableLayoutPanel9, 0, 10); tableLayoutPanel2.Controls.Add(tableLayoutPanel10, 0, 9); tableLayoutPanel2.Dock = DockStyle.Fill; tableLayoutPanel2.Location = new Point(3, 19); tableLayoutPanel2.Location = new Point(4, 24); tableLayoutPanel2.Margin = new Padding(4); tableLayoutPanel2.Name = "tableLayoutPanel2"; tableLayoutPanel2.RowCount = 14; tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 7.14301062F)); @@ -377,38 +402,40 @@ tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 7.14301062F)); tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 7.143011F)); tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 7.14086771F)); tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F)); tableLayoutPanel2.Size = new Size(359, 569); tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Absolute, 24F)); tableLayoutPanel2.Size = new Size(461, 667); tableLayoutPanel2.TabIndex = 25; // // tableLayoutPanel3 // tableLayoutPanel3.ColumnCount = 2; tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 64F)); tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel3.Controls.Add(label1, 0, 0); tableLayoutPanel3.Controls.Add(cmbBrand, 1, 0); tableLayoutPanel3.Dock = DockStyle.Fill; tableLayoutPanel3.Location = new Point(3, 3); tableLayoutPanel3.Location = new Point(4, 4); tableLayoutPanel3.Margin = new Padding(4); tableLayoutPanel3.Name = "tableLayoutPanel3"; tableLayoutPanel3.RowCount = 1; tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel3.Size = new Size(353, 34); tableLayoutPanel3.Size = new Size(453, 39); tableLayoutPanel3.TabIndex = 0; // // tableLayoutPanel4 // tableLayoutPanel4.ColumnCount = 2; tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 64F)); tableLayoutPanel4.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel4.Controls.Add(label2, 0, 0); tableLayoutPanel4.Controls.Add(cmbSN, 1, 0); tableLayoutPanel4.Dock = DockStyle.Fill; tableLayoutPanel4.Location = new Point(3, 43); tableLayoutPanel4.Location = new Point(4, 51); tableLayoutPanel4.Margin = new Padding(4); tableLayoutPanel4.Name = "tableLayoutPanel4"; tableLayoutPanel4.RowCount = 1; tableLayoutPanel4.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel4.Size = new Size(353, 34); tableLayoutPanel4.Size = new Size(453, 39); tableLayoutPanel4.TabIndex = 1; // // tableLayoutPanel5 @@ -422,11 +449,12 @@ tableLayoutPanel5.Controls.Add(btnClose, 1, 0); tableLayoutPanel5.Controls.Add(btnEdit, 3, 0); tableLayoutPanel5.Dock = DockStyle.Fill; tableLayoutPanel5.Location = new Point(3, 83); tableLayoutPanel5.Location = new Point(4, 98); tableLayoutPanel5.Margin = new Padding(4); tableLayoutPanel5.Name = "tableLayoutPanel5"; tableLayoutPanel5.RowCount = 1; tableLayoutPanel5.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel5.Size = new Size(353, 34); tableLayoutPanel5.Size = new Size(453, 39); tableLayoutPanel5.TabIndex = 2; // // btnEdit @@ -434,9 +462,10 @@ btnEdit.Dock = DockStyle.Fill; btnEdit.Enabled = false; btnEdit.ForeColor = SystemColors.ControlText; btnEdit.Location = new Point(267, 3); btnEdit.Location = new Point(343, 4); btnEdit.Margin = new Padding(4); btnEdit.Name = "btnEdit"; btnEdit.Size = new Size(83, 28); btnEdit.Size = new Size(106, 31); btnEdit.TabIndex = 10; btnEdit.Text = "ç¼è¾"; btnEdit.UseVisualStyleBackColor = true; @@ -454,21 +483,22 @@ tableLayoutPanel6.Controls.Add(btnCloseGrab, 2, 0); tableLayoutPanel6.Controls.Add(btnSaveImage, 3, 0); tableLayoutPanel6.Dock = DockStyle.Fill; tableLayoutPanel6.Location = new Point(3, 163); tableLayoutPanel6.Location = new Point(4, 192); tableLayoutPanel6.Margin = new Padding(4); tableLayoutPanel6.Name = "tableLayoutPanel6"; tableLayoutPanel6.RowCount = 1; tableLayoutPanel6.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel6.Size = new Size(353, 34); tableLayoutPanel6.Size = new Size(453, 39); tableLayoutPanel6.TabIndex = 24; // // btnSaveImage // btnSaveImage.Dock = DockStyle.Fill; btnSaveImage.ForeColor = SystemColors.Desktop; btnSaveImage.Location = new Point(266, 2); btnSaveImage.Margin = new Padding(2); btnSaveImage.Location = new Point(342, 2); btnSaveImage.Margin = new Padding(3, 2, 3, 2); btnSaveImage.Name = "btnSaveImage"; btnSaveImage.Size = new Size(85, 30); btnSaveImage.Size = new Size(108, 35); btnSaveImage.TabIndex = 8; btnSaveImage.Text = "ä¿åå¾ç"; btnSaveImage.UseVisualStyleBackColor = true; @@ -477,31 +507,33 @@ // tableLayoutPanel7 // tableLayoutPanel7.ColumnCount = 2; tableLayoutPanel7.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel7.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 64F)); tableLayoutPanel7.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel7.Controls.Add(label3, 0, 0); tableLayoutPanel7.Controls.Add(txtExp, 1, 0); tableLayoutPanel7.Dock = DockStyle.Fill; tableLayoutPanel7.Location = new Point(3, 283); tableLayoutPanel7.Location = new Point(4, 333); tableLayoutPanel7.Margin = new Padding(4); tableLayoutPanel7.Name = "tableLayoutPanel7"; tableLayoutPanel7.RowCount = 1; tableLayoutPanel7.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); tableLayoutPanel7.Size = new Size(353, 34); tableLayoutPanel7.Size = new Size(453, 39); tableLayoutPanel7.TabIndex = 25; // // tableLayoutPanel8 // tableLayoutPanel8.ColumnCount = 2; tableLayoutPanel8.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel8.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 64F)); tableLayoutPanel8.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel8.Controls.Add(label4, 0, 0); tableLayoutPanel8.Controls.Add(txtGain, 1, 0); tableLayoutPanel8.Dock = DockStyle.Fill; tableLayoutPanel8.Location = new Point(3, 323); tableLayoutPanel8.Location = new Point(4, 380); tableLayoutPanel8.Margin = new Padding(4); tableLayoutPanel8.Name = "tableLayoutPanel8"; tableLayoutPanel8.RowCount = 1; tableLayoutPanel8.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel8.Size = new Size(353, 34); tableLayoutPanel8.Size = new Size(453, 39); tableLayoutPanel8.TabIndex = 26; // // tableLayoutPanel1 @@ -514,19 +546,21 @@ tableLayoutPanel1.Controls.Add(ckbUpParams, 1, 0); tableLayoutPanel1.Controls.Add(ckbRegrab, 2, 0); tableLayoutPanel1.Dock = DockStyle.Fill; tableLayoutPanel1.Location = new Point(3, 243); tableLayoutPanel1.Location = new Point(4, 286); tableLayoutPanel1.Margin = new Padding(4); tableLayoutPanel1.Name = "tableLayoutPanel1"; tableLayoutPanel1.RowCount = 1; tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel1.Size = new Size(353, 34); tableLayoutPanel1.Size = new Size(453, 39); tableLayoutPanel1.TabIndex = 29; // // btnStartHard // btnStartHard.Dock = DockStyle.Fill; btnStartHard.Location = new Point(3, 3); btnStartHard.Location = new Point(4, 4); btnStartHard.Margin = new Padding(4); btnStartHard.Name = "btnStartHard"; btnStartHard.Size = new Size(64, 28); btnStartHard.Size = new Size(82, 31); btnStartHard.TabIndex = 22; btnStartHard.Text = "çå¾ è§¦å"; btnStartHard.UseVisualStyleBackColor = true; @@ -536,9 +570,10 @@ // ckbUpParams.AutoSize = true; ckbUpParams.Dock = DockStyle.Fill; ckbUpParams.Location = new Point(73, 3); ckbUpParams.Location = new Point(94, 4); ckbUpParams.Margin = new Padding(4); ckbUpParams.Name = "ckbUpParams"; ckbUpParams.Size = new Size(135, 28); ckbUpParams.Size = new Size(173, 31); ckbUpParams.TabIndex = 23; ckbUpParams.Text = "æ¯å¦æ¯æ¬¡åå ¥åæ°"; ckbUpParams.UseVisualStyleBackColor = true; @@ -547,9 +582,10 @@ // ckbRegrab.AutoSize = true; ckbRegrab.Dock = DockStyle.Fill; ckbRegrab.Location = new Point(214, 3); ckbRegrab.Location = new Point(275, 4); ckbRegrab.Margin = new Padding(4); ckbRegrab.Name = "ckbRegrab"; ckbRegrab.Size = new Size(136, 28); ckbRegrab.Size = new Size(174, 31); ckbRegrab.TabIndex = 24; ckbRegrab.Text = "æ¯å¦å¤±è´¥éæ°åå¾"; ckbRegrab.UseVisualStyleBackColor = true; @@ -557,25 +593,27 @@ // tableLayoutPanel12 // tableLayoutPanel12.ColumnCount = 2; tableLayoutPanel12.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 120F)); tableLayoutPanel12.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 154F)); tableLayoutPanel12.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel12.Controls.Add(lblCapTime, 1, 0); tableLayoutPanel12.Controls.Add(label7, 0, 0); tableLayoutPanel12.Dock = DockStyle.Fill; tableLayoutPanel12.Location = new Point(3, 523); tableLayoutPanel12.Location = new Point(4, 615); tableLayoutPanel12.Margin = new Padding(4); tableLayoutPanel12.Name = "tableLayoutPanel12"; tableLayoutPanel12.RowCount = 1; tableLayoutPanel12.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel12.Size = new Size(353, 43); tableLayoutPanel12.Size = new Size(453, 48); tableLayoutPanel12.TabIndex = 31; // // lblCapTime // lblCapTime.AutoSize = true; lblCapTime.Dock = DockStyle.Fill; lblCapTime.Location = new Point(123, 0); lblCapTime.Location = new Point(158, 0); lblCapTime.Margin = new Padding(4, 0, 4, 0); lblCapTime.Name = "lblCapTime"; lblCapTime.Size = new Size(227, 43); lblCapTime.Size = new Size(291, 48); lblCapTime.TabIndex = 16; lblCapTime.Text = "0ms"; lblCapTime.TextAlign = ContentAlignment.MiddleLeft; @@ -584,9 +622,10 @@ // label7.AutoSize = true; label7.Dock = DockStyle.Fill; label7.Location = new Point(3, 0); label7.Location = new Point(4, 0); label7.Margin = new Padding(4, 0, 4, 0); label7.Name = "label7"; label7.Size = new Size(114, 43); label7.Size = new Size(146, 48); label7.TabIndex = 15; label7.Text = "å徿¶é´ï¼"; label7.TextAlign = ContentAlignment.MiddleCenter; @@ -594,16 +633,17 @@ // tableLayoutPanel11 // tableLayoutPanel11.ColumnCount = 2; tableLayoutPanel11.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 120F)); tableLayoutPanel11.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 154F)); tableLayoutPanel11.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel11.Controls.Add(label5, 0, 0); tableLayoutPanel11.Controls.Add(lblPicCount, 1, 0); tableLayoutPanel11.Dock = DockStyle.Fill; tableLayoutPanel11.Location = new Point(3, 483); tableLayoutPanel11.Location = new Point(4, 568); tableLayoutPanel11.Margin = new Padding(4); tableLayoutPanel11.Name = "tableLayoutPanel11"; tableLayoutPanel11.RowCount = 1; tableLayoutPanel11.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel11.Size = new Size(353, 34); tableLayoutPanel11.Size = new Size(453, 39); tableLayoutPanel11.TabIndex = 30; // // cmbImagesPath @@ -612,9 +652,10 @@ cmbImagesPath.Dock = DockStyle.Fill; cmbImagesPath.ForeColor = SystemColors.ControlText; cmbImagesPath.FormattingEnabled = true; cmbImagesPath.Location = new Point(3, 443); cmbImagesPath.Location = new Point(4, 521); cmbImagesPath.Margin = new Padding(4); cmbImagesPath.Name = "cmbImagesPath"; cmbImagesPath.Size = new Size(353, 25); cmbImagesPath.Size = new Size(453, 28); cmbImagesPath.TabIndex = 0; cmbImagesPath.SelectedIndexChanged += cmbImagesPath_SelectedIndexChanged; cmbImagesPath.MouseHover += cmbImagesPath_MouseHover; @@ -629,20 +670,22 @@ tableLayoutPanel9.Controls.Add(btnAddImages, 1, 0); tableLayoutPanel9.Controls.Add(btnLocalGrab, 2, 0); tableLayoutPanel9.Dock = DockStyle.Fill; tableLayoutPanel9.Location = new Point(3, 403); tableLayoutPanel9.Location = new Point(4, 474); tableLayoutPanel9.Margin = new Padding(4); tableLayoutPanel9.Name = "tableLayoutPanel9"; tableLayoutPanel9.RowCount = 1; tableLayoutPanel9.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel9.Size = new Size(353, 34); tableLayoutPanel9.Size = new Size(453, 39); tableLayoutPanel9.TabIndex = 27; // // ckbLocalTest // ckbLocalTest.AutoSize = true; ckbLocalTest.Dock = DockStyle.Fill; ckbLocalTest.Location = new Point(3, 3); ckbLocalTest.Location = new Point(4, 4); ckbLocalTest.Margin = new Padding(4); ckbLocalTest.Name = "ckbLocalTest"; ckbLocalTest.Size = new Size(111, 28); ckbLocalTest.Size = new Size(142, 31); ckbLocalTest.TabIndex = 0; ckbLocalTest.Text = "æ¬å°åå¾"; ckbLocalTest.UseVisualStyleBackColor = true; @@ -651,9 +694,10 @@ // btnAddImages.Dock = DockStyle.Fill; btnAddImages.ForeColor = SystemColors.Desktop; btnAddImages.Location = new Point(120, 3); btnAddImages.Location = new Point(154, 4); btnAddImages.Margin = new Padding(4); btnAddImages.Name = "btnAddImages"; btnAddImages.Size = new Size(111, 28); btnAddImages.Size = new Size(142, 31); btnAddImages.TabIndex = 1; btnAddImages.Text = "æ·»å å¾ç"; btnAddImages.UseVisualStyleBackColor = true; @@ -663,9 +707,10 @@ // btnLocalGrab.Dock = DockStyle.Fill; btnLocalGrab.ForeColor = SystemColors.Desktop; btnLocalGrab.Location = new Point(237, 3); btnLocalGrab.Location = new Point(304, 4); btnLocalGrab.Margin = new Padding(4); btnLocalGrab.Name = "btnLocalGrab"; btnLocalGrab.Size = new Size(113, 28); btnLocalGrab.Size = new Size(145, 31); btnLocalGrab.TabIndex = 2; btnLocalGrab.Text = "æ¬å°åå¾"; btnLocalGrab.UseVisualStyleBackColor = true; @@ -674,25 +719,27 @@ // tableLayoutPanel10 // tableLayoutPanel10.ColumnCount = 2; tableLayoutPanel10.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 50F)); tableLayoutPanel10.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 64F)); tableLayoutPanel10.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); tableLayoutPanel10.Controls.Add(label6, 0, 0); tableLayoutPanel10.Controls.Add(txtTimeout, 1, 0); tableLayoutPanel10.Dock = DockStyle.Fill; tableLayoutPanel10.Location = new Point(3, 363); tableLayoutPanel10.Location = new Point(4, 427); tableLayoutPanel10.Margin = new Padding(4); tableLayoutPanel10.Name = "tableLayoutPanel10"; tableLayoutPanel10.RowCount = 1; tableLayoutPanel10.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); tableLayoutPanel10.Size = new Size(353, 34); tableLayoutPanel10.Size = new Size(453, 39); tableLayoutPanel10.TabIndex = 32; // // label6 // label6.AutoSize = true; label6.Dock = DockStyle.Fill; label6.Location = new Point(3, 0); label6.Location = new Point(4, 0); label6.Margin = new Padding(4, 0, 4, 0); label6.Name = "label6"; label6.Size = new Size(44, 34); label6.Size = new Size(56, 39); label6.TabIndex = 0; label6.Text = "è¶ æ¶"; label6.TextAlign = ContentAlignment.MiddleCenter; @@ -700,9 +747,10 @@ // txtTimeout // txtTimeout.Dock = DockStyle.Fill; txtTimeout.Location = new Point(53, 3); txtTimeout.Location = new Point(68, 4); txtTimeout.Margin = new Padding(4); txtTimeout.Name = "txtTimeout"; txtTimeout.Size = new Size(297, 23); txtTimeout.Size = new Size(381, 27); txtTimeout.TabIndex = 1; // // theme_2DCameraForm @@ -715,15 +763,17 @@ theme_2DCameraForm.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); theme_2DCameraForm.Image = (Image)resources.GetObject("theme_2DCameraForm.Image"); theme_2DCameraForm.Location = new Point(0, 0); theme_2DCameraForm.Margin = new Padding(4); theme_2DCameraForm.Name = "theme_2DCameraForm"; theme_2DCameraForm.Padding = new Padding(10, 70, 10, 9); theme_2DCameraForm.Padding = new Padding(13, 82, 13, 11); theme_2DCameraForm.RoundCorners = true; theme_2DCameraForm.Sizable = true; theme_2DCameraForm.Size = new Size(885, 680); theme_2DCameraForm.Size = new Size(1138, 800); theme_2DCameraForm.SmartBounds = true; theme_2DCameraForm.StartPosition = FormStartPosition.WindowsDefaultLocation; theme_2DCameraForm.TabIndex = 20; theme_2DCameraForm.Text = "2Dç¸æºè®¾ç½®çé¢"; theme_2DCameraForm.Click += theme_2DCameraForm_Click; // // controlBox1 // @@ -735,7 +785,8 @@ controlBox1.EnableMaximizeButton = false; controlBox1.EnableMinimizeButton = false; controlBox1.ForeColor = Color.FromArgb(155, 155, 155); controlBox1.Location = new Point(785, 18); controlBox1.Location = new Point(1009, 18); controlBox1.Margin = new Padding(4); controlBox1.MaximizeHoverColor = Color.FromArgb(74, 74, 74); controlBox1.MinimizeHoverColor = Color.FromArgb(63, 63, 65); controlBox1.Name = "controlBox1"; @@ -749,22 +800,24 @@ panel_2DCameraForm.Controls.Add(splitContainer1); panel_2DCameraForm.Dock = DockStyle.Fill; panel_2DCameraForm.EdgeColor = Color.FromArgb(32, 41, 50); panel_2DCameraForm.Location = new Point(10, 70); panel_2DCameraForm.Location = new Point(13, 82); panel_2DCameraForm.Margin = new Padding(4); panel_2DCameraForm.Name = "panel_2DCameraForm"; panel_2DCameraForm.Padding = new Padding(5); panel_2DCameraForm.Size = new Size(865, 601); panel_2DCameraForm.Padding = new Padding(6); panel_2DCameraForm.Size = new Size(1112, 707); panel_2DCameraForm.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; panel_2DCameraForm.TabIndex = 20; panel_2DCameraForm.Text = "panel2"; // // CameraForm // AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleDimensions = new SizeF(9F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(885, 680); ClientSize = new Size(1138, 800); Controls.Add(theme_2DCameraForm); FormBorderStyle = FormBorderStyle.None; MinimumSize = new Size(261, 61); Margin = new Padding(4); MinimumSize = new Size(336, 72); Name = "CameraForm"; Text = "2Dç¸æºè®¾ç½®çé¢"; TransparencyKey = Color.Fuchsia; LB_VisionProcesses/Cameras/2DCameraForm.cs
@@ -154,7 +154,7 @@ switch (brand) { case CameraBrand.HRCamera: //camera = new HRCamera(); camera = new HRCamera(); break; case CameraBrand.LBCamera: //camera = new LBCamera(); @@ -224,7 +224,7 @@ //camera = new LBCamera(); break; case CameraBrand.HRCamera: //camera = new HRCamera(); camera = new HRCamera(); break; default: Debug.WriteLine($"ã{DateTime.Now:HH:mm:ss.fff}ãæªç¥åç"); @@ -656,5 +656,10 @@ { // this.Close(); } private void theme_2DCameraForm_Click(object sender, EventArgs e) { } } } LB_VisionProcesses/Cameras/HRCamera.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,920 @@ using MVSDK_Net; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace LB_VisionProcesses.Cameras { /// <summary> /// åç¿2Då·¥ä¸ç¸æºå®ç°ç±» /// åºäºMVSDK_Net SDKå°è£ /// </summary> public class HRCamera : BaseCamera { #region ç§æåæ®µ private MyCamera _camera; // åç¿ç¸æºè®¾å¤å¯¹è±¡ private Thread _grabThread; // å¾åééçº¿ç¨ private bool _isGrabbing; // ééç¶ææ å¿ private bool _threadRunning; // 线ç¨è¿è¡æ å¿ private Thread _callbackThread; // åè°å¤ççº¿ç¨ private List<IMVDefine.IMV_Frame> _frameList; // å¾åç¼åå表 private readonly object _frameLock = new object(); // 帧ç¼åé // CopyMemory API声æ [System.Runtime.InteropServices.DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")] private static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); #endregion #region æé 彿°åææå½æ° /// <summary> /// æé 彿° /// </summary> public HRCamera() { _camera = new MyCamera(); _frameList = new List<IMVDefine.IMV_Frame>(); Brand = CameraBrand.HRCamera; _isGrabbing = false; _threadRunning = false; } /// <summary> /// ææå½æ° /// </summary> ~HRCamera() { Dispose(false); } #endregion #region 设å¤ç®¡çæä½ /// <summary> /// è·åç¸æºSNæä¸¾å表 /// </summary> /// <returns>ç¸æºSNå表</returns> public override List<string> GetListEnum() { List<string> cameraList = new List<string>(); try { // æä¸¾ææè®¾å¤ IMVDefine.IMV_DeviceList deviceList = new IMVDefine.IMV_DeviceList(); IMVDefine.IMV_EInterfaceType interfaceType = IMVDefine.IMV_EInterfaceType.interfaceTypeAll; int result = MyCamera.IMV_EnumDevices(ref deviceList, (uint)interfaceType); if (result == IMVDefine.IMV_OK && deviceList.nDevNum > 0) { for (int i = 0; i < deviceList.nDevNum; i++) { IMVDefine.IMV_DeviceInfo deviceInfo = (IMVDefine.IMV_DeviceInfo) Marshal.PtrToStructure( deviceList.pDevInfo + Marshal.SizeOf(typeof(IMVDefine.IMV_DeviceInfo)) * i, typeof(IMVDefine.IMV_DeviceInfo)); string cameraInfo = $"{deviceInfo.cameraName}[{deviceInfo.serialNumber}]"; cameraList.Add(cameraInfo); } } else { // è®°å½æ¥å¿ææåºå¼å¸¸ throw new Exception($"æä¸¾è®¾å¤å¤±è´¥ï¼é误ç ï¼{result}"); } } catch (Exception ex) { // è®°å½é误æ¥å¿ System.Diagnostics.Debug.WriteLine($"è·åç¸æºå表失败ï¼{ex.Message}"); throw; } return cameraList; } /// <summary> /// åå§åç¸æºè®¾å¤ /// </summary> /// <param name="SN">ç¸æºåºåå·</param> /// <param name="Handle">çªå£å¥æï¼å¯éï¼</param> /// <returns>åå§åæ¯å¦æå</returns> public override bool InitDevice(string SN, object Handle = null) { try { // å¦æç¸æºå·²æå¼ï¼å å ³é if (_camera != null && _camera.IMV_IsOpen()) { CloseDevice(); } // æä¸¾è®¾å¤å¹¶å¹é SN List<string> cameraList = GetListEnum(); int cameraIndex = -1; for (int i = 0; i < cameraList.Count; i++) { if (cameraList[i].Contains(SN)) { cameraIndex = i; break; } } if (cameraIndex == -1) { throw new Exception($"æªæ¾å°åºåå·ä¸º {SN} çç¸æº"); } // å建设å¤å¥æ int result = _camera.IMV_CreateHandle(IMVDefine.IMV_ECreateHandleMode.modeByIndex, cameraIndex); if (result != IMVDefine.IMV_OK) { throw new Exception($"å建设å¤å¥æå¤±è´¥ï¼é误ç ï¼{result}"); } // æå¼è®¾å¤ result = _camera.IMV_Open(); if (result != IMVDefine.IMV_OK) { throw new Exception($"æå¼ç¸æºå¤±è´¥ï¼é误ç ï¼{result}"); } // 设置设å¤å±æ§ SN = SN; isGrabbing = false; // 设置ç¼å个æ°ä¸º8 _camera.IMV_SetBufferCount(8); return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"åå§åç¸æºå¤±è´¥ï¼{ex.Message}"); return false; } } /// <summary> /// å ³éç¸æºè®¾å¤ /// </summary> /// <returns>å ³éæ¯å¦æå</returns> public override bool CloseDevice() { try { if (_camera == null) return true; // 忢éé if (_camera.IMV_IsGrabbing()) { StopGrabbing(); } // å ³éè®¾å¤ if (_camera.IMV_IsOpen()) { int result = _camera.IMV_Close(); if (result != IMVDefine.IMV_OK) { System.Diagnostics.Debug.WriteLine($"å ³éç¸æºå¤±è´¥ï¼é误ç ï¼{result}"); } } // éæ¾èµæº _isGrabbing = false; isGrabbing = false; // æ¸ ç帧ç¼å lock (_frameLock) { foreach (var frame in _frameList) { var tempFrame = frame; // å建临æ¶åé _camera.IMV_ReleaseFrame(ref tempFrame); } _frameList.Clear(); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"å ³éç¸æºå¤±è´¥ï¼{ex.Message}"); return false; } } #endregion #region å¾åééæä½ /// <summary> /// å¼å§å¾åéé /// </summary> /// <returns>ééå¯å¨æ¯å¦æå</returns> public override bool StartGrabbing() { try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } // åæ¢ç°æéé if (_isGrabbing) { StopGrabbing(); } // å¯å¨éé int result = _camera.IMV_StartGrabbing(); if (result != IMVDefine.IMV_OK) { throw new Exception($"å¯å¨éé失败ï¼é误ç ï¼{result}"); } _isGrabbing = true; isGrabbing = true; // å¯å¨ééçº¿ç¨ _threadRunning = true; _grabThread = new Thread(GrabThreadProc); _grabThread.IsBackground = true; _grabThread.Start(); return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"å¯å¨éé失败ï¼{ex.Message}"); _isGrabbing = false; isGrabbing = false; return false; } } /// <summary> /// 忢å¾åéé /// </summary> /// <returns>忢æ¯å¦æå</returns> public override bool StopGrabbing() { try { if (_camera == null || !_isGrabbing) return true; // åæ¢çº¿ç¨ _threadRunning = false; if (_grabThread != null && _grabThread.IsAlive) { _grabThread.Join(1000); _grabThread = null; } // 忢éé int result = _camera.IMV_StopGrabbing(); if (result != IMVDefine.IMV_OK) { System.Diagnostics.Debug.WriteLine($"忢éé失败ï¼é误ç ï¼{result}"); } _isGrabbing = false; isGrabbing = false; // æ¸ çç¼å lock (_frameLock) { foreach (var frame in _frameList) { var tempFrame = frame; // å建临æ¶åé _camera.IMV_ReleaseFrame(ref tempFrame); } _frameList.Clear(); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"忢éé失败ï¼{ex.Message}"); return false; } } /// <summary> /// æ§è¡è½¯è§¦å /// </summary> /// <returns>è§¦åæ¯å¦æå</returns> public override bool SoftTrigger() { try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } int result = _camera.IMV_ExecuteCommandFeature("TriggerSoftware"); return result == IMVDefine.IMV_OK; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"软触å失败ï¼{ex.Message}"); return false; } } #endregion #region åæ°è®¾ç½®åè·å /// <summary> /// è®¾ç½®è§¦åæ¨¡å¼ /// </summary> /// <param name="mode">è§¦åæ¨¡å¼</param> /// <param name="source">è§¦åæº</param> /// <returns>设置æ¯å¦æå</returns> public override bool SetTriggerMode(TriggerMode mode, TriggerSource source = TriggerSource.Line0) { try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } // è®¾ç½®è§¦åæ¨¡å¼ string triggerMode = mode == TriggerMode.On ? "On" : "Off"; int result = _camera.IMV_SetEnumFeatureSymbol("TriggerMode", triggerMode); if (result != IMVDefine.IMV_OK) { throw new Exception($"è®¾ç½®è§¦åæ¨¡å¼å¤±è´¥ï¼é误ç ï¼{result}"); } // è®¾ç½®è§¦åæº if (mode == TriggerMode.On) { string triggerSource = GetTriggerSourceString(source); result = _camera.IMV_SetEnumFeatureSymbol("TriggerSource", triggerSource); if (result != IMVDefine.IMV_OK) { throw new Exception($"è®¾ç½®è§¦åæºå¤±è´¥ï¼é误ç ï¼{result}"); } } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"è®¾ç½®è§¦åæ¨¡å¼å¤±è´¥ï¼{ex.Message}"); return false; } } /// <summary> /// è·åè§¦åæ¨¡å¼ /// </summary> /// <param name="mode">è§¦åæ¨¡å¼</param> /// <param name="source">è§¦åæº</param> /// <returns>è·åæ¯å¦æå</returns> public override bool GetTriggerMode(out TriggerMode mode, out TriggerSource source) { mode = TriggerMode.Off; source = TriggerSource.Software; try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } // è·åè§¦åæ¨¡å¼ IMVDefine.IMV_String triggerMode = new IMVDefine.IMV_String(); int result = _camera.IMV_GetEnumFeatureSymbol("TriggerMode", ref triggerMode); if (result == IMVDefine.IMV_OK) { mode = triggerMode.str == "On" ? TriggerMode.On : TriggerMode.Off; } // è·åè§¦åæº IMVDefine.IMV_String triggerSource = new IMVDefine.IMV_String(); result = _camera.IMV_GetEnumFeatureSymbol("TriggerSource", ref triggerSource); if (result == IMVDefine.IMV_OK) { source = GetTriggerSourceFromString(triggerSource.str); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"è·åè§¦åæ¨¡å¼å¤±è´¥ï¼{ex.Message}"); return false; } } /// <summary> /// 设置æå æ¶é´ /// </summary> /// <param name="value">æå æ¶é´ï¼å¾®ç§ï¼</param> /// <returns>设置æ¯å¦æå</returns> public override bool SetExpouseTime(double value) { try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } // éªè¯æå æ¶é´èå´ double minExp = 0, maxExp = 0; int result = _camera.IMV_GetDoubleFeatureMin("ExposureTime", ref minExp); if (result != IMVDefine.IMV_OK) { throw new Exception($"è·åæå æ¶é´æå°å¼å¤±è´¥ï¼é误ç ï¼{result}"); } result = _camera.IMV_GetDoubleFeatureMax("ExposureTime", ref maxExp); if (result != IMVDefine.IMV_OK) { throw new Exception($"è·åæå æ¶é´æå¤§å¼å¤±è´¥ï¼é误ç ï¼{result}"); } if (value < minExp || value > maxExp) { throw new Exception($"æå æ¶é´è¶ åºèå´ï¼ææèå´ï¼{minExp} - {maxExp}"); } // 设置æå æ¶é´ result = _camera.IMV_SetDoubleFeatureValue("ExposureTime", value); if (result != IMVDefine.IMV_OK) { throw new Exception($"设置æå æ¶é´å¤±è´¥ï¼é误ç ï¼{result}"); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"设置æå æ¶é´å¤±è´¥ï¼{ex.Message}"); return false; } } /// <summary> /// è·åæå æ¶é´ /// </summary> /// <param name="value">æå æ¶é´</param> /// <returns>è·åæ¯å¦æå</returns> public override bool GetExpouseTime(out double value) { value = 0; try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } int result = _camera.IMV_GetDoubleFeatureValue("ExposureTime", ref value); return result == IMVDefine.IMV_OK; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"è·åæå æ¶é´å¤±è´¥ï¼{ex.Message}"); return false; } } /// <summary> /// 设置å¢ç /// </summary> /// <param name="gain">å¢çå¼</param> /// <returns>设置æ¯å¦æå</returns> public override bool SetGain(double gain) { try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } // éªè¯å¢çèå´ double minGain = 0, maxGain = 0; int result = _camera.IMV_GetDoubleFeatureMin("GainRaw", ref minGain); if (result != IMVDefine.IMV_OK) { throw new Exception($"è·åå¢çæå°å¼å¤±è´¥ï¼é误ç ï¼{result}"); } result = _camera.IMV_GetDoubleFeatureMax("GainRaw", ref maxGain); if (result != IMVDefine.IMV_OK) { throw new Exception($"è·åå¢çæå¤§å¼å¤±è´¥ï¼é误ç ï¼{result}"); } if (gain < minGain || gain > maxGain) { throw new Exception($"å¢çå¼è¶ åºèå´ï¼ææèå´ï¼{minGain} - {maxGain}"); } // 设置å¢ç result = _camera.IMV_SetDoubleFeatureValue("GainRaw", gain); if (result != IMVDefine.IMV_OK) { throw new Exception($"设置å¢ç失败ï¼é误ç ï¼{result}"); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"设置å¢ç失败ï¼{ex.Message}"); return false; } } /// <summary> /// è·åå¢çå¼ /// </summary> /// <param name="gain">å¢çå¼</param> /// <returns>è·åæ¯å¦æå</returns> public override bool GetGain(out double gain) { gain = 0; try { if (_camera == null || !_camera.IMV_IsOpen()) { throw new Exception("ç¸æºæªæå¼"); } int result = _camera.IMV_GetDoubleFeatureValue("GainRaw", ref gain); return result == IMVDefine.IMV_OK; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"è·åå¢ç失败ï¼{ex.Message}"); return false; } } // å ¶ä»åæ°è®¾ç½®æ¹æ³ç±»ä¼¼ï¼è¿éçç¥é¨åå®ç°... #endregion #region è¾ å©æ¹æ³ /// <summary> /// å¾åéé线ç¨å¤ç彿° /// </summary> private void GrabThreadProc() { IMVDefine.IMV_Frame frame = new IMVDefine.IMV_Frame(); while (_threadRunning) { try { // è·åå¾å帧 int result = _camera.IMV_GetFrame(ref frame, 100); if (result == IMVDefine.IMV_OK) { // å¤çå¾å帧 ProcessFrame(frame); } else if (result != 0x80000001) // è¶ æ¶é误代ç ï¼å¸¸è§å¼ï¼ { // éè¶ æ¶é误 System.Diagnostics.Debug.WriteLine($"è·åå¾å帧失败ï¼é误ç ï¼{result}"); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"éé线ç¨å¼å¸¸ï¼{ex.Message}"); } Thread.Sleep(1); } } /// <summary> /// å¤çå¾å帧 /// </summary> /// <param name="frame">å¾å帧</param> private void ProcessFrame(IMVDefine.IMV_Frame frame) { try { // å°å¾åæ°æ®è½¬æ¢ä¸ºBitmap Bitmap bitmap = ConvertFrameToBitmap(frame); if (bitmap != null) { // 触åå¾åééäºä»¶ CameraEventArgs args = new CameraEventArgs(SN, bitmap); ImageGrabbed?.Invoke(this, args); // æ´æ°åè°å¾å CallBackImg = bitmap; } // 鿾叧 _camera.IMV_ReleaseFrame(ref frame); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"å¤çå¾å帧失败ï¼{ex.Message}"); } } /// <summary> /// å°å¾å帧转æ¢ä¸ºBitmap /// </summary> /// <param name="frame">å¾å帧</param> /// <returns>Bitmap对象</returns> private Bitmap ConvertFrameToBitmap(IMVDefine.IMV_Frame frame) { try { Bitmap bitmap = null; switch (frame.frameInfo.pixelFormat) { case IMVDefine.IMV_EPixelType.gvspPixelMono8: bitmap = CreateMono8Bitmap(frame); break; case IMVDefine.IMV_EPixelType.gvspPixelBGR8: bitmap = CreateBgr8Bitmap(frame); break; default: // å ¶ä»æ ¼å¼éè¦è½¬æ¢ bitmap = ConvertToBGR8(frame); break; } return bitmap; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"å¾åæ ¼å¼è½¬æ¢å¤±è´¥ï¼{ex.Message}"); return null; } } /// <summary> /// å建Mono8æ ¼å¼Bitmap /// </summary> private Bitmap CreateMono8Bitmap(IMVDefine.IMV_Frame frame) { Bitmap bitmap = new Bitmap((int)frame.frameInfo.width, (int)frame.frameInfo.height, PixelFormat.Format8bppIndexed); // 设置ç°åº¦è°è²æ¿ ColorPalette palette = bitmap.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } bitmap.Palette = palette; // å¤å¶å¾åæ°æ® BitmapData bmpData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); // 使ç¨CopyMemory APIè¿è¡å åå¤å¶ CopyMemory(bmpData.Scan0, frame.pData, (uint)Math.Min(frame.frameInfo.size, (uint)(bmpData.Stride * bitmap.Height))); bitmap.UnlockBits(bmpData); return bitmap; } /// <summary> /// å建BGR8æ ¼å¼Bitmap /// </summary> private Bitmap CreateBgr8Bitmap(IMVDefine.IMV_Frame frame) { Bitmap bitmap = new Bitmap((int)frame.frameInfo.width, (int)frame.frameInfo.height, PixelFormat.Format24bppRgb); BitmapData bmpData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); // 使ç¨CopyMemory APIè¿è¡å åå¤å¶ CopyMemory(bmpData.Scan0, frame.pData, (uint)Math.Min(frame.frameInfo.size, (uint)(bmpData.Stride * bitmap.Height))); bitmap.UnlockBits(bmpData); return bitmap; } /// <summary> /// 转æ¢ä¸ºBGR8æ ¼å¼ /// </summary> private Bitmap ConvertToBGR8(IMVDefine.IMV_Frame frame) { IMVDefine.IMV_PixelConvertParam convertParam = new IMVDefine.IMV_PixelConvertParam { nWidth = frame.frameInfo.width, nHeight = frame.frameInfo.height, ePixelFormat = frame.frameInfo.pixelFormat, pSrcData = frame.pData, nSrcDataLen = frame.frameInfo.size, nPaddingX = frame.frameInfo.paddingX, nPaddingY = frame.frameInfo.paddingY, eBayerDemosaic = IMVDefine.IMV_EBayerDemosaic.demosaicBilinear, eDstPixelFormat = IMVDefine.IMV_EPixelType.gvspPixelBGR8, nDstBufSize = frame.frameInfo.width * frame.frameInfo.height * 3 }; IntPtr dstBuffer = Marshal.AllocHGlobal((int)convertParam.nDstBufSize); convertParam.pDstBuf = dstBuffer; try { int result = _camera.IMV_PixelConvert(ref convertParam); if (result == IMVDefine.IMV_OK) { return CreateBgr8BitmapFromBuffer(dstBuffer, frame.frameInfo.width, frame.frameInfo.height); } return null; } finally { Marshal.FreeHGlobal(dstBuffer); } } /// <summary> /// ä»ç¼å²åºå建BGR8 Bitmap /// </summary> private Bitmap CreateBgr8BitmapFromBuffer(IntPtr buffer, uint width, uint height) { Bitmap bitmap = new Bitmap((int)width, (int)height, PixelFormat.Format24bppRgb); BitmapData bmpData = bitmap.LockBits( new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); // 使ç¨CopyMemory APIè¿è¡å®å ¨çå åå¤å¶ CopyMemory(bmpData.Scan0, buffer, (uint)(width * height * 3)); bitmap.UnlockBits(bmpData); return bitmap; } /// <summary> /// å°è§¦åæºæä¸¾è½¬æ¢ä¸ºå符串 /// </summary> private string GetTriggerSourceString(TriggerSource source) { return source switch { TriggerSource.Software => "Software", TriggerSource.Line0 => "Line0", TriggerSource.Line1 => "Line1", TriggerSource.Line2 => "Line2", TriggerSource.Line3 => "Line3", TriggerSource.Line4 => "Line4", TriggerSource.Line5 => "Line5", _ => "Software" }; } /// <summary> /// å°å符串转æ¢ä¸ºè§¦åæºæä¸¾ /// </summary> private TriggerSource GetTriggerSourceFromString(string source) { return source switch { "Software" => TriggerSource.Software, "Line0" => TriggerSource.Line0, "Line1" => TriggerSource.Line1, "Line2" => TriggerSource.Line2, "Line3" => TriggerSource.Line3, "Line4" => TriggerSource.Line4, "Line5" => TriggerSource.Line5, _ => TriggerSource.Software }; } #endregion #region æªå®ç°çæ½è±¡æ¹æ³ï¼ç®åçå®ç°ï¼ public override bool SetTriggerPolarity(TriggerPolarity polarity) { // åç¿ç¸æºå¯è½ä¸æ¯æè¯¥åè½ï¼è¿åæå return true; } public override bool GetTriggerPolarity(out TriggerPolarity polarity) { polarity = TriggerPolarity.RisingEdge; return true; } public override bool SetTriggerFliter(double flitertime) { // æä¸æ¯æ return true; } public override bool GetTriggerFliter(out double flitertime) { flitertime = 0; return true; } public override bool SetTriggerDelay(double delay) { // æä¸æ¯æ return true; } public override bool GetTriggerDelay(out double delay) { delay = 0; return true; } public override bool SetLineMode(IOLines line, LineMode mode) { // æä¸æ¯æ return true; } public override bool SetLineStatus(IOLines line, LineStatus linestatus) { // æä¸æ¯æ return true; } public override bool GetLineStatus(IOLines line, out LineStatus lineStatus) { lineStatus = LineStatus.Low; return true; } public override bool AutoBalanceWhite() { // æä¸æ¯æèªå¨ç½å¹³è¡¡ return true; } #endregion #region IDisposableå®ç° private bool _disposed = false; protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // éæ¾æç®¡èµæº } // éæ¾éæç®¡èµæº CloseDevice(); _disposed = true; } } public override void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion } }