using System;
using HalconDotNet;
namespace HalconTools
{
///
/// The class MeasurementPair describes edge pair measurement
/// and inherits from the base class Measurement. Virtual methods
/// defined in the base class are customized here to apply
/// HALCON operators for edge pair measurement.
///
public class MeasurementPair : Measurement
{
///
/// Result container for the edge information returned
/// by the HALCON measure operator.
///
private PairResult mResult;
///
/// Result container for the edge information converted
/// into world coordinates. If calibration data is not available,
/// the variable contains the same information as mResult.
///
private PairResult mResultWorld;
///
/// Creates a measurement object for the provided ROI instance.
///
/// ROI instance
/// Reference to controller class
public MeasurementPair(ROI roi, MeasureAssistant mAssist)
: base(roi, mAssist)
{
mResult = new PairResult();
mResultWorld = new PairResult();
UpdateMeasure();
}
///
/// Triggers an update of the measure results because of
/// changes in the parameter setup or a recreation of the measure
/// object caused by an update in the ROI model.
///
public override void UpdateResults()
{
if (mHandle == null)
return;
mMeasAssist.exceptionText = "";
try
{
mHandle.MeasurePairs(mMeasAssist.mImage,
mMeasAssist.mSigma, mMeasAssist.mThresh,
mMeasAssist.mTransition, mMeasAssist.mPosition,
out mResult.rowEdgeFirst, out mResult.colEdgeFirst, out mResult.amplitudeFirst,
out mResult.rowEdgeSecond, out mResult.colEdgeSecond, out mResult.amplitudeSecond,
out mResult.intraDistance, out mResult.interDistance);
if (mMeasAssist.mIsCalibValid && mMeasAssist.mTransWorldCoord)
{
Rectify(mResult.rowEdgeFirst, mResult.colEdgeFirst, out mResultWorld.rowEdgeFirst, out mResultWorld.colEdgeFirst);
Rectify(mResult.rowEdgeSecond, mResult.colEdgeSecond, out mResultWorld.rowEdgeSecond, out mResultWorld.colEdgeSecond);
mResultWorld.intraDistance = Distance(mResult.rowEdgeFirst, mResult.colEdgeFirst,
mResult.rowEdgeSecond, mResult.colEdgeSecond, 0);
mResultWorld.interDistance = Distance(mResult.rowEdgeSecond, mResult.colEdgeSecond,
mResult.rowEdgeFirst, mResult.colEdgeFirst, 1);
mResultWorld.amplitudeFirst = mResult.amplitudeFirst;
mResultWorld.amplitudeSecond = mResult.amplitudeSecond;
}
else
{
mResultWorld = new PairResult(mResult);
}
}
catch (HOperatorException e)
{
mEdgeXLD.Dispose();
mMeasAssist.exceptionText = e.Message;
mResultWorld = new PairResult();
return;
}
UpdateXLD();
}
/// Updates display object for measured edges.
public override void UpdateXLD()
{
HXLDCont val;
double width, phi, cRow, cCol, radius, extent;
if (mHandle == null && ((int)mHandle.Handle < 0))
return;
mMeasAssist.exceptionText = "";
width = mMeasAssist.mDispROIWidth ? mMeasAssist.mRoiWidth : mMeasAssist.mDispEdgeLength;
mEdgeXLD.Dispose();
mEdgeXLD.GenEmptyObj();
try
{
if (mROIType == ROI.ROI_TYPE_LINE)
{
phi = mMeasROI[2].D;
for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
{
val = DetermineEdgeLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D, phi, width);
mEdgeXLD = mEdgeXLD.ConcatObj(val);
val = DetermineEdgeLine(mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D, phi, width);
mEdgeXLD = mEdgeXLD.ConcatObj(val);
val = DetermineLine(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D);
mEdgeXLD = mEdgeXLD.ConcatObj(val);
}
}
else if (mROIType == ROI.ROI_TYPE_CIRCLEARC)
{
cRow = mROICoord[0].D;
cCol = mROICoord[1].D;
radius = mROICoord[2].D;
extent = mROICoord[4].D;
for (int i = 0; i < mResult.rowEdgeFirst.Length; i++)
{
val = DetermineEdgeCircularArc(mResult.rowEdgeFirst[i].D,
mResult.colEdgeFirst[i].D,
cRow, cCol, radius, width);
mEdgeXLD = mEdgeXLD.ConcatObj(val);
val = DetermineEdgeCircularArc(mResult.rowEdgeSecond[i].D,
mResult.colEdgeSecond[i].D,
cRow, cCol, radius, width);
mEdgeXLD = mEdgeXLD.ConcatObj(val);
val = DeterminePairCircularArc(mResult.rowEdgeFirst[i].D, mResult.colEdgeFirst[i].D,
mResult.rowEdgeSecond[i].D, mResult.colEdgeSecond[i].D,
cRow, cCol, radius, width, (extent >= 0));
mEdgeXLD = mEdgeXLD.ConcatObj(val);
}
}
}
catch (HOperatorException e)
{
mMeasAssist.exceptionText = e.Message;
}
}
/// Returns measurement result.
public override MeasureResult getMeasureResultData()
{
return mResultWorld;
}
/// Clears measurement result.
public override void ClearResultData()
{
mResultWorld = new PairResult();
}
}//end of class
}//end of namespace