mirror of
https://github.com/eggplantlwj/VisionEdit.git
synced 2026-03-25 17:26:35 +08:00
增加查找线工具
This commit is contained in:
192
CommonMethods/CommonMethods.cs
Normal file
192
CommonMethods/CommonMethods.cs
Normal file
@@ -0,0 +1,192 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user