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 @@