using System; using CommonMethods; using HalconDotNet; using ToolBase; using static DataStruct.DataStructClass; using ChoiceTech.Halcon.Control; using ViewROI; namespace CaliperTool { [Serializable] public class Caliper: IToolBase { public bool toolEnable = true; /// /// 输入姿态.. /// public PosXYU inputPose = new PosXYU(); /// /// 制作模板时的输入位姿 /// public PosXYU templatePose = new PosXYU(); /// /// 卡尺 /// public HObject contoursDisp = null; /// /// 箭头 /// public HObject arrowDisp = null; /// /// 交点 /// public HObject crossDisp = null; /// /// 期望矩形中心行坐标 /// public HTuple expectRecStartRow = 200; /// /// 期望矩形中心列坐标 /// public HTuple expectRecStartColumn = 200; /// /// 期望矩形起点方向 /// public HTuple expectAngle = 0; /// /// 卡尺高 /// public HTuple length1 = 40; /// /// 卡尺宽 /// public HTuple length2 = 40; /// /// 找边极性,从明到暗或从暗到明 /// public string polarity = "negative"; /// /// 边阈值 /// public int threshold = 30; /// /// 边Sigma /// public double sigma = 1.0; /// /// 选择所查找到的点 /// public string edgeSelect = "all"; /// /// 矩形框显示 /// public bool dispRec = true; /// /// 交点显示 /// public bool dispCross = true; /// public bool LineDisp = true; /// /// 新的跟随姿态变化后的预期线信息 /// HTuple newExpectRecStartRow = new HTuple(200), newExpectRecStartColumn = new HTuple(200), newExpectPhi = new HTuple(0); [NonSerialized] public HDrawingObject calibDrawObject = new HDrawingObject(); /// /// 查找到的线的起点行坐标 /// private HTuple _resultRow = 0; public HTuple ResulttRow { get { _resultRow = Math.Round((double)_resultRow, 3); return _resultRow; } set { _resultRow = value; } } /// /// 查找到的线的起点列坐标 /// private HTuple _resultCol = 0; public HTuple ResultCol { get { _resultCol = Math.Round((double)_resultCol, 3); return _resultCol; } set { _resultCol = value; } } public override void DispImage() { if (inputImage != null) { FormCaliper.Instance.myHwindow.DispHWindow.DispObj(inputImage); } } internal void DrawExpectLine(HWindow myHwindow) { if (inputImage != null) { try { HOperatorSet.SetColor(myHwindow, new HTuple("green")); HOperatorSet.DrawRectangle2Mod(myHwindow, expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2, out expectRecStartRow, out expectRecStartColumn, out expectAngle, out length1, out length2); if (inputPose != null) { templatePose.X = inputPose.X; templatePose.Y = inputPose.Y; templatePose.U = inputPose.U; } // 参数 FormCaliper.Instance.tbx_caliperLength1.Text = length1.TupleString("10.3f"); FormCaliper.Instance.tbx_caliperLength2.Text = length2.TupleString("10.3f"); // Run(); } catch (Exception ex) { FormCaliper.Instance.SetToolStatus(ex.Message, ToolRunStatu.Tool_Run_Error); } } else { FormCaliper.Instance.SetToolStatus("图像为空", ToolRunStatu.Not_Asign_Input_Image); } } public void UpdateImage() { FormCaliper.Instance.myHwindow.DispHWindow.ClearWindow(); DispImage(); } public override void Run(SoftwareRunState softwareRunState) { HTuple HMeasureHandle = new HTuple(); HTuple resultRow, resultCol; if (inputImage == null) { if(softwareRunState == SoftwareRunState.Debug) { FormCaliper.Instance.SetToolStatus("图像为空", ToolRunStatu.Not_Asign_Input_Image); } toolRunStatu = ToolRunStatu.Not_Input_Image; return; } try { UpdateImage(); if (inputPose != null) { HTuple Row = inputPose.X - templatePose.X; HTuple Col = inputPose.Y - templatePose.Y; HTuple angle = inputPose.U - templatePose.U; HTuple _homMat2D; HOperatorSet.HomMat2dIdentity(out _homMat2D); HOperatorSet.HomMat2dRotate(_homMat2D, (HTuple)(angle), (HTuple)templatePose.X, (HTuple)templatePose.Y, out _homMat2D); HOperatorSet.HomMat2dTranslate(_homMat2D, (HTuple)(Row), (HTuple)(Col), out _homMat2D); //对预期线的起始点做放射变换 HOperatorSet.AffineTransPixel(_homMat2D, (HTuple)expectRecStartRow, (HTuple)expectRecStartColumn, out newExpectRecStartRow, out newExpectRecStartColumn); } else { newExpectRecStartRow = expectRecStartRow; newExpectRecStartColumn = expectRecStartColumn; } HTuple width, height, AmplitudeThreshold, distance; HOperatorSet.GetImageSize(inputImage, out width, out height); HOperatorSet.GenMeasureRectangle2(expectRecStartRow, expectRecStartColumn, expectAngle, length1, length2, width, height, "nearest_neighbor", out HMeasureHandle); HOperatorSet.MeasurePos(inputImage, HMeasureHandle, sigma, threshold, polarity, edgeSelect, out resultRow, out resultCol, out AmplitudeThreshold, out distance); if(resultRow.Length != 0) { ResulttRow = resultRow; ResultCol = resultCol; } //把点显示出来 HOperatorSet.GenCrossContourXld(out crossDisp, ResulttRow, ResultCol, new HTuple(80), new HTuple(0)); if(softwareRunState == SoftwareRunState.Debug) { DispMainWindow(FormCaliper.Instance.myHwindow); FormCaliper.Instance.tbx_resultStartRow.Text = ResulttRow.ToString(); FormCaliper.Instance.tbx_resultStartCol.Text = ResultCol.ToString(); FormCaliper.Instance.SetToolStatus("运行成功", ToolRunStatu.Succeed); } // 参数传递 ParamsTrans(); toolRunStatu = ToolRunStatu.Succeed; } catch (Exception ex) { toolRunStatu = ToolRunStatu.Not_Succeed; if (softwareRunState == SoftwareRunState.Debug) { FormCaliper.Instance.SetToolStatus("工具运行异常" + ex.Message, ToolRunStatu.Tool_Run_Error); } } finally { //homMat2DArrow.Dispose(); //arrow.Dispose(); //arrowTrans.Dispose(); } } /// /// 将数据传递给FindlineToolInterface /// private void ParamsTrans() { if(FormCaliper.Instance.myToolInfo != null) { FormCaliper.Instance.myToolInfo.toolOutput.Clear(); FormCaliper.Instance.myToolInfo.toolOutput.Add(new ToolIO("outputCenterRow", ResulttRow, DataType.IntValue)); FormCaliper.Instance.myToolInfo.toolOutput.Add(new ToolIO("outputCenterColumn", ResultCol, DataType.IntValue)); } } public override void DispMainWindow(HWindowTool_Smart window) { // 显示矩形 if (dispRec && contoursDisp != null) { window.DispHWindow.SetColor("blue"); window.DispHWindow.DispObj(contoursDisp); } // 显示交点 if (dispCross && crossDisp != null) { window.DispHWindow.SetColor("green"); window.DispHWindow.DispObj(crossDisp); } //显示找到的线 // window.DispObj(LineDisp, "green"); } } }