using LB_VisionProcesses.Cameras; using LB_VisionProcesses.Communicators; using LB_VisionProcesses.Alogrithms; using LB_VisionProcesses.Alogrithms.Halcon; using System.Collections.Concurrent; using System.Reflection; using System.Runtime.InteropServices; using System.Text.Json.Serialization; namespace LB_VisionProcesses { public abstract class IProcess : IDisposable, ICloneable { /// /// 流程集合 /// public static Dictionary dicProcesses = new Dictionary { //相机 { "相机取图", "LB_VisionProcesses.Cameras.CameraConfig" }, //通讯 { "通讯测试", "LB_VisionProcesses.Communicators.CommunicatorConfig" }, //{ "T306通讯", "LB_VisionProcesses.Communicators.T306CommandTool" }, { "T306通讯", "LB_VisionProcesses.Communicators.T306CommandTool" }, { "ModbusRTU", "LB_VisionProcesses.Processes.ModbusRTUMasterTool" }, { "ModbusTCP", "LB_VisionProcesses.Processes.ModbusTCPMasterTool" }, //Halcon2D算法 { "Halcon2D_模板匹配工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindModelTool" }, { "Halcon2D_多模板匹配工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindMultiModelTool" }, { "Halcon2D_斑点工具", "LB_VisionProcesses.Alogrithms.Halcon.HBlobTool" }, { "Halcon2D_读码工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindCode2dTool" }, { "Halcon2D_找线工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindLineTool" }, { "Halcon2D_找弧工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindEllipseTool" }, //思谋深度学习算法 { "语义分割工具", "LB_VisionProcesses.Alogrithms.BigModel.Segment.SegmentTool" }, //图像处理 { "单图像处理工具", "LB_VisionProcesses.Alogrithms.OneImageConvertTool" }, { "点云转换工具", "LB_VisionProcesses.Alogrithms.PointsCloudConvertTool" }, { "畸变矫正工具", "LB_VisionProcesses.Alogrithms.Halcon.HCaltabTool" }, //OpenCvSharp { "OpenCvSharp_模板匹配工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.FindModelTool" }, { "OpenCvSharp_斑点工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.BlobTool" }, { "OpenCvSharp_找线工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.FindLineTool" }, //工具 { "创建绘制工具", "LB_VisionProcesses.Processes.RecordTool" }, { "创建固定跟随", "LB_VisionProcesses.Alogrithms.CreateFixtureTool" }, { "创建线段工具", "LB_VisionProcesses.Alogrithms.CreateSegmentTool" }, { "创建垂线工具", "LB_VisionProcesses.Alogrithms.CreateVerticalTool" }, { "线线交点工具", "LB_VisionProcesses.Alogrithms.IntersectionLine2Tool" }, { "脚本", "LB_VisionProcesses.Processes.ScriptTool" }, { "延时", "LB_VisionProcesses.Processes.DelayTime" }, { "分支", "LB_VisionProcesses.Processes.ScriptTool" }, { "多分支", "LB_VisionProcesses.Processes.ScriptTool" }, }; static IProcess() { _isRunningVisionProServer = true; } public static bool _isRunningVisionProServer = false; /// /// 通讯和相机集合 /// public static List lstCommunicators = new List(); public static List lstCameras = new List(); /// /// 固定跟随集合 /// public static ConcurrentDictionary dicFixtures = new ConcurrentDictionary(); /// /// 畸变矫正集合 /// public static ConcurrentDictionary dicHCaltabMaps = new ConcurrentDictionary(); /// /// 全局变量集合(Key:变量名,Value:变量值) /// public static ConcurrentDictionary dicGlobalVars = new ConcurrentDictionary(); /// /// 运行日志 /// public string Msg = "运行成功"; /// /// 运行结果 /// public bool Result = true; /// /// 运行时间 /// public double RunTime = 0; /// /// 允许运行时间 /// public double MaxTimeOut = 2000; /// /// 工具名称 /// public string strProcessName = string.Empty; /// /// 工具类名 /// public string strProcessClass = "LB_VisionProcesses.IProcess"; /// /// 算法参数 /// public ProcessParams Params = new ProcessParams(); /// /// 输入图片 /// public object InputImage; /// /// 输出图片 /// public object OutputImage; /// /// 结果区域 /// public ObjectRecord Record = new ObjectRecord(); /// /// 运行完成标记 /// public bool bCompleted = false; public abstract void InitRunParams(); public abstract bool Run(); public abstract bool Load(string fullPath); public abstract bool Save(string filePath); public static Assembly GetExecutingAssembly() { return Assembly.GetExecutingAssembly(); } public abstract object Clone(); public abstract void Dispose(); } [Serializable] public class Fixture { /// /// 横坐标X /// public double X = 0; public double Column { get { return X; } set { X = value; } } /// /// 纵坐标Y /// public double Y = 0; public double Row { get { return Y; } set { Y = value; } } /// /// 弧度Phi /// public double Phi = 0; public double Angle { get { return Phi / Math.PI * 180; } set { Phi = value / 180 * Math.PI; } } public string strName = ""; public Fixture() { } [JsonConstructor] // 标记为用于反序列化 public Fixture(double x, double y, double phi, string strName) { this.X = x; this.Y = y; this.Phi = phi; this.strName = strName; } public Fixture(Fixture fixture) { if (fixture == null) return; this.X = fixture.X; this.Y = fixture.Y; this.Phi = fixture.Phi; this.strName = fixture.strName; } public Fixture(string strName) => this.strName = strName; public void GetOffset(double x, double y, double phi, out double offsetX, out double offsetY, out double offsetPhi) { offsetX = X - x; offsetY = Y - y; offsetPhi = Phi - phi; } public object Clone() { return MemberwiseClone(); } } public class NaturalStringComparer : IComparer { [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] public static extern int StrCmpLogicalW(string psz1, string psz2); public int Compare(string x, string y) { return StrCmpLogicalW(x, y); } } }