using System; using System.Collections.Generic; using System.Linq; using System.Text; using HalconDotNet; using System.ComponentModel; namespace HalconTools { public delegate void FitMessageDelegate(int value); public delegate void SetImageDelegate(object sender, HImage image); public delegate void FitLineDelegate(object sender, HImage image, FitLineResult result); public delegate void FitCircleDelegate(object sender,HImage image,FitCircleResult result); public class FitAssistant { public event FitLineDelegate FitLineDone; public event FitCircleDelegate FitCircleDone; public event FitMessageDelegate NotifyIconObserverMessage; private const int ERR_READING_FILE = 0; private const int ERR_NO_IMAGE = 1; private const int ERR_PARAMSET = 2; private const int ERR_FITLINE = 3; private const int ERR_FITCIRCLE = 4; /// HALCON image used for . public HImage mImage; public int mWidth; public int mHeight; public HWndCtrl viewController; public ROIController roiController; /// Error messages for failed measure actions. public HTuple exceptionText; private object someEventLock; public FitAssistant() { NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage); someEventLock = new object(); roiController = new ROIController(); } public FitAssistant(HWindowControl viewPort) { NotifyIconObserverMessage = new FitMessageDelegate(UpdateMessage); someEventLock = new object(); viewController = new HWndCtrl(viewPort); roiController = new ROIController(); } public void UpdateMessage(int val) { switch (val) { case FitAssistant.ERR_READING_FILE: System.Windows.Forms.MessageBox.Show("Error Imge File!", "Fit Wizard", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); break; case FitAssistant.ERR_NO_IMAGE: System.Windows.Forms.MessageBox.Show("No Imge!", "Fit Wizard", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); break; case FitAssistant.ERR_PARAMSET: System.Windows.Forms.MessageBox.Show("Error param set!", "Fit Wizard", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); break; case FitAssistant.ERR_FITLINE: System.Windows.Forms.MessageBox.Show("Error fit line!", "Fit Wizard", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); break; case FitAssistant.ERR_FITCIRCLE: System.Windows.Forms.MessageBox.Show("Error fit circle!", "Fit Wizard", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information); break; default: break; } } public bool SetImage(string filename) { string tmp; exceptionText = ""; try { mImage = new HImage(filename); mImage.GetImagePointer1(out tmp, out mWidth, out mHeight); } catch (HOperatorException e) { mImage = null; exceptionText = e.Message; NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE); return false; } return true; } public bool SetImage(HImage image) { string tmp; exceptionText = ""; try { mImage = image; mImage.GetImagePointer1(out tmp, out mWidth, out mHeight); } catch (HOperatorException e) { mImage = null; exceptionText = e.Message; NotifyIconObserverMessage(FitAssistant.ERR_READING_FILE); return false; } return true; } /// /// Writes the new image to graphic window /// public void UpdateImage() { //viewController = new HWndCtrl(viewPort); //roiController = new ROIController(); viewController.resetAll(); viewController.useROIController(roiController); viewController.setViewState(HWndCtrl.MODE_VIEW_NONE); viewController.addIconicVar(mImage); viewController.repaint(); } public LinePosition GetLinePosition() { LinePosition position; int activeROIIdx = roiController.getActiveROIIdx(); if (activeROIIdx > -1) { ROI line = roiController.getActiveROI(); HTuple ss = line.getModelData(); if (ss.Length == 4) { position = new LinePosition(ss); } else { position = null; } } else { position = null; } return position; } public CirclePosition GetCirClePosition() { CirclePosition position; int activeROIIdx = roiController.getActiveROIIdx(); if (activeROIIdx > -1) { ROI circle = roiController.getActiveROI(); HTuple ss = circle.getModelData(); if (ss.Length == 3) { position = new CirclePosition(ss); } else { position = null; } } else { position = null; } return position; } /// /// 在指定窗体中显示Fit到的结果 /// /// 图像显示窗体 /// 图像 /// 匹配结果 public void FitLineGraphics(HWndCtrl viewController, HImage CurrentImg, FitLineResult result) { //Window control that manages visualization viewController.resetAll(); viewController.repaint(); viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple()); viewController.addIconicVar(CurrentImg); HXLD DetectionContour = result.mFitLineResult; if (DetectionContour != null) { viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green"); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2); viewController.addIconicVar(DetectionContour); viewController.repaint(); } } public void FitCircleGraphics(HWndCtrl viewController, HImage CurrentImg, FitCircleResult result) { //Window control that manages visualization viewController.resetAll(); viewController.repaint(); viewController.changeGraphicSettings(GraphicsContext.GC_LINESTYLE, new HTuple()); viewController.addIconicVar(CurrentImg); HXLD DetectionContour = result.mFitCircleResult; if (DetectionContour != null) { viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "green"); viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2); viewController.addIconicVar(DetectionContour); viewController.repaint(); } } public FitLineResult FitLine(FitLineParam param) { double t2, t1; //HTuple hv_rows=null,hv_column=null; FitLineResult result = new FitLineResult(); if (mImage == null) { if (NotifyIconObserverMessage != null) { NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE); } return result; } if (param == null) { if (NotifyIconObserverMessage != null) { NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET); } return result; } try { lock (someEventLock) { t1 = HSystem.CountSeconds(); mImage.GetImageSize(out result.mWidth,out result.mHeight); HMetrologyModel hv_MetrologyHandle = new HMetrologyModel(); hv_MetrologyHandle.CreateMetrologyModel(); hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight); hv_MetrologyHandle.AddMetrologyObjectLineMeasure((HTuple)param.hv_RowBegin, (HTuple)param.hv_ColumnBegin, (HTuple)param.hv_RowEnd, (HTuple)param.hv_ColumnEnd, (HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2, (HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold, new HTuple(), new HTuple()); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)(int)param.hv_measure_number); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString()); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString()); hv_MetrologyHandle.ApplyMetrologyModel(mImage); result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns); result.mContLine.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns); result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398); result.mContLine.FitLineContourXld("tukey", (int)(param.hv_measure_number - 10), 3, 5, 2.0, out result.mRowStart, out result.mColumnStart, out result.mRowEnd, out result.mColumnEnd, out result.mVector, out result.mNC, out result.mDist); HTuple rows, cols; rows = new HTuple(new HTuple[] { result.mRowStart, result.mRowEnd }); cols = new HTuple(new HTuple[] { result.mColumnStart, result.mColumnEnd }); result.mFitLineResult.GenContourPolygonXld(rows, cols); //result.mAngle = result.mFitLineResult.GetContourAttribXld("angle"); //result.mAngle = result.mFitLineResult.GetContourAngleXld("abs", "range", 3); t2 = HSystem.CountSeconds(); result.mTime = 1000.0 * (t2 - t1); if (FitLineDone != null) { FitLineDone(this, mImage, result); } } } catch(HOperatorException e) { if (NotifyIconObserverMessage != null) { //NotifyIconObserverMessage(FitAssistant.ERR_FITLINE); } result = null; return result; } return result; } public FitCircleResult FitCircle(FitCircleParam param) { double t2, t1; FitCircleResult result = new FitCircleResult(); if (mImage == null) { if (NotifyIconObserverMessage != null) { NotifyIconObserverMessage(FitAssistant.ERR_NO_IMAGE); } return result; } if (param == null) { if (NotifyIconObserverMessage != null) { NotifyIconObserverMessage(FitAssistant.ERR_PARAMSET); } return result; } try { lock (someEventLock) { t1 = HSystem.CountSeconds(); mImage.GetImageSize(out result.mWidth, out result.mHeight); HMetrologyModel hv_MetrologyHandle = new HMetrologyModel(); hv_MetrologyHandle.CreateMetrologyModel(); hv_MetrologyHandle.SetMetrologyModelImageSize(result.mWidth, result.mHeight); hv_MetrologyHandle.AddMetrologyObjectCircleMeasure((HTuple)param.hv_RowCenter, (HTuple)param.hv_ColumnCenter, (HTuple)param.hv_Radius, (HTuple)param.hv_measure_Length1, (HTuple)param.hv_measure_Length2, (HTuple)param.hv_measure_sigma, (HTuple)param.hv_measure_threshold, new HTuple(), new HTuple()); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length1", (HTuple)param.hv_measure_Length1); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_length2", (HTuple)param.hv_measure_Length2); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"num_measures", (HTuple)(int)param.hv_measure_number); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_select", (HTuple)param.hv_measure_position.ToString()); hv_MetrologyHandle.SetMetrologyObjectParam((HTuple)"all", (HTuple)"measure_transition", (HTuple)param.hv_measure_transition.ToString()); hv_MetrologyHandle.ApplyMetrologyModel(mImage); result.mContours = hv_MetrologyHandle.GetMetrologyObjectMeasures("all", "all", out result.hv_Rows, out result.hv_Columns); result.mContCircle.GenContourPolygonXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns); result.mContPoints.GenCrossContourXld((HTuple)result.hv_Rows, (HTuple)result.hv_Columns, 6, 0.785398); result.mContCircle.FitCircleContourXld("ahuber", -1, 2.0, 4, 3, 2.0, out result.mRowCenter, out result.mColumnCenter, out result.mRadius, out result.mStartPhi, out result.mEndPhi, out result.mPointOrder); result.mFitCircleResult.GenCircleContourXld(result.mRowCenter, result.mColumnCenter, result.mRadius, 0, (new HTuple(360)).TupleRad(), (HTuple)"positive", 1.0); t2 = HSystem.CountSeconds(); result.mTime = 1000.0 * (t2 - t1); if (FitCircleDone != null) { FitCircleDone(this, mImage, result); } } } catch(HOperatorException e) { if (NotifyIconObserverMessage != null) { //NotifyIconObserverMessage(FitAssistant.ERR_FITCIRCLE); } result = null; return result; } return result; } } }