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