DHDHSoftware/CanFly/UI/GuidePanel/GuideLineCtrl.cs
2025-03-16 17:32:09 +08:00

388 lines
11 KiB
C#

using CanFly.Canvas.Helper;
using CanFly.Canvas.Shape;
using CanFly.Canvas.UI;
using CanFly.Helper;
using HalconDotNet;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CanFly.UI.GuidePanel
{
public partial class GuideLineCtrl : BaseGuideControl
{
private FlyShape? _line;
private float _lineX1;
private float _lineY1;
private float _lineX2;
private float _lineY2;
private float _lineWidth;
private PointF[] _rectPoints = new PointF[4];
//private float _LineLX=new float();
//private float _LineLY =new float();
//private float _LineRX =new float();
//private float _LineRY =new float();
protected override string GetScriptFileName() => "Line_detect.hdvp";
public GuideLineCtrl()
{
InitializeComponent();
this.canvas.mouseMoved += Canvas_mouseMoved;
this.canvas.OnShapeUpdateEvent += UpdateShape;
this.canvas.selectionChanged += Canvas_selectionChanged;
this.canvas.OnShapeMoving += Canvas_OnShapeMoving;
this.canvas.newShape += Canvas_newShape;
this.ctrlTitleBar.OnCloseClicked += OnControlClose;
NumRectWidth1.ValueChanged -= NumRectWidth1_ValueChanged;
NumRectWidth1.Value = 40;
NumRectWidth1.ValueChanged += NumRectWidth1_ValueChanged;
}
protected override void UpdateShape(FlyShape shape)
{
switch (shape.ShapeType)
{
case ShapeTypeEnum.Line:
this._line = shape;
_line.IsDrawLineVirtualRect = true;
var pts = this._line.Points;
_lineX1 = pts[0].X;
_lineY1 = pts[0].Y;
_lineX2 = pts[1].X;
_lineY2 = pts[1].Y;
_lineWidth = shape.LineVirtualRectWidth;
_rectPoints = shape.LineVirtualRectPoints;
//_LineLX = (shape.LineVirtualRectPoints[0].X + shape.LineVirtualRectPoints[3].X) / 2;
//_LineLY = (shape.LineVirtualRectPoints[0].Y + shape.LineVirtualRectPoints[3].Y) / 2;
//_LineRX = (shape.LineVirtualRectPoints[1].X + shape.LineVirtualRectPoints[2].X) / 2;
//_LineRY = (shape.LineVirtualRectPoints[1].Y + shape.LineVirtualRectPoints[2].Y) / 2;
tbLineX1.Text = _lineX1.ToString("F3");
tbLineY1.Text = _lineY1.ToString("F3");
tbLineX2.Text = _lineX2.ToString("F3");
tbLineY2.Text = _lineY2.ToString("F3");
// NumRectWidth1.Value = (decimal)_lineWidth;
break;
default:
break;
}
}
private void GuideLineCircleCtrl_Load(object sender, EventArgs e)
{
}
private void Canvas_mouseMoved(PointF pos)
{
if (InvokeRequired)
{
Invoke(Canvas_mouseMoved, pos);
return;
}
lblStatus.Text = $"X:{pos.X}, Y:{pos.Y}";
}
private void Canvas_selectionChanged(List<FlyShape> shapes)
{
//if (shapes.Count != 1)
//{
// // panelGuide.Controls.Clear();
// return;
//}
//SwitchGuideForm(shapes[0].ShapeType);
// Canvas_OnShapeUpdateEvent(shapes[0]);
if (shapes.Count != 1)
{
return;
}
UpdateShape(shapes[0]);
}
private void Canvas_OnShapeMoving(List<FlyShape> shapes)
{
if (shapes.Count != 1)
{
return;
}
UpdateShape(shapes[0]);
}
private void btnCreateLine_Click(object sender, EventArgs e)
{
if (this.canvas.pixmap == null)
{
MessageBox.Show("请先打开图片");
return;
}
tbLineX1.Text = string.Empty;
tbLineY1.Text = string.Empty;
tbLineX2.Text = string.Empty;
tbLineY2.Text = string.Empty;
this.canvas.Shapes.RemoveAll(shp => shp.ShapeType == ShapeTypeEnum.Line);
this.canvas.Invalidate();
this.canvas.StartDraw(ShapeTypeEnum.Line);
}
private void btnLoadImage_Click(object sender, EventArgs e)
{
OpenImageFile(bitmap =>
{
this.canvas.LoadPixmap(bitmap);
this.canvas.Enabled = true;
});
}
private void Canvas_newShape()
{
this.canvas.StopDraw();
}
string strarrayX = string.Empty;
string strarrayY = string.Empty;
private void btnExecute_Click(object sender, EventArgs e)
{
if (this.canvas.pixmap == null)
{
MessageBox.Show("请先打开图片");
return;
}
if (this.tbLineX1.Text.Trim().Length == 0)
{
MessageBox.Show("请先创建直线");
return;
}
this.canvas.OutsideShapes.Clear();
this.canvas.Invalidate();
flag = new List<double>();
RowBegin = new List<double>();
ColBegin = new List<double>();
RowEnd = new List<double>();
ColEnd = new List<double>();
Dictionary<string, HObject> inputImg = new Dictionary<string, HObject>();
if (hImage == null)
{
HOperatorSet.ReadImage(out hImage, CurrentImageFile);
}
inputImg["INPUT_Image"] = hImage;
// 创建一维数组
Dictionary<string, HTuple> inputPara = new Dictionary<string, HTuple>();
// 获取矩形的 4 个点
PointF[] Points = this._line.LineVirtualRectPoints;
PointF Point1 = Points[0];
PointF Point2 = Points[1];
PointF Point3 = Points[2];
PointF Point4 = Points[3];
PointF Point5 = Points[0];
float x1 = Point1.X;
float y1 = Point1.Y;
float x2 = Point2.X;
float y2 = Point2.Y;
float x3 = Point3.X;
float y3 = Point3.Y;
float x4 = Point4.X;
float y4 = Point4.Y;
float x5 = Point5.X;
float y5 = Point5.Y;
float[] arrayX = new float[] { x1, x2, x3, x4, x5 };
HTuple hTupleArrayX = new HTuple(arrayX);
float[] arrayY = new float[] { y1, y2, y3, y4, y5 };
HTuple hTupleArrayY = new HTuple(arrayY);
strarrayX = string.Join(",", arrayX);
strarrayY = string.Join(",", arrayY);
inputPara["LX"] = _lineX1;
inputPara["LY"] = _lineY1;
inputPara["RX"] = _lineX2;
inputPara["RY"] = _lineY2;
inputPara["XRect"] = hTupleArrayX;
inputPara["YRect"] = hTupleArrayY;
List<string> outputKeys = new List<string>()
{
"OUTPUT_Flag",
"RowBegin",
"ColBegin",
"RowEnd",
"ColEnd"
};
ExecuteHScript(
inputImg,
inputPara,
outputKeys);
}
List<double> flag = new List<double>();
List<double> RowBegin = new List<double>();
List<double> ColBegin = new List<double>();
List<double> RowEnd = new List<double>();
List<double> ColEnd = new List<double>();
protected override void OnExecuteHScriptResult(
bool success,
Dictionary<string, HTuple> resultDic,
int timeElasped)
{
if (!success)
{
return;
}
/*
"OUTPUT_Flag",
"RXCenter",
"RYCenter",
"RRadius"
*/
flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
RowBegin = resultDic["RowBegin"].HTupleToDouble();
ColBegin = resultDic["ColBegin"].HTupleToDouble();
RowEnd = resultDic["RowEnd"].HTupleToDouble();
ColEnd = resultDic["ColEnd"].HTupleToDouble();
if (flag.Count > 0)
{
lblResult.Text = flag[0].ToString();
}
else
{
lblResult.Text = "无";
}
if (flag.Count > 0 && RowBegin.Count > 0 && ColBegin.Count > 0 && RowEnd.Count > 0 && ColEnd.Count > 0)
{
float width = 0;
this.canvas.DrawLine(new PointF((float)ColBegin[0], (float)RowBegin[0]), new PointF((float)ColEnd[0], (float)RowEnd[0]), width);
this.canvas.Invalidate();
lblElapsed.Text = $"{timeElasped} ms";
}
}
private void NumRectWidth1_ValueChanged(object sender, EventArgs e)
{
if (_line != null)
{
//_line1.IsDrawLineVirtualRect = true;
_line.LineVirtualRectWidth = (float)NumRectWidth1.Value;
UpdateShape(_line);
this.canvas.Invalidate();
}
}
private void btnSave_Click(object sender, EventArgs e)
{
if (lblResult.Text.Equals("无"))
{
MessageBox.Show("请先进行绘制");
return;
}
if (lblResult.Text != "0")
{
MessageBox.Show("测量计算错误,无法保存");
return;
}
//flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
//RowBegin = resultDic["RowBegin"].HTupleToDouble();
//ColBegin = resultDic["ColBegin"].HTupleToDouble();
//RowEnd = resultDic["RowEnd"].HTupleToDouble();
//ColEnd = resultDic["ColEnd"].HTupleToDouble();
string input = $"LX:{_lineX1};" +
$"LY:{_lineY1};" +
$"RX:{_lineX2};" +
$"RY:{_lineY2};" +
$"Line_XRect:{strarrayX};" +
$"Line_YRect:{strarrayY}";
string result = $"RowBegin:{string.Join(";", RowBegin[0])};ColBegin:{string.Join(";", ColBegin[0])};RowEnd:{string.Join(";", RowEnd[0])};ColEnd:{string.Join(";", ColEnd[0])}";
DataToTriggerEvent(input, result);
}
}
}