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 { /// /// 延时操作 /// /// public static void Delay(int mm) { DateTime delay = DateTime.Now.AddMilliseconds((double)mm); while (delay > DateTime.Now) { Application.DoEvents(); } } /// /// Creates an arrow shaped XLD contour. /// /// 生成的箭头 /// 箭头起点Row /// 箭头起点Column /// 箭头终点Row /// 箭头终点Column /// 头长度 /// 头宽度 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; } } }