mirror of
https://github.com/eggplantlwj/VisionEdit.git
synced 2026-03-24 00:36:41 +08:00
193 lines
8.0 KiB
C#
193 lines
8.0 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows.Forms;
|
|||
|
|
using HalconDotNet;
|
|||
|
|
|
|||
|
|
namespace CommonMethods
|
|||
|
|
{
|
|||
|
|
public class CommonMethods
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 延时操作
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="mm"></param>
|
|||
|
|
public static void Delay(int mm)
|
|||
|
|
{
|
|||
|
|
DateTime delay = DateTime.Now.AddMilliseconds((double)mm);
|
|||
|
|
while (delay > DateTime.Now)
|
|||
|
|
{
|
|||
|
|
Application.DoEvents();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Creates an arrow shaped XLD contour.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="ho_Arrow">生成的箭头</param>
|
|||
|
|
/// <param name="hv_Row1">箭头起点Row</param>
|
|||
|
|
/// <param name="hv_Column1">箭头起点Column</param>
|
|||
|
|
/// <param name="hv_Row2">箭头终点Row</param>
|
|||
|
|
/// <param name="hv_Column2">箭头终点Column</param>
|
|||
|
|
/// <param name="hv_HeadLength">头长度</param>
|
|||
|
|
/// <param name="hv_HeadWidth">头宽度</param>
|
|||
|
|
public static void gen_arrow_contour_xld(out HObject ho_Arrow, HTuple hv_Row1, HTuple hv_Column1,
|
|||
|
|
HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Stack for temporary objects
|
|||
|
|
HObject[] OTemp = new HObject[20];
|
|||
|
|
|
|||
|
|
// Local iconic variables
|
|||
|
|
|
|||
|
|
HObject ho_TempArrow = null;
|
|||
|
|
|
|||
|
|
// Local control variables
|
|||
|
|
|
|||
|
|
HTuple hv_Length = new HTuple(), hv_ZeroLengthIndices = new HTuple();
|
|||
|
|
HTuple hv_DR = new HTuple(), hv_DC = new HTuple(), hv_HalfHeadWidth = new HTuple();
|
|||
|
|
HTuple hv_RowP1 = new HTuple(), hv_ColP1 = new HTuple();
|
|||
|
|
HTuple hv_RowP2 = new HTuple(), hv_ColP2 = new HTuple();
|
|||
|
|
HTuple hv_Index = new HTuple();
|
|||
|
|
// Initialize local and output iconic variables
|
|||
|
|
HOperatorSet.GenEmptyObj(out ho_Arrow);
|
|||
|
|
HOperatorSet.GenEmptyObj(out ho_TempArrow);
|
|||
|
|
//This procedure generates arrow shaped XLD contours,
|
|||
|
|
//pointing from (Row1, Column1) to (Row2, Column2).
|
|||
|
|
//If starting and end point are identical, a contour consisting
|
|||
|
|
//of a single point is returned.
|
|||
|
|
//
|
|||
|
|
//input parameteres:
|
|||
|
|
//Row1, Column1: Coordinates of the arrows' starting points
|
|||
|
|
//Row2, Column2: Coordinates of the arrows' end points
|
|||
|
|
//HeadLength, HeadWidth: Size of the arrow heads in pixels
|
|||
|
|
//
|
|||
|
|
//output parameter:
|
|||
|
|
//Arrow: The resulting XLD contour
|
|||
|
|
//
|
|||
|
|
//The input tuples Row1, Column1, Row2, and Column2 have to be of
|
|||
|
|
//the same length.
|
|||
|
|
//HeadLength and HeadWidth either have to be of the same length as
|
|||
|
|
//Row1, Column1, Row2, and Column2 or have to be a single element.
|
|||
|
|
//If one of the above restrictions is violated, an error will occur.
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
//Init
|
|||
|
|
ho_Arrow.Dispose();
|
|||
|
|
HOperatorSet.GenEmptyObj(out ho_Arrow);
|
|||
|
|
//
|
|||
|
|
//Calculate the arrow length
|
|||
|
|
hv_Length.Dispose();
|
|||
|
|
HOperatorSet.DistancePp(hv_Row1, hv_Column1, hv_Row2, hv_Column2, out hv_Length);
|
|||
|
|
//
|
|||
|
|
//Mark arrows with identical start and end point
|
|||
|
|
//(set Length to -1 to avoid division-by-zero exception)
|
|||
|
|
hv_ZeroLengthIndices.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_ZeroLengthIndices = hv_Length.TupleFind(
|
|||
|
|
0);
|
|||
|
|
}
|
|||
|
|
if ((int)(new HTuple(hv_ZeroLengthIndices.TupleNotEqual(-1))) != 0)
|
|||
|
|
{
|
|||
|
|
if (hv_Length == null)
|
|||
|
|
hv_Length = new HTuple();
|
|||
|
|
hv_Length[hv_ZeroLengthIndices] = -1;
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
//Calculate auxiliary variables.
|
|||
|
|
hv_DR.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_DR = (1.0 * (hv_Row2 - hv_Row1)) / hv_Length;
|
|||
|
|
}
|
|||
|
|
hv_DC.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_DC = (1.0 * (hv_Column2 - hv_Column1)) / hv_Length;
|
|||
|
|
}
|
|||
|
|
hv_HalfHeadWidth.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_HalfHeadWidth = hv_HeadWidth / 2.0;
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
//Calculate end points of the arrow head.
|
|||
|
|
hv_RowP1.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_RowP1 = (hv_Row1 + ((hv_Length - hv_HeadLength) * hv_DR)) + (hv_HalfHeadWidth * hv_DC);
|
|||
|
|
}
|
|||
|
|
hv_ColP1.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_ColP1 = (hv_Column1 + ((hv_Length - hv_HeadLength) * hv_DC)) - (hv_HalfHeadWidth * hv_DR);
|
|||
|
|
}
|
|||
|
|
hv_RowP2.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_RowP2 = (hv_Row1 + ((hv_Length - hv_HeadLength) * hv_DR)) - (hv_HalfHeadWidth * hv_DC);
|
|||
|
|
}
|
|||
|
|
hv_ColP2.Dispose();
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
hv_ColP2 = (hv_Column1 + ((hv_Length - hv_HeadLength) * hv_DC)) + (hv_HalfHeadWidth * hv_DR);
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
//Finally create output XLD contour for each input point pair
|
|||
|
|
for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_Length.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
|
|||
|
|
{
|
|||
|
|
if ((int)(new HTuple(((hv_Length.TupleSelect(hv_Index))).TupleEqual(-1))) != 0)
|
|||
|
|
{
|
|||
|
|
//Create_ single points for arrows with identical start and end point
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
ho_TempArrow.Dispose();
|
|||
|
|
HOperatorSet.GenContourPolygonXld(out ho_TempArrow, hv_Row1.TupleSelect(hv_Index),
|
|||
|
|
hv_Column1.TupleSelect(hv_Index));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//Create arrow contour
|
|||
|
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
|||
|
|
{
|
|||
|
|
ho_TempArrow.Dispose();
|
|||
|
|
HOperatorSet.GenContourPolygonXld(out ho_TempArrow, ((((((((((hv_Row1.TupleSelect(
|
|||
|
|
hv_Index))).TupleConcat(hv_Row2.TupleSelect(hv_Index)))).TupleConcat(
|
|||
|
|
hv_RowP1.TupleSelect(hv_Index)))).TupleConcat(hv_Row2.TupleSelect(hv_Index)))).TupleConcat(
|
|||
|
|
hv_RowP2.TupleSelect(hv_Index)))).TupleConcat(hv_Row2.TupleSelect(hv_Index)),
|
|||
|
|
((((((((((hv_Column1.TupleSelect(hv_Index))).TupleConcat(hv_Column2.TupleSelect(
|
|||
|
|
hv_Index)))).TupleConcat(hv_ColP1.TupleSelect(hv_Index)))).TupleConcat(
|
|||
|
|
hv_Column2.TupleSelect(hv_Index)))).TupleConcat(hv_ColP2.TupleSelect(
|
|||
|
|
hv_Index)))).TupleConcat(hv_Column2.TupleSelect(hv_Index)));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
{
|
|||
|
|
HObject ExpTmpOutVar_0;
|
|||
|
|
HOperatorSet.ConcatObj(ho_Arrow, ho_TempArrow, out ExpTmpOutVar_0);
|
|||
|
|
ho_Arrow.Dispose();
|
|||
|
|
ho_Arrow = ExpTmpOutVar_0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ho_TempArrow.Dispose();
|
|||
|
|
|
|||
|
|
hv_Length.Dispose();
|
|||
|
|
hv_ZeroLengthIndices.Dispose();
|
|||
|
|
hv_DR.Dispose();
|
|||
|
|
hv_DC.Dispose();
|
|||
|
|
hv_HalfHeadWidth.Dispose();
|
|||
|
|
hv_RowP1.Dispose();
|
|||
|
|
hv_ColP1.Dispose();
|
|||
|
|
hv_RowP2.Dispose();
|
|||
|
|
hv_ColP2.Dispose();
|
|||
|
|
hv_Index.Dispose();
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|