1 #region ===========================两个相机=============================================
2 public static double[] TwoPointLine(double Point1X, double Point1Y, double Point2X, double Point2Y)
3 {
4 double[] TwoPointPars = new double[3];
5 try
6 {
7 if (Point1Y == Point2Y && Point1X == Point2X)
8 {
9
10 System.Windows.Forms.MessageBox.Show("两相同点,不能确定同一直线,请查实!"
11 , "错误"
12 , System.Windows.Forms.MessageBoxButtons.OK
13 , System.Windows.Forms.MessageBoxIcon.Exclamation
14 , System.Windows.Forms.MessageBoxDefaultButton.Button1);
15 return null;
16 }
17 else if (Point1X == Point2X)
18 {
19 TwoPointPars[1] = 0;
20 TwoPointPars[0] = 1;
21 TwoPointPars[2] = -Point1X;
22 }
23 else
24 {
25 TwoPointPars[1] = 1;
26 TwoPointPars[0] = -(Point2Y - Point1Y) / (Point2X - Point1X);
27 TwoPointPars[2] = Point1X * (Point2Y - Point1Y) / (Point2X - Point1X) - Point1Y;
28 }
29
30 }
31
32 catch (Exception ex)
33 {
34
35
36 }
37 return TwoPointPars;
38 }
39 public static double[] PiontGradientLine(double PointX, double PointY, double[] TwoPointPars)
40 {
41 double[] PiontGradientPars = new double[3];
42 if (TwoPointPars[0] == 0)
43 {
44 PiontGradientPars[1] = 0;
45 PiontGradientPars[0] = 1;
46 PiontGradientPars[2] = -PointX;
47 }
48 if (TwoPointPars[1] == 0)
49 {
50 PiontGradientPars[1] = 1;
51 PiontGradientPars[0] = 0;
52 PiontGradientPars[2] = -PointY;
53 }
54 if (TwoPointPars[0] != 0 && TwoPointPars[1] != 0)
55 {
56 PiontGradientPars[0] = TwoPointPars[1];
57 PiontGradientPars[1] = -TwoPointPars[0];
58 PiontGradientPars[2] = TwoPointPars[0] * PointY - TwoPointPars[1] * PointX;
59 }
60 return PiontGradientPars;
61 }
62 public static double[] CrossPointCordinate(double[] TwoPointPars, double[] PiontGradientPars)
63 {
64 double[] CrossCordinate = new double[2];
65 if (TwoPointPars[1] == 0 && PiontGradientPars[1] == 0)
66 {
67 System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
68 return null;
69 }
70 else if (TwoPointPars[1] == 0)
71 {
72 CrossCordinate[0] = -TwoPointPars[2];
73 CrossCordinate[1] = -(PiontGradientPars[0] * CrossCordinate[0] + PiontGradientPars[2]) / PiontGradientPars[1];
74 }
75 else if (PiontGradientPars[1] == 0)
76 {
77 CrossCordinate[0] = -PiontGradientPars[2];
78 CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0] + TwoPointPars[2]) / TwoPointPars[1];
79 }
80 else
81 {
82 if ((TwoPointPars[0] / TwoPointPars[1]) == (PiontGradientPars[0] / PiontGradientPars[1]))
83 {
84 System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
85 return null;
86 }
87 else
88 {
89 CrossCordinate[0] = (TwoPointPars[2] - PiontGradientPars[2]) / (PiontGradientPars[0] - TwoPointPars[0]);
90 CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0]) - TwoPointPars[2];
91 }
92 }
93
94 return CrossCordinate;
95 }
96 public static double[] CrossPointCordinateDummy(double[] TwoPointPars, double[] PiontGradientPars)
97 {
98 double[] CrossCordinate = new double[2];
99 if (TwoPointPars[1] == 0 && PiontGradientPars[1] == 0)
100 {
101 System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
102 return null;
103 }
104 else if (TwoPointPars[1] == 0)
105 {
106 CrossCordinate[0] = -TwoPointPars[2];
107 CrossCordinate[1] = -(PiontGradientPars[0] * CrossCordinate[0] + PiontGradientPars[2]) / PiontGradientPars[1];
108 }
109 else if (PiontGradientPars[1] == 0)
110 {
111 CrossCordinate[0] = -PiontGradientPars[2];
112 CrossCordinate[1] = -(TwoPointPars[0] * CrossCordinate[0] + TwoPointPars[2]) / TwoPointPars[1];
113 }
114 else
115 {
116 if ((TwoPointPars[0] / TwoPointPars[1]) == (PiontGradientPars[0] / PiontGradientPars[1]))
117 {
118 System.Windows.Forms.MessageBox.Show("两直线平行,无交点!");
119 return null;
120 }
121 else
122 {
123 CrossCordinate[0] = (TwoPointPars[1] * PiontGradientPars[2] - PiontGradientPars[1] * TwoPointPars[2]) / (TwoPointPars[0] * PiontGradientPars[1] - PiontGradientPars[0] * TwoPointPars[1]);
124 CrossCordinate[1] = (TwoPointPars[0] * PiontGradientPars[2] - PiontGradientPars[0] * TwoPointPars[2]) / (PiontGradientPars[0] * TwoPointPars[1] - TwoPointPars[0] * PiontGradientPars[1]);
125 }
126 }
127
128 return CrossCordinate;
129 }
130 public static double[] Calk(double theta, double[] PiontGradientPars)
131 {
132 double[] k = new double[2];
133 if (PiontGradientPars[0] == 0)
134 {
135 k[0] = Math.Tan(theta);
136 k[1] = Math.Tan(-theta);
137 }
138 else if (PiontGradientPars[1] == 0)
139 {
140 k[0] = Math.Tan((Math.PI / 2) - theta);
141 k[1] = Math.Tan(-((Math.PI / 2) - theta));
142 }
143 else
144 {
145
146 if (Math.Round(1 + (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]), 5) != 0)
147 {
148 k[0] = (Math.Tan(theta) - (PiontGradientPars[0] / PiontGradientPars[1])) / (1 + (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]));
149
150 }
151 else
152 {
153 k[0] = double.PositiveInfinity;
154 }
155 if (Math.Round(1 - (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]), 5) != 0)
156 {
157 k[1] = (-(PiontGradientPars[0] / PiontGradientPars[1]) - Math.Tan(theta)) / (1 - (Math.Tan(theta) * PiontGradientPars[0] / PiontGradientPars[1]));
158 }
159 else
160 {
161 k[1] = double.PositiveInfinity;
162 }
163 }
164 return k;
165 }
166 public static double[] Pointk(double PointX, double PointY, double k)
167 {
168 double[] PiontkPars = new double[3];
169 if (double.IsInfinity(k))
170 {
171 PiontkPars[0] = 1;
172 PiontkPars[1] = 0;
173 PiontkPars[2] = PointX;
174 }
175 else
176 {
177 double b = PointY - k * PointX;
178 PiontkPars[0] = k;
179 PiontkPars[1] = -1;
180 PiontkPars[2] = b;
181 }
182 return PiontkPars;
183 }
184 public static double[] ConvertXY(double X10, double Y10, double X210, double Y210)
185 {
186 double[] CnvtXY = new double[2];
187
188 CnvtXY[0] = X10 - X210;
189 CnvtXY[1] = Y10 - Y210;
190 return CnvtXY;
191
192 }
193 public static double[] Calcxcy(double x10, double y10, double x11, double y11, double theta)
194 {
195 double[] CrossPoints = new double[2];
196 double[] TwoPointPars = TwoPointLine(x10, y10, x11, y11);
197
198 double[] PiontGradientPars = PiontGradientLine((x10 + x11) / 2, (y10 + y11) / 2, TwoPointPars);
199 double[] kk = Calk((Math.Abs(theta / 2)) * Math.PI / 180, PiontGradientPars);
200 double[] PiontkPars1 = Pointk(x10, y10, kk[0]);
201 double[] PiontkPars2 = Pointk(x10, y10, kk[1]);
202 double[] CrossCordinate1 = CrossPointCordinateDummy(PiontkPars1, PiontGradientPars);
203 double[] CrossCordinate2 = CrossPointCordinateDummy(PiontkPars2, PiontGradientPars);
204 if (CrossCordinate1[1] < CrossCordinate2[1])
205 {
206 CrossPoints = CrossCordinate1;
207 }
208 if (CrossCordinate2[1] < CrossCordinate1[1])
209 {
210 CrossPoints = CrossCordinate2;
211 }
212 return CrossPoints;
213 }
214 public static double Caltheta(double x11, double y11, double CnX, double CnY)
215 {
216 double theta = 0;
217 double thetaX = CnY;
218 double thetaY = CnX;
219 theta = computeAngle(x11, y11, x11 + CnX, y11 + CnY);
220 return theta;
221 }
222 private static double computeAngle(double x1, double y1, double x2, double y2)
223 {
224 double thetaX = x2 - x1;
225 double thetaY = y2 - y1;
226 double angleOfLine = ((Math.Atan2((y2 - y1), (x2 - x1))) * 180) / Math.PI;
227 return angleOfLine;
228 }
229 public static bool oppositeSigns(int x, int y)
230 {
231 return ((x ^ y) < 0);
232 }
233
234 #endregion
235
236 #region ===========================单个相机=============================================
237
238 #region==================旋转中心方法====================
239 //1. 两个点加一个旋转角度
240 // (X0,Y0)为旋转中心,(X1,Y1) (X2,Y2)为工件在视野内旋转角度a(机器人旋转(使用前先转化为弧度))的前后座标
241 //(Xt,Yt)为两点延长线
242
243 public static double[] CalcCircleCenter(double x1, double y1, double x2, double y2, double a)
244 {
245 double[] dCircleCenter = new double[3];
246 //两点之间距离
247 double distance = Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
248 double radius = distance / 2 * (Math.Sin(a * Math.PI / (2 * 180)));
249 double k = radius / distance;
250 double xt = (1 - k) * x1 + k * x2;
251 double yt = (1 - k) * y1 + k * y2;
252
253 dCircleCenter[0] = Math.Cos(Math.PI / 2 - a / 2) * (xt - x1) - Math.Sin(Math.PI / 2 - a / 2) * (yt - y1) + x1;
254 dCircleCenter[1] = Math.Cos(Math.PI / 2 - a / 2) * (yt - y1) + Math.Sin(Math.PI / 2 - a / 2) * (xt - x1) + y1;
255 dCircleCenter[2] = radius;
256 return dCircleCenter;
257 }
258
259
260 /// <summary>
261 ///
262 /// </summary>
263 /// <param name="x">旋转中心的位置</param>
264 /// <param name="y">旋转中心的位置</param>
265 /// <param name="a">旋转角度</param>
266 /// <param name="x1">旋转角度a后定位到产品位置</param>
267 /// <param name="y1">旋转角度a后定位到产品位置</param>
268 /// <param name="x0">基准位置</param>
269 /// <param name="y0">基准位置</param>
270 /// <returns></returns>
271 public static double[] CalcCdxy(double x, double y, double a, double x1, double y1, double x0, double y0)
272 {
273 double[] cdxytheta = new double[3];
274 //旋转后新位置
275 double x_new = Math.Cos(a * Math.PI / 180) * (x1 - x) - Math.Sin(a * Math.PI) * (y1 - y) + x;
276 double y_new = Math.Cos(a * Math.PI / 180) * (y1 - y) + Math.Sin(a * Math.PI) * (x1 - x) + y;
277 cdxytheta[2] = 0;
278 cdxytheta[0] = x_new - x0;
279 cdxytheta[1] = y_new - y0;
280 return cdxytheta;
281 }
282 #endregion
283
284
285
286 //绘制直线
287 public void FindLineCaliperTool(HTuple hv_ExpDefaultWinHandle, HObject ho_Image, HTuple hv_LineParams, ref HTuple hv_Parameter)
288 {
289 HObject ho_Contours, ho_Cross, ho_Contour;
290 HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
291 HTuple hv_MetrologyHandle = new HTuple(), hv_Index = new HTuple();
292 HTuple hv_Row = new HTuple(), hv_Column = new HTuple();
293 // Initialize local and output iconic variables
294 HOperatorSet.GenEmptyObj(out ho_Contours);
295 HOperatorSet.GenEmptyObj(out ho_Cross);
296 HOperatorSet.GenEmptyObj(out ho_Contour);
297 hv_Parameter = new HTuple();
298 try
299 {
300 //******************************************卡尺工具**************************************
301 hv_Width.Dispose(); hv_Height.Dispose();
302 HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
303 hv_MetrologyHandle.Dispose();
304 HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);
305 HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandle, hv_Width, hv_Height);
306 hv_Index.Dispose();
307 HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandle, "line", hv_LineParams,
308 40, 3, 1, 30, new HTuple(), new HTuple(), out hv_Index);
309
310 //执行测量,获取边缘点集
311 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "yellow");
312 HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);
313 ho_Contours.Dispose(); hv_Row.Dispose(); hv_Column.Dispose();
314 HOperatorSet.GetMetrologyObjectMeasures(out ho_Contours, hv_MetrologyHandle,
315 "all", "all", out hv_Row, out hv_Column);
316 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
317 ho_Cross.Dispose();
318 HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 6, 0.785398);
319
320 //获取最终测量数据和轮廓线
321 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
322 HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 1);
323 hv_Parameter.Dispose();
324 HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "result_type",
325 "all_param", out hv_Parameter);
326 ho_Contour.Dispose();
327 HOperatorSet.GetMetrologyObjectResultContour(out ho_Contour, hv_MetrologyHandle,
328 "all", "all", 1.5);
329 //释放测量句柄
330 HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);
331
332 hv_Width.Dispose();
333 hv_Height.Dispose();
334 hv_MetrologyHandle.Dispose();
335 hv_Index.Dispose();
336 hv_Row.Dispose();
337 hv_Column.Dispose();
338
339 return;
340
341 hv_Width.Dispose();
342 hv_Height.Dispose();
343 hv_MetrologyHandle.Dispose();
344 hv_Index.Dispose();
345 hv_Row.Dispose();
346 hv_Column.Dispose();
347
348 return;
349 }
350 catch (HalconException HDevExpDefaultException)
351 {
352
353 hv_Width.Dispose();
354 hv_Height.Dispose();
355 hv_MetrologyHandle.Dispose();
356 hv_Index.Dispose();
357 hv_Row.Dispose();
358 hv_Column.Dispose();
359
360 throw HDevExpDefaultException;
361 }
362 }
363
364 //绘制一条直线直线
365 public HObject DrawLine(HObject InputImage, HTuple HalconWindowHandle, ref HTuple FitLine)
366 {
367 HTuple htWidth, htHeight;
368 HOperatorSet.GetImageSize(InputImage, out htWidth, out htHeight);
369 HTuple r1, c1, r2, c2, angle;
370 HObject hoLineRegion = new HObject();
371 HOperatorSet.SetColor(HalconWindowHandle, "blue");
372 HOperatorSet.GenEmptyObj(out hoLineRegion);
373 DispMessage(HalconWindowHandle, "绘制直线", "image", 50, 50, "blue", "false");
374 HOperatorSet.DrawLine(HalconWindowHandle, out r1, out c1, out r2, out c2);
375 HOperatorSet.AngleLx(r1, c1, r2, c2, out angle);
376 HTuple line = new HTuple(r1, c1, r2, c2);
377 FindLineCaliperTool(HalconWindowHandle,InputImage, line, ref FitLine);
378 return hoLineRegion;
379 }
380
381 // //绘制两条直线直线
382 public HObject[] DrawLines(HObject InputImage, HTuple HalconWindowHandle, ref HTuple FitLine1, ref HTuple FitLine2)
383 {
384 HObject[] LineRegions = new HObject[2];
385 HOperatorSet.GenEmptyRegion(out LineRegions[0]);
386 HOperatorSet.GenEmptyRegion(out LineRegions[1]);
387 LineRegions[0] = DrawLine(InputImage, HalconWindowHandle, ref FitLine1);
388 LineRegions[1] = DrawLine(InputImage, HalconWindowHandle, ref FitLine2);
389 return LineRegions;
390 }
391
392 //绘制矩形框(Rectangle1)
393 public void DrawRectangle1(HObject InputImage, HTuple HalconWindowHandle, out HObject Rectangle1)
394 {
395 HTuple r1, c1, r2, c2;
396 HTuple height, width;
397 HOperatorSet.GenEmptyObj(out Rectangle1);
398 HOperatorSet.GetImageSize(InputImage, out width, out height);
399 HOperatorSet.SetColor(HalconWindowHandle, "blue");
400 HOperatorSet.DrawRectangle1Mod(HalconWindowHandle, width / 2 - 100, height / 2 - 100, width/2 + 100, height/2 + 100, out r1, out c1, out r2, out c2);
401 HOperatorSet.GenRectangle1(out Rectangle1, r1, c1, r2, c2);
402 }
403 //绘制矩形框(Rectangle2)
404 public void DrawRectangle2(HObject InputImage, HTuple HalconWindowHandle, out HObject Rectangle2)
405 {
406 HTuple r1, c1, ahi, length1, length2;
407 HTuple height, width;
408 HOperatorSet.GenEmptyObj(out Rectangle2);
409 HOperatorSet.GetImageSize(InputImage, out width, out height);
410 HOperatorSet.SetColor(HalconWindowHandle, "blue");
411 HOperatorSet.DrawRectangle2Mod(HalconWindowHandle, 1 * height / 2, 2 * width / 5, 0, 1 * width / 10 , 1 * height / 10, out r1, out c1, out ahi, out length1, out length2);
412 HOperatorSet.GenRectangle2(out Rectangle2, r1, c1, ahi, length1, length2);
413 }
414
415 //求两条直线
416 //返回Line1直线得角度:参数Angle以弧度为单位返回角度-pi到pi
417 public void TwoLineIntersection(HTuple Line1, HTuple Line2, ref HTuple IntersectionPoint)
418 {
419 //直线1到直线2夹角,与直线2到直线1夹角为相反数
420 HTuple x, y, a, isOverLapping;
421 //拟合出来直线后求出两个直线交点,以及一条直线的交点
422 HOperatorSet.IntersectionLines(Line1[0], Line1[1], Line1[2], Line1[3],
423 Line2[0], Line2[1], Line2[2], Line2[3], out x, out y, out isOverLapping);
424 HOperatorSet.AngleLx(Line1[0], Line1[1], Line1[2], Line1[3], out a);
425 IntersectionPoint = new HTuple(x, y, a);
426 }
427 public void AffineLinePoints(HTuple Line, HTuple r1, HTuple c1, HTuple a1, HTuple r2, HTuple c2, HTuple a2, ref HTuple AffineLine)
428 {
429 HTuple htHomat = new HTuple();
430 HTuple x1, y1, x2, y2;
431 HOperatorSet.VectorAngleToRigid(r1, c1, a1, r2, c2, a2, out htHomat);
432 HOperatorSet.AffineTransPoint2d(htHomat, Line[0], Line[1], out x1, out y1);
433 HOperatorSet.AffineTransPoint2d(htHomat, Line[2], Line[3], out x2, out y2);
434 AffineLine = new HTuple(x1, y1, x2, y2);
435 }
436
437 //Aniso模板
438 public void CreateAnisoModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoTrainRegion, out HTuple hv_ModelID)
439 {
440 HObject ho_ModelImage = new HObject();
441 HOperatorSet.GenEmptyObj(out ho_ModelImage);
442 ho_ModelImage.Dispose();
443 hv_ModelID = new HTuple();
444 hv_ModelID.Dispose();
445 string Message = "";
446 try
447 {
448 HOperatorSet.SetDraw(HalconWindowHandle, "margin");
449 if (InputImage == null)
450 {
451 Message = "图片不能为空,请输入图片";
452 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
453 return;
454 }
455
456 if (hoTrainRegion == null)
457 {
458 Message = "训练区域不能为空,请输入图片";
459 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
460 return;
461 }
462 HOperatorSet.GenEmptyObj(out ho_ModelImage);
463 ho_ModelImage.Dispose();
464 HOperatorSet.ReduceDomain(InputImage, hoTrainRegion, out ho_ModelImage);
465 HOperatorSet.CreateAnisoShapeModel(ho_ModelImage, "auto", -0.39, 0.79, "auto",
466 0.9, 1.1, "auto", 0.9, 1.1, "auto", "auto", "use_polarity", "auto", "auto",
467 out hv_ModelID);
468 if (hv_ModelID!= null)
469 DispMessage(HalconWindowHandle, "模板创建成功", "window", 12, 12, "green", "false");
470 else
471 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
472 ho_ModelImage.Dispose();
473 }
474 catch (HalconException hal)
475 {
476 Message = hal.Message;
477 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
478 ho_ModelImage.Dispose();
479 }
480 }
481 //匹配Aniso
482 public void FindAnisoModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoSearchRegion, HTuple htModelID,HTuple htMarkNums, ref HTuple hv_Angle, ref HTuple hv_Row, ref HTuple hv_Column, ref HTuple hv_Score)
483 {
484 string Message = "";
485 if (InputImage == null)
486 {
487 Message = "图片不能为空,请输入图片";
488 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
489 return;
490 }
491 HObject hoReduceImage = new HObject();
492 HTuple hv_ScaleR1 = new HTuple();
493 HTuple hv_ScaleC1 = new HTuple();
494 HOperatorSet.ReduceDomain(InputImage, hoSearchRegion, out hoReduceImage);
495 HOperatorSet.FindAnisoShapeModel(hoReduceImage, htModelID, -0.39, 0.79, 0.9, 1.1,
496 0.9, 1.1, 0.5, htMarkNums, 0.5, "least_squares", numLevels: 0, 0.9, out hv_Row, out hv_Column,
497 out hv_Angle, out hv_ScaleR1, out hv_ScaleC1, out hv_Score);
498 HObject ho_ModelContours = new HObject();
499 HOperatorSet.GenEmptyObj(out ho_ModelContours);
500 HOperatorSet.GetShapeModelContours(out ho_ModelContours, htModelID, 1); //获取形状模型的轮廓
501 DispShapeMatchResults(HalconWindowHandle, htModelID, hv_Score, hv_Row, hv_Column, hv_Angle, hv_ScaleR1, hv_ScaleC1, 0);
502 // ResultShow(HalconWindowHandle,hv_Row, hv_Column, hv_Angle, hv_Score, hoSearchRegion, ho_ModelContours);
503 }
504 //NCC模板
505 public void CreateNccModel(HTuple HalconWindowHandle, HObject InputImage, HObject hoTrainRegion, out HTuple hv_ModelID)
506 {
507 HObject hoReduceImage = new HObject();
508 hv_ModelID = "";
509 string Message = "";
510 try
511 {
512 if (InputImage == null)
513 {
514 Message = "图片不能为空,请输入图片";
515 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
516 return;
517 }
518
519 if (hoTrainRegion == null)
520 {
521 Message = "训练区域不能为空,请输入图片";
522 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
523 return;
524 }
525 HOperatorSet.ReduceDomain(InputImage, hoTrainRegion, out hoReduceImage);
526 HOperatorSet.CreateNccModel(hoReduceImage, "auto", 0, 3.14 / 2, "auto", "use_polarity", out hv_ModelID);
527 if (hv_ModelID != null)
528 DispMessage(HalconWindowHandle, "模板创建成功", "window", 12, 12, "green", "false");
529 else
530 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
531
532 }
533 catch (HalconException hal)
534 {
535 Message = hal.Message;
536 DispMessage(HalconWindowHandle, Message, "window", 12, 12, "red", "false");
537 }
538 }
539
540 //标定
541 //N Point标定
542 public void CalibPoints(HTuple HalconWindowHandle, HObject InputImage, HTuple hv_PixRows, HTuple hv_PixColumns, HTuple hv_MachineRows, HTuple hv_MachineColumn, ref HTuple hv_Hommat2D)
543 {
544 try
545 {
546 if (hv_PixRows.Length > 0)
547 {
548 HOperatorSet.VectorToHomMat2d(hv_PixRows, hv_PixColumns, hv_MachineRows, hv_MachineColumn, out hv_Hommat2D);
549 HOperatorSet.SetColor(HalconWindowHandle, "green");
550 HOperatorSet.DispObj(InputImage, HalconWindowHandle);
551 for (int i = 0; i < hv_PixRows.Length; i++)
552 {
553 HOperatorSet.DispCross(HalconWindowHandle, hv_PixRows[i], hv_PixColumns[i], 50, 0);
554 }
555 }
556
557 }
558 catch (HalconException hal)
559 {
560 }
561 }
562
563 //保存标定文件
564 public void SaveCalibFile(string sProductName, string HomatName, HTuple htHomat2D, out string msg)
565 {
566 //获取文件
567 string filepath = AppDomain.CurrentDomain.BaseDirectory + @"\NinePoints\" + sProductName + @"\";
568 // string HomatName = "CalibNPoint" + CameraNO.ToString() + ".mat";
569 //保存Homat2D
570 HTuple hv_SerializedItemHandle = null;
571 HTuple hv_FileHandle = null;
572 msg = string.Empty;
573 if (htHomat2D != null)
574 {
575 try
576 {
577 AddFileManger(HomatName, filepath);
578 HOperatorSet.SerializeHomMat2d(htHomat2D, out hv_SerializedItemHandle);
579 HOperatorSet.OpenFile(filepath + HomatName, "output_binary", out hv_FileHandle);
580 HOperatorSet.FwriteSerializedItem(hv_FileHandle, hv_SerializedItemHandle);
581 HOperatorSet.CloseFile(hv_FileHandle);
582 msg = "Save CalibNPointTool Completed";
583 }
584 catch (HalconException hex)
585 {
586 msg = "Save CalibNPointTool Error: " + hex.Message;
587 }
588 }
589 }
590
591 public void ResultShow(HTuple hv_ExpDefaultWinHandle, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Score, HObject RectangleSearchArea, HObject ho_ModelContours)
592 {
593 HTuple hv_MovementOfObject;
594 HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_Row, hv_Column, hv_Angle, out hv_MovementOfObject);
595 HObject ho_ModelAtNewPosition;
596 HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ModelAtNewPosition, hv_MovementOfObject);
597 //HOperatorSet.DispObj(ho_Image, ht_hWindowHandle_Tempalte);
598 HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin"); //只显示边框
599 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "blue"); //设置画笔的颜色及线宽
600 HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 2);
601 HOperatorSet.DispRegion(RectangleSearchArea, hv_ExpDefaultWinHandle);
602 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
603 HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 1); //设置线宽及颜色
604 HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
605 ho_ModelAtNewPosition.Dispose();
606 hv_MovementOfObject.UnpinTuple();
607
608 HOperatorSet.DispRectangle2(hv_ExpDefaultWinHandle, hv_Row, hv_Column, hv_Angle, 50, 50); //绘制图形框
609 HOperatorSet.DispCross(hv_ExpDefaultWinHandle, hv_Row, hv_Column, 7, hv_Angle); //绘制十字线
610 //设置显示文字的样式
611
612 //显示的对象只有边缘线,
613 HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin");
614 //线宽用Line Width 指定 s
615 HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 2);
616 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "blue");
617
618 if (hv_Score.D > 0.6)
619 {
620
621 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
622 HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
623 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "green", "false");
624 }
625 else
626 {
627 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
628 HOperatorSet.DispObj(ho_ModelAtNewPosition, hv_ExpDefaultWinHandle);
629 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "red", "false");
630 }
631 }
632
633 //特征显示
634 private void DispShapeMatchResults(HTuple hv_ExpDefaultWinHandle, HTuple hv_ModelID, HTuple hv_Score, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_ScaleR, HTuple hv_ScaleC, HTuple hv_Model)
635 {
636 HObject ho_ModelContours = null, ho_ContoursAffinTrans = null;
637 HTuple hv_NumMatches = null, hv_Index = new HTuple();
638 HTuple hv_Match = new HTuple(), hv_HomMat2DIdentity = new HTuple();
639 HTuple hv_HomMat2DScale = new HTuple(), hv_HomMat2DRotate = new HTuple();
640 HTuple hv_HomMat2DTranslate = new HTuple();
641 HTuple hv_Model_COPY_INP_TMP = hv_Model.Clone();
642 HTuple hv_ScaleC_COPY_INP_TMP = hv_ScaleC.Clone();
643 HTuple hv_ScaleR_COPY_INP_TMP = hv_ScaleR.Clone();
644 HTuple hv_ContoursCenter_Row = null;
645 HTuple hv_ContoursCenter_Col = null;
646 HTuple hv_ContoursCenter_Area = null;
647 HTuple hv_ContoursCenter_Pointer = null;
648 HOperatorSet.GenEmptyObj(out ho_ModelContours);
649 HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans);
650 hv_NumMatches = new HTuple(hv_Row.TupleLength());
651 if ((int)(new HTuple(hv_NumMatches.TupleGreater(0))) != 0)
652 {
653 if ((int)(new HTuple((new HTuple(hv_ScaleR_COPY_INP_TMP.TupleLength())).TupleEqual(
654 1))) != 0)
655 {
656 HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleR_COPY_INP_TMP, out hv_ScaleR_COPY_INP_TMP);
657 }
658 if ((int)(new HTuple((new HTuple(hv_ScaleC_COPY_INP_TMP.TupleLength())).TupleEqual(
659 1))) != 0)
660 {
661 HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleC_COPY_INP_TMP, out hv_ScaleC_COPY_INP_TMP);
662 }
663 if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual(
664 0))) != 0)
665 {
666 HOperatorSet.TupleGenConst(hv_NumMatches, 0, out hv_Model_COPY_INP_TMP);
667 }
668 else if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength()
669 )).TupleEqual(1))) != 0)
670 {
671 HOperatorSet.TupleGenConst(hv_NumMatches, hv_Model_COPY_INP_TMP, out hv_Model_COPY_INP_TMP);
672 }
673 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ModelID.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
674 {
675 ho_ModelContours.Dispose();
676 HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID.TupleSelect(
677 hv_Index), 1);
678 HTuple end_val18 = hv_NumMatches - 1;
679 HTuple step_val18 = 1;
680 for (hv_Match = 0; hv_Match.Continue(end_val18, step_val18); hv_Match = hv_Match.TupleAdd(step_val18))
681 {
682 if ((int)(new HTuple(hv_Index.TupleEqual(hv_Model_COPY_INP_TMP.TupleSelect(
683 hv_Match)))) != 0)
684 {
685 HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity);
686 HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity, hv_ScaleR_COPY_INP_TMP.TupleSelect(
687 hv_Match), hv_ScaleC_COPY_INP_TMP.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DScale);
688 HOperatorSet.HomMat2dRotate(hv_HomMat2DScale, hv_Angle.TupleSelect(hv_Match),
689 0, 0, out hv_HomMat2DRotate);
690 HOperatorSet.HomMat2dTranslate(hv_HomMat2DRotate, hv_Row.TupleSelect(
691 hv_Match), hv_Column.TupleSelect(hv_Match), out hv_HomMat2DTranslate);
692 ho_ContoursAffinTrans.Dispose();
693 HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffinTrans,
694 hv_HomMat2DTranslate);
695 HOperatorSet.AreaCenterXld(ho_ContoursAffinTrans, out hv_ContoursCenter_Area, out hv_ContoursCenter_Row, out hv_ContoursCenter_Col, out hv_ContoursCenter_Pointer);
696 if (hv_Score.D > 0.6)
697 {
698
699 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
700 HOperatorSet.DispObj(ho_ContoursAffinTrans, hv_ExpDefaultWinHandle);
701 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "green", "false");
702 }
703 else
704 {
705 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
706 HOperatorSet.DispObj(ho_ContoursAffinTrans, hv_ExpDefaultWinHandle);
707 DispMessage(hv_ExpDefaultWinHandle, ((((("Result: " + hv_Row) + new HTuple(", ")) + hv_Column) + new HTuple(",")) + "\r\n Score:") + (hv_Score * 100).TupleString(".2f") + "%", "window", 1, 1, "red", "false");
708 }
709 }
710 }
711 }
712 }
713 }
714
715
716 //消息显示
717 public void DispMessage(HTuple hv_ExpDefaultWinHandle, HTuple hv_String, HTuple hv_CoordSystem, HTuple hv_Row, HTuple hv_Column, HTuple hv_Color, HTuple hv_Box)
718 {
719 HTuple hv_M = null, hv_N = null, hv_Red = null;
720 HTuple hv_Green = null, hv_Blue = null, hv_RowI1Part = null;
721 HTuple hv_ColumnI1Part = null, hv_RowI2Part = null, hv_ColumnI2Part = null;
722 HTuple hv_RowIWin = null, hv_ColumnIWin = null, hv_WidthWin = new HTuple();
723 HTuple hv_HeightWin = null, hv_I = null, hv_RowI = new HTuple();
724 HTuple hv_ColumnI = new HTuple(), hv_StringI = new HTuple();
725 HTuple hv_MaxAscent = new HTuple(), hv_MaxDescent = new HTuple();
726 HTuple hv_MaxWidth = new HTuple(), hv_MaxHeight = new HTuple();
727 HTuple hv_R1 = new HTuple(), hv_C1 = new HTuple(), hv_FactorRowI = new HTuple();
728 HTuple hv_FactorColumnI = new HTuple(), hv_UseShadow = new HTuple();
729 HTuple hv_ShadowColor = new HTuple(), hv_Exception = new HTuple();
730 HTuple hv_Width = new HTuple(), hv_Index = new HTuple();
731 HTuple hv_Ascent = new HTuple(), hv_Descent = new HTuple();
732 HTuple hv_W = new HTuple(), hv_H = new HTuple(), hv_FrameHeight = new HTuple();
733 HTuple hv_FrameWidth = new HTuple(), hv_R2 = new HTuple();
734 HTuple hv_C2 = new HTuple(), hv_DrawMode = new HTuple();
735 HTuple hv_CurrentColor = new HTuple();
736 HTuple hv_Box_COPY_INP_TMP = hv_Box.Clone();
737 HTuple hv_Color_COPY_INP_TMP = hv_Color.Clone();
738 HTuple hv_Column_COPY_INP_TMP = hv_Column.Clone();
739 HTuple hv_Row_COPY_INP_TMP = hv_Row.Clone();
740 HTuple hv_String_COPY_INP_TMP = hv_String.Clone();
741 if ((int)(new HTuple(hv_Color_COPY_INP_TMP.TupleEqual(new HTuple()))) != 0)
742 {
743 hv_Color_COPY_INP_TMP = "";
744 }
745 if ((int)(new HTuple(hv_Box_COPY_INP_TMP.TupleEqual(new HTuple()))) != 0)
746 {
747 hv_Box_COPY_INP_TMP = "false";
748 }
749 //
750 //
751 //Check conditions
752 //
753 hv_M = (new HTuple(hv_Row_COPY_INP_TMP.TupleLength())) * (new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
754 ));
755 hv_N = new HTuple(hv_Row_COPY_INP_TMP.TupleLength());
756 if ((int)((new HTuple(hv_M.TupleEqual(0))).TupleOr(new HTuple(hv_String_COPY_INP_TMP.TupleEqual(
757 new HTuple())))) != 0)
758 {
759
760 return;
761 }
762 if ((int)(new HTuple(hv_M.TupleNotEqual(1))) != 0)
763 {
764 //Multiple positions
765 //
766 //Expand single parameters
767 if ((int)(new HTuple((new HTuple(hv_Row_COPY_INP_TMP.TupleLength())).TupleEqual(
768 1))) != 0)
769 {
770 hv_N = new HTuple(hv_Column_COPY_INP_TMP.TupleLength());
771 HOperatorSet.TupleGenConst(hv_N, hv_Row_COPY_INP_TMP, out hv_Row_COPY_INP_TMP);
772 }
773 else if ((int)(new HTuple((new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
774 )).TupleEqual(1))) != 0)
775 {
776 HOperatorSet.TupleGenConst(hv_N, hv_Column_COPY_INP_TMP, out hv_Column_COPY_INP_TMP);
777 }
778 else if ((int)(new HTuple((new HTuple(hv_Column_COPY_INP_TMP.TupleLength()
779 )).TupleNotEqual(new HTuple(hv_Row_COPY_INP_TMP.TupleLength())))) != 0)
780 {
781 throw new HalconException("Number of elements in Row and Column does not match.");
782 }
783 if ((int)(new HTuple((new HTuple(hv_String_COPY_INP_TMP.TupleLength())).TupleEqual(
784 1))) != 0)
785 {
786 HOperatorSet.TupleGenConst(hv_N, hv_String_COPY_INP_TMP, out hv_String_COPY_INP_TMP);
787 }
788 else if ((int)(new HTuple((new HTuple(hv_String_COPY_INP_TMP.TupleLength()
789 )).TupleNotEqual(hv_N))) != 0)
790 {
791 throw new HalconException("Number of elements in Strings does not match number of positions.");
792 }
793 //
794 }
795 //
796 //Prepare window
797 HOperatorSet.GetRgb(hv_ExpDefaultWinHandle, out hv_Red, out hv_Green, out hv_Blue);
798 HOperatorSet.GetPart(hv_ExpDefaultWinHandle, out hv_RowI1Part, out hv_ColumnI1Part,
799 out hv_RowI2Part, out hv_ColumnI2Part);
800 HOperatorSet.GetWindowExtents(hv_ExpDefaultWinHandle, out hv_RowIWin, out hv_ColumnIWin,
801 out hv_WidthWin, out hv_HeightWin);
802 HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_HeightWin - 1, hv_WidthWin - 1);
803 //
804 //Loop over all positions
805 HTuple end_val89 = hv_N - 1;
806 HTuple step_val89 = 1;
807 for (hv_I = 0; hv_I.Continue(end_val89, step_val89); hv_I = hv_I.TupleAdd(step_val89))
808 {
809 hv_RowI = hv_Row_COPY_INP_TMP.TupleSelect(hv_I);
810 hv_ColumnI = hv_Column_COPY_INP_TMP.TupleSelect(hv_I);
811 //Allow multiple strings for a single position.
812 if ((int)(new HTuple(hv_N.TupleEqual(1))) != 0)
813 {
814 hv_StringI = hv_String_COPY_INP_TMP.Clone();
815 }
816 else
817 {
818 //In case of multiple positions, only single strings
819 //are allowed per position.
820 //For line breaks, use \n in this case.
821 hv_StringI = hv_String_COPY_INP_TMP.TupleSelect(hv_I);
822 }
823 //Default settings
824 //-1 is mapped to 12.
825 if ((int)(new HTuple(hv_RowI.TupleEqual(-1))) != 0)
826 {
827 hv_RowI = 12;
828 }
829 if ((int)(new HTuple(hv_ColumnI.TupleEqual(-1))) != 0)
830 {
831 hv_ColumnI = 12;
832 }
833 //
834 //Split string into one string per line.
835 hv_StringI = ((("" + hv_StringI) + "")).TupleSplit("\n");
836 //
837 //Estimate extentions of text depending on font size.
838 HOperatorSet.GetFontExtents(hv_ExpDefaultWinHandle, out hv_MaxAscent, out hv_MaxDescent,
839 out hv_MaxWidth, out hv_MaxHeight);
840 if ((int)(new HTuple(hv_CoordSystem.TupleEqual("window"))) != 0)
841 {
842 hv_R1 = hv_RowI.Clone();
843 hv_C1 = hv_ColumnI.Clone();
844 }
845 else
846 {
847 //Transform image to window coordinates.
848 hv_FactorRowI = (1.0 * hv_HeightWin) / ((hv_RowI2Part - hv_RowI1Part) + 1);
849 hv_FactorColumnI = (1.0 * hv_WidthWin) / ((hv_ColumnI2Part - hv_ColumnI1Part) + 1);
850 hv_R1 = (((hv_RowI - hv_RowI1Part) + 0.5) * hv_FactorRowI) - 0.5;
851 hv_C1 = (((hv_ColumnI - hv_ColumnI1Part) + 0.5) * hv_FactorColumnI) - 0.5;
852 }
853 //
854 //Display text box depending on text size.
855 hv_UseShadow = 1;
856 hv_ShadowColor = "gray";
857 if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(0))).TupleEqual("true"))) != 0)
858 {
859 if (hv_Box_COPY_INP_TMP == null)
860 hv_Box_COPY_INP_TMP = new HTuple();
861 hv_Box_COPY_INP_TMP[0] = "#fce9d4";
862 hv_ShadowColor = "#f28d26";
863 }
864 if ((int)(new HTuple((new HTuple(hv_Box_COPY_INP_TMP.TupleLength())).TupleGreater(
865 1))) != 0)
866 {
867 if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(1))).TupleEqual("true"))) != 0)
868 {
869 //Use default ShadowColor set above
870 }
871 else if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(1))).TupleEqual(
872 "false"))) != 0)
873 {
874 hv_UseShadow = 0;
875 }
876 else
877 {
878 hv_ShadowColor = hv_Box_COPY_INP_TMP.TupleSelect(1);
879 //Valid color?
880 try
881 {
882 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
883 1));
884 }
885 // catch (Exception)
886 catch (HalconException HDevExpDefaultException1)
887 {
888 HDevExpDefaultException1.ToHTuple(out hv_Exception);
889 hv_Exception = new HTuple("Wrong value of control parameter Box[1] (must be a 'true', 'false', or a valid color string)");
890 throw new HalconException(hv_Exception);
891 }
892 }
893 }
894 if ((int)(new HTuple(((hv_Box_COPY_INP_TMP.TupleSelect(0))).TupleNotEqual("false"))) != 0)
895 {
896 //Valid color?
897 try
898 {
899 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
900 0));
901 }
902 // catch (Exception)
903 catch (HalconException HDevExpDefaultException1)
904 {
905 HDevExpDefaultException1.ToHTuple(out hv_Exception);
906 hv_Exception = new HTuple("Wrong value of control parameter Box[0] (must be a 'true', 'false', or a valid color string)");
907 throw new HalconException(hv_Exception);
908 }
909 //Calculate box extents
910 hv_StringI = (" " + hv_StringI) + " ";
911 hv_Width = new HTuple();
912 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_StringI.TupleLength()
913 )) - 1); hv_Index = (int)hv_Index + 1)
914 {
915 HOperatorSet.GetStringExtents(hv_ExpDefaultWinHandle, hv_StringI.TupleSelect(
916 hv_Index), out hv_Ascent, out hv_Descent, out hv_W, out hv_H);
917 hv_Width = hv_Width.TupleConcat(hv_W);
918 }
919 hv_FrameHeight = hv_MaxHeight * (new HTuple(hv_StringI.TupleLength()));
920 hv_FrameWidth = (((new HTuple(0)).TupleConcat(hv_Width))).TupleMax();
921 hv_R2 = hv_R1 + hv_FrameHeight;
922 hv_C2 = hv_C1 + hv_FrameWidth;
923 //Display rectangles
924 HOperatorSet.GetDraw(hv_ExpDefaultWinHandle, out hv_DrawMode);
925 HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "fill");
926 //Set shadow color
927 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_ShadowColor);
928 if ((int)(hv_UseShadow) != 0)
929 {
930 HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, hv_R1 + 1, hv_C1 + 1, hv_R2 + 1,
931 hv_C2 + 1);
932 }
933 //Set box color
934 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Box_COPY_INP_TMP.TupleSelect(
935 0));
936 HOperatorSet.DispRectangle1(hv_ExpDefaultWinHandle, hv_R1, hv_C1, hv_R2,
937 hv_C2);
938 HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, hv_DrawMode);
939 }
940 //Write text.
941 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_StringI.TupleLength())) - 1); hv_Index = (int)hv_Index + 1)
942 {
943 //Set color
944 if ((int)(new HTuple(hv_N.TupleEqual(1))) != 0)
945 {
946 //Wiht a single text position, each text line
947 //may get a different color.
948 hv_CurrentColor = hv_Color_COPY_INP_TMP.TupleSelect(hv_Index % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
949 )));
950 }
951 else
952 {
953 //With multiple text positions, each position
954 //gets a single color for all text lines.
955 hv_CurrentColor = hv_Color_COPY_INP_TMP.TupleSelect(hv_I % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
956 )));
957 }
958 if ((int)((new HTuple(hv_CurrentColor.TupleNotEqual(""))).TupleAnd(new HTuple(hv_CurrentColor.TupleNotEqual(
959 "auto")))) != 0)
960 {
961 //Valid color?
962 try
963 {
964 HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_CurrentColor);
965 }
966 // catch (Exception)
967 catch (HalconException HDevExpDefaultException1)
968 {
969 HDevExpDefaultException1.ToHTuple(out hv_Exception);
970 hv_Exception = ((("Wrong value of control parameter Color[" + (hv_Index % (new HTuple(hv_Color_COPY_INP_TMP.TupleLength()
971 )))) + "] == '") + hv_CurrentColor) + "' (must be a valid color string)";
972 throw new HalconException(hv_Exception);
973 }
974 }
975 else
976 {
977 HOperatorSet.SetRgb(hv_ExpDefaultWinHandle, hv_Red, hv_Green, hv_Blue);
978 }
979 //Finally display text
980 hv_RowI = hv_R1 + (hv_MaxHeight * hv_Index);
981 HOperatorSet.SetTposition(hv_ExpDefaultWinHandle, hv_RowI, hv_C1);
982 HOperatorSet.WriteString(hv_ExpDefaultWinHandle, hv_StringI.TupleSelect(hv_Index));
983 }
984 }
985 //Reset changed window settings
986 HOperatorSet.SetRgb(hv_ExpDefaultWinHandle, hv_Red, hv_Green, hv_Blue);
987 HOperatorSet.SetPart(hv_ExpDefaultWinHandle, hv_RowI1Part, hv_ColumnI1Part, hv_RowI2Part,
988 hv_ColumnI2Part);
989
990 return;
991 }
992
993 public void AddFileManger(string fileName, string filePath)
994 {
995 if (!Directory.Exists(filePath))
996 {
997 Directory.CreateDirectory(filePath);
998 }
999 if (!File.Exists(filePath + fileName))
1000 {
1001 File.Create(filePath + fileName);
1002 }
1003 }
1004
1005 public void CopyFile(string sourceFile, string disFile, string fileName)
1006 {
1007 if (!Directory.Exists(disFile))
1008 {
1009 Directory.CreateDirectory(disFile);
1010 }
1011 File.Copy(sourceFile + fileName, disFile + fileName, true);
1012 }
1013
1014 public void DelDirectory(string path)
1015 {
1016 FileAttributes attr = File.GetAttributes(path);
1017 if (attr == FileAttributes.Directory)
1018 {
1019 if (Directory.Exists(path))
1020 {
1021 Directory.Delete(path, true);
1022 }
1023 }
1024 }
1025
1026 public void MoveFile(string sourceFile, string disFile)
1027 {
1028 Directory.Move(sourceFile, disFile);
1029 }
1030
1031
1032 public double[] CalMdxy(double x0, double y0, double x1, double y1)
1033 {
1034 double[] Mdxy = new double[2];
1035 Mdxy[0] = x1 - x0;
1036 Mdxy[1] = y1 - y0;
1037 return Mdxy;
1038 }
1039
1040 //传进来的参数是角度
1041 public double[] CalCdxyθ(double stdx, double stdy, double Mdx, double Mdy, double angle)
1042 {
1043 angle = (angle * Math.PI) / 180;
1044 double[] xyθ = new double[3];
1045 xyθ[0] = (Math.Cos(angle) - 1) * stdx - Math.Sin(angle) * stdy + Mdx;
1046 xyθ[1] = (Math.Cos(angle) - 1) * stdy + Math.Sin(angle) * stdx + Mdy;
1047 xyθ[2] = angle * 180 / Math.PI;
1048 return xyθ;
1049 }
1050
1051 //传进来的参数是角度
1052 public double[] CalStdxy(double Mdx, double Mdy, double con)
1053 {
1054 con = (con * Math.PI) / 180;
1055 double[] stdxy = new double[2];
1056 stdxy[0] = (-0.5) * (Mdx * (Math.Cos(con) - 1) + Mdy * (Math.Sin(con))) / (1 - Math.Cos(con));
1057 stdxy[1] = (0.5) * (Mdx * (Math.Sin(con)) - Mdy * (Math.Cos(con) - 1)) / (1 - Math.Cos(con));
1058 return stdxy;
1059 }
1060
1061 public void SortHTuple(HTuple SortSelect, HTuple hv_Angle, HTuple hv_Row, HTuple hv_Column, out HTuple Angle, out HTuple Row, out HTuple Column)
1062 {
1063 Angle = new HTuple();
1064 Row = new HTuple();
1065 Column = new HTuple();
1066
1067 HTuple midRow = new HTuple();
1068 HTuple midColumn = new HTuple();
1069 HTuple midAngle = new HTuple();
1070 HTuple MidIndices = new HTuple();
1071 if (SortSelect != "R")
1072 {
1073 HOperatorSet.TupleSortIndex(hv_Row, out MidIndices);
1074 for (int i = 0; i < hv_Row.Length; i++)
1075 {
1076 HTuple Index = MidIndices[i];
1077 Row[i] = hv_Row[Index];
1078 Column[i] = hv_Column[Index];
1079 Angle[i] = hv_Angle[Index];
1080 }
1081 }
1082 if (SortSelect != "C")
1083 {
1084 HOperatorSet.TupleSortIndex(hv_Column, out MidIndices);
1085 for (int i = 0; i < hv_Column.Length; i++)
1086 {
1087 HTuple Index = MidIndices[i];
1088 Row[i] = hv_Row[Index];
1089 Column[i] = hv_Column[Index];
1090 Angle[i] = hv_Angle[Index];
1091 }
1092 }
1093 }
1094