From ebcc1d53f14112363bbf539bcaf0202aadcdc9d7 Mon Sep 17 00:00:00 2001
From: C3032 <1057644574@qq.com>
Date: 星期一, 13 四月 2026 12:58:58 +0800
Subject: [PATCH] 2D取图计数功能完成

---
 LB_SmartVision/ProcessRun/ProcessContext.cs |  143 ++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 132 insertions(+), 11 deletions(-)

diff --git a/LB_SmartVision/ProcessRun/ProcessContext.cs b/LB_SmartVision/ProcessRun/ProcessContext.cs
index 313c6cb..c680c4f 100644
--- a/LB_SmartVision/ProcessRun/ProcessContext.cs
+++ b/LB_SmartVision/ProcessRun/ProcessContext.cs
@@ -6,9 +6,11 @@
 using LB_VisionProcesses.Alogrithms;
 using LB_VisionProcesses.Cameras;
 using LB_VisionProcesses.Communicators;
+using LB_VisionProcesses.Processes;
 using LB_VisionProcesses.Processes.ScriptTool;
 using OpenCvSharp;
 using System.Collections.Concurrent;
+using System.Windows.Media.Media3D;
 
 namespace LB_SmartVision.ProcessRun
 {
@@ -301,7 +303,7 @@
             return res;
         }
 
-        public bool GetImage(Layout layout, out HImage InputImage, out HObject RecordImage)
+        public bool GetImage(Layout layout, out HObject InputImage, out HObject RecordImage)
         {
             InputImage = null; RecordImage = null;
             try
@@ -329,23 +331,19 @@
                     IndexValueName = arrOutputs[2];
 
                     object o_InputImage = ((IProcess)dicContext[IndexProcessName]).OutputImage;
-                    if (o_InputImage is HImage ho_image && ho_image.IsInitialized())
+                    if (o_InputImage is HObject ho_image && ho_image.IsInitialized())
                         InputImage = ho_image;
                     else if (o_InputImage is Bitmap)
                     {
                         //灏哅at杞崲涓篐Object
-                        using (HImage ho_RecordImage = TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage))
-                        {
-                            InputImage = ho_RecordImage.Clone();
-                        }
+                        TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage, out HObject ho_RecordImage);
+                        InputImage = ho_RecordImage;
                     }
                     else if (o_InputImage is Mat)
                     {
                         //灏哅at杞崲涓篐Object
-                        using (HImage ho_RecordImage = TAlgorithm.Mat2HObject((Mat)o_InputImage))
-                        {
-                            InputImage = ho_RecordImage.Clone();
-                        }
+                        TAlgorithm.Mat2HObject((Mat)o_InputImage, out HObject ho_RecordImage);
+                        InputImage = ho_RecordImage;
                     }
 
                     if (InputImage != null && InputImage.IsInitialized())
@@ -493,7 +491,37 @@
                 if (dicContext.TryGetValue(ProcessName, out IProcess obj)
                     && obj is IProcess process)
                 {
-                    process.InputImage = null;
+                    //process.InputImage = null;
+
+                    if (process.InputImage != null)
+                    {
+                        if (process.InputImage is HObject)
+                            ((HObject)process.InputImage).Dispose();
+                        else if (process.InputImage is Mat)
+                            ((Mat)process.InputImage).Dispose();
+                        else if (process.InputImage is Bitmap)
+                            ((Bitmap)process.InputImage).Dispose();
+
+                        process.InputImage = null;
+                    }
+
+                    if (process.OutputImage != null)
+                    {
+                        if (process.OutputImage is HObject)
+                            ((HObject)process.OutputImage).Dispose();
+                        else if (process.OutputImage is Mat)
+                            ((Mat)process.OutputImage).Dispose();
+                        else if (process.OutputImage is Bitmap)
+                            ((Bitmap)process.OutputImage).Dispose();
+
+                        process.OutputImage = null;
+                    }
+
+                    if (process.Record != null)
+                    {
+                        process.Record.Dispose();
+                        process.Record = null;
+                    }
                     UpdateInputs(process);
 
                     // 涓嶅悓鑺傜偣璺宠繃鐨勬柟寮忎笉鍚�
@@ -543,9 +571,102 @@
         [Node("鐩告満鍙栧浘", "鍙栧儚宸ュ叿", "Basic", "鐩告満鍙栧浘")]
         public void 鐩告満鍙栧浘(FlowNode node) { RunNodeAsync(node); }
 
+        [Node("璇荤爜宸ュ叿", "鍙栧儚宸ュ叿", "Basic", "璇荤爜宸ュ叿")]
+        public void 璇荤爜宸ュ叿(FlowNode node) { RunNodeAsync(node); }
+
         [Node("Halcon2D鏂戠偣宸ュ叿", "Halcon2D宸ュ叿", "Basic", "Halcon2D鏂戠偣宸ュ叿")]
         public void Halcon2D鏂戠偣宸ュ叿(FlowNode node) { RunNodeAsync(node); }
 
+        [Node("閫氳妯″潡", "閫氳宸ュ叿", "Basic", "閫氳妯″潡")]
+        public void 閫氳妯″潡(FlowNode node) { RunNodeAsync(node); }
+
+        [Node("Halcon2D鍥惧儚澧炲己", "Halcon2D宸ュ叿", "Basic", "Halcon2D鍥惧儚澧炲己")]
+        public void Halcon2D鍥惧儚澧炲己(FlowNode node) { RunNodeAsync(node); }
+
+        [Node("Halcon2D鍥惧儚婊ゆ尝", "Halcon2D宸ュ叿", "Basic", "Halcon2D鍥惧儚婊ゆ尝")]
+        public void Halcon2D鍥惧儚婊ゆ尝(FlowNode node) { RunNodeAsync(node); }
+
+        [Node("杞儙璁℃暟", "鎺у埗", "Logic", "杞儙璁℃暟鑺傜偣")]
+        public void 杞儙璁℃暟(FlowNode node)
+        {
+            string ProcessName = node.Text;
+            try
+            {
+                if (dicContext.TryGetValue(ProcessName, out IProcess obj)
+                    && obj is TyreCounterProcess counter)
+                {
+                    UpdateInputs(counter);
+
+                    if (node.Break)
+                    {
+                        node.BranchIndex = "0";
+                        node.Result = true;
+                        counter.Result = true;
+                        counter.Msg = "杞儙璁℃暟鑺傜偣宸茶烦杩�";
+                        return;
+                    }
+
+                    // 浠庡墠缃妭鐐硅幏鍙栨娴嬬粨鏋滐紙閫氳繃杈撳叆鏄犲皠锛�
+                    bool imageResult = GetPreviousResult(node);
+
+                    // 璁剧疆杈撳叆缁撴灉
+                    counter.InputImage = imageResult;
+
+                    // 杩愯杞儙璁℃暟
+                    if (!counter.Run())
+                    {
+                        node.Result = false;
+                        Result &= false;
+                        Msg += $"[{ProcessName}]{counter.Msg}";
+                    }
+                    else
+                    {
+                        node.Result = true;
+
+                        // 濡傛灉瀹屾垚涓�涓疆鑳庯紝杈撳嚭瀹屾垚淇″彿
+                        if (counter.IsTyreComplete)
+                        {
+                            Msg += $"[{ProcessName}]瀹屾垚杞儙 #{counter.CurrentTyreID - 1}锛岀粨鏋�: {(counter.TyreResult ? "OK" : "NG")}";
+                        }
+                    }
+                }
+                else
+                {
+                    node.Result = false;
+                    Result &= false;
+                    Msg += $"[{ProcessName}]鏈壘鍒拌疆鑳庤鏁板伐鍏峰疄渚�";
+                }
+            }
+            catch (Exception ex)
+            {
+                node.Result = false;
+                Result &= false;
+                Msg += $"[{ProcessName}]杩愯鍙戠敓鎰忓,{ex.Message}";
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍓嶇疆鑺傜偣鐨勬娴嬬粨鏋�
+        /// </summary>
+        private bool GetPreviousResult(FlowNode node)
+        {
+            try
+            {
+                // 鏌ユ壘鍓嶇疆鑺傜偣
+                var prevNode = dicContext.Values
+                    .OfType<IProcess>()
+                    .FirstOrDefault(p => p.Result == true || p.Result == false);
+
+                if (prevNode != null)
+                {
+                    return prevNode.Result;
+                }
+            }
+            catch { }
+
+            return true; // 榛樿杩斿洖OK
+        }
+
         #endregion
 
 

--
Gitblit v1.9.3