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)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)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;
}
}
}