diff --git a/CanFly/UI/GuidePanel/GuideHeightCtrl.resx b/CanFly/UI/GuidePanel/GuideHeightCtrl.resx
index ad76d1e..71e5e93 100644
--- a/CanFly/UI/GuidePanel/GuideHeightCtrl.resx
+++ b/CanFly/UI/GuidePanel/GuideHeightCtrl.resx
@@ -142,4 +142,7 @@
17, 17
+
+ 25
+
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeBaseGuideControl.cs b/CanFly/UI/SizePanel/SizeBaseGuideControl.cs
new file mode 100644
index 0000000..3a0fefa
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeBaseGuideControl.cs
@@ -0,0 +1,160 @@
+using CanFly.Canvas.Shape;
+using CanFly.Canvas.UI;
+using CanFly.Helper;
+using DH.Commons.Base;
+using HalconDotNet;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+
+
+namespace CanFly.UI.SizePanel
+{
+
+ public class SizeBaseGuideControl : UserControl
+ {
+ public Action? OnControlCloseEvent;
+
+ public event Action OnDataPassed;
+
+
+ private string _currentImageFile;
+
+ public string CurrentImageFile;
+
+ public CameraBase cameraBase;
+
+ protected string _hScriptsDir = Path.Combine(Environment.CurrentDirectory, "hscripts");
+
+ protected HObject? hImage = null;
+
+ protected FlyCanvas _canvas;
+
+ private HDevEngineTool? tool = null;
+
+
+
+ public void DataToTriggerEvent(string input,string output)
+ {
+
+ OnDataPassed?.Invoke(input, output);
+ }
+
+ protected virtual void UpdateShape(FlyShape shape)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected virtual string GetScriptFileName()
+ {
+ throw new NotImplementedException();
+ }
+
+
+
+ ///
+ /// 执行Halcon脚本
+ ///
+ /// 输入图像
+ /// 输入参数
+ /// 输出参数
+ protected void ExecuteHScript(
+ Dictionary inputImg,
+ Dictionary inputDic,
+ List outputParamKeys,
+ Action? exceptionHandler = null)
+ {
+
+ string filePath = Path.Combine(_hScriptsDir, GetScriptFileName());
+ if (!File.Exists(filePath))
+ {
+ MessageBox.Show($"文件 {filePath} 不存在");
+ return;
+ }
+
+ try
+ {
+ if (tool == null)
+ {
+ tool = new HDevEngineTool(_hScriptsDir);
+ tool.LoadProcedure(Path.GetFileNameWithoutExtension(GetScriptFileName()));
+ }
+
+
+
+ //tool.InputImageDic["INPUT_Image"] = hImage;
+ //tool.InputTupleDic["XCenter"] = _x;
+ //tool.InputTupleDic["YCenter"] = _y;
+ //tool.InputTupleDic["Radius"] = _r;
+
+ tool.InputImageDic = inputImg;
+ tool.InputTupleDic = inputDic;
+
+
+ Dictionary outputParams = new Dictionary();
+
+
+ if (!tool.RunProcedure(out string error, out int timeElasped))
+ {
+ OnExecuteHScriptResult(false, outputParams, timeElasped);
+ return;
+ }
+
+ for (int i = 0; i < outputParamKeys.Count; i++)
+ {
+ string k = outputParamKeys[i];
+ outputParams[k] = tool.GetResultTuple(k);
+ }
+
+ OnExecuteHScriptResult(true, outputParams, timeElasped);
+ }
+ catch (Exception ex)
+ {
+ exceptionHandler?.Invoke(ex);
+ }
+ finally
+ {
+ hImage?.Dispose();
+ hImage = null;
+ }
+
+ }
+
+
+
+ ///
+ /// Halcon脚本执行结果回调函数,重写该方法以自行处理算法执行结果
+ ///
+ /// 算法执行是否成功
+ /// 算法输出结果
+ /// 算法耗时,单位:ms
+ protected virtual void OnExecuteHScriptResult(bool success, Dictionary resultDic, int timeElasped)
+ {
+ throw new NotImplementedException();
+ }
+
+
+ protected void OpenImageFile(Action callback)
+ {
+ OpenFileDialog ofd = new OpenFileDialog();
+ ofd.Filter = "图像文件|*.jpg;*.jpeg;*.png";
+ ofd.Multiselect = false;
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ CurrentImageFile = ofd.FileName;
+ Bitmap bitmap = (Bitmap)Image.FromFile(CurrentImageFile);
+ callback?.Invoke(bitmap);
+ }
+ }
+
+
+ protected void OnControlClose()
+ {
+ OnControlCloseEvent?.Invoke();
+ }
+ }
+}
diff --git a/DHSoftware/Views/PreTreatUserControl.resx b/CanFly/UI/SizePanel/SizeBaseGuideControl.resx
similarity index 93%
rename from DHSoftware/Views/PreTreatUserControl.resx
rename to CanFly/UI/SizePanel/SizeBaseGuideControl.resx
index 8b2ff64..1af7de1 100644
--- a/DHSoftware/Views/PreTreatUserControl.resx
+++ b/CanFly/UI/SizePanel/SizeBaseGuideControl.resx
@@ -1,17 +1,17 @@
-
diff --git a/CanFly/UI/SizePanel/SizeCtrlTitleBar.Designer.cs b/CanFly/UI/SizePanel/SizeCtrlTitleBar.Designer.cs
new file mode 100644
index 0000000..ae8db9b
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeCtrlTitleBar.Designer.cs
@@ -0,0 +1,77 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeCtrlTitleBar
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ btnClose = new PictureBox();
+ j = new Label();
+ ((System.ComponentModel.ISupportInitialize)btnClose).BeginInit();
+ SuspendLayout();
+ //
+ // btnClose
+ //
+ btnClose.Dock = DockStyle.Right;
+ btnClose.Image = XKRS.CanFly.Properties.Resources.Close;
+ btnClose.Location = new Point(516, 3);
+ btnClose.Name = "btnClose";
+ btnClose.Size = new Size(30, 30);
+ btnClose.SizeMode = PictureBoxSizeMode.StretchImage;
+ btnClose.TabIndex = 1;
+ btnClose.TabStop = false;
+ btnClose.Click += btnClose_Click;
+ //
+ // j
+ //
+ j.Dock = DockStyle.Fill;
+ j.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Bold);
+ j.Location = new Point(3, 3);
+ j.Name = "j";
+ j.Size = new Size(513, 30);
+ j.TabIndex = 2;
+ j.Text = "标题";
+ j.TextAlign = ContentAlignment.MiddleLeft;
+ //
+ // SizeCtrlTitleBar
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(j);
+ Controls.Add(btnClose);
+ MinimumSize = new Size(0, 36);
+ Name = "SizeCtrlTitleBar";
+ Padding = new Padding(3);
+ Size = new Size(549, 36);
+ ((System.ComponentModel.ISupportInitialize)btnClose).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+ private PictureBox btnClose;
+ private Label j;
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeCtrlTitleBar.cs b/CanFly/UI/SizePanel/SizeCtrlTitleBar.cs
new file mode 100644
index 0000000..08294ca
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeCtrlTitleBar.cs
@@ -0,0 +1,38 @@
+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.SizePanel
+{
+ public partial class SizeCtrlTitleBar : UserControl
+ {
+ public event Action? OnCloseClicked;
+
+
+
+ [DisplayName("Title")]
+ public string Title
+ {
+ get { return this.j.Text; }
+ set { this.j.Text = value; }
+ }
+
+
+ public SizeCtrlTitleBar()
+ {
+ InitializeComponent();
+ this.Dock = DockStyle.Top;
+ }
+
+ private void btnClose_Click(object sender, EventArgs e)
+ {
+ OnCloseClicked?.Invoke();
+ }
+ }
+}
diff --git a/DHSoftware/Views/DetectConfigControl.resx b/CanFly/UI/SizePanel/SizeCtrlTitleBar.resx
similarity index 100%
rename from DHSoftware/Views/DetectConfigControl.resx
rename to CanFly/UI/SizePanel/SizeCtrlTitleBar.resx
diff --git a/CanFly/UI/SizePanel/SizeGuideCircleCtrl.Designer.cs b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.Designer.cs
new file mode 100644
index 0000000..5a4c543
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.Designer.cs
@@ -0,0 +1,364 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeGuideCircleCtrl
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SizeGuideCircleCtrl));
+ splitContainer = new SplitContainer();
+ panel1 = new Panel();
+ canvas = new Canvas.UI.FlyCanvas();
+ statusStrip1 = new StatusStrip();
+ lblStatus = new ToolStripStatusLabel();
+ btnClose = new PictureBox();
+ label4 = new Label();
+ btnExecute = new Button();
+ lblElapsed = new Label();
+ ctrlTitleBar = new SizeCtrlTitleBar();
+ groupBox1 = new GroupBox();
+ label1 = new Label();
+ label2 = new Label();
+ label3 = new Label();
+ tbR = new TextBox();
+ tbY = new TextBox();
+ tbX = new TextBox();
+ btnLoadImage = new Button();
+ btnCreateCircle = new Button();
+ btnSave = new Button();
+ label6 = new Label();
+ lblResult = new Label();
+ panelGuide = new Panel();
+ ((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
+ splitContainer.Panel1.SuspendLayout();
+ splitContainer.Panel2.SuspendLayout();
+ splitContainer.SuspendLayout();
+ panel1.SuspendLayout();
+ statusStrip1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)btnClose).BeginInit();
+ groupBox1.SuspendLayout();
+ panelGuide.SuspendLayout();
+ SuspendLayout();
+ //
+ // splitContainer
+ //
+ splitContainer.Dock = DockStyle.Fill;
+ splitContainer.Location = new Point(0, 0);
+ splitContainer.Name = "splitContainer";
+ //
+ // splitContainer.Panel1
+ //
+ splitContainer.Panel1.Controls.Add(panelGuide);
+ splitContainer.Panel1MinSize = 150;
+ //
+ // splitContainer.Panel2
+ //
+ splitContainer.Panel2.Controls.Add(panel1);
+ splitContainer.Size = new Size(1280, 640);
+ splitContainer.SplitterDistance = 200;
+ splitContainer.TabIndex = 12;
+ //
+ // panel1
+ //
+ panel1.BorderStyle = BorderStyle.FixedSingle;
+ panel1.Controls.Add(canvas);
+ panel1.Controls.Add(statusStrip1);
+ panel1.Dock = DockStyle.Fill;
+ panel1.Location = new Point(0, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(1076, 640);
+ panel1.TabIndex = 1;
+ //
+ // canvas
+ //
+ canvas.AllowMultiSelect = false;
+ canvas.CreateMode = Canvas.Shape.ShapeTypeEnum.Polygon;
+ canvas.Dock = DockStyle.Fill;
+ canvas.Enabled = false;
+ canvas.FillDrawing = false;
+ canvas.Location = new Point(0, 0);
+ canvas.Margin = new Padding(2);
+ canvas.Name = "canvas";
+ canvas.OutsideShapes = (List)resources.GetObject("canvas.OutsideShapes");
+ canvas.Scale = 1F;
+ canvas.Shapes = (List)resources.GetObject("canvas.Shapes");
+ canvas.Size = new Size(1074, 616);
+ canvas.TabIndex = 2;
+ //
+ // statusStrip1
+ //
+ statusStrip1.Items.AddRange(new ToolStripItem[] { lblStatus });
+ statusStrip1.Location = new Point(0, 616);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(1074, 22);
+ statusStrip1.TabIndex = 1;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // lblStatus
+ //
+ lblStatus.Name = "lblStatus";
+ lblStatus.Size = new Size(44, 17);
+ lblStatus.Text = " ";
+ //
+ // btnClose
+ //
+ btnClose.Anchor = AnchorStyles.Top | AnchorStyles.Right;
+ btnClose.Image = XKRS.CanFly.Properties.Resources.Close;
+ btnClose.InitialImage = XKRS.CanFly.Properties.Resources.Close;
+ btnClose.Location = new Point(1102, 3);
+ btnClose.Name = "btnClose";
+ btnClose.Size = new Size(33, 33);
+ btnClose.SizeMode = PictureBoxSizeMode.StretchImage;
+ btnClose.TabIndex = 5;
+ btnClose.TabStop = false;
+ btnClose.Click += btnClose_Click;
+ //
+ // label4
+ //
+ label4.AutoSize = true;
+ label4.Location = new Point(6, 307);
+ label4.Name = "label4";
+ label4.Size = new Size(44, 17);
+ label4.TabIndex = 3;
+ label4.Text = "耗时:";
+ //
+ // btnExecute
+ //
+ btnExecute.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnExecute.Location = new Point(6, 272);
+ btnExecute.Name = "btnExecute";
+ btnExecute.Size = new Size(186, 32);
+ btnExecute.TabIndex = 2;
+ btnExecute.Text = "执行";
+ btnExecute.UseVisualStyleBackColor = true;
+ btnExecute.Click += btnExecute_Click;
+ //
+ // lblElapsed
+ //
+ lblElapsed.AutoSize = true;
+ lblElapsed.Location = new Point(56, 307);
+ lblElapsed.Name = "lblElapsed";
+ lblElapsed.Size = new Size(32, 17);
+ lblElapsed.TabIndex = 4;
+ lblElapsed.Text = "0ms";
+ //
+ // ctrlTitleBar
+ //
+ ctrlTitleBar.Dock = DockStyle.Top;
+ ctrlTitleBar.Location = new Point(0, 0);
+ ctrlTitleBar.MinimumSize = new Size(0, 36);
+ ctrlTitleBar.Name = "ctrlTitleBar";
+ ctrlTitleBar.Padding = new Padding(3);
+ ctrlTitleBar.Size = new Size(198, 36);
+ ctrlTitleBar.TabIndex = 11;
+ ctrlTitleBar.Title = "圆形测量";
+ //
+ // groupBox1
+ //
+ groupBox1.Controls.Add(tbX);
+ groupBox1.Controls.Add(tbY);
+ groupBox1.Controls.Add(tbR);
+ groupBox1.Controls.Add(label3);
+ groupBox1.Controls.Add(label2);
+ groupBox1.Controls.Add(label1);
+ groupBox1.Dock = DockStyle.Top;
+ groupBox1.Location = new Point(0, 36);
+ groupBox1.Name = "groupBox1";
+ groupBox1.Size = new Size(198, 116);
+ groupBox1.TabIndex = 12;
+ groupBox1.TabStop = false;
+ groupBox1.Text = "圆参数";
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new Point(6, 25);
+ label1.Name = "label1";
+ label1.Size = new Size(19, 17);
+ label1.TabIndex = 0;
+ label1.Text = "X:";
+ //
+ // label2
+ //
+ label2.AutoSize = true;
+ label2.Location = new Point(6, 54);
+ label2.Name = "label2";
+ label2.Size = new Size(18, 17);
+ label2.TabIndex = 1;
+ label2.Text = "Y:";
+ //
+ // label3
+ //
+ label3.AutoSize = true;
+ label3.Location = new Point(3, 83);
+ label3.Name = "label3";
+ label3.Size = new Size(44, 17);
+ label3.TabIndex = 2;
+ label3.Text = "半径:";
+ //
+ // tbR
+ //
+ tbR.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbR.Location = new Point(56, 80);
+ tbR.Name = "tbR";
+ tbR.Size = new Size(136, 23);
+ tbR.TabIndex = 3;
+ //
+ // tbY
+ //
+ tbY.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbY.Location = new Point(56, 51);
+ tbY.Name = "tbY";
+ tbY.Size = new Size(136, 23);
+ tbY.TabIndex = 4;
+ //
+ // tbX
+ //
+ tbX.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbX.Location = new Point(56, 22);
+ tbX.Name = "tbX";
+ tbX.Size = new Size(136, 23);
+ tbX.TabIndex = 5;
+ //
+ // btnLoadImage
+ //
+ btnLoadImage.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnLoadImage.Location = new Point(6, 158);
+ btnLoadImage.Name = "btnLoadImage";
+ btnLoadImage.Size = new Size(186, 32);
+ btnLoadImage.TabIndex = 13;
+ btnLoadImage.Text = "打开图片";
+ btnLoadImage.UseVisualStyleBackColor = true;
+ btnLoadImage.Click += btnLoadImage_Click;
+ //
+ // btnCreateCircle
+ //
+ btnCreateCircle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnCreateCircle.Location = new Point(6, 196);
+ btnCreateCircle.Name = "btnCreateCircle";
+ btnCreateCircle.Size = new Size(186, 32);
+ btnCreateCircle.TabIndex = 14;
+ btnCreateCircle.Text = "创建圆形";
+ btnCreateCircle.UseVisualStyleBackColor = true;
+ btnCreateCircle.Click += btnCreateCircle_Click;
+ //
+ // btnSave
+ //
+ btnSave.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnSave.Location = new Point(9, 397);
+ btnSave.Name = "btnSave";
+ btnSave.Size = new Size(186, 32);
+ btnSave.TabIndex = 15;
+ btnSave.Text = "保存数据";
+ btnSave.UseVisualStyleBackColor = true;
+ btnSave.Click += btnSave_Click;
+ //
+ // label6
+ //
+ label6.AutoSize = true;
+ label6.Location = new Point(6, 338);
+ label6.Name = "label6";
+ label6.Size = new Size(44, 17);
+ label6.TabIndex = 16;
+ label6.Text = "结果:";
+ //
+ // lblResult
+ //
+ lblResult.AutoSize = true;
+ lblResult.Location = new Point(56, 338);
+ lblResult.Name = "lblResult";
+ lblResult.Size = new Size(20, 17);
+ lblResult.TabIndex = 17;
+ lblResult.Text = "无";
+ //
+ // panelGuide
+ //
+ panelGuide.BorderStyle = BorderStyle.FixedSingle;
+ panelGuide.Controls.Add(lblResult);
+ panelGuide.Controls.Add(label6);
+ panelGuide.Controls.Add(btnSave);
+ panelGuide.Controls.Add(btnCreateCircle);
+ panelGuide.Controls.Add(btnLoadImage);
+ panelGuide.Controls.Add(groupBox1);
+ panelGuide.Controls.Add(ctrlTitleBar);
+ panelGuide.Controls.Add(lblElapsed);
+ panelGuide.Controls.Add(btnExecute);
+ panelGuide.Controls.Add(label4);
+ panelGuide.Dock = DockStyle.Fill;
+ panelGuide.Location = new Point(0, 0);
+ panelGuide.Name = "panelGuide";
+ panelGuide.Size = new Size(200, 640);
+ panelGuide.TabIndex = 0;
+ //
+ // GuideCircleCtrl
+ //
+ Controls.Add(splitContainer);
+ Controls.Add(btnClose);
+ Name = "GuideCircleCtrl";
+ Size = new Size(1280, 640);
+ splitContainer.Panel1.ResumeLayout(false);
+ splitContainer.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
+ splitContainer.ResumeLayout(false);
+ panel1.ResumeLayout(false);
+ panel1.PerformLayout();
+ statusStrip1.ResumeLayout(false);
+ statusStrip1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)btnClose).EndInit();
+ groupBox1.ResumeLayout(false);
+ groupBox1.PerformLayout();
+ panelGuide.ResumeLayout(false);
+ panelGuide.PerformLayout();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private SplitContainer splitContainer;
+ private Panel panel1;
+ private Canvas.UI.FlyCanvas canvas;
+ private StatusStrip statusStrip1;
+ private ToolStripStatusLabel lblStatus;
+ private PictureBox btnClose;
+ private Panel panelGuide;
+ private Label lblResult;
+ private Label label6;
+ private Button btnSave;
+ private Button btnCreateCircle;
+ private Button btnLoadImage;
+ private GroupBox groupBox1;
+ private TextBox tbX;
+ private TextBox tbY;
+ private TextBox tbR;
+ private Label label3;
+ private Label label2;
+ private Label label1;
+ private SizeCtrlTitleBar ctrlTitleBar;
+ private Label lblElapsed;
+ private Button btnExecute;
+ private Label label4;
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideCircleCtrl.cs b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.cs
new file mode 100644
index 0000000..9135a88
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.cs
@@ -0,0 +1,361 @@
+using CanFly.Canvas.Shape;
+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;
+using CanFly.Canvas.Helper;
+using CanFly.Helper;
+using HalconDotNet;
+using System.Diagnostics;
+using CanFly.Canvas.UI;
+
+
+namespace CanFly.UI.SizePanel
+{
+ public partial class SizeGuideCircleCtrl : SizeBaseGuideControl
+ {
+
+ private float _x;
+ private float _y;
+ private float _r;
+ private FlyShape? _circle;
+
+
+ protected override string GetScriptFileName() => "CircleMeasure.hdvp";
+
+
+
+
+ public SizeGuideCircleCtrl()
+ {
+ 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;
+ }
+
+
+
+ protected override void UpdateShape(FlyShape shape)
+ {
+ this._circle = shape;
+
+ _x = shape.Points[0].X;
+ _y = shape.Points[0].Y;
+ _r = PointHelper.Distance(shape.Points[0], shape.Points[1]);
+
+ this.tbX.Text = shape.Points[0].X.ToString("F3");
+ this.tbY.Text = shape.Points[0].Y.ToString("F3");
+ this.tbR.Text = _r.ToString("F3");
+ }
+
+
+
+
+ private void btnExecute_Click(object sender, EventArgs e)
+ {
+
+
+ if (this.canvas.pixmap == null)
+ {
+ MessageBox.Show("请先打开图片");
+ return;
+ }
+ if(this.tbX.Text.Trim().Length == 0)
+ {
+ MessageBox.Show("请先创建圆形");
+ return;
+ }
+
+
+ this.canvas.OutsideShapes.Clear();
+ this.canvas.Invalidate();
+
+ flag = new List();
+ x = new List();
+ y = new List();
+ r = new List();
+ Dictionary inputImg = new Dictionary();
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+ inputImg["INPUT_Image"] = hImage;
+
+ Dictionary inputPara = new Dictionary();
+
+
+ inputPara["XCenter"] = _x;
+ inputPara["YCenter"] = _y;
+ inputPara["Radius"] = _r;
+
+
+ List outputKeys = new List()
+ {
+ "OUTPUT_PreTreatedImage",
+ "OUTPUT_Flag",
+ "RXCenter",
+ "RYCenter",
+ "RRadius"
+ };
+
+ ExecuteHScript(
+ inputImg,
+ inputPara,
+ outputKeys);
+
+ }
+ List flag = new List(), x=new List(),y=new List(),r=new List();
+
+ protected override void OnExecuteHScriptResult(
+ bool success,
+ Dictionary resultDic,
+ int timeElasped)
+ {
+ if (!success)
+ {
+ return;
+ }
+
+
+ /*
+ "OUTPUT_Flag",
+ "RXCenter",
+ "RYCenter",
+ "RRadius"
+ */
+
+ //取图?????
+
+
+
+ flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
+ x = resultDic["RXCenter"].HTupleToDouble();
+ y = resultDic["RYCenter"].HTupleToDouble();
+ r = resultDic["RRadius"].HTupleToDouble();
+
+
+
+
+
+
+
+
+
+ if (flag.Count > 0)
+ {
+ lblResult.Text = flag[0].ToString();
+
+ }
+ else
+ {
+ lblResult.Text = "无";
+ }
+ if (flag.Count > 0 && x.Count > 0 && y.Count > 0 && r.Count > 0)
+ {
+
+ //detectResult.VisionImageSet.MLImage = resultDic["RRadius"].GetResultObject("OUTPUT_PreTreatedImage");
+ this.canvas.DrawCircle(new PointF((float)x[0], (float)y[0]), (float)r[0]);
+ lblElapsed.Text = $"{timeElasped} ms";
+ }
+ }
+
+
+
+
+ private void Test()
+ {
+ string filePath = Path.Combine(_hScriptsDir, GetScriptFileName());
+ if (!File.Exists(filePath))
+ {
+ MessageBox.Show($"文件 {filePath} 不存在");
+ return;
+ }
+
+
+ try
+ {
+ HDevEngineTool tool = new HDevEngineTool(_hScriptsDir);
+ tool.LoadProcedure(Path.GetFileNameWithoutExtension(GetScriptFileName()));
+
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+
+ tool.InputImageDic["INPUT_Image"] = hImage;
+ tool.InputTupleDic["XCenter"] = _x;
+ tool.InputTupleDic["YCenter"] = _y;
+ tool.InputTupleDic["Radius"] = _r;
+
+
+
+ if (!tool.RunProcedure(out string error, out int timeElasped))
+ {
+ throw new Exception();
+ }
+
+ HTuple hFlag = tool.GetResultTuple("OUTPUT_Flag");
+
+ var flag = tool.GetResultTuple("OUTPUT_Flag").HTupleToDouble();
+ List x = tool.GetResultTuple("RXCenter").HTupleToDouble();
+ var y = tool.GetResultTuple("RYCenter").HTupleToDouble();
+ var r = tool.GetResultTuple("RRadius").HTupleToDouble();
+ if (flag.Count > 0)
+ {
+ lblResult.Text = flag[0].ToString();
+
+ }
+ else
+ {
+ lblResult.Text = "无";
+ }
+ if (flag.Count > 0 && x.Count > 0 && y.Count > 0 && r.Count > 0)
+ {
+ this.canvas.DrawCircle(new PointF((float)x[0], (float)y[0]), (float)r[0]);
+ lblElapsed.Text = $"{timeElasped} ms";
+ }
+
+ //
+ Debug.WriteLine("");
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ hImage?.Dispose();
+ hImage = null;
+ }
+
+
+ }
+
+
+
+ private void btnClose_Click(object sender, EventArgs e)
+ {
+ OnControlCloseEvent?.Invoke();
+ }
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenImageFile(bitmap =>
+ {
+ this.canvas.LoadPixmap(bitmap);
+ this.canvas.Enabled = true;
+ });
+ }
+
+
+
+
+ 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 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 shapes)
+ {
+ if (shapes.Count != 1)
+ {
+ return;
+ }
+
+ UpdateShape(shapes[0]);
+ }
+
+ private void btnCreateCircle_Click(object sender, EventArgs e)
+ {
+ if (this.canvas.pixmap == null)
+ {
+ MessageBox.Show("请先打开图片");
+ return;
+ }
+ this.tbX.Text = string.Empty;
+ this.tbY.Text = string.Empty;
+ this.tbR.Text = string.Empty;
+ this.canvas.Shapes.Clear();
+ this.canvas.Invalidate();
+ this.canvas.StartDraw(ShapeTypeEnum.Circle);
+ this.canvas.Enabled = true;
+ }
+
+
+
+ private void Canvas_newShape()
+ {
+
+ this.canvas.StopDraw();
+ }
+
+ private void btnSave_Click(object sender, EventArgs e)
+ {
+ if (lblResult.Text.Equals("无"))
+ {
+ MessageBox.Show("请先进行绘制");
+ return;
+ }
+ if(lblResult.Text != "0")
+ {
+ MessageBox.Show("测量计算错误,无法保存");
+ return;
+ }
+
+ //List x = tool.GetResultTuple("RXCenter").HTupleToDouble();
+ //var y = tool.GetResultTuple("RYCenter").HTupleToDouble();
+ //var r = tool.GetResultTuple("RRadius").HTupleToDouble();
+ //tool.InputTupleDic["XCenter"] = _x;
+ //tool.InputTupleDic["YCenter"] = _y;
+ //tool.InputTupleDic["Radius"] = _r;
+ string inputput = $"XCenter:{string.Join(";", _x)};YCenter:{string.Join(";", _y)};RRadius:{string.Join(";", _r)}";
+ string output = $"RXCenter:{string.Join(";", x[0])};RYCenter:{string.Join(";", y[0])};RRadius:{string.Join(";", r[0])}";
+
+ DataToTriggerEvent(inputput,output);
+ }
+ }
+}
diff --git a/DHSoftware/Views/UserConfigFrm.resx b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.resx
similarity index 77%
rename from DHSoftware/Views/UserConfigFrm.resx
rename to CanFly/UI/SizePanel/SizeGuideCircleCtrl.resx
index 8b2ff64..097e294 100644
--- a/DHSoftware/Views/UserConfigFrm.resx
+++ b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.resx
@@ -117,4 +117,29 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+ 17, 17
+
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeGuideHeightCtrl.Designer.cs b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.Designer.cs
new file mode 100644
index 0000000..3b2ffde
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.Designer.cs
@@ -0,0 +1,471 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeGuideHeightCtrl
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SizeGuideHeightCtrl));
+ splitter1 = new AntdUI.Splitter();
+ panel1 = new AntdUI.Panel();
+ canvas = new Canvas.UI.FlyCanvas();
+ panel2 = new AntdUI.Panel();
+ ctrlTitleBar = new GuidePanel.CtrlTitleBar();
+ statusStrip1 = new StatusStrip();
+ lblStatus = new ToolStripStatusLabel();
+ groupBox2 = new GroupBox();
+ tbLineX1 = new AntdUI.Input();
+ label1 = new AntdUI.Label();
+ label4 = new AntdUI.Label();
+ tbLineY1 = new AntdUI.Input();
+ label3 = new AntdUI.Label();
+ tbLineY2 = new AntdUI.Input();
+ label5 = new AntdUI.Label();
+ tbLineX2 = new AntdUI.Input();
+ label6 = new AntdUI.Label();
+ label7 = new AntdUI.Label();
+ tbwidth = new AntdUI.Input();
+ tbheight = new AntdUI.Input();
+ label2 = new AntdUI.Label();
+ CamName = new AntdUI.Input();
+ groupBox1 = new GroupBox();
+ switch1 = new AntdUI.Switch();
+ label8 = new AntdUI.Label();
+ button1 = new AntdUI.Button();
+ button2 = new AntdUI.Button();
+ button3 = new AntdUI.Button();
+ label9 = new AntdUI.Label();
+ lblElapsed = new AntdUI.Label();
+ lblResult = new AntdUI.Label();
+ label12 = new AntdUI.Label();
+ btnSave = new AntdUI.Button();
+ ((System.ComponentModel.ISupportInitialize)splitter1).BeginInit();
+ splitter1.Panel1.SuspendLayout();
+ splitter1.Panel2.SuspendLayout();
+ splitter1.SuspendLayout();
+ panel1.SuspendLayout();
+ panel2.SuspendLayout();
+ statusStrip1.SuspendLayout();
+ groupBox2.SuspendLayout();
+ groupBox1.SuspendLayout();
+ SuspendLayout();
+ //
+ // splitter1
+ //
+ splitter1.Dock = DockStyle.Fill;
+ splitter1.Location = new Point(0, 0);
+ splitter1.Name = "splitter1";
+ //
+ // splitter1.Panel1
+ //
+ splitter1.Panel1.Controls.Add(panel2);
+ //
+ // splitter1.Panel2
+ //
+ splitter1.Panel2.Controls.Add(panel1);
+ splitter1.Size = new Size(1280, 640);
+ splitter1.SplitterDistance = 286;
+ splitter1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(statusStrip1);
+ panel1.Controls.Add(canvas);
+ panel1.Dock = DockStyle.Fill;
+ panel1.Location = new Point(0, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(990, 640);
+ panel1.TabIndex = 0;
+ panel1.Text = "panel1";
+ //
+ // canvas
+ //
+ canvas.AllowMultiSelect = false;
+ canvas.CreateMode = Canvas.Shape.ShapeTypeEnum.Polygon;
+ canvas.Dock = DockStyle.Fill;
+ canvas.FillDrawing = false;
+ canvas.Location = new Point(0, 0);
+ canvas.Margin = new Padding(2);
+ canvas.Name = "canvas";
+ canvas.OutsideShapes = (List)resources.GetObject("canvas.OutsideShapes");
+ canvas.Scale = 1F;
+ canvas.Shapes = (List)resources.GetObject("canvas.Shapes");
+ canvas.Size = new Size(990, 640);
+ canvas.TabIndex = 0;
+ //
+ // panel2
+ //
+ panel2.Controls.Add(btnSave);
+ panel2.Controls.Add(lblResult);
+ panel2.Controls.Add(label12);
+ panel2.Controls.Add(lblElapsed);
+ panel2.Controls.Add(label9);
+ panel2.Controls.Add(button3);
+ panel2.Controls.Add(button2);
+ panel2.Controls.Add(groupBox1);
+ panel2.Controls.Add(groupBox2);
+ panel2.Controls.Add(ctrlTitleBar);
+ panel2.Dock = DockStyle.Fill;
+ panel2.Location = new Point(0, 0);
+ panel2.Name = "panel2";
+ panel2.Size = new Size(286, 640);
+ panel2.TabIndex = 0;
+ panel2.Text = "panel2";
+ //
+ // ctrlTitleBar
+ //
+ ctrlTitleBar.Dock = DockStyle.Top;
+ ctrlTitleBar.Location = new Point(0, 0);
+ ctrlTitleBar.MinimumSize = new Size(0, 36);
+ ctrlTitleBar.Name = "ctrlTitleBar";
+ ctrlTitleBar.Padding = new Padding(3);
+ ctrlTitleBar.Size = new Size(286, 36);
+ ctrlTitleBar.TabIndex = 12;
+ ctrlTitleBar.Title = "高度测量";
+ //
+ // statusStrip1
+ //
+ statusStrip1.Items.AddRange(new ToolStripItem[] { lblStatus });
+ statusStrip1.Location = new Point(0, 618);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(990, 22);
+ statusStrip1.TabIndex = 2;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // lblStatus
+ //
+ lblStatus.Name = "lblStatus";
+ lblStatus.Size = new Size(44, 17);
+ lblStatus.Text = " ";
+ //
+ // groupBox2
+ //
+ groupBox2.Controls.Add(tbheight);
+ groupBox2.Controls.Add(tbwidth);
+ groupBox2.Controls.Add(label7);
+ groupBox2.Controls.Add(label6);
+ groupBox2.Controls.Add(label3);
+ groupBox2.Controls.Add(tbLineY2);
+ groupBox2.Controls.Add(label5);
+ groupBox2.Controls.Add(tbLineX2);
+ groupBox2.Controls.Add(label4);
+ groupBox2.Controls.Add(tbLineY1);
+ groupBox2.Controls.Add(label1);
+ groupBox2.Controls.Add(tbLineX1);
+ groupBox2.Dock = DockStyle.Top;
+ groupBox2.Location = new Point(0, 36);
+ groupBox2.Name = "groupBox2";
+ groupBox2.Size = new Size(286, 229);
+ groupBox2.TabIndex = 14;
+ groupBox2.TabStop = false;
+ groupBox2.Text = "线参数";
+ //
+ // tbLineX1
+ //
+ tbLineX1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbLineX1.Location = new Point(62, 22);
+ tbLineX1.Name = "tbLineX1";
+ tbLineX1.Radius = 3;
+ tbLineX1.Size = new Size(214, 32);
+ tbLineX1.TabIndex = 17;
+ //
+ // label1
+ //
+ label1.Location = new Point(6, 22);
+ label1.Name = "label1";
+ label1.Size = new Size(38, 32);
+ label1.TabIndex = 19;
+ label1.Text = " X1:";
+ //
+ // label4
+ //
+ label4.Location = new Point(6, 60);
+ label4.Name = "label4";
+ label4.Size = new Size(38, 32);
+ label4.TabIndex = 23;
+ label4.Text = " Y1:";
+ //
+ // tbLineY1
+ //
+ tbLineY1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbLineY1.Location = new Point(62, 60);
+ tbLineY1.Name = "tbLineY1";
+ tbLineY1.Radius = 3;
+ tbLineY1.Size = new Size(214, 32);
+ tbLineY1.TabIndex = 22;
+ //
+ // label3
+ //
+ label3.Location = new Point(6, 136);
+ label3.Name = "label3";
+ label3.Size = new Size(38, 32);
+ label3.TabIndex = 27;
+ label3.Text = " Y2:";
+ //
+ // tbLineY2
+ //
+ tbLineY2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbLineY2.Location = new Point(62, 136);
+ tbLineY2.Name = "tbLineY2";
+ tbLineY2.Radius = 3;
+ tbLineY2.Size = new Size(214, 32);
+ tbLineY2.TabIndex = 26;
+ //
+ // label5
+ //
+ label5.Location = new Point(6, 98);
+ label5.Name = "label5";
+ label5.Size = new Size(38, 32);
+ label5.TabIndex = 25;
+ label5.Text = " X2:";
+ //
+ // tbLineX2
+ //
+ tbLineX2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbLineX2.Location = new Point(62, 98);
+ tbLineX2.Name = "tbLineX2";
+ tbLineX2.Radius = 3;
+ tbLineX2.Size = new Size(214, 32);
+ tbLineX2.TabIndex = 24;
+ //
+ // label6
+ //
+ label6.Location = new Point(6, 174);
+ label6.Name = "label6";
+ label6.Size = new Size(50, 32);
+ label6.TabIndex = 28;
+ label6.Text = " 宽:";
+ //
+ // label7
+ //
+ label7.Location = new Point(145, 177);
+ label7.Name = "label7";
+ label7.Size = new Size(29, 32);
+ label7.TabIndex = 29;
+ label7.Text = "高:";
+ //
+ // tbwidth
+ //
+ tbwidth.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbwidth.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbwidth.Location = new Point(62, 177);
+ tbwidth.Name = "tbwidth";
+ tbwidth.Radius = 3;
+ tbwidth.Size = new Size(77, 32);
+ tbwidth.TabIndex = 30;
+ //
+ // tbheight
+ //
+ tbheight.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbheight.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ tbheight.Location = new Point(180, 177);
+ tbheight.Name = "tbheight";
+ tbheight.Radius = 3;
+ tbheight.Size = new Size(96, 32);
+ tbheight.TabIndex = 31;
+ //
+ // label2
+ //
+ label2.Location = new Point(6, 22);
+ label2.Name = "label2";
+ label2.Size = new Size(55, 32);
+ label2.TabIndex = 1;
+ label2.Text = "相机名:";
+ //
+ // CamName
+ //
+ CamName.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ CamName.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134);
+ CamName.Location = new Point(64, 22);
+ CamName.Name = "CamName";
+ CamName.Radius = 3;
+ CamName.ReadOnly = true;
+ CamName.Size = new Size(212, 32);
+ CamName.TabIndex = 18;
+ //
+ // groupBox1
+ //
+ groupBox1.Controls.Add(button1);
+ groupBox1.Controls.Add(label8);
+ groupBox1.Controls.Add(switch1);
+ groupBox1.Controls.Add(label2);
+ groupBox1.Controls.Add(CamName);
+ groupBox1.Dock = DockStyle.Top;
+ groupBox1.Location = new Point(0, 265);
+ groupBox1.Name = "groupBox1";
+ groupBox1.Size = new Size(286, 105);
+ groupBox1.TabIndex = 19;
+ groupBox1.TabStop = false;
+ groupBox1.Text = "相机控制";
+ //
+ // switch1
+ //
+ switch1.Location = new Point(67, 60);
+ switch1.Name = "switch1";
+ switch1.Size = new Size(72, 32);
+ switch1.TabIndex = 19;
+ switch1.Text = "switch1";
+ //
+ // label8
+ //
+ label8.Location = new Point(6, 60);
+ label8.Name = "label8";
+ label8.Size = new Size(55, 32);
+ label8.TabIndex = 20;
+ label8.Text = "硬触发:";
+ //
+ // button1
+ //
+ button1.Location = new Point(145, 60);
+ button1.Name = "button1";
+ button1.Size = new Size(131, 32);
+ button1.TabIndex = 21;
+ button1.Text = "软触发一次";
+ //
+ // button2
+ //
+ button2.Location = new Point(0, 376);
+ button2.Name = "button2";
+ button2.Size = new Size(276, 37);
+ button2.TabIndex = 22;
+ button2.Text = "创建矩形";
+ button2.Type = AntdUI.TTypeMini.Primary;
+ //
+ // button3
+ //
+ button3.Location = new Point(0, 419);
+ button3.Name = "button3";
+ button3.Size = new Size(276, 36);
+ button3.TabIndex = 23;
+ button3.Text = "执行";
+ button3.Type = AntdUI.TTypeMini.Primary;
+ //
+ // label9
+ //
+ label9.Location = new Point(6, 461);
+ label9.Name = "label9";
+ label9.Size = new Size(50, 23);
+ label9.TabIndex = 24;
+ label9.Text = "耗时:";
+ //
+ // lblElapsed
+ //
+ lblElapsed.Location = new Point(67, 461);
+ lblElapsed.Name = "lblElapsed";
+ lblElapsed.Size = new Size(72, 23);
+ lblElapsed.TabIndex = 25;
+ lblElapsed.Text = "0 ms";
+ //
+ // lblResult
+ //
+ lblResult.Location = new Point(67, 490);
+ lblResult.Name = "lblResult";
+ lblResult.Size = new Size(72, 23);
+ lblResult.TabIndex = 27;
+ lblResult.Text = "无";
+ //
+ // label12
+ //
+ label12.Location = new Point(6, 490);
+ label12.Name = "label12";
+ label12.Size = new Size(50, 23);
+ label12.TabIndex = 26;
+ label12.Text = "结果:";
+ //
+ // btnSave
+ //
+ btnSave.Location = new Point(0, 519);
+ btnSave.Name = "btnSave";
+ btnSave.Size = new Size(276, 36);
+ btnSave.TabIndex = 28;
+ btnSave.Text = "保存数据";
+ btnSave.Type = AntdUI.TTypeMini.Primary;
+ //
+ // SizeGuideHeightCtrl
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(splitter1);
+ Name = "SizeGuideHeightCtrl";
+ Size = new Size(1280, 640);
+ Load += GuideLineCircleCtrl_Load;
+ splitter1.Panel1.ResumeLayout(false);
+ splitter1.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)splitter1).EndInit();
+ splitter1.ResumeLayout(false);
+ panel1.ResumeLayout(false);
+ panel1.PerformLayout();
+ panel2.ResumeLayout(false);
+ statusStrip1.ResumeLayout(false);
+ statusStrip1.PerformLayout();
+ groupBox2.ResumeLayout(false);
+ groupBox1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+ private TextBox tbRectWidth1;
+ private AntdUI.Splitter splitter1;
+ private AntdUI.Panel panel1;
+ private Canvas.UI.FlyCanvas canvas;
+ private AntdUI.Panel panel2;
+ private GuidePanel.CtrlTitleBar ctrlTitleBar;
+ private StatusStrip statusStrip1;
+ private ToolStripStatusLabel lblStatus;
+ private GroupBox groupBox2;
+
+ private Canvas.UI.FlyCanvas flyCanvas1;
+ private AntdUI.Input tbLineX1;
+ private AntdUI.Label label1;
+ private AntdUI.Label label3;
+ private AntdUI.Input tbLineY2;
+ private AntdUI.Label label5;
+ private AntdUI.Input tbLineX2;
+ private AntdUI.Label label4;
+ private AntdUI.Input tbLineY1;
+ private AntdUI.Label label7;
+ private AntdUI.Label label6;
+ private AntdUI.Input tbwidth;
+ private AntdUI.Input tbheight;
+ private GroupBox groupBox1;
+ private AntdUI.Label label2;
+ private AntdUI.Input CamName;
+ private AntdUI.Button button1;
+ private AntdUI.Label label8;
+ private AntdUI.Switch switch1;
+ private AntdUI.Button button2;
+ private AntdUI.Button button3;
+ private AntdUI.Label lblElapsed;
+ private AntdUI.Label label9;
+ private AntdUI.Label lblResult;
+ private AntdUI.Label label12;
+ private AntdUI.Button btnSave;
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideHeightCtrl.cs b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.cs
new file mode 100644
index 0000000..a93f9f3
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.cs
@@ -0,0 +1,346 @@
+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.SizePanel
+{
+ public partial class SizeGuideHeightCtrl : SizeBaseGuideControl
+ {
+
+
+
+ private FlyShape? _line;
+
+
+ private float _lineX1;
+ private float _lineY1;
+ private float _lineX2;
+ private float _lineY2;
+ float width, height;
+ 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() => "HeightMeasure.hdvp";
+
+
+
+ public SizeGuideHeightCtrl()
+ {
+ 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;
+
+
+
+ }
+
+
+
+ protected override void UpdateShape(FlyShape shape)
+ {
+ switch (shape.ShapeType)
+ {
+ case ShapeTypeEnum.Rectangle:
+ this._line = shape;
+
+ 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;
+
+ width = Math.Abs(_lineX2 - _lineX1);
+ height = Math.Abs(_lineY2 - _lineY1);
+
+
+ tbLineX1.Text = _lineX1.ToString("F3");
+ tbLineY1.Text = _lineY1.ToString("F3");
+ tbLineX2.Text = _lineX2.ToString("F3");
+ tbLineY2.Text = _lineY2.ToString("F3");
+ tbwidth.Text = width.ToString();
+ tbheight.Text = height.ToString();
+ // 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 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 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; ;
+ tbwidth.Text = string.Empty; ;
+ tbheight.Text = string.Empty; ;
+ this.canvas.Shapes.RemoveAll(shp => shp.ShapeType == ShapeTypeEnum.Rectangle);
+ this.canvas.Invalidate();
+ this.canvas.StartDraw(ShapeTypeEnum.Rectangle);
+
+ }
+
+
+
+ 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();
+ }
+
+ 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();
+
+ Line1Para = new List();
+ Line2Para = new List();
+ iHeight = new List();
+ Dictionary inputImg = new Dictionary();
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+ inputImg["INPUT_Image"] = hImage;
+
+
+ Dictionary inputPara = new Dictionary();
+
+
+ inputPara["row"] = _lineY1;
+ inputPara["column"] = _lineX1;
+ inputPara["Width"] = width;
+ inputPara["Height"] = height;
+
+
+
+ List outputKeys = new List()
+ {
+ "OUTPUT_PreTreatedImage",
+ "OUTPUT_Flag",
+
+ "Line1Para",
+ "Line2Para",
+ "iHeight"
+ };
+
+ ExecuteHScript(
+ inputImg,
+ inputPara,
+ outputKeys);
+
+ }
+
+
+ List flag = new List();
+ List Line1Para = new List();
+ List Line2Para = new List();
+
+ List iHeight = new List();
+
+
+ protected override void OnExecuteHScriptResult(
+ bool success,
+ Dictionary resultDic,
+ int timeElasped)
+ {
+ if (!success)
+ {
+ return;
+ }
+
+
+ /*
+ "OUTPUT_Flag",
+ "RXCenter",
+ "RYCenter",
+ "RRadius"
+ */
+
+ flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
+
+ Line1Para = resultDic["Line1Para"].HTupleToDouble();
+ Line2Para = resultDic["Line2Para"].HTupleToDouble();
+ // EndRow = resultDic["EndRow"].HTupleToDouble();
+ //EndCloumn = resultDic["EndColumn"].HTupleToDouble();
+ iHeight = resultDic["iHeight"].HTupleToDouble();
+
+ if (flag.Count > 0)
+ {
+ lblResult.Text = flag[0].ToString();
+
+ }
+ else
+ {
+ lblResult.Text = "无";
+ }
+ if (flag.Count > 0 && Line1Para.Count == 4 && Line2Para.Count == 4 && iHeight.Count > 0)
+ {
+ float width = 0;
+ this.canvas.DrawLine(new PointF((float)Line1Para[1], (float)Line1Para[0]), new PointF((float)Line1Para[3], (float)Line1Para[2]), 0);
+ this.canvas.DrawLine(new PointF((float)Line2Para[1], (float)Line2Para[0]), new PointF((float)Line2Para[3], (float)Line2Para[2]), 0);
+ this.canvas.Invalidate();
+ lblElapsed.Text = $"{timeElasped} ms";
+ }
+ }
+
+
+
+ private void btnSave_Click(object sender, EventArgs e)
+ {
+ if (lblResult.Text.Equals("无"))
+ {
+ MessageBox.Show("请先进行绘制");
+ return;
+ }
+ if (lblResult.Text != "0")
+ {
+ MessageBox.Show("测量计算错误,无法保存");
+ return;
+ }
+
+
+
+ string input = $"row:{string.Join(";", _lineY1)};column:{string.Join(";", _lineX1)};" +
+ $"Width:{string.Join(";", width)};Height:{string.Join(";", height)}";
+
+ string output = $"iHeight:{string.Join(";", iHeight[0])}";
+ DataToTriggerEvent(input, output);
+ }
+
+ private void tbLineX1_TextChanged(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideHeightCtrl.resx b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.resx
new file mode 100644
index 0000000..ccbe56c
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideHeightCtrl.resx
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.Designer.cs b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.Designer.cs
new file mode 100644
index 0000000..c0f603e
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.Designer.cs
@@ -0,0 +1,550 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeGuideLineCircleCtrl
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SizeGuideLineCircleCtrl));
+ lblElapsed = new Label();
+ label4 = new Label();
+ splitContainer = new SplitContainer();
+ panelGuide = new Panel();
+ lblDistance = new Label();
+ label17 = new Label();
+ lblResult = new Label();
+ label15 = new Label();
+ btnCreateLine = new Button();
+ btnCreateCircle = new Button();
+ btnLoadImage = new Button();
+ label9 = new Label();
+ btnExecute = new Button();
+ label10 = new Label();
+ groupBox2 = new GroupBox();
+ NumRectWidth1 = new NumericUpDown();
+ label11 = new Label();
+ tbLineX2 = new TextBox();
+ label8 = new Label();
+ tbLineY2 = new TextBox();
+ label5 = new Label();
+ tbLineX1 = new TextBox();
+ tbLineY1 = new TextBox();
+ label6 = new Label();
+ label7 = new Label();
+ groupBox1 = new GroupBox();
+ tbCircleX = new TextBox();
+ tbCircleY = new TextBox();
+ tbCircleR = new TextBox();
+ label3 = new Label();
+ label2 = new Label();
+ label1 = new Label();
+ ctrlTitleBar = new SizeCtrlTitleBar();
+ panel1 = new Panel();
+ canvas = new Canvas.UI.FlyCanvas();
+ statusStrip1 = new StatusStrip();
+ lblStatus = new ToolStripStatusLabel();
+ btnSave = new Button();
+ ((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
+ splitContainer.Panel1.SuspendLayout();
+ splitContainer.Panel2.SuspendLayout();
+ splitContainer.SuspendLayout();
+ panelGuide.SuspendLayout();
+ groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).BeginInit();
+ groupBox1.SuspendLayout();
+ panel1.SuspendLayout();
+ statusStrip1.SuspendLayout();
+ SuspendLayout();
+ //
+ // lblElapsed
+ //
+ lblElapsed.AutoSize = true;
+ lblElapsed.Location = new Point(50, 328);
+ lblElapsed.Name = "lblElapsed";
+ lblElapsed.Size = new Size(32, 17);
+ lblElapsed.TabIndex = 9;
+ lblElapsed.Text = "0ms";
+ //
+ // label4
+ //
+ label4.AutoSize = true;
+ label4.Location = new Point(0, 328);
+ label4.Name = "label4";
+ label4.Size = new Size(44, 17);
+ label4.TabIndex = 8;
+ label4.Text = "耗时:";
+ //
+ // splitContainer
+ //
+ splitContainer.Dock = DockStyle.Fill;
+ splitContainer.Location = new Point(0, 0);
+ splitContainer.Name = "splitContainer";
+ //
+ // splitContainer.Panel1
+ //
+ splitContainer.Panel1.Controls.Add(panelGuide);
+ splitContainer.Panel1MinSize = 150;
+ //
+ // splitContainer.Panel2
+ //
+ splitContainer.Panel2.Controls.Add(panel1);
+ splitContainer.Size = new Size(1280, 640);
+ splitContainer.SplitterDistance = 200;
+ splitContainer.TabIndex = 11;
+ //
+ // panelGuide
+ //
+ panelGuide.BorderStyle = BorderStyle.FixedSingle;
+ panelGuide.Controls.Add(btnSave);
+ panelGuide.Controls.Add(lblDistance);
+ panelGuide.Controls.Add(label17);
+ panelGuide.Controls.Add(lblResult);
+ panelGuide.Controls.Add(label15);
+ panelGuide.Controls.Add(btnCreateLine);
+ panelGuide.Controls.Add(btnCreateCircle);
+ panelGuide.Controls.Add(btnLoadImage);
+ panelGuide.Controls.Add(label9);
+ panelGuide.Controls.Add(btnExecute);
+ panelGuide.Controls.Add(label10);
+ panelGuide.Controls.Add(groupBox2);
+ panelGuide.Controls.Add(groupBox1);
+ panelGuide.Controls.Add(ctrlTitleBar);
+ panelGuide.Dock = DockStyle.Fill;
+ panelGuide.Location = new Point(0, 0);
+ panelGuide.Name = "panelGuide";
+ panelGuide.Size = new Size(200, 640);
+ panelGuide.TabIndex = 0;
+ //
+ // lblDistance
+ //
+ lblDistance.AutoSize = true;
+ lblDistance.Location = new Point(54, 505);
+ lblDistance.Name = "lblDistance";
+ lblDistance.Size = new Size(15, 17);
+ lblDistance.TabIndex = 29;
+ lblDistance.Text = "0";
+ //
+ // label17
+ //
+ label17.AutoSize = true;
+ label17.Location = new Point(6, 505);
+ label17.Name = "label17";
+ label17.Size = new Size(44, 17);
+ label17.TabIndex = 28;
+ label17.Text = "距离:";
+ //
+ // lblResult
+ //
+ lblResult.AutoSize = true;
+ lblResult.Location = new Point(54, 479);
+ lblResult.Name = "lblResult";
+ lblResult.Size = new Size(20, 17);
+ lblResult.TabIndex = 27;
+ lblResult.Text = "无";
+ //
+ // label15
+ //
+ label15.AutoSize = true;
+ label15.Location = new Point(6, 479);
+ label15.Name = "label15";
+ label15.Size = new Size(44, 17);
+ label15.TabIndex = 26;
+ label15.Text = "结果:";
+ //
+ // btnCreateLine
+ //
+ btnCreateLine.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnCreateLine.Location = new Point(6, 406);
+ btnCreateLine.Name = "btnCreateLine";
+ btnCreateLine.Size = new Size(186, 32);
+ btnCreateLine.TabIndex = 20;
+ btnCreateLine.Text = "创建直线";
+ btnCreateLine.UseVisualStyleBackColor = true;
+ btnCreateLine.Click += btnCreateLine_Click;
+ //
+ // btnCreateCircle
+ //
+ btnCreateCircle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnCreateCircle.Location = new Point(6, 368);
+ btnCreateCircle.Name = "btnCreateCircle";
+ btnCreateCircle.Size = new Size(186, 32);
+ btnCreateCircle.TabIndex = 19;
+ btnCreateCircle.Text = "创建圆形";
+ btnCreateCircle.UseVisualStyleBackColor = true;
+ btnCreateCircle.Click += btnCreateCircle_Click;
+ //
+ // btnLoadImage
+ //
+ btnLoadImage.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnLoadImage.Location = new Point(6, 330);
+ btnLoadImage.Name = "btnLoadImage";
+ btnLoadImage.Size = new Size(186, 32);
+ btnLoadImage.TabIndex = 18;
+ btnLoadImage.Text = "打开图片";
+ btnLoadImage.UseVisualStyleBackColor = true;
+ btnLoadImage.Click += btnLoadImage_Click;
+ //
+ // label9
+ //
+ label9.AutoSize = true;
+ label9.Location = new Point(56, 525);
+ label9.Name = "label9";
+ label9.Size = new Size(32, 17);
+ label9.TabIndex = 17;
+ label9.Text = "0ms";
+ //
+ // btnExecute
+ //
+ btnExecute.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnExecute.Location = new Point(6, 444);
+ btnExecute.Name = "btnExecute";
+ btnExecute.Size = new Size(186, 32);
+ btnExecute.TabIndex = 15;
+ btnExecute.Text = "执行";
+ btnExecute.UseVisualStyleBackColor = true;
+ btnExecute.Click += btnExecute_Click;
+ //
+ // label10
+ //
+ label10.AutoSize = true;
+ label10.Location = new Point(6, 525);
+ label10.Name = "label10";
+ label10.Size = new Size(44, 17);
+ label10.TabIndex = 16;
+ label10.Text = "耗时:";
+ //
+ // groupBox2
+ //
+ groupBox2.Controls.Add(NumRectWidth1);
+ groupBox2.Controls.Add(label11);
+ groupBox2.Controls.Add(tbLineX2);
+ groupBox2.Controls.Add(label8);
+ groupBox2.Controls.Add(tbLineY2);
+ groupBox2.Controls.Add(label5);
+ groupBox2.Controls.Add(tbLineX1);
+ groupBox2.Controls.Add(tbLineY1);
+ groupBox2.Controls.Add(label6);
+ groupBox2.Controls.Add(label7);
+ groupBox2.Dock = DockStyle.Top;
+ groupBox2.Location = new Point(0, 152);
+ groupBox2.Name = "groupBox2";
+ groupBox2.Size = new Size(198, 172);
+ groupBox2.TabIndex = 13;
+ groupBox2.TabStop = false;
+ groupBox2.Text = "线参数";
+ //
+ // NumRectWidth1
+ //
+ NumRectWidth1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ NumRectWidth1.Location = new Point(56, 138);
+ NumRectWidth1.Maximum = new decimal(new int[] { 9000, 0, 0, 0 });
+ NumRectWidth1.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
+ NumRectWidth1.Name = "NumRectWidth1";
+ NumRectWidth1.Size = new Size(136, 23);
+ NumRectWidth1.TabIndex = 13;
+ NumRectWidth1.Value = new decimal(new int[] { 1, 0, 0, 0 });
+ //
+ // label11
+ //
+ label11.AutoSize = true;
+ label11.Location = new Point(6, 140);
+ label11.Name = "label11";
+ label11.Size = new Size(35, 17);
+ label11.TabIndex = 12;
+ label11.Text = "宽度:";
+ //
+ // tbLineX2
+ //
+ tbLineX2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX2.Location = new Point(56, 80);
+ tbLineX2.Name = "tbLineX2";
+ tbLineX2.Size = new Size(136, 23);
+ tbLineX2.TabIndex = 9;
+ //
+ // label8
+ //
+ label8.AutoSize = true;
+ label8.Location = new Point(6, 83);
+ label8.Name = "label8";
+ label8.Size = new Size(26, 17);
+ label8.TabIndex = 8;
+ label8.Text = "X2:";
+ //
+ // tbLineY2
+ //
+ tbLineY2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY2.Location = new Point(56, 109);
+ tbLineY2.Name = "tbLineY2";
+ tbLineY2.Size = new Size(136, 23);
+ tbLineY2.TabIndex = 7;
+ //
+ // label5
+ //
+ label5.AutoSize = true;
+ label5.Location = new Point(6, 112);
+ label5.Name = "label5";
+ label5.Size = new Size(25, 17);
+ label5.TabIndex = 6;
+ label5.Text = "Y2:";
+ //
+ // tbLineX1
+ //
+ tbLineX1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX1.Location = new Point(56, 22);
+ tbLineX1.Name = "tbLineX1";
+ tbLineX1.Size = new Size(136, 23);
+ tbLineX1.TabIndex = 5;
+ //
+ // tbLineY1
+ //
+ tbLineY1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY1.Location = new Point(56, 51);
+ tbLineY1.Name = "tbLineY1";
+ tbLineY1.Size = new Size(136, 23);
+ tbLineY1.TabIndex = 4;
+ //
+ // label6
+ //
+ label6.AutoSize = true;
+ label6.Location = new Point(6, 54);
+ label6.Name = "label6";
+ label6.Size = new Size(25, 17);
+ label6.TabIndex = 1;
+ label6.Text = "Y1:";
+ //
+ // label7
+ //
+ label7.AutoSize = true;
+ label7.Location = new Point(6, 25);
+ label7.Name = "label7";
+ label7.Size = new Size(26, 17);
+ label7.TabIndex = 0;
+ label7.Text = "X1:";
+ //
+ // groupBox1
+ //
+ groupBox1.Controls.Add(tbCircleX);
+ groupBox1.Controls.Add(tbCircleY);
+ groupBox1.Controls.Add(tbCircleR);
+ groupBox1.Controls.Add(label3);
+ groupBox1.Controls.Add(label2);
+ groupBox1.Controls.Add(label1);
+ groupBox1.Dock = DockStyle.Top;
+ groupBox1.Location = new Point(0, 36);
+ groupBox1.Name = "groupBox1";
+ groupBox1.Size = new Size(198, 116);
+ groupBox1.TabIndex = 12;
+ groupBox1.TabStop = false;
+ groupBox1.Text = "圆参数";
+ //
+ // tbCircleX
+ //
+ tbCircleX.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbCircleX.Location = new Point(56, 22);
+ tbCircleX.Name = "tbCircleX";
+ tbCircleX.Size = new Size(136, 23);
+ tbCircleX.TabIndex = 5;
+ //
+ // tbCircleY
+ //
+ tbCircleY.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbCircleY.Location = new Point(56, 51);
+ tbCircleY.Name = "tbCircleY";
+ tbCircleY.Size = new Size(136, 23);
+ tbCircleY.TabIndex = 4;
+ //
+ // tbCircleR
+ //
+ tbCircleR.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbCircleR.Location = new Point(56, 80);
+ tbCircleR.Name = "tbCircleR";
+ tbCircleR.Size = new Size(136, 23);
+ tbCircleR.TabIndex = 3;
+ //
+ // label3
+ //
+ label3.AutoSize = true;
+ label3.Location = new Point(3, 83);
+ label3.Name = "label3";
+ label3.Size = new Size(44, 17);
+ label3.TabIndex = 2;
+ label3.Text = "半径:";
+ //
+ // label2
+ //
+ label2.AutoSize = true;
+ label2.Location = new Point(6, 54);
+ label2.Name = "label2";
+ label2.Size = new Size(18, 17);
+ label2.TabIndex = 1;
+ label2.Text = "Y:";
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new Point(6, 25);
+ label1.Name = "label1";
+ label1.Size = new Size(19, 17);
+ label1.TabIndex = 0;
+ label1.Text = "X:";
+ //
+ // ctrlTitleBar
+ //
+ ctrlTitleBar.Dock = DockStyle.Top;
+ ctrlTitleBar.Location = new Point(0, 0);
+ ctrlTitleBar.MinimumSize = new Size(0, 36);
+ ctrlTitleBar.Name = "ctrlTitleBar";
+ ctrlTitleBar.Padding = new Padding(3);
+ ctrlTitleBar.Size = new Size(198, 36);
+ ctrlTitleBar.TabIndex = 11;
+ ctrlTitleBar.Title = "线圆测量";
+ //
+ // panel1
+ //
+ panel1.BorderStyle = BorderStyle.FixedSingle;
+ panel1.Controls.Add(canvas);
+ panel1.Controls.Add(statusStrip1);
+ panel1.Dock = DockStyle.Fill;
+ panel1.Location = new Point(0, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(1076, 640);
+ panel1.TabIndex = 1;
+ //
+ // canvas
+ //
+ canvas.AllowMultiSelect = false;
+ canvas.CreateMode = Canvas.Shape.ShapeTypeEnum.Polygon;
+ canvas.Dock = DockStyle.Fill;
+ canvas.Enabled = false;
+ canvas.FillDrawing = false;
+ canvas.Location = new Point(0, 0);
+ canvas.Margin = new Padding(2);
+ canvas.Name = "canvas";
+ canvas.OutsideShapes = (List)resources.GetObject("canvas.OutsideShapes");
+ canvas.Scale = 1F;
+ canvas.Shapes = (List)resources.GetObject("canvas.Shapes");
+ canvas.Size = new Size(1074, 616);
+ canvas.TabIndex = 2;
+ //
+ // statusStrip1
+ //
+ statusStrip1.Items.AddRange(new ToolStripItem[] { lblStatus });
+ statusStrip1.Location = new Point(0, 616);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(1074, 22);
+ statusStrip1.TabIndex = 1;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // lblStatus
+ //
+ lblStatus.Name = "lblStatus";
+ lblStatus.Size = new Size(44, 17);
+ lblStatus.Text = " ";
+ //
+ // btnSave
+ //
+ btnSave.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnSave.Location = new Point(6, 545);
+ btnSave.Name = "btnSave";
+ btnSave.Size = new Size(186, 32);
+ btnSave.TabIndex = 30;
+ btnSave.Text = "保存数据";
+ btnSave.UseVisualStyleBackColor = true;
+ btnSave.Click += btnSave_Click;
+ //
+ // GuideLineCircleCtrl
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(splitContainer);
+ Controls.Add(lblElapsed);
+ Controls.Add(label4);
+ Name = "GuideLineCircleCtrl";
+ Size = new Size(1280, 640);
+ Load += GuideLineCircleCtrl_Load;
+ splitContainer.Panel1.ResumeLayout(false);
+ splitContainer.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
+ splitContainer.ResumeLayout(false);
+ panelGuide.ResumeLayout(false);
+ panelGuide.PerformLayout();
+ groupBox2.ResumeLayout(false);
+ groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).EndInit();
+ groupBox1.ResumeLayout(false);
+ groupBox1.PerformLayout();
+ panel1.ResumeLayout(false);
+ panel1.PerformLayout();
+ statusStrip1.ResumeLayout(false);
+ statusStrip1.PerformLayout();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Label lblElapsed;
+ private Label label4;
+
+ private SplitContainer splitContainer;
+ private Panel panelGuide;
+ private Panel panel1;
+ private Canvas.UI.FlyCanvas canvas;
+ private StatusStrip statusStrip1;
+ private ToolStripStatusLabel lblStatus;
+ private GroupBox groupBox2;
+ private TextBox tbLineX2;
+ private Label label8;
+ private TextBox tbLineY2;
+ private Label label5;
+ private TextBox tbLineX1;
+ private TextBox tbLineY1;
+ private Label label6;
+ private Label label7;
+ private GroupBox groupBox1;
+ private TextBox tbCircleX;
+ private TextBox tbCircleY;
+ private TextBox tbCircleR;
+ private Label label3;
+ private Label label2;
+ private Label label1;
+ private SizeCtrlTitleBar ctrlTitleBar;
+ private Button btnCreateCircle;
+ private Button btnLoadImage;
+ private Label label9;
+ private Button btnExecute;
+ private Label label10;
+ private Button btnCreateLine;
+ private TextBox tbRectWidth1;
+ private Label label11;
+ private NumericUpDown NumRectWidth1;
+ private Label lblDistance;
+ private Label label17;
+ private Label lblResult;
+ private Label label15;
+ private Button btnSave;
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.cs b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.cs
new file mode 100644
index 0000000..8a0d23c
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.cs
@@ -0,0 +1,449 @@
+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.SizePanel
+{
+ public partial class SizeGuideLineCircleCtrl : SizeBaseGuideControl
+ {
+
+
+ private FlyShape? _circle;
+ private FlyShape? _line;
+
+
+ private float _lineX1;
+ private float _lineY1;
+ private float _lineX2;
+ private float _lineY2;
+ private float _lineWidth;
+
+
+ private float _circleX;
+ private float _circleY;
+ private float _circleR;
+
+
+
+
+ protected override string GetScriptFileName() => "LineToCircle.hdvp";
+
+
+
+ public SizeGuideLineCircleCtrl()
+ {
+ 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;
+
+ 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;
+ case ShapeTypeEnum.Circle:
+ this._circle = shape;
+
+ _circleX = shape.Points[0].X;
+ _circleY = shape.Points[0].Y;
+ _circleR = PointHelper.Distance(shape.Points[0], shape.Points[1]);
+
+ this.tbCircleX.Text = _circleX.ToString("F3");
+ this.tbCircleY.Text = _circleY.ToString("F3");
+ this.tbCircleR.Text = _circleR.ToString("F3");
+
+ 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 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 shapes)
+ {
+ if (shapes.Count != 1)
+ {
+ return;
+ }
+
+ UpdateShape(shapes[0]);
+ }
+
+
+
+ private void btnCreateCircle_Click(object sender, EventArgs e)
+ {
+ if (this.canvas.pixmap == null)
+ {
+ MessageBox.Show("请先打开图片");
+ return;
+ }
+ this.tbCircleX.Text = string.Empty;
+ this.tbCircleY.Text = string.Empty;
+ this.tbCircleR.Text = string.Empty;
+ this.canvas.Shapes.RemoveAll(shp => shp.ShapeType == ShapeTypeEnum.Circle);
+
+ this.canvas.Invalidate();
+ this.canvas.StartDraw(ShapeTypeEnum.Circle);
+ }
+
+
+
+ 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;
+ }
+ if (this.tbLineX1.Text.Trim().Length == 0)
+ {
+ MessageBox.Show("请先创建圆形");
+ return;
+ }
+
+ this.canvas.OutsideShapes.Clear();
+ this.canvas.Invalidate();
+
+ flag = new List();
+ Distance = new List();
+ fRowCenter = new List();
+ fColCenter = new List();
+ fRadius = new List();
+ RowBegin = new List();
+ ColBegin = new List();
+ RowEnd = new List();
+ ColEnd = new List();
+ Dictionary inputImg = new Dictionary();
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+ inputImg["INPUT_Image"] = hImage;
+
+ Dictionary inputPara = new Dictionary();
+
+ 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["XCenter"] = _circleX;
+ inputPara["YCenter"] = _circleY;
+ inputPara["Radius"] = _circleR;
+ inputPara["Line_XRect"] = hTupleArrayX;
+ inputPara["Line_YRect"] = hTupleArrayY;
+
+
+
+ List outputKeys = new List()
+ {
+ "OUTPUT_Flag",
+ "distance",
+ "fRowCenter",
+ "fColCenter",
+ "fRadius",
+ "RowBegin",
+ "ColBegin",
+ "RowEnd",
+ "ColEnd"
+ };
+
+ ExecuteHScript(
+ inputImg,
+ inputPara,
+ outputKeys);
+
+ }
+ List flag = new List();
+ List Distance = new List();
+ List fRowCenter = new List();
+ List fColCenter = new List();
+ List fRadius = new List();
+ List RowBegin = new List();
+ List ColBegin = new List();
+ List RowEnd = new List();
+ List ColEnd = new List();
+ protected override void OnExecuteHScriptResult(
+ bool success,
+ Dictionary resultDic,
+ int timeElasped)
+ {
+ if (!success)
+ {
+ return;
+ }
+
+ //"OUTPUT_Flag",
+ // "distance",
+ // "fRowCenter",
+ // "fColCenter",
+ // "fRadius",
+ // "RowBegin",
+ // "ColBegin",
+ // "RowEnd",
+ // "ColEnd"
+
+ flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
+ Distance = resultDic["distance"].HTupleToDouble();
+ fRowCenter = resultDic["fRowCenter"].HTupleToDouble();
+ fColCenter = resultDic["fColCenter"].HTupleToDouble();
+ fRadius = resultDic["fRadius"].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 (Distance.Count > 0)
+ {
+ lblDistance.Text = Distance[0].ToString();
+ }
+ else
+ {
+ lblDistance.Text = "0";
+ }
+
+ if (flag.Count > 0 && Distance.Count > 0 && fRowCenter.Count > 0 && fColCenter.Count > 0 && fRadius.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.DrawCircle(new PointF((float)fColCenter[0], (float)fRowCenter[0]), (float)fRadius[0]);
+
+ 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;
+ }
+
+
+
+
+
+ string input = $"LX:{_lineX1};" +
+ $"LY:{_lineY1};" +
+ $"RX:{_lineX2};" +
+ $"RY:{_lineY2};" +
+ $"XCenter:{_circleX};" +
+ $"YCenter:{_circleY};" +
+ $"Radius:{_circleR};" +
+ $"Line_XRect:{strarrayX};"+
+ $"Line_YRect:{strarrayY}";
+
+
+
+
+ string result = $"distance:{Distance[0]};";
+ DataToTriggerEvent(input, result);
+
+ }
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.resx b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.resx
new file mode 100644
index 0000000..097e294
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCircleCtrl.resx
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCtrl.Designer.cs b/CanFly/UI/SizePanel/SizeGuideLineCtrl.Designer.cs
new file mode 100644
index 0000000..fb816ee
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCtrl.Designer.cs
@@ -0,0 +1,427 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeGuideLineCtrl
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 组件设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要修改
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SizeGuideLineCtrl));
+ lblElapsed = new Label();
+ label4 = new Label();
+ splitContainer = new SplitContainer();
+ panelGuide = new Panel();
+ btnSave = new Button();
+ lblResult = new Label();
+ label1 = new Label();
+ btnCreateLine = new Button();
+ btnLoadImage = new Button();
+ label9 = new Label();
+ btnExecute = new Button();
+ label10 = new Label();
+ groupBox2 = new GroupBox();
+ NumRectWidth1 = new NumericUpDown();
+ label11 = new Label();
+ tbLineX2 = new TextBox();
+ label8 = new Label();
+ tbLineY2 = new TextBox();
+ label5 = new Label();
+ tbLineX1 = new TextBox();
+ tbLineY1 = new TextBox();
+ label6 = new Label();
+ label7 = new Label();
+ ctrlTitleBar = new SizeCtrlTitleBar();
+ panel1 = new Panel();
+ canvas = new Canvas.UI.FlyCanvas();
+ statusStrip1 = new StatusStrip();
+ lblStatus = new ToolStripStatusLabel();
+ ((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
+ splitContainer.Panel1.SuspendLayout();
+ splitContainer.Panel2.SuspendLayout();
+ splitContainer.SuspendLayout();
+ panelGuide.SuspendLayout();
+ groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).BeginInit();
+ panel1.SuspendLayout();
+ statusStrip1.SuspendLayout();
+ SuspendLayout();
+ //
+ // lblElapsed
+ //
+ lblElapsed.AutoSize = true;
+ lblElapsed.Location = new Point(50, 328);
+ lblElapsed.Name = "lblElapsed";
+ lblElapsed.Size = new Size(32, 17);
+ lblElapsed.TabIndex = 9;
+ lblElapsed.Text = "0ms";
+ //
+ // label4
+ //
+ label4.AutoSize = true;
+ label4.Location = new Point(0, 328);
+ label4.Name = "label4";
+ label4.Size = new Size(44, 17);
+ label4.TabIndex = 8;
+ label4.Text = "耗时:";
+ //
+ // splitContainer
+ //
+ splitContainer.Dock = DockStyle.Fill;
+ splitContainer.Location = new Point(0, 0);
+ splitContainer.Name = "splitContainer";
+ //
+ // splitContainer.Panel1
+ //
+ splitContainer.Panel1.Controls.Add(panelGuide);
+ splitContainer.Panel1MinSize = 150;
+ //
+ // splitContainer.Panel2
+ //
+ splitContainer.Panel2.Controls.Add(panel1);
+ splitContainer.Size = new Size(1280, 640);
+ splitContainer.SplitterDistance = 200;
+ splitContainer.TabIndex = 11;
+ //
+ // panelGuide
+ //
+ panelGuide.BorderStyle = BorderStyle.FixedSingle;
+ panelGuide.Controls.Add(btnSave);
+ panelGuide.Controls.Add(lblResult);
+ panelGuide.Controls.Add(label1);
+ panelGuide.Controls.Add(btnCreateLine);
+ panelGuide.Controls.Add(btnLoadImage);
+ panelGuide.Controls.Add(label9);
+ panelGuide.Controls.Add(btnExecute);
+ panelGuide.Controls.Add(label10);
+ panelGuide.Controls.Add(groupBox2);
+ panelGuide.Controls.Add(ctrlTitleBar);
+ panelGuide.Dock = DockStyle.Fill;
+ panelGuide.Location = new Point(0, 0);
+ panelGuide.Name = "panelGuide";
+ panelGuide.Size = new Size(200, 640);
+ panelGuide.TabIndex = 0;
+ //
+ // btnSave
+ //
+ btnSave.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnSave.Location = new Point(6, 390);
+ btnSave.Name = "btnSave";
+ btnSave.Size = new Size(186, 32);
+ btnSave.TabIndex = 23;
+ btnSave.Text = "保存数据";
+ btnSave.UseVisualStyleBackColor = true;
+ btnSave.Click += btnSave_Click;
+ //
+ // lblResult
+ //
+ lblResult.AutoSize = true;
+ lblResult.Location = new Point(59, 354);
+ lblResult.Name = "lblResult";
+ lblResult.Size = new Size(20, 17);
+ lblResult.TabIndex = 22;
+ lblResult.Text = "无";
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new Point(9, 354);
+ label1.Name = "label1";
+ label1.Size = new Size(44, 17);
+ label1.TabIndex = 21;
+ label1.Text = "结果:";
+ //
+ // btnCreateLine
+ //
+ btnCreateLine.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnCreateLine.Location = new Point(9, 252);
+ btnCreateLine.Name = "btnCreateLine";
+ btnCreateLine.Size = new Size(186, 32);
+ btnCreateLine.TabIndex = 20;
+ btnCreateLine.Text = "创建直线";
+ btnCreateLine.UseVisualStyleBackColor = true;
+ btnCreateLine.Click += btnCreateLine_Click;
+ //
+ // btnLoadImage
+ //
+ btnLoadImage.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnLoadImage.Location = new Point(6, 214);
+ btnLoadImage.Name = "btnLoadImage";
+ btnLoadImage.Size = new Size(186, 32);
+ btnLoadImage.TabIndex = 18;
+ btnLoadImage.Text = "打开图片";
+ btnLoadImage.UseVisualStyleBackColor = true;
+ btnLoadImage.Click += btnLoadImage_Click;
+ //
+ // label9
+ //
+ label9.AutoSize = true;
+ label9.Location = new Point(59, 325);
+ label9.Name = "label9";
+ label9.Size = new Size(32, 17);
+ label9.TabIndex = 17;
+ label9.Text = "0ms";
+ //
+ // btnExecute
+ //
+ btnExecute.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnExecute.Location = new Point(9, 290);
+ btnExecute.Name = "btnExecute";
+ btnExecute.Size = new Size(186, 32);
+ btnExecute.TabIndex = 15;
+ btnExecute.Text = "执行";
+ btnExecute.UseVisualStyleBackColor = true;
+ btnExecute.Click += btnExecute_Click;
+ //
+ // label10
+ //
+ label10.AutoSize = true;
+ label10.Location = new Point(9, 325);
+ label10.Name = "label10";
+ label10.Size = new Size(44, 17);
+ label10.TabIndex = 16;
+ label10.Text = "耗时:";
+ //
+ // groupBox2
+ //
+ groupBox2.Controls.Add(NumRectWidth1);
+ groupBox2.Controls.Add(label11);
+ groupBox2.Controls.Add(tbLineX2);
+ groupBox2.Controls.Add(label8);
+ groupBox2.Controls.Add(tbLineY2);
+ groupBox2.Controls.Add(label5);
+ groupBox2.Controls.Add(tbLineX1);
+ groupBox2.Controls.Add(tbLineY1);
+ groupBox2.Controls.Add(label6);
+ groupBox2.Controls.Add(label7);
+ groupBox2.Dock = DockStyle.Top;
+ groupBox2.Location = new Point(0, 36);
+ groupBox2.Name = "groupBox2";
+ groupBox2.Size = new Size(198, 172);
+ groupBox2.TabIndex = 13;
+ groupBox2.TabStop = false;
+ groupBox2.Text = "线参数";
+ //
+ // NumRectWidth1
+ //
+ NumRectWidth1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ NumRectWidth1.Location = new Point(56, 138);
+ NumRectWidth1.Maximum = new decimal(new int[] { 9000, 0, 0, 0 });
+ NumRectWidth1.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
+ NumRectWidth1.Name = "NumRectWidth1";
+ NumRectWidth1.Size = new Size(136, 23);
+ NumRectWidth1.TabIndex = 13;
+ NumRectWidth1.Value = new decimal(new int[] { 1, 0, 0, 0 });
+ //
+ // label11
+ //
+ label11.AutoSize = true;
+ label11.Location = new Point(6, 140);
+ label11.Name = "label11";
+ label11.Size = new Size(35, 17);
+ label11.TabIndex = 12;
+ label11.Text = "宽度:";
+ //
+ // tbLineX2
+ //
+ tbLineX2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX2.Location = new Point(56, 80);
+ tbLineX2.Name = "tbLineX2";
+ tbLineX2.Size = new Size(136, 23);
+ tbLineX2.TabIndex = 9;
+ //
+ // label8
+ //
+ label8.AutoSize = true;
+ label8.Location = new Point(6, 83);
+ label8.Name = "label8";
+ label8.Size = new Size(26, 17);
+ label8.TabIndex = 8;
+ label8.Text = "X2:";
+ //
+ // tbLineY2
+ //
+ tbLineY2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY2.Location = new Point(56, 109);
+ tbLineY2.Name = "tbLineY2";
+ tbLineY2.Size = new Size(136, 23);
+ tbLineY2.TabIndex = 7;
+ //
+ // label5
+ //
+ label5.AutoSize = true;
+ label5.Location = new Point(6, 112);
+ label5.Name = "label5";
+ label5.Size = new Size(25, 17);
+ label5.TabIndex = 6;
+ label5.Text = "Y2:";
+ //
+ // tbLineX1
+ //
+ tbLineX1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineX1.Location = new Point(56, 22);
+ tbLineX1.Name = "tbLineX1";
+ tbLineX1.Size = new Size(136, 23);
+ tbLineX1.TabIndex = 5;
+ //
+ // tbLineY1
+ //
+ tbLineY1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLineY1.Location = new Point(56, 51);
+ tbLineY1.Name = "tbLineY1";
+ tbLineY1.Size = new Size(136, 23);
+ tbLineY1.TabIndex = 4;
+ //
+ // label6
+ //
+ label6.AutoSize = true;
+ label6.Location = new Point(6, 54);
+ label6.Name = "label6";
+ label6.Size = new Size(25, 17);
+ label6.TabIndex = 1;
+ label6.Text = "Y1:";
+ //
+ // label7
+ //
+ label7.AutoSize = true;
+ label7.Location = new Point(6, 25);
+ label7.Name = "label7";
+ label7.Size = new Size(26, 17);
+ label7.TabIndex = 0;
+ label7.Text = "X1:";
+ //
+ // ctrlTitleBar
+ //
+ ctrlTitleBar.Dock = DockStyle.Top;
+ ctrlTitleBar.Location = new Point(0, 0);
+ ctrlTitleBar.MinimumSize = new Size(0, 36);
+ ctrlTitleBar.Name = "ctrlTitleBar";
+ ctrlTitleBar.Padding = new Padding(3);
+ ctrlTitleBar.Size = new Size(198, 36);
+ ctrlTitleBar.TabIndex = 11;
+ ctrlTitleBar.Title = "直线测量";
+ //
+ // panel1
+ //
+ panel1.BorderStyle = BorderStyle.FixedSingle;
+ panel1.Controls.Add(canvas);
+ panel1.Controls.Add(statusStrip1);
+ panel1.Dock = DockStyle.Fill;
+ panel1.Location = new Point(0, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(1076, 640);
+ panel1.TabIndex = 1;
+ //
+ // canvas
+ //
+ canvas.AllowMultiSelect = false;
+ canvas.CreateMode = Canvas.Shape.ShapeTypeEnum.Polygon;
+ canvas.Dock = DockStyle.Fill;
+ canvas.Enabled = false;
+ canvas.FillDrawing = false;
+ canvas.Location = new Point(0, 0);
+ canvas.Margin = new Padding(2);
+ canvas.Name = "canvas";
+ canvas.OutsideShapes = (List)resources.GetObject("canvas.OutsideShapes");
+ canvas.Scale = 1F;
+ canvas.Shapes = (List)resources.GetObject("canvas.Shapes");
+ canvas.Size = new Size(1074, 616);
+ canvas.TabIndex = 2;
+ //
+ // statusStrip1
+ //
+ statusStrip1.Items.AddRange(new ToolStripItem[] { lblStatus });
+ statusStrip1.Location = new Point(0, 616);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(1074, 22);
+ statusStrip1.TabIndex = 1;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // lblStatus
+ //
+ lblStatus.Name = "lblStatus";
+ lblStatus.Size = new Size(44, 17);
+ lblStatus.Text = " ";
+ //
+ // GuideLineCtrl
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(splitContainer);
+ Controls.Add(lblElapsed);
+ Controls.Add(label4);
+ Name = "GuideLineCtrl";
+ Size = new Size(1280, 640);
+ Load += GuideLineCircleCtrl_Load;
+ splitContainer.Panel1.ResumeLayout(false);
+ splitContainer.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
+ splitContainer.ResumeLayout(false);
+ panelGuide.ResumeLayout(false);
+ panelGuide.PerformLayout();
+ groupBox2.ResumeLayout(false);
+ groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).EndInit();
+ panel1.ResumeLayout(false);
+ panel1.PerformLayout();
+ statusStrip1.ResumeLayout(false);
+ statusStrip1.PerformLayout();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Label lblElapsed;
+ private Label label4;
+
+ private SplitContainer splitContainer;
+ private Panel panelGuide;
+ private Panel panel1;
+ private Canvas.UI.FlyCanvas canvas;
+ private StatusStrip statusStrip1;
+ private ToolStripStatusLabel lblStatus;
+ private GroupBox groupBox2;
+ private TextBox tbLineX2;
+ private Label label8;
+ private TextBox tbLineY2;
+ private Label label5;
+ private TextBox tbLineX1;
+ private TextBox tbLineY1;
+ private Label label6;
+ private Label label7;
+ private SizeCtrlTitleBar ctrlTitleBar;
+ private Button btnLoadImage;
+ private Label label9;
+ private Button btnExecute;
+ private Label label10;
+ private Button btnCreateLine;
+ private TextBox tbRectWidth1;
+ private Label label11;
+ private NumericUpDown NumRectWidth1;
+ private Label lblResult;
+ private Label label1;
+ private Button btnSave;
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCtrl.cs b/CanFly/UI/SizePanel/SizeGuideLineCtrl.cs
new file mode 100644
index 0000000..c6307fe
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCtrl.cs
@@ -0,0 +1,387 @@
+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.SizePanel
+{
+ public partial class SizeGuideLineCtrl : SizeBaseGuideControl
+ {
+
+
+
+ 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 SizeGuideLineCtrl()
+ {
+ 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 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 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();
+ RowBegin = new List();
+ ColBegin = new List();
+ RowEnd = new List();
+ ColEnd = new List();
+ Dictionary inputImg = new Dictionary();
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+ inputImg["INPUT_Image"] = hImage;
+ // 创建一维数组
+
+ Dictionary inputPara = new Dictionary();
+
+ // 获取矩形的 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 outputKeys = new List()
+ {
+ "OUTPUT_Flag",
+ "RowBegin",
+ "ColBegin",
+ "RowEnd",
+ "ColEnd"
+ };
+
+ ExecuteHScript(
+ inputImg,
+ inputPara,
+ outputKeys);
+
+ }
+
+
+ List flag = new List();
+ List RowBegin = new List();
+ List ColBegin = new List();
+ List RowEnd = new List();
+ List ColEnd = new List();
+
+
+ protected override void OnExecuteHScriptResult(
+ bool success,
+ Dictionary 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);
+ }
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideLineCtrl.resx b/CanFly/UI/SizePanel/SizeGuideLineCtrl.resx
new file mode 100644
index 0000000..097e294
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineCtrl.resx
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.Designer.cs b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.Designer.cs
new file mode 100644
index 0000000..474d379
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.Designer.cs
@@ -0,0 +1,570 @@
+namespace CanFly.UI.SizePanel
+{
+ partial class SizeGuideLineLineCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SizeGuideLineLineCtrl));
+ lblStatus = new ToolStripStatusLabel();
+ panel1 = new Panel();
+ canvas = new Canvas.UI.FlyCanvas();
+ statusStrip1 = new StatusStrip();
+ ctrlTitleBar = new SizeCtrlTitleBar();
+ tbLine1X2 = new TextBox();
+ label8 = new Label();
+ tbLine1Y2 = new TextBox();
+ label5 = new Label();
+ label10 = new Label();
+ tbLine1X1 = new TextBox();
+ tbLine1Y1 = new TextBox();
+ label6 = new Label();
+ label7 = new Label();
+ btnLoadImage = new Button();
+ label9 = new Label();
+ btnExecute = new Button();
+ panelGuide = new Panel();
+ lblDistance = new Label();
+ label17 = new Label();
+ lblResult = new Label();
+ label15 = new Label();
+ groupBox3 = new GroupBox();
+ NumRectWidth2 = new NumericUpDown();
+ label2 = new Label();
+ tbLine2X2 = new TextBox();
+ label11 = new Label();
+ tbLine2Y2 = new TextBox();
+ label12 = new Label();
+ tbLine2X1 = new TextBox();
+ tbLine2Y1 = new TextBox();
+ label13 = new Label();
+ label14 = new Label();
+ groupBox2 = new GroupBox();
+ NumRectWidth1 = new NumericUpDown();
+ label1 = new Label();
+ splitContainer = new SplitContainer();
+ lblElapsed = new Label();
+ label4 = new Label();
+ btnSave = new Button();
+ panel1.SuspendLayout();
+ statusStrip1.SuspendLayout();
+ panelGuide.SuspendLayout();
+ groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth2).BeginInit();
+ groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit();
+ splitContainer.Panel1.SuspendLayout();
+ splitContainer.Panel2.SuspendLayout();
+ splitContainer.SuspendLayout();
+ SuspendLayout();
+ //
+ // lblStatus
+ //
+ lblStatus.Name = "lblStatus";
+ lblStatus.Size = new Size(44, 17);
+ lblStatus.Text = " ";
+ //
+ // panel1
+ //
+ panel1.BorderStyle = BorderStyle.FixedSingle;
+ panel1.Controls.Add(canvas);
+ panel1.Controls.Add(statusStrip1);
+ panel1.Dock = DockStyle.Fill;
+ panel1.Location = new Point(0, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(1076, 640);
+ panel1.TabIndex = 1;
+ //
+ // canvas
+ //
+ canvas.AllowMultiSelect = false;
+ canvas.CreateMode = Canvas.Shape.ShapeTypeEnum.Polygon;
+ canvas.Dock = DockStyle.Fill;
+ canvas.Enabled = false;
+ canvas.FillDrawing = false;
+ canvas.Location = new Point(0, 0);
+ canvas.Margin = new Padding(2);
+ canvas.Name = "canvas";
+ canvas.OutsideShapes = (List)resources.GetObject("canvas.OutsideShapes");
+ canvas.Scale = 1F;
+ canvas.Shapes = (List)resources.GetObject("canvas.Shapes");
+ canvas.Size = new Size(1074, 616);
+ canvas.TabIndex = 2;
+ //
+ // statusStrip1
+ //
+ statusStrip1.Items.AddRange(new ToolStripItem[] { lblStatus });
+ statusStrip1.Location = new Point(0, 616);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(1074, 22);
+ statusStrip1.TabIndex = 1;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // ctrlTitleBar
+ //
+ ctrlTitleBar.Dock = DockStyle.Top;
+ ctrlTitleBar.Location = new Point(0, 0);
+ ctrlTitleBar.MinimumSize = new Size(0, 36);
+ ctrlTitleBar.Name = "ctrlTitleBar";
+ ctrlTitleBar.Padding = new Padding(3);
+ ctrlTitleBar.Size = new Size(198, 36);
+ ctrlTitleBar.TabIndex = 11;
+ ctrlTitleBar.Title = "线线测量";
+ //
+ // tbLine1X2
+ //
+ tbLine1X2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine1X2.Location = new Point(56, 80);
+ tbLine1X2.Name = "tbLine1X2";
+ tbLine1X2.Size = new Size(134, 23);
+ tbLine1X2.TabIndex = 9;
+ //
+ // label8
+ //
+ label8.AutoSize = true;
+ label8.Location = new Point(6, 83);
+ label8.Name = "label8";
+ label8.Size = new Size(26, 17);
+ label8.TabIndex = 8;
+ label8.Text = "X2:";
+ //
+ // tbLine1Y2
+ //
+ tbLine1Y2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine1Y2.Location = new Point(56, 109);
+ tbLine1Y2.Name = "tbLine1Y2";
+ tbLine1Y2.Size = new Size(134, 23);
+ tbLine1Y2.TabIndex = 7;
+ //
+ // label5
+ //
+ label5.AutoSize = true;
+ label5.Location = new Point(6, 112);
+ label5.Name = "label5";
+ label5.Size = new Size(25, 17);
+ label5.TabIndex = 6;
+ label5.Text = "Y2:";
+ //
+ // label10
+ //
+ label10.AutoSize = true;
+ label10.Location = new Point(6, 521);
+ label10.Name = "label10";
+ label10.Size = new Size(44, 17);
+ label10.TabIndex = 16;
+ label10.Text = "耗时:";
+ //
+ // tbLine1X1
+ //
+ tbLine1X1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine1X1.Location = new Point(56, 22);
+ tbLine1X1.Name = "tbLine1X1";
+ tbLine1X1.Size = new Size(134, 23);
+ tbLine1X1.TabIndex = 5;
+ //
+ // tbLine1Y1
+ //
+ tbLine1Y1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine1Y1.Location = new Point(56, 51);
+ tbLine1Y1.Name = "tbLine1Y1";
+ tbLine1Y1.Size = new Size(134, 23);
+ tbLine1Y1.TabIndex = 4;
+ //
+ // label6
+ //
+ label6.AutoSize = true;
+ label6.Location = new Point(6, 54);
+ label6.Name = "label6";
+ label6.Size = new Size(25, 17);
+ label6.TabIndex = 1;
+ label6.Text = "Y1:";
+ //
+ // label7
+ //
+ label7.AutoSize = true;
+ label7.Location = new Point(6, 25);
+ label7.Name = "label7";
+ label7.Size = new Size(26, 17);
+ label7.TabIndex = 0;
+ label7.Text = "X1:";
+ //
+ // btnLoadImage
+ //
+ btnLoadImage.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnLoadImage.Location = new Point(6, 394);
+ btnLoadImage.Name = "btnLoadImage";
+ btnLoadImage.Size = new Size(184, 32);
+ btnLoadImage.TabIndex = 18;
+ btnLoadImage.Text = "打开图片";
+ btnLoadImage.UseVisualStyleBackColor = true;
+ btnLoadImage.Click += btnLoadImage_Click;
+ //
+ // label9
+ //
+ label9.AutoSize = true;
+ label9.Location = new Point(54, 521);
+ label9.Name = "label9";
+ label9.Size = new Size(32, 17);
+ label9.TabIndex = 17;
+ label9.Text = "0ms";
+ //
+ // btnExecute
+ //
+ btnExecute.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnExecute.Location = new Point(5, 432);
+ btnExecute.Name = "btnExecute";
+ btnExecute.Size = new Size(184, 32);
+ btnExecute.TabIndex = 15;
+ btnExecute.Text = "执行";
+ btnExecute.UseVisualStyleBackColor = true;
+ btnExecute.Click += btnExecute_Click;
+ //
+ // panelGuide
+ //
+ panelGuide.BorderStyle = BorderStyle.FixedSingle;
+ panelGuide.Controls.Add(btnSave);
+ panelGuide.Controls.Add(lblDistance);
+ panelGuide.Controls.Add(label17);
+ panelGuide.Controls.Add(lblResult);
+ panelGuide.Controls.Add(label15);
+ panelGuide.Controls.Add(groupBox3);
+ panelGuide.Controls.Add(btnLoadImage);
+ panelGuide.Controls.Add(label9);
+ panelGuide.Controls.Add(btnExecute);
+ panelGuide.Controls.Add(label10);
+ panelGuide.Controls.Add(groupBox2);
+ panelGuide.Controls.Add(ctrlTitleBar);
+ panelGuide.Dock = DockStyle.Fill;
+ panelGuide.Location = new Point(0, 0);
+ panelGuide.Name = "panelGuide";
+ panelGuide.Size = new Size(200, 640);
+ panelGuide.TabIndex = 0;
+ //
+ // lblDistance
+ //
+ lblDistance.AutoSize = true;
+ lblDistance.Location = new Point(54, 493);
+ lblDistance.Name = "lblDistance";
+ lblDistance.Size = new Size(15, 17);
+ lblDistance.TabIndex = 25;
+ lblDistance.Text = "0";
+ //
+ // label17
+ //
+ label17.AutoSize = true;
+ label17.Location = new Point(6, 493);
+ label17.Name = "label17";
+ label17.Size = new Size(44, 17);
+ label17.TabIndex = 24;
+ label17.Text = "距离:";
+ //
+ // lblResult
+ //
+ lblResult.AutoSize = true;
+ lblResult.Location = new Point(54, 467);
+ lblResult.Name = "lblResult";
+ lblResult.Size = new Size(20, 17);
+ lblResult.TabIndex = 23;
+ lblResult.Text = "无";
+ //
+ // label15
+ //
+ label15.AutoSize = true;
+ label15.Location = new Point(6, 467);
+ label15.Name = "label15";
+ label15.Size = new Size(44, 17);
+ label15.TabIndex = 22;
+ label15.Text = "结果:";
+ //
+ // groupBox3
+ //
+ groupBox3.Controls.Add(NumRectWidth2);
+ groupBox3.Controls.Add(label2);
+ groupBox3.Controls.Add(tbLine2X2);
+ groupBox3.Controls.Add(label11);
+ groupBox3.Controls.Add(tbLine2Y2);
+ groupBox3.Controls.Add(label12);
+ groupBox3.Controls.Add(tbLine2X1);
+ groupBox3.Controls.Add(tbLine2Y1);
+ groupBox3.Controls.Add(label13);
+ groupBox3.Controls.Add(label14);
+ groupBox3.Dock = DockStyle.Top;
+ groupBox3.Location = new Point(0, 216);
+ groupBox3.Name = "groupBox3";
+ groupBox3.Size = new Size(198, 172);
+ groupBox3.TabIndex = 21;
+ groupBox3.TabStop = false;
+ groupBox3.Text = "线2参数";
+ //
+ // NumRectWidth2
+ //
+ NumRectWidth2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ NumRectWidth2.Location = new Point(53, 138);
+ NumRectWidth2.Maximum = new decimal(new int[] { 9000, 0, 0, 0 });
+ NumRectWidth2.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
+ NumRectWidth2.Name = "NumRectWidth2";
+ NumRectWidth2.Size = new Size(136, 23);
+ NumRectWidth2.TabIndex = 13;
+ NumRectWidth2.Value = new decimal(new int[] { 1, 0, 0, 0 });
+ //
+ // label2
+ //
+ label2.AutoSize = true;
+ label2.Location = new Point(6, 140);
+ label2.Name = "label2";
+ label2.Size = new Size(35, 17);
+ label2.TabIndex = 12;
+ label2.Text = "宽度:";
+ //
+ // tbLine2X2
+ //
+ tbLine2X2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine2X2.Location = new Point(56, 80);
+ tbLine2X2.Name = "tbLine2X2";
+ tbLine2X2.Size = new Size(134, 23);
+ tbLine2X2.TabIndex = 9;
+ //
+ // label11
+ //
+ label11.AutoSize = true;
+ label11.Location = new Point(6, 83);
+ label11.Name = "label11";
+ label11.Size = new Size(26, 17);
+ label11.TabIndex = 8;
+ label11.Text = "X2:";
+ //
+ // tbLine2Y2
+ //
+ tbLine2Y2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine2Y2.Location = new Point(56, 109);
+ tbLine2Y2.Name = "tbLine2Y2";
+ tbLine2Y2.Size = new Size(136, 23);
+ tbLine2Y2.TabIndex = 7;
+ //
+ // label12
+ //
+ label12.AutoSize = true;
+ label12.Location = new Point(6, 112);
+ label12.Name = "label12";
+ label12.Size = new Size(25, 17);
+ label12.TabIndex = 6;
+ label12.Text = "Y2:";
+ //
+ // tbLine2X1
+ //
+ tbLine2X1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine2X1.Location = new Point(56, 22);
+ tbLine2X1.Name = "tbLine2X1";
+ tbLine2X1.Size = new Size(134, 23);
+ tbLine2X1.TabIndex = 5;
+ //
+ // tbLine2Y1
+ //
+ tbLine2Y1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ tbLine2Y1.Location = new Point(56, 51);
+ tbLine2Y1.Name = "tbLine2Y1";
+ tbLine2Y1.Size = new Size(134, 23);
+ tbLine2Y1.TabIndex = 4;
+ //
+ // label13
+ //
+ label13.AutoSize = true;
+ label13.Location = new Point(6, 54);
+ label13.Name = "label13";
+ label13.Size = new Size(25, 17);
+ label13.TabIndex = 1;
+ label13.Text = "Y1:";
+ //
+ // label14
+ //
+ label14.AutoSize = true;
+ label14.Location = new Point(6, 25);
+ label14.Name = "label14";
+ label14.Size = new Size(26, 17);
+ label14.TabIndex = 0;
+ label14.Text = "X1:";
+ //
+ // groupBox2
+ //
+ groupBox2.Controls.Add(NumRectWidth1);
+ groupBox2.Controls.Add(label1);
+ groupBox2.Controls.Add(tbLine1X2);
+ groupBox2.Controls.Add(label8);
+ groupBox2.Controls.Add(tbLine1Y2);
+ groupBox2.Controls.Add(label5);
+ groupBox2.Controls.Add(tbLine1X1);
+ groupBox2.Controls.Add(tbLine1Y1);
+ groupBox2.Controls.Add(label6);
+ groupBox2.Controls.Add(label7);
+ groupBox2.Dock = DockStyle.Top;
+ groupBox2.Location = new Point(0, 36);
+ groupBox2.Name = "groupBox2";
+ groupBox2.Size = new Size(198, 180);
+ groupBox2.TabIndex = 13;
+ groupBox2.TabStop = false;
+ groupBox2.Text = "线1参数";
+ //
+ // NumRectWidth1
+ //
+ NumRectWidth1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ NumRectWidth1.Location = new Point(54, 138);
+ NumRectWidth1.Maximum = new decimal(new int[] { 9000, 0, 0, 0 });
+ NumRectWidth1.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
+ NumRectWidth1.Name = "NumRectWidth1";
+ NumRectWidth1.Size = new Size(135, 23);
+ NumRectWidth1.TabIndex = 11;
+ NumRectWidth1.Value = new decimal(new int[] { 1, 0, 0, 0 });
+ //
+ // label1
+ //
+ label1.AutoSize = true;
+ label1.Location = new Point(6, 140);
+ label1.Name = "label1";
+ label1.Size = new Size(35, 17);
+ label1.TabIndex = 10;
+ label1.Text = "宽度:";
+ //
+ // splitContainer
+ //
+ splitContainer.Dock = DockStyle.Fill;
+ splitContainer.Location = new Point(0, 0);
+ splitContainer.Name = "splitContainer";
+ //
+ // splitContainer.Panel1
+ //
+ splitContainer.Panel1.Controls.Add(panelGuide);
+ splitContainer.Panel1MinSize = 150;
+ //
+ // splitContainer.Panel2
+ //
+ splitContainer.Panel2.Controls.Add(panel1);
+ splitContainer.Size = new Size(1280, 640);
+ splitContainer.SplitterDistance = 200;
+ splitContainer.TabIndex = 11;
+ //
+ // lblElapsed
+ //
+ lblElapsed.AutoSize = true;
+ lblElapsed.Location = new Point(50, 328);
+ lblElapsed.Name = "lblElapsed";
+ lblElapsed.Size = new Size(32, 17);
+ lblElapsed.TabIndex = 13;
+ lblElapsed.Text = "0ms";
+ //
+ // label4
+ //
+ label4.AutoSize = true;
+ label4.Location = new Point(0, 328);
+ label4.Name = "label4";
+ label4.Size = new Size(44, 17);
+ label4.TabIndex = 12;
+ label4.Text = "耗时:";
+ //
+ // btnSave
+ //
+ btnSave.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
+ btnSave.Location = new Point(3, 541);
+ btnSave.Name = "btnSave";
+ btnSave.Size = new Size(186, 32);
+ btnSave.TabIndex = 26;
+ btnSave.Text = "保存数据";
+ btnSave.UseVisualStyleBackColor = true;
+ btnSave.Click += btnSave_Click;
+ //
+ // GuideLineLineCtrl
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(splitContainer);
+ Controls.Add(lblElapsed);
+ Controls.Add(label4);
+ Name = "GuideLineLineCtrl";
+ Size = new Size(1280, 640);
+ panel1.ResumeLayout(false);
+ panel1.PerformLayout();
+ statusStrip1.ResumeLayout(false);
+ statusStrip1.PerformLayout();
+ panelGuide.ResumeLayout(false);
+ panelGuide.PerformLayout();
+ groupBox3.ResumeLayout(false);
+ groupBox3.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth2).EndInit();
+ groupBox2.ResumeLayout(false);
+ groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)NumRectWidth1).EndInit();
+ splitContainer.Panel1.ResumeLayout(false);
+ splitContainer.Panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)splitContainer).EndInit();
+ splitContainer.ResumeLayout(false);
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private ToolStripStatusLabel lblStatus;
+ private Panel panel1;
+ private Canvas.UI.FlyCanvas canvas;
+ private StatusStrip statusStrip1;
+ private SizeCtrlTitleBar ctrlTitleBar;
+ private TextBox tbLine1X2;
+ private Label label8;
+ private TextBox tbLine1Y2;
+ private Label label5;
+ private Label label10;
+ private TextBox tbLine1X1;
+ private TextBox tbLine1Y1;
+ private Label label6;
+ private Label label7;
+ private Button btnLoadImage;
+ private Label label9;
+ private Button btnExecute;
+ private Panel panelGuide;
+ private GroupBox groupBox2;
+ private SplitContainer splitContainer;
+ private Label lblElapsed;
+ private Label label4;
+ private GroupBox groupBox3;
+ private TextBox tbLine2X2;
+ private Label label11;
+ private TextBox tbLine2Y2;
+ private Label label12;
+ private TextBox tbLine2X1;
+ private TextBox tbLine2Y1;
+ private Label label13;
+ private Label label14;
+ private Label label1;
+ private Label label2;
+ private NumericUpDown NumRectWidth2;
+ private NumericUpDown NumRectWidth1;
+ private Label lblDistance;
+ private Label label17;
+ private Label lblResult;
+ private Label label15;
+ private Button btnSave;
+ }
+}
\ No newline at end of file
diff --git a/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.cs b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.cs
new file mode 100644
index 0000000..66a2eee
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.cs
@@ -0,0 +1,526 @@
+using CanFly.Canvas.Helper;
+using CanFly.Canvas.Shape;
+using CanFly.Helper;
+using HalconDotNet;
+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.SizePanel
+{
+ public partial class SizeGuideLineLineCtrl : SizeBaseGuideControl
+ {
+ private FlyShape? _line1;
+ private FlyShape? _line2;
+
+ private float _line1X1;
+ private float _line1Y1;
+ private float _line1X2;
+ private float _line1Y2;
+ private float _lineWidth;
+
+ private float _line2X1;
+ private float _line2Y1;
+ private float _line2X2;
+ private float _line2Y2;
+ private float _line2Width;
+
+ protected override string GetScriptFileName() => "LineToLine.hdvp";
+
+
+ public SizeGuideLineLineCtrl()
+ {
+ 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;
+
+ NumRectWidth2.ValueChanged -= NumericUpDown2_ValueChanged;
+ NumRectWidth2.Value = 40;
+ NumRectWidth2.ValueChanged += NumericUpDown2_ValueChanged;
+
+ }
+ protected override void UpdateShape(FlyShape shape)
+ {
+ switch (shape.ShapeType)
+ {
+ case ShapeTypeEnum.Line:
+ // 判断是否为第一条直线或第二条直线
+ if (_line1 == shape)
+ {
+ //_line1 = shape;
+ var pts1 = _line1.Points;
+ _line1X1 = pts1[0].X;
+ _line1Y1 = pts1[0].Y;
+ _line1X2 = pts1[1].X;
+ _line1Y2 = pts1[1].Y;
+ _lineWidth = _line1.LineVirtualRectWidth;
+
+ tbLine1X1.Text = _line1X1.ToString("F3");
+ tbLine1Y1.Text = _line1Y1.ToString("F3");
+ tbLine1X2.Text = _line1X2.ToString("F3");
+ tbLine1Y2.Text = _line1Y2.ToString("F3");
+ //NumRectWidth1.Value = (decimal)_lineWidth;
+ }
+ else
+ {
+ //_line2 = shape;
+ var pts2 = _line2.Points;
+ _line2X1 = pts2[0].X;
+ _line2Y1 = pts2[0].Y;
+ _line2X2 = pts2[1].X;
+ _line2Y2 = pts2[1].Y;
+ _line2Width = _line2.LineVirtualRectWidth;
+
+ tbLine2X1.Text = _line2X1.ToString("F3");
+ tbLine2Y1.Text = _line2Y1.ToString("F3");
+ tbLine2X2.Text = _line2X2.ToString("F3");
+ tbLine2Y2.Text = _line2Y2.ToString("F3");
+ // NumRectWidth2.Value = (decimal)_line2Width;
+ }
+
+ 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 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 shapes)
+ {
+ if (shapes.Count != 1)
+ {
+ return;
+ }
+
+ UpdateShape(shapes[0]);
+ }
+ private void Canvas_newShape()
+ {
+ // 自动切换到下一条直线绘制
+ if (_line1 == null)
+ {
+ _line1 = this.canvas.Shapes.LastOrDefault(shp => shp.ShapeType == ShapeTypeEnum.Line);
+ }
+ else if (_line2 == null)
+ {
+ _line2 = this.canvas.Shapes.LastOrDefault(shp => shp.ShapeType == ShapeTypeEnum.Line);
+ }
+
+ // 停止绘制模式,用户可以根据需要重新启用
+ this.canvas.StopDraw();
+ //this.canvas.StopDraw();
+ }
+
+ private void btnCreateLineOne_Click(object sender, EventArgs e)
+ {
+ // this.canvas.Shapes.RemoveAll(shp => shp == _line1); // 移除第一条直线
+ this._line1 = null;
+ this.canvas.Invalidate();
+ this.canvas.StartDraw(ShapeTypeEnum.Line); // 启动绘制模式
+ this.canvas.Enabled = true;
+ }
+
+ private void btnCreateLineTwo_Click(object sender, EventArgs e)
+ {
+ // this.canvas.Shapes.RemoveAll(shp => shp == _line2); // 移除第二条直线
+ this._line2 = null;
+ this.canvas.Invalidate();
+ this.canvas.StartDraw(ShapeTypeEnum.Line); // 启动绘制模式
+ this.canvas.Enabled = true;
+ }
+
+ private void btnExecute_Click(object sender, EventArgs e)
+ {
+ if (this.canvas.pixmap == null)
+ {
+ MessageBox.Show("请先打开图片");
+ return;
+ }
+
+ this.canvas.OutsideShapes.Clear();
+ this.canvas.Invalidate();
+
+ flag = new List();
+ Distance = new List();
+ Line1_RowBegin = new List();
+ Line1_ColBegin = new List();
+ Line1_RowEnd = new List();
+ Line1_ColEnd = new List();
+ Line2_RowBegin = new List();
+ Line2_ColBegin = new List();
+ Line2_RowEnd = new List();
+ Line2_ColEnd = new List();
+ Dictionary inputImg = new Dictionary();
+
+ if (hImage == null)
+ {
+ HOperatorSet.ReadImage(out hImage, CurrentImageFile);
+ }
+ inputImg["INPUT_Image"] = hImage;
+
+ Dictionary inputPara = new Dictionary();
+
+
+ // 获取矩形的 4 个点
+ PointF[] Points = this._line1.LineVirtualRectPoints;
+ if (Points.Count() < 4)
+ {
+ return;
+ }
+ 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[] array1X = new float[] { x1, x2, x3, x4, x5 };
+ HTuple hTupleArray1X = new HTuple(array1X);
+
+ float[] array1Y = new float[] { y1, y2, y3, y4, y5 };
+ HTuple hTupleArray1Y = new HTuple(array1Y);
+
+
+ strarray1X = string.Join(",", array1X);
+ strarray1Y = string.Join(",", array1Y);
+
+
+ // 获取矩形的 4 个点
+ PointF[] Points2 = this._line2.LineVirtualRectPoints;
+ if (Points2.Count() < 4)
+ {
+ return;
+ }
+ PointF Point21 = Points2[0];
+ PointF Point22 = Points2[1];
+ PointF Point23 = Points2[2];
+ PointF Point24 = Points2[3];
+ PointF Point25 = Points2[0];
+
+ float x21 = Point21.X;
+ float y21 = Point21.Y;
+
+ float x22 = Point22.X;
+ float y22 = Point22.Y;
+
+ float x23 = Point23.X;
+ float y23 = Point23.Y;
+
+ float x24 = Point24.X;
+ float y24 = Point24.Y;
+
+ float x25 = Point25.X;
+ float y25 = Point25.Y;
+
+
+ float[] array2X = new float[] { x21, x22, x23, x24, x25 };
+ HTuple hTupleArray2X = new HTuple(array2X);
+
+ float[] array2Y = new float[] { y21, y22, y23, y24, y25 };
+ HTuple hTupleArray2Y = new HTuple(array2Y);
+
+
+ strarray2X = string.Join(",", array2X);
+ strarray2Y = string.Join(",", array2Y);
+
+ inputPara["Line1_LX"] = _line1X1;
+ inputPara["Line1_LY"] = _line1Y1;
+ inputPara["Line1_RX"] = _line1X2;
+ inputPara["Line1_RY"] = _line1Y2;
+
+ inputPara["Line2_LX"] = _line2X1;
+ inputPara["Line2_LY"] = _line2Y1;
+ inputPara["Line2_RX"] = _line2X2;
+ inputPara["Line2_RY"] = _line2Y2;
+
+
+
+ inputPara["Line1_XRect"] = hTupleArray1X;
+ inputPara["Line1_YRect"] = hTupleArray1Y;
+
+ inputPara["Line2_XRect"] = hTupleArray2X;
+ inputPara["Line2_YRect"] = hTupleArray2Y;
+
+ List outputKeys = new List()
+ {
+ "OUTPUT_Flag",
+ "Distance",
+ "Line1_RowBegin",
+ "Line1_ColBegin",
+ "Line1_RowEnd",
+ "Line1_ColEnd",
+ "Line2_RowBegin",
+ "Line2_ColBegin",
+ "Line2_RowEnd",
+ "Line2_ColEnd"
+
+ };
+
+ ExecuteHScript(
+ inputImg,
+ inputPara,
+ outputKeys);
+ }
+
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ OpenImageFile(bitmap =>
+ {
+ this.canvas.LoadPixmap(bitmap);
+ this.canvas.Enabled = true;
+ _line1 = new FlyShape();
+ _line2 = new FlyShape();
+ _line1.AddPoint(new Point(10, 10));
+ _line1.AddPoint(new Point(50, 10));
+ _line2.AddPoint(new Point(10, 20));
+ _line2.AddPoint(new Point(60, 20));
+ _line1.ShapeType = ShapeTypeEnum.Line;
+ _line2.ShapeType = ShapeTypeEnum.Line;
+
+ _line1.IsDrawLineVirtualRect = true;
+ _line1.LineVirtualRectWidth = 40;
+ _line2.IsDrawLineVirtualRect = true;
+ _line2.LineVirtualRectWidth = 40;
+
+ canvas.Shapes.Add(_line1);
+ canvas.Shapes.Add(_line2);
+ canvas.Invalidate();
+
+ UpdateShape(_line1);
+ UpdateShape(_line2);
+ });
+ }
+ string strarray1X = string.Empty;
+ string strarray1Y = string.Empty;
+ string strarray2X = string.Empty;
+ string strarray2Y = string.Empty;
+ List flag =new List();
+ List Distance = new List();
+ List Line1_RowBegin = new List();
+ List Line1_ColBegin = new List();
+ List Line1_RowEnd = new List();
+ List Line1_ColEnd = new List();
+ List Line2_RowBegin = new List();
+ List Line2_ColBegin = new List();
+ List Line2_RowEnd = new List();
+ List Line2_ColEnd = new List();
+ protected override void OnExecuteHScriptResult(
+ bool success,
+ Dictionary resultDic,
+ int timeElasped)
+ {
+ if (!success)
+ {
+ return;
+ }
+
+ //"OUTPUT_Flag",
+ // "Distance",
+ // "Line1_RowBegin",
+ // "Line1_ColBegin",
+ // "Line1_RowEnd",
+ // "Line1_ColEnd",
+ // "Line2_RowBegin",
+ // "Line2_ColBegin",
+ // "Line2_RowEnd",
+ // "Line2_ColEnd"
+
+
+ flag = resultDic["OUTPUT_Flag"].HTupleToDouble();
+ Distance = resultDic["Distance"].HTupleToDouble();
+ Line1_RowBegin = resultDic["Line1_RowBegin"].HTupleToDouble();
+ Line1_ColBegin = resultDic["Line1_ColBegin"].HTupleToDouble();
+ Line1_RowEnd = resultDic["Line1_RowEnd"].HTupleToDouble();
+ Line1_ColEnd = resultDic["Line1_ColEnd"].HTupleToDouble();
+ Line2_RowBegin = resultDic["Line2_RowBegin"].HTupleToDouble();
+ Line2_ColBegin = resultDic["Line2_ColBegin"].HTupleToDouble();
+ Line2_RowEnd = resultDic["Line2_RowEnd"].HTupleToDouble();
+ Line2_ColEnd = resultDic["Line2_ColEnd"].HTupleToDouble();
+
+ if (flag.Count > 0)
+ {
+ lblResult.Text = flag[0].ToString();
+
+ }
+ else
+ {
+ lblResult.Text = "无";
+ }
+ if (Distance.Count > 0)
+ {
+ lblDistance.Text = Distance[0].ToString();
+ }
+ else
+ {
+ lblDistance.Text = "0";
+ }
+
+ if (flag.Count > 0 && Distance.Count > 0 && Line1_RowBegin.Count > 0 && Line1_ColBegin.Count > 0 && Line1_RowEnd.Count > 0 && Line1_ColEnd.Count > 0 && Line2_RowBegin.Count > 0 && Line2_ColBegin.Count > 0 && Line2_RowEnd.Count > 0 && Line2_ColEnd.Count > 0)
+ {
+ float width = 0;
+ this.canvas.DrawLine(new PointF((float)Line1_ColBegin[0], (float)Line1_RowBegin[0]), new PointF((float)Line1_ColEnd[0], (float)Line1_RowEnd[0]), width);
+ this.canvas.DrawLine(new PointF((float)Line2_ColBegin[0], (float)Line2_RowBegin[0]), new PointF((float)Line2_ColEnd[0], (float)Line2_RowEnd[0]), width);
+ this.canvas.Invalidate();
+ lblElapsed.Text = $"{timeElasped} ms";
+ }
+ }
+
+ private void NumRectWidth1_ValueChanged(object sender, EventArgs e)
+ {
+ if (_line1 != null)
+ {
+ //_line1.IsDrawLineVirtualRect = true;
+ _line1.LineVirtualRectWidth = (float)NumRectWidth1.Value;
+ UpdateShape(_line1);
+ this.canvas.Invalidate();
+ }
+ }
+
+ private void NumericUpDown2_ValueChanged(object sender, EventArgs e)
+ {
+ if (_line2 != null)
+ {
+ // _line2.IsDrawLineVirtualRect = true;
+ _line2.LineVirtualRectWidth = (float)NumRectWidth2.Value;
+ UpdateShape(_line2);
+ 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;
+ }
+
+
+
+ //inputPara["Line1_LX"] = _line1X1;
+ //inputPara["Line1_LY"] = _line1Y1;
+ //inputPara["Line1_RX"] = _line1X2;
+ //inputPara["Line1_RY"] = _line1Y2;
+
+ //inputPara["Line2_LX"] = _line2X1;
+ //inputPara["Line2_LY"] = _line2Y1;
+ //inputPara["Line2_RX"] = _line2X2;
+ //inputPara["Line2_RY"] = _line2Y2;
+
+
+
+ //inputPara["Line1_XRect"] = hTupleArray1X;
+ //inputPara["Line1_YRect"] = hTupleArray1Y;
+
+ //inputPara["Line2_XRect"] = hTupleArray2X;
+ //inputPara["Line2_YRect"] = hTupleArray2Y;
+
+
+ string input = $"Line1_LX:{_line1X1};" +
+ $"Line1_LY:{_line1Y1};" +
+ $"Line1_RX:{_line1X2};" +
+ $"Line1_RY:{_line1Y2};" +
+ $"Line2_LX:{_line2X1};" +
+ $"Line2_LY:{_line2Y1};" +
+ $"Line2_RX:{_line2X2};" +
+ $"Line2_RY:{_line2Y2};" +
+ $"Line1_XRect:{strarray1X};" +
+ $"Line1_YRect:{strarray1Y};" +
+ $"Line2_XRect:{strarray2X};" +
+ $"Line2_YRect:{strarray2Y}"
+ ;
+
+
+ string result = $"Distance:{Distance[0]}";
+
+
+ DataToTriggerEvent(input, result);
+
+ }
+ }
+}
diff --git a/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.resx b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.resx
new file mode 100644
index 0000000..097e294
--- /dev/null
+++ b/CanFly/UI/SizePanel/SizeGuideLineLineCtrl.resx
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAERDYW5GbHkuQ2FudmFzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
+ cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAdlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbQ2FuRmx5LkNhbnZhcy5TaGFwZS5GbHlTaGFwZSwgQ2FuRmx5LkNhbnZhcywgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lv
+ bgQAAB5DYW5GbHkuQ2FudmFzLlNoYXBlLkZseVNoYXBlW10CAAAACAgJAwAAAAAAAAAAAAAADAQAAAAz
+ Q2FuRmx5LkNhbnZhcywgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBwMAAAAAAQAA
+ AAAAAAAEHENhbkZseS5DYW52YXMuU2hhcGUuRmx5U2hhcGUEAAAACw==
+
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/CanFly/UI/UIMain/FrmMainSize.Designer.cs b/CanFly/UI/UIMain/FrmMainSize.Designer.cs
new file mode 100644
index 0000000..5cd1fbb
--- /dev/null
+++ b/CanFly/UI/UIMain/FrmMainSize.Designer.cs
@@ -0,0 +1,93 @@
+
+
+namespace XKRS.CanFly
+{
+ partial class FrmMainSize
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ statusStrip1 = new StatusStrip();
+ panelContent = new Panel();
+ pageHeader1 = new AntdUI.PageHeader();
+ panelContent.SuspendLayout();
+ SuspendLayout();
+ //
+ // statusStrip1
+ //
+ statusStrip1.Location = new Point(0, 808);
+ statusStrip1.Name = "statusStrip1";
+ statusStrip1.Size = new Size(1185, 22);
+ statusStrip1.TabIndex = 4;
+ statusStrip1.Text = "statusStrip1";
+ //
+ // panelContent
+ //
+ panelContent.Controls.Add(pageHeader1);
+ panelContent.Dock = DockStyle.Fill;
+ panelContent.Location = new Point(0, 0);
+ panelContent.Margin = new Padding(4, 3, 4, 3);
+ panelContent.Name = "panelContent";
+ panelContent.Size = new Size(1185, 808);
+ panelContent.TabIndex = 5;
+ //
+ // pageHeader1
+ //
+ pageHeader1.BackColor = Color.FromArgb(46, 108, 227);
+ pageHeader1.Dock = DockStyle.Top;
+ pageHeader1.Location = new Point(0, 0);
+ pageHeader1.Mode = AntdUI.TAMode.Dark;
+ pageHeader1.Name = "pageHeader1";
+ pageHeader1.ShowButton = true;
+ pageHeader1.ShowIcon = true;
+ pageHeader1.Size = new Size(1185, 33);
+ pageHeader1.TabIndex = 2;
+ pageHeader1.Text = "尺寸测量";
+ //
+ // FrmMainSize
+ //
+ AutoScaleDimensions = new SizeF(7F, 17F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1185, 830);
+ Controls.Add(panelContent);
+ Controls.Add(statusStrip1);
+ FormBorderStyle = FormBorderStyle.FixedSingle;
+ Margin = new Padding(2, 3, 2, 3);
+ Name = "FrmMainSize";
+ StartPosition = FormStartPosition.CenterScreen;
+ Text = "尺寸测量";
+ Load += FrmMain_Load;
+ panelContent.ResumeLayout(false);
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+ private StatusStrip statusStrip1;
+ private Panel panelContent;
+ private AntdUI.PageHeader pageHeader1;
+ }
+}
diff --git a/CanFly/UI/UIMain/FrmMainSize.cs b/CanFly/UI/UIMain/FrmMainSize.cs
new file mode 100644
index 0000000..c608b17
--- /dev/null
+++ b/CanFly/UI/UIMain/FrmMainSize.cs
@@ -0,0 +1,440 @@
+using AntdUI;
+using CanFly.Canvas.Shape;
+using CanFly.Helper;
+using CanFly.UI;
+using CanFly.UI.GuidePanel;
+using CanFly.UI.SizePanel;
+using CanFly.Util;
+using DH.Commons.Base;
+using HalconDotNet;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Windows.Forms;
+
+namespace XKRS.CanFly
+{
+
+ public partial class FrmMainSize : Window
+ {
+
+ private string _currentImageFile = "";
+ private System.Windows.Forms.Timer _statusTimer = new System.Windows.Forms.Timer();
+ private SizeBaseGuideControl? _currentGuideCtrl;
+
+
+ private SizeGuideCircleCtrl guideCircleCtrl = new SizeGuideCircleCtrl();
+ private SizeGuideLineCircleCtrl guideLineCircleCtrl = new SizeGuideLineCircleCtrl();
+ private SizeGuideLineLineCtrl guideLineLineCtrl = new SizeGuideLineLineCtrl();
+ private SizeGuideLineCtrl guideLineCtrl = new SizeGuideLineCtrl();
+ private SizeGuideHeightCtrl guideHeightCtrl = new SizeGuideHeightCtrl();
+ string Type=string.Empty;
+
+
+ public string inputtext=string.Empty;
+ public string outtext = string.Empty;
+ DetectionConfig DetectionConfig;
+ public FrmMainSize(string type,DetectionConfig detectionConfig)
+ {
+ InitializeComponent();
+
+ DetectionConfig = detectionConfig;
+ Type=type;
+
+ guideCircleCtrl.Dock = DockStyle.Fill;
+ guideCircleCtrl.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ guideCircleCtrl.OnControlCloseEvent += () => panelContent.Controls.Clear();
+
+
+ guideLineCircleCtrl.Dock = DockStyle.Fill;
+ guideLineCircleCtrl.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ guideLineCircleCtrl.OnControlCloseEvent += () => panelContent.Controls.Clear();
+
+ guideLineLineCtrl.Dock = DockStyle.Fill;
+ guideLineLineCtrl.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ guideLineLineCtrl.OnControlCloseEvent += () => panelContent.Controls.Clear();
+
+ guideLineCtrl.Dock = DockStyle.Fill;
+ guideLineCtrl.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ guideLineCtrl.OnControlCloseEvent += () => panelContent.Controls.Clear();
+
+
+ guideHeightCtrl.Dock = DockStyle.Fill;
+ guideHeightCtrl.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ guideHeightCtrl.OnControlCloseEvent += () => panelContent.Controls.Clear();
+ }
+
+
+
+ private void FrmMain_Load(object sender, EventArgs e)
+ {
+ switch (Type)
+ {
+ case "1":
+ SwitchMeasureMode(guideCircleCtrl);
+ break;
+ case "2":
+ SwitchMeasureMode(guideLineCtrl);
+ break;
+ case "3":
+ SwitchMeasureMode(guideLineLineCtrl);
+ break;
+ case "4":
+ SwitchMeasureMode(guideLineCircleCtrl);
+ break;
+ case "5":
+ SwitchMeasureMode(guideHeightCtrl);
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ private void btnLoadImage_Click(object sender, EventArgs e)
+ {
+ //OpenFileDialog ofd = new OpenFileDialog();
+ //ofd.Filter = "ͼļ|*.jpg;*.png";
+ //ofd.Multiselect = false;
+ //if (ofd.ShowDialog() == DialogResult.OK)
+ //{
+ // _currentImageFile = ofd.FileName;
+ // Bitmap bitmap = (Bitmap)Image.FromFile(_currentImageFile);
+ // this.canvas.LoadPixmap(bitmap);
+ // this.btnCreateCircle.Enabled = true;
+ //}
+ }
+
+
+
+ private void btnMeasureCircle_Click(object sender, EventArgs e)
+ {
+ //var contentCtrls = panelContent.Controls;
+
+ //if (contentCtrls.Count > 0)
+ //{
+ // if (contentCtrls[0] == guideCircleCtrl)
+ // {
+ // return;
+ // }
+ //}
+
+ //panelContent.Controls.Clear();
+ //panelContent.Controls.Add(guideCircleCtrl);
+
+ SwitchMeasureMode(guideCircleCtrl);
+ }
+
+
+ private void btnMeasureLineCircle_Click(object sender, EventArgs e)
+ {
+ SwitchMeasureMode(guideLineCircleCtrl);
+ }
+
+
+ private void SwitchMeasureMode(SizeBaseGuideControl control)
+ {
+ var contentCtrls = panelContent.Controls;
+
+ if (contentCtrls.Count > 0)
+ {
+ if (contentCtrls[0] == control)
+ {
+ return;
+ }
+ }
+
+ panelContent.Controls.Clear();
+
+ control.OnDataPassed -= Control_OnDataPassed;
+ control.OnDataPassed += Control_OnDataPassed;
+
+
+
+ //control.Dock = DockStyle.Fill;
+ //control.OnControlCloseEvent -= () => panelContent.Controls.Clear();
+ //control.OnControlCloseEvent += () => panelContent.Controls.Clear();
+ panelContent.Controls.Add(control);
+ }
+
+ private void Control_OnDataPassed(string obj,string obj1)
+ {
+ inputtext = obj;
+ outtext = obj1;
+ this.Close();
+ }
+
+ private void btnCreateRect_Click(object sender, EventArgs e)
+ {
+ //this.canvas.StartDraw(ShapeTypeEnum.Rectangle);
+ //this.btnCreateCircle.Enabled = false;
+ //this.btnStopDraw.Enabled = true;
+ //this.canvas.Enabled = true;
+ }
+
+
+
+ private void btnStopDraw_Click(object sender, EventArgs e)
+ {
+ //panelGuide.Controls.Clear();
+ StopDrawMode();
+ }
+
+
+
+ private void StartDrawMode()
+ {
+
+ }
+
+
+ private void StopDrawMode()
+ {
+ //this.canvas.StopDraw();
+
+
+ //this.btnStopDraw.Enabled = false;
+ //this.btnCreateCircle.Enabled = true;
+ }
+
+
+
+
+
+ private void Status(string message, int delay = 5000)
+ {
+ //_statusTimer.Stop();
+ //// ʾϢ
+ //lblStatus.Text = message;
+
+ //// һʱ
+
+ //_statusTimer.Interval = delay; // ӳʱ
+ //_statusTimer.Tick += (sender, e) =>
+ //{
+ // _statusTimer.Stop(); // ֹͣʱ
+ // lblStatus.Text = string.Empty; // ״̬Ϣ
+ //};
+ //_statusTimer.Start(); // ʱ
+ }
+
+
+
+
+ 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 shapes)
+ {
+ if (shapes.Count != 1)
+ {
+ // panelGuide.Controls.Clear();
+ return;
+ }
+ //SwitchGuideForm(shapes[0].ShapeType);
+ Canvas_OnShapeUpdateEvent(shapes[0]);
+
+ }
+
+
+
+ private void SwitchGuideForm(ShapeTypeEnum shapeType)
+ {
+ //if (_currentGuideCtrl == null)
+ //{
+ // switch (shapeType)
+ // {
+ // case ShapeTypeEnum.Point:
+ // break;
+ // case ShapeTypeEnum.Line:
+ // break;
+ // case ShapeTypeEnum.Rectangle:
+ // break;
+ // case ShapeTypeEnum.Circle:
+ // _currentGuideCtrl = new GuideCircleCtrl();
+ // _currentGuideCtrl.ImageFile = _currentImageFile;
+ // _currentGuideCtrl.OnDrawCircle += this.canvas.DrawCircle;
+ // _currentGuideCtrl.OnClose += () =>
+ // {
+ // panelGuide.Controls.Clear();
+ // StopDrawMode();
+ // };
+ // break;
+ // case ShapeTypeEnum.Polygon:
+ // break;
+ // case ShapeTypeEnum.LineStrip:
+ // break;
+ // default:
+ // break;
+ // }
+ //}
+ //_currentGuideCtrl?.AddToPanel(panelGuide);
+ }
+
+
+
+ private void Canvas_OnShapeMoving(List shapes)
+ {
+ //if (shapes.Count != 1)
+ //{
+ // panelGuide.Controls.Clear();
+ // return;
+ //}
+
+ //_currentGuideCtrl?.UpdateShape(shapes[0]);
+ }
+
+
+
+ private void Canvas_OnShapeUpdateEvent(FlyShape shape)
+ {
+ switch (shape.ShapeType)
+ {
+ case ShapeTypeEnum.Point:
+ break;
+ case ShapeTypeEnum.Line:
+ break;
+ case ShapeTypeEnum.Rectangle:
+ break;
+ case ShapeTypeEnum.Circle:
+ {
+ //_currentGuideCtrl?.UpdateShape(shape);
+ }
+ break;
+ case ShapeTypeEnum.Polygon:
+ break;
+ case ShapeTypeEnum.LineStrip:
+ break;
+ default:
+ break;
+ }
+ }
+
+
+
+ private void btnTestOutsideDraw_Click(object sender, EventArgs e)
+ {
+ //Random random = new Random((int)DateTime.Now.Ticks);
+
+ //for (int i = 0; i < 10; i++)
+ //{
+ // // this.canvas.DrawCircle(new PointF(500, 500), 100);
+
+ // int x = random.Next() % 500;
+ // int y = random.Next() % 500;
+ // int r = random.Next() % 200;
+
+ // Debug.WriteLine($"X:{x}\tY:{y}\tR:{r}");
+
+ // this.canvas.DrawCircle(new PointF(x, y), r);
+ //}
+ }
+
+ private void btnTestClearDraw_Click(object sender, EventArgs e)
+ {
+ //this.canvas.ClearDraw();
+ }
+
+
+
+ private async void btnTestCircleMeasure_Click(object sender, EventArgs e)
+ {
+ //string dir = Path.Combine(Environment.CurrentDirectory, "hscripts");
+ //string file = "CircleMeasure.hdvp";
+ //string filePath = Path.Combine(dir, file);
+ //if (!File.Exists(filePath))
+ //{
+ // MessageBox.Show($"ļ {filePath} ");
+ // return;
+ //}
+
+ //HObject? hImage = null;
+
+ //try
+ //{
+ // HDevEngineTool tool = new HDevEngineTool(dir);
+ // tool.LoadProcedure(Path.GetFileNameWithoutExtension(file));
+
+ // // string imageFile = Path.Combine(Environment.CurrentDirectory, "hscripts", "image.png");
+
+ // HOperatorSet.ReadImage(out hImage, _currentImageFile);
+ // tool.InputImageDic["INPUT_Image"] = hImage;
+ // tool.InputTupleDic["XCenter"] = 981.625;
+ // tool.InputTupleDic["YCenter"] = 931.823;
+ // tool.InputTupleDic["Radius"] = 900.141;
+
+ // Stopwatch sw = new Stopwatch();
+ // sw.Start();
+ // if (!tool.RunProcedure(out string error, out _))
+ // {
+ // throw new Exception();
+ // }
+ // sw.Stop();
+
+
+
+ // var flag = tool.GetResultTuple("OUTPUT_Flag").HTupleToDouble();
+ // List x = tool.GetResultTuple("RXCenter").HTupleToDouble();
+ // var y = tool.GetResultTuple("RYCenter").HTupleToDouble();
+ // var r = tool.GetResultTuple("RRadius").HTupleToDouble();
+
+ // if (flag.Count > 0 && x.Count > 0 && y.Count > 0 && r.Count > 0)
+ // {
+ // this.canvas.DrawCircle(new PointF((float)x[0], (float)y[0]), (float)r[0]);
+ // }
+
+ // //
+ // Debug.WriteLine("");
+ //}
+ //catch (Exception)
+ //{
+ // throw;
+ //}
+ //finally
+ //{
+ // hImage?.Dispose();
+ //}
+
+
+ }
+
+ private void btnTest_Click(object sender, EventArgs e)
+ {
+ //this.canvas.DrawRectangle(new PointF(300, 300),
+ // new PointF(800, 500), 33f);
+ }
+
+
+ private void btnRotateTest_Click(object sender, EventArgs e)
+ {
+ //if (this.canvas.Shapes.Count == 0)
+ //{
+ // return;
+ //}
+
+ //this.canvas.Shapes[0]._currentRotateAngle += 10;
+ //this.canvas.Invalidate();
+ }
+
+ private void btnMeasureLineline_Click(object sender, EventArgs e)
+ {
+ SwitchMeasureMode(guideLineLineCtrl);
+ }
+
+ private void btnMeasureLine_Click(object sender, EventArgs e)
+ {
+ SwitchMeasureMode(guideLineCtrl);
+ }
+ }
+}
diff --git a/DHSoftware/Views/UserDetetion.resx b/CanFly/UI/UIMain/FrmMainSize.resx
similarity index 96%
rename from DHSoftware/Views/UserDetetion.resx
rename to CanFly/UI/UIMain/FrmMainSize.resx
index af32865..7258ec3 100644
--- a/DHSoftware/Views/UserDetetion.resx
+++ b/CanFly/UI/UIMain/FrmMainSize.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/CanFly/XKRS.CanFly.csproj b/CanFly/XKRS.CanFly.csproj
index bcae58e..5724784 100644
--- a/CanFly/XKRS.CanFly.csproj
+++ b/CanFly/XKRS.CanFly.csproj
@@ -11,17 +11,12 @@
AnyCPU;x64
-
-
-
-
-
-
+
@@ -29,6 +24,7 @@
+
diff --git a/DH.Commons/DH.Commons.csproj b/DH.Commons/DH.Commons.csproj
index 434bf24..0954b95 100644
--- a/DH.Commons/DH.Commons.csproj
+++ b/DH.Commons/DH.Commons.csproj
@@ -13,9 +13,11 @@
+
+
diff --git a/DH.Commons/Helper/ConfigHelper.cs b/DH.Commons/Helper/ConfigHelper.cs
index e1678af..b77febc 100644
--- a/DH.Commons/Helper/ConfigHelper.cs
+++ b/DH.Commons/Helper/ConfigHelper.cs
@@ -5,6 +5,7 @@ using System.Text.Json;
using System.Text.Json.Serialization;
using AntdUI;
using DH.Commons.Base;
+using DH.Commons.Enums;
using DH.Commons.Models;
namespace DH.Commons.Helper
@@ -127,6 +128,13 @@ namespace DH.Commons.Helper
{
foreach (var label in config.DetectionLableList)
{
+ //是否假如判断标签为中文转为为英文
+ //string pinyinlabel = FileHelper.ConvertHanzitoPinyinWithNumbers(label.LabelName.ToString());
+ //if (FileHelper.IsAlphaNumericOnly(pinyinlabel))
+ //{
+
+ //}
+
// 根据实际需求格式化输出
writer.WriteLine(label.LabelName.ToString()); // 假设DetectionLable重写了ToString()
diff --git a/DH.Commons/Helper/FileHelper.cs b/DH.Commons/Helper/FileHelper.cs
new file mode 100644
index 0000000..688e713
--- /dev/null
+++ b/DH.Commons/Helper/FileHelper.cs
@@ -0,0 +1,507 @@
+using hyjiacan.py4n;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace DH.Commons.Enums
+{
+
+ public static class FileHelper
+ {
+
+ ///
+ /// 清理两个文件夹中的文件,保留文件名交集部分,其余文件删除。
+ ///
+ /// 图片文件夹路径
+ /// 标签文件夹路径
+ public static void CleanupFolders(string imagesFolder, string labelsFolder)
+ {
+ if (!Directory.Exists(imagesFolder))
+ {
+ Console.WriteLine($"Images folder does not exist: {imagesFolder}");
+ return;
+ }
+
+ if (!Directory.Exists(labelsFolder))
+ {
+ Console.WriteLine($"Labels folder does not exist: {labelsFolder}");
+ return;
+ }
+
+ // 获取文件名(不包含扩展名)
+ var imageFiles = Directory.GetFiles(imagesFolder)
+ .Select(Path.GetFileNameWithoutExtension)
+ .ToHashSet();
+
+ var labelFiles = Directory.GetFiles(labelsFolder)
+ .Select(Path.GetFileNameWithoutExtension)
+ .ToHashSet();
+
+ // 计算交集
+ var commonFiles = imageFiles.Intersect(labelFiles);
+
+ // 删除 images 文件夹中不在交集中的文件
+ foreach (var imagePath in Directory.GetFiles(imagesFolder))
+ {
+ string fileNameWithoutExt = Path.GetFileNameWithoutExtension(imagePath);
+ if (!commonFiles.Contains(fileNameWithoutExt))
+ {
+ File.Delete(imagePath);
+ Console.WriteLine($"Deleted image file: {imagePath}");
+ }
+ }
+
+ // 删除 labels 文件夹中不在交集中的文件
+ foreach (var labelPath in Directory.GetFiles(labelsFolder))
+ {
+ string fileNameWithoutExt = Path.GetFileNameWithoutExtension(labelPath);
+ if (!commonFiles.Contains(fileNameWithoutExt))
+ {
+ File.Delete(labelPath);
+ Console.WriteLine($"Deleted label file: {labelPath}");
+ }
+ }
+
+ Console.WriteLine("Folders cleaned successfully!");
+ }
+
+ ///
+ /// 获取文件夹中所有图片文件的个数
+ ///
+ /// 目标文件夹路径
+ /// 是否包含子文件夹,默认不包含
+ /// 图片文件总数
+ public static int CountImageFiles(string folderPath, bool includeSubdirectories = false)
+ {
+ if (!Directory.Exists(folderPath))
+ {
+ throw new DirectoryNotFoundException($"The folder '{folderPath}' does not exist.");
+ }
+
+ // 支持的图片格式
+ string[] imageExtensions = { "*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif" };
+
+ // 搜索选项
+ SearchOption searchOption = includeSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
+
+ int fileCount = 0;
+
+ foreach (var ext in imageExtensions)
+ {
+ fileCount += Directory.GetFiles(folderPath, ext, searchOption).Length;
+ }
+
+ return fileCount;
+ }
+
+ ///
+ /// 删除一个目录所有子目录和文件
+ ///
+ ///
+ public static void DeleteDirectoryAndContents(string path)
+ {
+ // 确保目录存在
+ if (Directory.Exists(path))
+ {
+ // 删除目录中的文件
+ string[] files = Directory.GetFiles(path);
+ foreach (var file in files)
+ {
+ File.Delete(file);
+ Console.WriteLine($"文件已删除: {file}");
+ }
+
+ // 删除目录中的子目录
+ string[] directories = Directory.GetDirectories(path);
+ foreach (var directory in directories)
+ {
+ DeleteDirectoryAndContents(directory); // 递归删除子目录
+ }
+
+ // 删除空目录
+ Directory.Delete(path);
+ Console.WriteLine($"目录已删除: {path}");
+ }
+ else
+ {
+ Console.WriteLine("目录不存在!");
+ }
+ }
+ ///
+ /// 将一个文件夹中的所有图片文件和 JSON 文件复制到另一个文件夹中
+ ///
+ ///
+ ///
+ public static void CopyImageAndJsonFiles(string sourceDirectory, string destinationDirectory)
+ {
+ // 确保目标文件夹存在,如果不存在则创建它
+ if (!Directory.Exists(destinationDirectory))
+ {
+ Directory.CreateDirectory(destinationDirectory);
+ }
+
+ // 获取源文件夹中的所有图片文件和 JSON 文件
+ string[] imageFiles = Directory.GetFiles(sourceDirectory, "*.*")
+ .Where(file => file.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".tiff", StringComparison.OrdinalIgnoreCase) ||
+ file.EndsWith(".webp", StringComparison.OrdinalIgnoreCase))
+ .ToArray();
+
+ string[] jsonFiles = Directory.GetFiles(sourceDirectory, "*.json");
+
+ // 合并图片文件和 JSON 文件
+ string[] filesToCopy = imageFiles.Concat(jsonFiles).ToArray();
+
+ foreach (string file in filesToCopy)
+ {
+ try
+ {
+ // 获取文件名
+ string fileName = Path.GetFileName(file);
+
+ // 拼接目标文件的完整路径
+ string destinationFile = Path.Combine(destinationDirectory, fileName);
+
+ // 如果目标文件已存在,可以选择覆盖或跳过(这里我们选择跳过)
+ if (File.Exists(destinationFile))
+ {
+ Console.WriteLine($"文件 {fileName} 已存在,跳过复制.");
+ continue;
+ }
+
+ // 复制文件
+ File.Copy(file, destinationFile);
+ Console.WriteLine($"文件 {fileName} 已成功复制到 {destinationDirectory}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"复制文件 {file} 时出错: {ex.Message}");
+ }
+ }
+ }
+ ///
+ /// 遍历图片文件夹,检查对应的标签文件夹中是否有同名的 .txt 文件。
+ /// 如果没有,则创建一个空的 .txt 文件。
+ ///
+ /// 图片文件夹路径
+ /// 标签文件夹路径
+ public static void ProcessImageFiles(string imagesDirectory, string labelsDirectory)
+ {
+ // 检查 images 目录是否存在
+ if (!Directory.Exists(imagesDirectory))
+ {
+ throw new DirectoryNotFoundException($"目录 {imagesDirectory} 不存在.");
+ }
+
+ // 检查 labels 目录是否存在,如果不存在则创建
+ if (!Directory.Exists(labelsDirectory))
+ {
+ Directory.CreateDirectory(labelsDirectory);
+ Console.WriteLine($"目录 {labelsDirectory} 已创建.");
+ }
+
+ // 获取 images 目录中的所有文件(包括图片文件)
+ string[] imageFiles = Directory.GetFiles(imagesDirectory, "*.*", SearchOption.TopDirectoryOnly);
+ string[] validExtensions = { ".jpg", ".jpeg", ".png", ".bmp", ".gif" }; // 支持的图片格式
+
+ foreach (var imageFile in imageFiles)
+ {
+ // 检查文件扩展名是否为支持的图片格式
+ string extension = Path.GetExtension(imageFile).ToLower();
+ if (Array.Exists(validExtensions, ext => ext == extension))
+ {
+ // 获取图片文件的文件名(不包括扩展名)
+ string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(imageFile);
+
+ // 生成对应的 txt 文件路径
+ string labelFilePath = Path.Combine(labelsDirectory, fileNameWithoutExtension + ".txt");
+
+ // 如果该 txt 文件不存在,则创建一个空白 txt 文件
+ if (!File.Exists(labelFilePath))
+ {
+ try
+ {
+ File.WriteAllText(labelFilePath, string.Empty); // 创建空白 txt 文件
+ Console.WriteLine($"创建空白文件: {labelFilePath}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"无法创建文件 {labelFilePath}: {ex.Message}");
+ }
+ }
+ }
+ }
+ }
+ // 封装的函数:删除没有对应 JSON 文件的图片
+ public static void DeleteUnmatchedImages(string labelsFolderPath, string imagesFolderPath)
+ {
+ try
+ {
+ // 获取 labels 文件夹中的所有 JSON 文件名(去除扩展名)
+ string[] jsonFiles = Directory.GetFiles(labelsFolderPath, "*.txt");
+ HashSet jsonFileNames = new HashSet();
+
+ foreach (string jsonFile in jsonFiles)
+ {
+ string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(jsonFile);
+ jsonFileNames.Add(fileNameWithoutExtension);
+ }
+
+ // 获取 images 文件夹中的所有图片文件
+ string[] imageFiles = Directory.GetFiles(imagesFolderPath);
+
+ // 遍历图片文件,检查是否有对应的 JSON 文件
+ foreach (string imageFile in imageFiles)
+ {
+ string imageFileNameWithoutExtension = Path.GetFileNameWithoutExtension(imageFile);
+
+ // 如果图片文件名不在 labels 文件夹的 JSON 文件名集合中,则删除该图片
+ if (!jsonFileNames.Contains(imageFileNameWithoutExtension))
+ {
+ try
+ {
+ File.Delete(imageFile); // 删除图片
+ Console.WriteLine($"已删除图片: {Path.GetFileName(imageFile)}");
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"删除文件 {Path.GetFileName(imageFile)} 时出错: {ex.Message}");
+ }
+ }
+ else
+ {
+ Console.WriteLine($"图片 {Path.GetFileName(imageFile)} 有对应的 JSON 文件,不删除。");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"操作失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 将 List 保存到指定文件中,格式为 "项,标签"。
+ /// 标签是根据项的索引生成的。
+ ///
+ /// 要保存的字符串列表
+ /// 保存文件的路径
+ public static void SaveItemsToFile(List items, string filePath)
+ {
+ // 使用 StreamWriter 写入文件
+ using (StreamWriter writer = new StreamWriter(filePath))
+ {
+ // 遍历 items 列表
+ for (int i = 0; i < items.Count; i++)
+ {
+ // 写入每一行,格式为 "项, 标签"
+ writer.WriteLine($"{items[i]},{i}");
+ }
+ }
+ }
+ public static void SaveItemsToFile(HashSet items, string filePath)
+ {
+ // 使用 StreamWriter 写入文件
+ using (StreamWriter writer = new StreamWriter(filePath))
+ {
+ // 遍历 HashSet
+ int i = 0;
+ foreach (string item in items)
+ {
+ // 写入每一行,格式为 "项, 标签"
+ writer.WriteLine($"{item},{i}"); // 假设使用 item 的长度作为标签
+ i++;
+ }
+ }
+ }
+ static List FileList = new List();
+
+ ///
+ /// 递归获取指定文件夹下所有文件
+ ///
+ ///
+ ///
+ public static List GetAllFiles(DirectoryInfo dir)
+ {
+ FileInfo[] allFile = dir.GetFiles();
+ foreach (FileInfo fi in allFile)
+ {
+ FileList.Add(new FileInformation { FileName = fi.Name, FilePath = fi.FullName });
+ }
+ DirectoryInfo[] allDir = dir.GetDirectories();
+ foreach (DirectoryInfo d in allDir)
+ {
+ GetAllFiles(d);
+ }
+ return FileList;
+ }
+
+ ///
+ /// 判断字符串是否纯字母
+ ///
+ ///
+ ///
+ public static bool IsAlphabetOnly(string input)
+ {
+ return Regex.IsMatch(input, "^[a-zA-Z]+$");
+ }
+ ///
+ /// 判断字符串是否仅包含大小写字母和数字
+ ///
+ /// 待判断的字符串
+ /// 如果字符串仅包含字母和数字,返回 true;否则返回 false
+ public static bool IsAlphaNumericOnly(string input)
+ {
+ return Regex.IsMatch(input, "^[a-zA-Z0-9]+$");
+ }
+ public static string ConvertHanzitoPinyinWithNumbers(string input)
+ {
+ // 正则表达式匹配汉字
+ string pattern = @"[\u4e00-\u9fa5]";
+ Regex regex = new Regex(pattern);
+
+ StringBuilder result = new StringBuilder();
+ int lastIndex = 0;
+
+ foreach (Match match in regex.Matches(input))
+ {
+ // 将非汉字部分保留为原样
+ result.Append(input.Substring(lastIndex, match.Index - lastIndex));
+
+ // 获取汉字并转换为拼音
+ string hanzi = match.Value;
+ string pinyin = ConvertHanziToPinyin(hanzi);
+
+ // 将拼音追加到结果中
+ result.Append(pinyin);
+
+ lastIndex = match.Index + match.Length;
+ }
+
+ // 添加最后的非汉字部分
+ result.Append(input.Substring(lastIndex));
+
+ return result.ToString();
+ }
+
+ public static string ConvertHanziToPinyin(string hanzi)
+ {
+ // 设置拼音格式:去掉音调,拼音小写,ü保持为u:
+ PinyinFormat format = PinyinFormat.WITHOUT_TONE | PinyinFormat.LOWERCASE | PinyinFormat.WITH_U_AND_COLON;
+
+ // 获取拼音数组
+ List pinyinItems = Pinyin4Net.GetPinyinArray(hanzi, format);
+
+ StringBuilder pinyinBuilder = new StringBuilder();
+
+ foreach (var item in pinyinItems)
+ {
+ // 处理多音字:默认取第一个拼音
+ if (item.Count > 0)
+ {
+ string pinyin = item[0];
+
+ // 特殊处理ü的情况
+ pinyin = pinyin.Replace("u:", "v"); // 将u:转为v,这是常见的拼音表示法
+
+ pinyinBuilder.Append(pinyin);
+ }
+ }
+
+ return pinyinBuilder.ToString();
+ }
+ ///
+ /// 汉字拼音转化
+ ///
+ ///
+ ///
+ //public static string ConvertHanzitoPinyin(string hanzi)
+ //{
+ // PinyinFormat format = PinyinFormat.WITHOUT_TONE | PinyinFormat.LOWERCASE | PinyinFormat.WITH_U_UNICODE;
+
+ // // string hanzi = defectRow.LabelDescription;
+ // List pylist = Pinyin4Net.GetPinyinArray(hanzi, format);
+ // // 提取所有拼音并合并为一个字符串
+ // List pinyinStrings = new List();
+ // foreach (var item in pylist)
+ // {
+ // // 将PinyinItem中的每个拼音(List)合并为一个字符串
+ // string joinedPinyin = string.Join("", item); // 这里的item就是一个List,其中存储了拼音
+ // pinyinStrings.Add(joinedPinyin); // 添加合并后的拼音
+ // }
+
+ // // 合并所有拼音为一个字符串
+ // string allPinyin = string.Join("", pinyinStrings);
+ // return allPinyin;
+ //}
+ ///
+ /// 递归获取指定文件夹下所有文件
+ ///
+ ///
+ ///
+ public static List GetAllFiles(string dir)
+ {
+ DirectoryInfo directoryInfo = new(dir);
+ return GetAllFiles(directoryInfo);
+ }
+ public static string OpenSlectDirDialog(string dirpath = "")
+ {
+ FolderBrowserDialog fbd = new FolderBrowserDialog();
+ fbd.InitialDirectory = dirpath;
+ if (fbd.ShowDialog() == DialogResult.OK)
+ {
+ string targetDirPath = fbd.SelectedPath;
+ if (Directory.Exists(targetDirPath))
+ {
+ return targetDirPath;
+ }
+ else
+ return string.Empty;
+ //ImportDirImages(targetDirPath);
+ }
+ else
+ return string.Empty;
+ }
+ public static string OpenSlectfileDialog(string dirpath = "")
+ {
+
+
+
+ // 创建并配置 OpenFileDialog 实例
+ OpenFileDialog openFileDialog = new OpenFileDialog();
+ openFileDialog.Title = "选择文件"; // 对话框标题
+ openFileDialog.Filter = "所有文件 (*.pt)|*.*"; // 允许选择任何类型的文件
+ openFileDialog.InitialDirectory = @"C:\"; // 初始显示目录,可以根据需要修改
+
+ // 显示对话框
+ if (openFileDialog.ShowDialog() == DialogResult.OK)
+ {
+ // 获取选中的文件路径
+ string selectedFilePath = openFileDialog.FileName;
+ Console.WriteLine("您选择的文件路径是: " + selectedFilePath);
+ return selectedFilePath;
+ }
+ else
+ {
+ Console.WriteLine("没有选择任何文件。");
+ return string.Empty;
+ MessageBox.Show("没有选择任何文件。");
+ }
+ }
+
+
+ }
+
+ public class FileInformation
+ {
+ public string FileName { get; set; }
+ public string FilePath { get; set; }
+ }
+}
diff --git a/DH.Devices.Camera/Do3ThinkCamera.cs b/DH.Devices.Camera/Do3ThinkCamera.cs
index f284d20..7e3d93e 100644
--- a/DH.Devices.Camera/Do3ThinkCamera.cs
+++ b/DH.Devices.Camera/Do3ThinkCamera.cs
@@ -24,7 +24,7 @@ namespace DH.Devices.Camera
private dvpStatus nRet = dvpStatus.DVP_STATUS_OK;
private DVPCamera.dvpEventCallback pCallBackFunc;
private uint m_handle;
-
+ public bool Connected=false;
public int m_n_dev_count = 0;
private DVPCamera.dvpStreamCallback ImageCallback;
public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
@@ -180,13 +180,14 @@ namespace DH.Devices.Camera
//IIConfig.PropertyChanged -= IIConfig_PropertyChanged;
//IIConfig.PropertyChanged += IIConfig_PropertyChanged;
-
+ Connected = true;
}
return true;
}
catch
{
+ Connected = false;
return false;
}
diff --git a/DH.Devices.PLC/XinJEPLCTcpNet.cs b/DH.Devices.PLC/XinJEPLCTcpNet.cs
index 6d7634f..5576a0b 100644
--- a/DH.Devices.PLC/XinJEPLCTcpNet.cs
+++ b/DH.Devices.PLC/XinJEPLCTcpNet.cs
@@ -76,7 +76,8 @@ namespace DH.Devices.PLC
{
Connected = false;
LogAsync(DateTime.Now, LogLevel.Error, $"PLC初始化失败");
- throw new Exception($"{IP}:{Port}PLC连接失败!");
+ return false;
+ //throw new Exception($"{IP}:{Port}PLC连接失败!");
}
@@ -85,7 +86,8 @@ namespace DH.Devices.PLC
{
Connected = false;
LogAsync(DateTime.Now, LogLevel.Error, $"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}");
- throw new Exception($"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}");
+ return false;
+ //throw new Exception($"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}");
}
}
diff --git a/DHSoftware/MainWindow.Designer.cs b/DHSoftware/MainWindow.Designer.cs
index 963fd84..5e66a11 100644
--- a/DHSoftware/MainWindow.Designer.cs
+++ b/DHSoftware/MainWindow.Designer.cs
@@ -28,14 +28,14 @@
///
private void InitializeComponent()
{
- AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine();
- AntdUI.Tabs.StyleCard styleCard2 = new AntdUI.Tabs.StyleCard();
- AntdUI.SegmentedItem segmentedItem6 = new AntdUI.SegmentedItem();
+ AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine();
+ AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard();
+ AntdUI.SegmentedItem segmentedItem1 = new AntdUI.SegmentedItem();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow));
- AntdUI.SegmentedItem segmentedItem7 = new AntdUI.SegmentedItem();
- AntdUI.SegmentedItem segmentedItem8 = new AntdUI.SegmentedItem();
- AntdUI.SegmentedItem segmentedItem9 = new AntdUI.SegmentedItem();
- AntdUI.SegmentedItem segmentedItem10 = new AntdUI.SegmentedItem();
+ AntdUI.SegmentedItem segmentedItem2 = new AntdUI.SegmentedItem();
+ AntdUI.SegmentedItem segmentedItem3 = new AntdUI.SegmentedItem();
+ AntdUI.SegmentedItem segmentedItem4 = new AntdUI.SegmentedItem();
+ AntdUI.SegmentedItem segmentedItem5 = new AntdUI.SegmentedItem();
titlebar = new AntdUI.PageHeader();
lbName = new AntdUI.Label();
tabsStas = new AntdUI.Tabs();
@@ -136,16 +136,16 @@
tabsStas.Name = "tabsStas";
tabsStas.Pages.Add(tabPage3);
tabsStas.Size = new Size(580, 176);
- tabsStas.Style = styleLine2;
+ tabsStas.Style = styleLine1;
tabsStas.TabIndex = 3;
tabsStas.Text = "tabs3";
//
// tabPage3
//
tabPage3.Controls.Add(panel7);
- tabPage3.Location = new Point(3, 3);
+ tabPage3.Location = new Point(3, 28);
tabPage3.Name = "tabPage3";
- tabPage3.Size = new Size(574, 170);
+ tabPage3.Size = new Size(574, 145);
tabPage3.TabIndex = 0;
tabPage3.Text = "日志";
//
@@ -154,7 +154,7 @@
panel7.Dock = DockStyle.Fill;
panel7.Location = new Point(0, 0);
panel7.Name = "panel7";
- panel7.Size = new Size(574, 170);
+ panel7.Size = new Size(574, 145);
panel7.TabIndex = 2;
//
// tabMain
@@ -201,7 +201,7 @@
tabImgDisplay.Location = new Point(0, 0);
tabImgDisplay.Name = "tabImgDisplay";
tabImgDisplay.Size = new Size(1024, 400);
- tabImgDisplay.Style = styleCard2;
+ tabImgDisplay.Style = styleCard1;
tabImgDisplay.TabIndex = 3;
tabImgDisplay.Text = "tabs1";
//
@@ -553,67 +553,67 @@
segmented1.Font = new Font("Microsoft YaHei UI", 9F);
segmented1.ForeColor = Color.White;
segmented1.Full = true;
- segmentedItem6.Badge = null;
- segmentedItem6.BadgeAlign = AntdUI.TAlignFrom.TR;
- segmentedItem6.BadgeBack = null;
- segmentedItem6.BadgeMode = false;
- segmentedItem6.BadgeOffsetX = 0;
- segmentedItem6.BadgeOffsetY = 0;
- segmentedItem6.BadgeSize = 0.6F;
- segmentedItem6.BadgeSvg = null;
- segmentedItem6.IconActiveSvg = resources.GetString("segmentedItem6.IconActiveSvg");
- segmentedItem6.IconSvg = resources.GetString("segmentedItem6.IconSvg");
- segmentedItem6.Text = "启动";
- segmentedItem7.Badge = null;
- segmentedItem7.BadgeAlign = AntdUI.TAlignFrom.TR;
- segmentedItem7.BadgeBack = null;
- segmentedItem7.BadgeMode = false;
- segmentedItem7.BadgeOffsetX = 0;
- segmentedItem7.BadgeOffsetY = 0;
- segmentedItem7.BadgeSize = 0.6F;
- segmentedItem7.BadgeSvg = null;
- segmentedItem7.IconActiveSvg = resources.GetString("segmentedItem7.IconActiveSvg");
- segmentedItem7.IconSvg = resources.GetString("segmentedItem7.IconSvg");
- segmentedItem7.Text = "停止";
- segmentedItem8.Badge = null;
- segmentedItem8.BadgeAlign = AntdUI.TAlignFrom.TR;
- segmentedItem8.BadgeBack = null;
- segmentedItem8.BadgeMode = false;
- segmentedItem8.BadgeOffsetX = 0;
- segmentedItem8.BadgeOffsetY = 0;
- segmentedItem8.BadgeSize = 0.6F;
- segmentedItem8.BadgeSvg = null;
- segmentedItem8.IconActiveSvg = resources.GetString("segmentedItem8.IconActiveSvg");
- segmentedItem8.IconSvg = resources.GetString("segmentedItem8.IconSvg");
- segmentedItem8.Text = "复位";
- segmentedItem9.Badge = null;
- segmentedItem9.BadgeAlign = AntdUI.TAlignFrom.TR;
- segmentedItem9.BadgeBack = null;
- segmentedItem9.BadgeMode = false;
- segmentedItem9.BadgeOffsetX = 0;
- segmentedItem9.BadgeOffsetY = 0;
- segmentedItem9.BadgeSize = 0.6F;
- segmentedItem9.BadgeSvg = null;
- segmentedItem9.IconActiveSvg = resources.GetString("segmentedItem9.IconActiveSvg");
- segmentedItem9.IconSvg = resources.GetString("segmentedItem9.IconSvg");
- segmentedItem9.Text = "登录";
- segmentedItem10.Badge = null;
- segmentedItem10.BadgeAlign = AntdUI.TAlignFrom.TR;
- segmentedItem10.BadgeBack = null;
- segmentedItem10.BadgeMode = false;
- segmentedItem10.BadgeOffsetX = 0;
- segmentedItem10.BadgeOffsetY = 0;
- segmentedItem10.BadgeSize = 0.6F;
- segmentedItem10.BadgeSvg = null;
- segmentedItem10.IconActiveSvg = resources.GetString("segmentedItem10.IconActiveSvg");
- segmentedItem10.IconSvg = resources.GetString("segmentedItem10.IconSvg");
- segmentedItem10.ID = "sys-setbutton";
- segmentedItem10.Text = "设置";
- segmented1.Items.Add(segmentedItem6);
- segmented1.Items.Add(segmentedItem7);
- segmented1.Items.Add(segmentedItem8);
- segmented1.Items.Add(segmentedItem9);
- segmented1.Items.Add(segmentedItem10);
+ segmentedItem1.Badge = null;
+ segmentedItem1.BadgeAlign = AntdUI.TAlignFrom.TR;
+ segmentedItem1.BadgeBack = null;
+ segmentedItem1.BadgeMode = false;
+ segmentedItem1.BadgeOffsetX = 0;
+ segmentedItem1.BadgeOffsetY = 0;
+ segmentedItem1.BadgeSize = 0.6F;
+ segmentedItem1.BadgeSvg = null;
+ segmentedItem1.IconActiveSvg = resources.GetString("segmentedItem1.IconActiveSvg");
+ segmentedItem1.IconSvg = resources.GetString("segmentedItem1.IconSvg");
+ segmentedItem1.Text = "启动";
+ segmentedItem2.Badge = null;
+ segmentedItem2.BadgeAlign = AntdUI.TAlignFrom.TR;
+ segmentedItem2.BadgeBack = null;
+ segmentedItem2.BadgeMode = false;
+ segmentedItem2.BadgeOffsetX = 0;
+ segmentedItem2.BadgeOffsetY = 0;
+ segmentedItem2.BadgeSize = 0.6F;
+ segmentedItem2.BadgeSvg = null;
+ segmentedItem2.IconActiveSvg = resources.GetString("segmentedItem2.IconActiveSvg");
+ segmentedItem2.IconSvg = resources.GetString("segmentedItem2.IconSvg");
+ segmentedItem2.Text = "停止";
+ segmentedItem3.Badge = null;
+ segmentedItem3.BadgeAlign = AntdUI.TAlignFrom.TR;
+ segmentedItem3.BadgeBack = null;
+ segmentedItem3.BadgeMode = false;
+ segmentedItem3.BadgeOffsetX = 0;
+ segmentedItem3.BadgeOffsetY = 0;
+ segmentedItem3.BadgeSize = 0.6F;
+ segmentedItem3.BadgeSvg = null;
+ segmentedItem3.IconActiveSvg = resources.GetString("segmentedItem3.IconActiveSvg");
+ segmentedItem3.IconSvg = resources.GetString("segmentedItem3.IconSvg");
+ segmentedItem3.Text = "复位";
+ segmentedItem4.Badge = null;
+ segmentedItem4.BadgeAlign = AntdUI.TAlignFrom.TR;
+ segmentedItem4.BadgeBack = null;
+ segmentedItem4.BadgeMode = false;
+ segmentedItem4.BadgeOffsetX = 0;
+ segmentedItem4.BadgeOffsetY = 0;
+ segmentedItem4.BadgeSize = 0.6F;
+ segmentedItem4.BadgeSvg = null;
+ segmentedItem4.IconActiveSvg = resources.GetString("segmentedItem4.IconActiveSvg");
+ segmentedItem4.IconSvg = resources.GetString("segmentedItem4.IconSvg");
+ segmentedItem4.Text = "登录";
+ segmentedItem5.Badge = null;
+ segmentedItem5.BadgeAlign = AntdUI.TAlignFrom.TR;
+ segmentedItem5.BadgeBack = null;
+ segmentedItem5.BadgeMode = false;
+ segmentedItem5.BadgeOffsetX = 0;
+ segmentedItem5.BadgeOffsetY = 0;
+ segmentedItem5.BadgeSize = 0.6F;
+ segmentedItem5.BadgeSvg = null;
+ segmentedItem5.IconActiveSvg = resources.GetString("segmentedItem5.IconActiveSvg");
+ segmentedItem5.IconSvg = resources.GetString("segmentedItem5.IconSvg");
+ segmentedItem5.ID = "sys-setbutton";
+ segmentedItem5.Text = "设置";
+ segmented1.Items.Add(segmentedItem1);
+ segmented1.Items.Add(segmentedItem2);
+ segmented1.Items.Add(segmentedItem3);
+ segmented1.Items.Add(segmentedItem4);
+ segmented1.Items.Add(segmentedItem5);
segmented1.Location = new Point(0, 0);
segmented1.Name = "segmented1";
segmented1.Size = new Size(491, 83);
diff --git a/DHSoftware/MainWindow.cs b/DHSoftware/MainWindow.cs
index 94b9baa..211ade4 100644
--- a/DHSoftware/MainWindow.cs
+++ b/DHSoftware/MainWindow.cs
@@ -36,8 +36,11 @@ using System.Windows.Forms;
using XKRS.UI.Device.Winform;
using static AntdUI.Math3D;
using static DH.Commons.Enums.EnumHelper;
+using Button = System.Windows.Forms.Button;
using Camera = DHSoftware.Models.Camera;
+using Label = AntdUI.Label;
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
+using Point = System.Drawing.Point;
using ResultState = DH.Commons.Base.ResultState;
using Timer = System.Threading.Timer;
@@ -189,7 +192,15 @@ namespace DHSoftware
SetPermission(list, this.Controls);
}
}
-
+ public void ResetAllCameraCounts()
+ {
+ CameraSummaries.ForEach(camera =>
+ {
+ camera.OKCount = 0;
+ camera.NGCount = 0;
+ camera.TiggerCount = 0;
+ });
+ }
private void SetPermission(List list, Control.ControlCollection controls)
{
foreach (Control control in controls)
@@ -689,8 +700,27 @@ namespace DHSoftware
{
cam.OnLog -= _visionEngine_OnLog;
cam.OnLog += _visionEngine_OnLog;
- cam.CameraConnect();
cam.OnHImageOutput += OnCameraHImageOutput;
+
+ Button CamLabel = new Button();
+ CamLabel.Name = cameraBase.CameraName;
+ CamLabel.Text = cameraBase.CameraName; // 关键1:必须有文本
+ CamLabel.AutoSize = true;
+ CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2:自动调整大小
+ CamLabel.Location = new Point(20 + 50 * i, 12); // 关键3:明确位置
+ if (cam.CameraConnect())
+ CamLabel.BackColor = Color.Green; // 关键4:避免透明
+ else
+ CamLabel.BackColor = Color.Yellow; // 关键4:避免透明
+ CamLabel.ForeColor = Color.Black; // 关键4:避免透明
+ CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
+
+ // 关键5:确保添加到父控件
+ if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
+ {
+ pageHeader1.Controls.Add(CamLabel);
+ }
+
}
}
@@ -707,7 +737,7 @@ namespace DHSoftware
}
}
}
-
+
public void ConnectPLC()
{
if (ConfigModel.PLCBaseList.Count > 0)
@@ -725,7 +755,31 @@ namespace DHSoftware
PLC.Port = plcBase.Port;
PLC.OnLog -= _visionEngine_OnLog;
PLC.OnLog += _visionEngine_OnLog;
- PLC.PLCConnect();
+ if(PLC.Enable)
+ {
+ PLC.PLCConnect();
+ Button CamLabel = new Button();
+ CamLabel.Name = PLC.PLCName;
+ CamLabel.Text = PLC.PLCName; // 关键1:必须有文本
+ CamLabel.AutoSize = true;
+ CamLabel.Size = new System.Drawing.Size(20, 20); // 关键2:自动调整大小
+ CamLabel.Location = new Point(20 + 50 * (i + ConfigModel.CameraBaseList.Count), 12); // 关键3:明确位置
+ if (PLC.Connected)
+ CamLabel.BackColor = Color.Green; // 关键4:避免透明
+ else
+ CamLabel.BackColor = Color.Yellow; // 关键4:避免透明
+ CamLabel.ForeColor = Color.Black; // 关键4:避免透明
+ //CamLabel.ForeColor = Color.Green; // 关键4:避免透明
+ CamLabel.Font = new Font("Microsoft YaHei", 9); // 可选:字体
+
+ // 关键5:确保添加到父控件
+ if (pageHeader1 != null && !pageHeader1.Controls.Contains(CamLabel))
+ {
+ pageHeader1.Controls.Add(CamLabel);
+ }
+
+ }
+
}
}
}
@@ -1125,10 +1179,13 @@ namespace DHSoftware
// DataSavePath = string.IsNullOrEmpty(DataSavePath) ? Path.Combine(X018PLCConfig.ImgDirectory, DateTime.Now.ToString("yyyyMMdd"), BatchNO) : DataSavePath;
}
+
private void HandleStartButton()
{
InitialCameraSumsView();
LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候...");
+ ResetAllCameraCounts();
+ //开始流程
StartProcess();
LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!");
}
diff --git a/DHSoftware/MainWindow.resx b/DHSoftware/MainWindow.resx
index ea83a3c..1a56e4c 100644
--- a/DHSoftware/MainWindow.resx
+++ b/DHSoftware/MainWindow.resx
@@ -1,7 +1,7 @@