using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HalconDotNet;
namespace HalconTools
{
public delegate void ScrewDelegate(ScrewResult result);
public class ScrewAssistant
{
public event ScrewDelegate ScrewDone;
/// HALCON image used for .
public HImage mImage;
public int mWidth;
public int mHeight;
public HWndCtrl viewController;
public ROIController roiController;
public ScrewParam mScrewPara = new ScrewParam();
public ScrewResult mScrewResult = new ScrewResult();
//中间参数
public HXLDCont XLDThresholdSubPix = new HXLDCont();
public HXLDCont XLDSelected = new HXLDCont();
public HXLDCont XLDRoundness = new HXLDCont();
public double row, col, radius;
private HXLDCont tmpXLD = new HXLDCont();
private HXLDCont tmpXLD2 = new HXLDCont();
private HXLDCont tmpXLD3 = new HXLDCont();
public ScrewAssistant()
{
}
public ScrewAssistant(HWindowControl viewPort)
{
viewController = new HWndCtrl(viewPort);
roiController = new ROIController();
}
public bool SetImage(string filename)
{
string tmp;
try
{
mImage = new HImage(filename);
mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
}
catch (HOperatorException e)
{
mImage = null;
return false;
}
return true;
}
public bool SetImage(HImage image)
{
string tmp;
try
{
mImage = image;
mImage.GetImagePointer1(out tmp, out mWidth, out mHeight);
}
catch (HOperatorException e)
{
mImage = null;
return false;
}
return true;
}
///
/// Writes the new image to graphic window
///
public void UpdateImage()
{
viewController.resetAll();
viewController.useROIController(roiController);
viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
viewController.addIconicVar(mImage);
viewController.repaint();
}
public void UpdateObj(HObject obj)
{
viewController.resetAll();
viewController.repaint();
viewController.useROIController(roiController);
viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, "blue");
viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
viewController.addIconicVar(obj);
viewController.repaint();
}
public void UpdateObj(HObject obj, string color)
{
viewController.resetAll();
viewController.repaint();
viewController.useROIController(roiController);
viewController.setViewState(HWndCtrl.MODE_VIEW_NONE);
viewController.changeGraphicSettings(GraphicsContext.GC_COLOR, color);
viewController.changeGraphicSettings(GraphicsContext.GC_LINEWIDTH, 2);
viewController.addIconicVar(obj);
viewController.repaint();
}
public void SetPara(ScrewParam para)
{
mScrewPara.ThresholdSubPix = para.ThresholdSubPix;
mScrewPara.RoundnessMin = para.RoundnessMin;
mScrewPara.RoundnessMax = para.RoundnessMax;
mScrewPara.RadiusMin = para.RadiusMin;
mScrewPara.RadiusMax = para.RadiusMax;
}
public HXLDCont ThresholdSubPix(HImage image)
{
tmpXLD = image.ThresholdSubPix(mScrewPara.ThresholdSubPix);
return tmpXLD;
}
public HXLDCont RoundnessXLD(HXLDCont xld)
{
tmpXLD = xld.SelectShapeXld("circularity", "and", mScrewPara.RoundnessMin, mScrewPara.RoundnessMax);
return tmpXLD;
}
public HXLDCont SelectXLD(HXLDCont xld)
{
tmpXLD2 = xld.SelectShapeXld("width", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2);
tmpXLD3 = tmpXLD2.SelectShapeXld("height", "and", mScrewPara.RadiusMin * 2, mScrewPara.RadiusMax * 2);
return tmpXLD3;
}
public HXLDCont FitCircle(HXLDCont xld)
{
double phistart,phiend;
string tmps;
xld.FitCircleContourXld("atukey", -1, 0, 0, 3, 2, out row, out col, out radius, out phistart, out phiend, out tmps);
tmpXLD = new HXLDCont();
tmpXLD.GenCircleContourXld(row, col, radius, 0, 6.28518, "positive", 1);
return tmpXLD;
}
public void Run()
{
try
{
mScrewResult = new ScrewResult();
XLDThresholdSubPix = ThresholdSubPix(mImage);
XLDRoundness = RoundnessXLD(XLDThresholdSubPix);
XLDSelected = SelectXLD(XLDRoundness);
mScrewResult.CircleCont = FitCircle(XLDSelected);
mScrewResult.row = row;
mScrewResult.col = col;
mScrewResult.radius = radius;
if (ScrewDone != null)
{
ScrewDone(mScrewResult);
}
}
catch (Exception ex)
{
mScrewResult = null;
if (ScrewDone != null) ScrewDone(mScrewResult);
}
}
}
}