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/CanFly/UI/SizePanel/SizeBaseGuideControl.resx b/CanFly/UI/SizePanel/SizeBaseGuideControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CanFly/UI/SizePanel/SizeBaseGuideControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file 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/CanFly/UI/SizePanel/SizeGuideCircleCtrl.resx b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.resx new file mode 100644 index 0000000..097e294 --- /dev/null +++ b/CanFly/UI/SizePanel/SizeGuideCircleCtrl.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/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/CanFly/UI/UIMain/FrmMainSize.resx b/CanFly/UI/UIMain/FrmMainSize.resx new file mode 100644 index 0000000..7258ec3 --- /dev/null +++ b/CanFly/UI/UIMain/FrmMainSize.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/CanFly/XKRS.CanFly.csproj b/CanFly/XKRS.CanFly.csproj index 94a81c0..5724784 100644 --- a/CanFly/XKRS.CanFly.csproj +++ b/CanFly/XKRS.CanFly.csproj @@ -11,26 +11,20 @@ AnyCPU;x64 - - - - - - - - - - - - + + + + + + diff --git a/DH.Commons.Devies/Base/VisionEngineBase.cs b/DH.Commons.Devies/Base/VisionEngineBase.cs deleted file mode 100644 index 28f5718..0000000 --- a/DH.Commons.Devies/Base/VisionEngineBase.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System.Collections; -using System.ComponentModel; -using System.Drawing; -using System.Drawing.Imaging; -using DH.Commons.Enums; -using HalconDotNet; -using OpenCvSharp; - - - -namespace DH.Devices.Devices -{ - /// - /// 视觉处理引擎:1.传统视觉 2.深度学习 - /// CV深度学习 四大领域 - /// Image Classification 图像分类:判别图中物体是什么,比如是猫还是狗; - /// Semantic Segmentation 语义分割:对图像进行像素级分类,预测每个像素属于的类别,不区分个体; - /// Object Detection 目标检测:寻找图像中的物体并进行定位; - /// Instance Segmentation 实例分割:定位图中每个物体,并进行像素级标注,区分不同个体; - /// - public abstract class VisionEngineBase - { - public List DetectionConfigs = new List(); - #region event - public event Action> OnCropParamsOutput; - public event Action> OnDetectionDone; - public event Action OnDetectionWarningStop;//有无检测 需要报警停机 - #endregion - //public VisionEngineInitialConfigBase IConfig - //{ - // get => InitialConfig as VisionEngineInitialConfigBase; - //} - // public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper(); - public string BatchNO { get; set; } - - public HTuple hv_ModelID; - - public abstract DetectStationResult RunInference(Mat originImgSet, string detectionId = null); - - //public abstract void SaveDetectResultAsync(DetectStationResult detectResult); - - - - public virtual void DetectionDone(string detectionId, Bitmap image, List detectionResults) - { - OnDetectionDone?.Invoke(detectionId, image, detectionResults); - } - - public virtual void DetectionWarningStop(string detectionDes) - { - OnDetectionWarningStop?.Invoke(detectionDes); - } - - public virtual void SaveImageAsync(string fullname, Bitmap saveMap, ImageFormat imageFormat) - { - if (saveMap != null) - { - //ImageSaveSet imageSaveSet = new ImageSaveSet() - //{ - // FullName = fullname, - // SaveImage = saveMap.CopyBitmap(), - // ImageFormat = imageFormat.DeepSerializeClone() - //}; - - //ImageSaveHelper.ImageSaveAsync(imageSaveSet); - } - } - } - public class CamModuleXY - { - [Category("图片行")] - [DisplayName("行")] - [Description("行")] - // [TypeConverter(typeof(DeviceIdSelectorConverter))] - //[TypeConverter(typeof(CollectionCountConvert))] - public int PicRows { get; set; } = 1; - - [Category("图片列")] - [DisplayName("列")] - [Description("列")] - // [TypeConverter(typeof(DeviceIdSelectorConverter))] - //[TypeConverter(typeof(CollectionCountConvert))] - public int PicCols { get; set; } = 1; - - public string GetDisplayText() - { - return "行:" + PicRows.ToString() + "列:" + PicCols.ToString(); - } - } - - //public class RelatedCamera - //{ - - // [Category("关联相机")] - // [DisplayName("关联相机")] - // [Description("关联相机描述")] - // //[TypeConverter(typeof(DeviceIdSelectorConverter))] - // //[TypeConverter(typeof(CollectionCountConvert))] - // public string CameraSourceId { get; set; } = ""; - - - // //public string GetDisplayText() - // //{ - // // using (var scope = GlobalVar.Container.BeginLifetimeScope()) - // // { - // // List deviceList = scope.Resolve>(); - // // IDevice CameraDevice = deviceList.FirstOrDefault(dev => dev.Id.Equals(CameraSourceId)); - - // // if (CameraDevice != null && CameraDevice is CameraBase) - // // { - // // return CameraDevice.Name; - // // } - - // // } - // // return CameraSourceId; - // //} - //} - public class VisionEngineInitialConfigBase //: InitialConfigBase - { - [Category("深度学习检测配置")] - [DisplayName("检测配置集合")] - [Description("检测配置集合")] - //[TypeConverter(typeof(CollectionCountConvert))] - //[Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] - public List DetectionConfigs { get; set; } = new List(); - - [Category("深度学习检测配置")] - [DisplayName("标签分类")] - [Description("标签分类,A_NG,B_TBD...")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] - public List RecongnitionLabelCategoryList { get; set; } = new List(); - - [Category("深度学习检测配置")] - [DisplayName("检测标签定义集合")] - [Description("定义检测标签的集合,例如:Seg/Detection模式:断裂、油污、划伤...;Class模式:ok、ng、上面、下面、套环、正常...")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] - public List RecongnitionLabelList { get; set; } = new List(); - - [Category("深度学习检测配置")] - [DisplayName("标签置信度")] - [Description("标签置信度,过滤小于改置信度的标签,大于该设置的标签才能识别")] - public float Score { get; set; } = 0.5f; - - [Category("深度学习检测配置")] - [DisplayName("CPU线程数量")] - [Description("用于深度学习的CPU线程数量,不要设置太大,会单独占用线程,影响其他程序运行")] - public int CPUNums { get; set; } = 1; - - //[Category("深度学习检测配置")] - //[DisplayName("检测项GPU指定")] - //[Description("将检测项指定到GPU")] - // [TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] - // public List DetectionGPUList { get; set; } = new List(); - - // [Category("数据保存配置")] - //[DisplayName("是否保存检测明细CSV")] - //[Description("是否保存 检测明细CSV")] - //public override bool IsEnableCSV { get; set; } = true; - - //[Category("数据保存配置")] - //[DisplayName("是否保存检测图片")] - //[Description("是否保存 检测图片,总开关")] - //public bool IsSaveImage { get; set; } = true; - - //[Category("数据保存配置")] - //[Description("检测图片 保存文件夹")] - //[DisplayName("检测图片保存文件夹")] - //[Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))] - //public string ImageSaveDirectory { get; set; } = "D:\\PROJECTS\\X017\\Images"; - - //[Category("数据保存配置")] - //[Description("检测明细CSV文件夹")] - //[DisplayName("检测明细CSV文件夹")] - //[Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))] - //public string CSVDataPath { get; set; } = "D:\\PROJECTS\\X017\\Images"; - - } -} - - - - - diff --git a/DH.Commons.Devies/DH.Commons.Devies.csproj b/DH.Commons.Devies/DH.Commons.Devies.csproj index 64a8d06..bbfb35a 100644 --- a/DH.Commons.Devies/DH.Commons.Devies.csproj +++ b/DH.Commons.Devies/DH.Commons.Devies.csproj @@ -21,6 +21,7 @@ + diff --git a/DH.Commons.Devies/Base/CameraBase.cs b/DH.Commons/Base/CameraBase.cs similarity index 72% rename from DH.Commons.Devies/Base/CameraBase.cs rename to DH.Commons/Base/CameraBase.cs index 4aa04c3..047f788 100644 --- a/DH.Commons.Devies/Base/CameraBase.cs +++ b/DH.Commons/Base/CameraBase.cs @@ -2,36 +2,92 @@ using System.ComponentModel; using System.Drawing.Imaging; using AntdUI; +using DH.Commons.Enums; +using DVPCameraType; +using HalconDotNet; using OpenCvSharp; -namespace DH.Devices.Devices +namespace DH.Commons.Base { + public class MatSet + { + public DateTime ImageTime { get; set; } = DateTime.Now; + + private string id = ""; + public string Id + { + get + { + if (string.IsNullOrWhiteSpace(id)) + { + id = ImageTime.ToString("HHmmssfff"); + } + return id; + } + set + { + id = value; + } + } + public string CameraId { get; set; } + public Mat _mat { get; set; } = null; + + public ImageFormat _imageFormat { get; set; } = ImageFormat.Jpeg; + public virtual void Dispose() + { + _mat?.Dispose(); + _mat = null; + + } + } public class CameraBase : NotifyProperty { + + // public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper(); + // 私有字段 + 带通知的属性(与DetectionLabel风格一致) private bool _isEnabled = false; + private bool _isallPicEnabled = true;//默认全画幅 + private bool _isRGBEnabled = true;//默认彩色 private bool _isContinueMode = false; private bool _isSavePicEnabled = false; + private bool _isZoomCamera = false; private string _imageSaveDirectory; + private EnumCamType _CamType; + private dvpStreamFormat _dvpstreamFormat = dvpStreamFormat.S_RGB24; private ImageFormat _imageFormat = ImageFormat.Jpeg; - private bool _isHardwareTrigger = false; + private bool _isHardwareTrigger = true; private string _serialNumber = string.Empty; private string _cameraName = string.Empty; private string _cameraIP = string.Empty; private string _computerIP = string.Empty; private bool _isDirectHardwareTrigger = false; - private float _gain = -1; - private float _rotateImage = 0; + private float _gain =6; + private int _rotateImage = 0; private float _exposure = 200; private float _triggerDelay = 0; private decimal _roiX = 0; private decimal _roiY = 0; - private decimal _roiW = 0; - private decimal _roiH = 0; + private decimal _roiW = 2448; + private decimal _roiH = 2048; private int _lineDebouncerTime = 0; public volatile int SnapshotCount = 0; + [Category("相机设置")] + [DisplayName("图像格式")] + [Description("相机采集图像格式")] + public dvpStreamFormat DvpImageFormat + { + get => _dvpstreamFormat; + set + { + if (_dvpstreamFormat == value) return; + _dvpstreamFormat = value; + OnPropertyChanged(nameof(DvpImageFormat)); + } + } + [Category("采图模式")] [DisplayName("连续模式")] [Description("是否连续模式。true:连续模式采图;false:触发模式采图")] @@ -45,6 +101,16 @@ namespace DH.Devices.Devices OnPropertyChanged(nameof(IsContinueMode)); } } + public bool IsZoomCamera + { + get => _isZoomCamera; + set + { + if (_isZoomCamera == value) return; + _isZoomCamera = value; + OnPropertyChanged(nameof(IsZoomCamera)); + } + } public virtual bool IsEnabled { @@ -56,7 +122,16 @@ namespace DH.Devices.Devices OnPropertyChanged(nameof(IsEnabled)); } } - + public virtual bool IsAllPicEnabled + { + get => _isallPicEnabled; + set + { + if (_isallPicEnabled == value) return; + _isallPicEnabled = value; + OnPropertyChanged(nameof(IsAllPicEnabled)); + } + } public virtual bool IsSavePicEnabled { get => _isSavePicEnabled; @@ -95,6 +170,19 @@ namespace DH.Devices.Devices OnPropertyChanged(nameof(ImageFormat)); } } + [Category("设备配置")] + [DisplayName("相机类型")] + [Description("相机类型")] + public EnumCamType CamType + { + get => _CamType; + set + { + if (_CamType == value) return; + _CamType = value; + OnPropertyChanged(nameof(CamType)); + } + } [Category("采图模式")] [DisplayName("硬触发")] @@ -185,7 +273,7 @@ namespace DH.Devices.Devices [Category("图像旋转")] [DisplayName("默认旋转")] [Description("默认旋转,相机开启后默认不旋转")] - public virtual float RotateImage + public virtual int RotateImage { get => _rotateImage; set @@ -283,7 +371,18 @@ namespace DH.Devices.Devices } // 其他方法保持原有逻辑 - public Action OnHImageOutput { get; set; } + public MatSet CopyImageSet(MatSet srcSet) + { + MatSet imageSet = new MatSet + { + Id = srcSet.Id, + _mat = srcSet._mat.Clone(), + // ImageSaveOption = srcSet.ImageSaveOption.Copy(), + ImageTime = srcSet.ImageTime + }; + return imageSet; + } + public Action OnHImageOutput { get; set; } public virtual bool CameraConnect() { return false; } diff --git a/DH.Commons/DetectionConfig.cs b/DH.Commons/Base/DetectionConfig.cs similarity index 68% rename from DH.Commons/DetectionConfig.cs rename to DH.Commons/Base/DetectionConfig.cs index 85f20b4..8b56293 100644 --- a/DH.Commons/DetectionConfig.cs +++ b/DH.Commons/Base/DetectionConfig.cs @@ -9,27 +9,14 @@ using AntdUI; using System.Text.Json.Serialization; using static DH.Commons.Enums.EnumHelper; -using System.Collections.ObjectModel; +using System.Text.Json.Serialization; +using DH.Commons.Enums; +using System.Drawing.Imaging; - -namespace DH.Commons.Enums +namespace DH.Commons.Base { - public enum MLModelType - { - [Description("图像分类")] - ImageClassification = 1, - [Description("目标检测")] - ObjectDetection = 2, - //[Description("图像分割")] - //ImageSegmentation = 3 - [Description("语义分割")] - SemanticSegmentation = 3, - [Description("实例分割")] - InstanceSegmentation = 4, - [Description("目标检测GPU")] - ObjectGPUDetection = 5 - } - public class ModelLabel + + public class ModelLabel { public string LabelId { get; set; } @@ -45,7 +32,7 @@ namespace DH.Commons.Enums [Description("模型识别的标签名称")] public string LabelName { get; set; } - + //[Category("模型配置")] @@ -74,28 +61,28 @@ namespace DH.Commons.Enums //public int ImageResizeCount; public bool IsCLDetection; public int ProCount; - public string in_node_name; + public string in_node_name; - public string out_node_name; + public string out_node_name; - public string in_lable_path; + public string in_lable_path; public int ResizeImageSize; public int segmentWidth; public int ImageWidth; - // public List OkClassTxtList; + // public List OkClassTxtList; - public List LabelNames; + public List LabelNames; + - } public enum ResultState { - + [Description("检测NG")] DetectNG = -3, @@ -120,20 +107,20 @@ namespace DH.Commons.Enums /// public class DetectionResultDetail { - + public string LabelBGR { get; set; }//识别到对象的标签BGR public int LabelNo { get; set; } // 识别到对象的标签索引 - + public string LabelName { get; set; }//识别到对象的标签名称 public double Score { get; set; }//识别目标结果的可能性、得分 - + public string LabelDisplay { get; set; }//识别到对象的 显示信息 @@ -154,10 +141,10 @@ namespace DH.Commons.Enums public class MLResult { public bool IsSuccess = false; - + public string ResultMessage; - + public Bitmap ResultMap; public List ResultDetails = new List(); @@ -181,8 +168,7 @@ namespace DH.Commons.Enums public bool IsGPU; public int GPUId; public float Score_thre; - - + public MLInit(string modelFile, bool isGPU, int gpuId, float score_thre) @@ -205,31 +191,48 @@ namespace DH.Commons.Enums } } - public class DetectStationResult + public class DetectStationResult { - + public DateTime ImageTime { get; set; } = DateTime.Now; + + private string id = ""; + public string Id + { + get + { + if (string.IsNullOrWhiteSpace(id)) + { + id = ImageTime.ToString("HHmmssfff"); + } + return id; + } + set + { + id = value; + } + } public string Pid { get; set; } - - - public string TempPid { get; set; } + public string TempPid { get; set; } /// /// 检测工位名称 /// - public string DetectName { get; set; } - + /// /// 深度学习 检测结果 /// public List DetectDetails = new List(); public List DetectionResultShapes = new List(); - - + /// + /// 视觉测量结果集合 + /// + + public List realSpecs { get; set; } = new List(); /// /// 工位检测结果 /// @@ -254,36 +257,25 @@ namespace DH.Commons.Enums /// 预处理阶段已经NG /// public bool IsPreTreatNG { get; set; } = false; - + /// + /// 检测原图 + /// + public Bitmap DetectionOriginImage { get; set; } /// /// 目标检测NG /// public bool IsObjectDetectNG { get; set; } = false; - + public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg; public DateTime EndTime { get; set; } + public string ImageSaveDirectory { get; set; } public int StationDetectElapsed { get; set; } - public static string NormalizeAndClean(string input) - { -#pragma warning disable CS8603 // 可能返回 null 引用 - if (input == null) return null; -#pragma warning restore CS8603 // 可能返回 null 引用 + public bool SaveOKOriginal = false; + public bool SaveNGOriginal = false; + public bool SaveOKDetect = false; + public bool SaveNGDetect = false; - // Step 1: 标准化字符编码为 Form C (规范组合) - string normalizedString = input.Normalize(NormalizationForm.FormC); - // Step 2: 移除所有空白字符,包括制表符和换行符 - string withoutWhitespace = Regex.Replace(normalizedString, @"\s+", ""); - - // Step 3: 移除控制字符 (Unicode 控制字符,范围 \u0000 - \u001F 和 \u007F) - string withoutControlChars = Regex.Replace(withoutWhitespace, @"[\u0000-\u001F\u007F]+", ""); - - // Step 4: 移除特殊的不可见字符(如零宽度空格等) - string cleanedString = Regex.Replace(withoutControlChars, @"[\u200B\u200C\u200D\uFEFF]+", ""); - - return cleanedString; - } - } public class RelatedCamera : NotifyProperty { @@ -406,7 +398,7 @@ namespace DH.Commons.Enums public static double GetDistance(CustomizedPoint p1, CustomizedPoint p2) { - return Math.Sqrt(Math.Pow((p1.X - p2.X), 2) + Math.Pow((p1.Y - p2.Y), 2)); + return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)); } public override string ToString() @@ -447,13 +439,13 @@ namespace DH.Commons.Enums public int CompareTo(CustomizedPoint other) { - return (X == other.X && Y == other.Y) ? 0 : 1; + return X == other.X && Y == other.Y ? 0 : 1; } public override int GetHashCode() { //return (int)(X * 10 + Y); - return (new Tuple(X, Y)).GetHashCode(); + return new Tuple(X, Y).GetHashCode(); } public static CustomizedPoint operator -(CustomizedPoint p1, CustomizedPoint p2) @@ -476,7 +468,7 @@ namespace DH.Commons.Enums // [Category("预处理参数")] // [DisplayName("参数名称")] // [Description("参数名称")] - // + //#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。 // public string Name { get; set; } @@ -488,7 +480,7 @@ namespace DH.Commons.Enums // [Category("预处理参数")] // [DisplayName("参数值")] // [Description("参数值")] - // + //#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。 // public string Value { get; set; } @@ -496,48 +488,135 @@ namespace DH.Commons.Enums // } public class DetectionConfig : NotifyProperty { - #region 基本信息 - [JsonPropertyName("id")] + #region 属性字段 + private string _id = Guid.NewGuid().ToString(); + private string _name; + private EnumDetectionType _detectionType= EnumDetectionType.深度学习; + private string _cameraSourceId = ""; + private List _cameraCollects = new List(); + private bool _isEnableGPU; + private bool _isMixModel; + private bool _isPreEnabled; + private bool _isEnabled; + private bool _isAddStation = true; + private string _halconAlgorithemPath_Pre; + private AntList _preTreatParams = new AntList(); + private AntList _outPreTreatParams = new AntList(); + private ModelType _modelType = ModelType.目标检测; + private string _modelPath; + private int _modelWidth = 640; + private int _modelHeight = 640; + private string _modeloutNodeName = "output0"; + private float _modelconfThreshold = 0.5f; + private string _in_lable_path; + private AntList _detectionLableList = new AntList(); + private AntList _sizeTreatParamList = new AntList(); + + private CustomizedPoint _showLocation = new CustomizedPoint(); + private string _imageSaveDirectory= "D://PROJECTS//Images//"; + private bool _saveOKOriginal = false; + private bool _saveNGOriginal = false; + private bool _saveOKDetect = false; + private bool _saveNGDetect = false; + + #endregion + + #region 属性声明 [ReadOnly(true)] - public string Id { get; private set; } = Guid.NewGuid().ToString(); + public string Id + { + get => _id; + set + { + if (_id == value) return; + _id = value; + OnPropertyChanged(nameof(Id)); + } + } [Category("检测配置")] [DisplayName("检测配置名称")] [Description("检测配置名称")] - [JsonPropertyName("name")] - public string Name { get; set; } - - #endregion - - #region 相机配置 - [Category("关联相机")] - [DisplayName("关联相机")] - [Description("关联相机描述")] - [JsonPropertyName("camera_source_id")] - public string CameraSourceId { get; set; } = ""; + public string Name + { + get => _name; + set + { + if (_name == value) return; + _name = value; + OnPropertyChanged(nameof(Name)); + } + } [Category("关联相机集合")] [DisplayName("关联相机集合")] [Description("关联相机描述")] - [JsonPropertyName("camera_Collects")] - public List CameraCollects { get; set; } = new(); - #endregion + public List CameraCollects + { + get => _cameraCollects; + set + { + if (_cameraCollects == value) return; + _cameraCollects = value; + OnPropertyChanged(nameof(CameraCollects)); + } + } - #region 启用选项 [Category("启用配置")] [DisplayName("是否启用GPU检测")] - [JsonPropertyName("is_enable_gpu")] - public bool IsEnableGPU { get; set; } + [Description("是否启用GPU检测")] + public bool IsEnableGPU + { + get => _isEnableGPU; + set + { + if (_isEnableGPU == value) return; + _isEnableGPU = value; + OnPropertyChanged(nameof(IsEnableGPU)); + } + } [Category("启用配置")] [DisplayName("是否混料模型")] - [JsonPropertyName("is_mixModel")] - public bool IsMixModel { get; set; } + [Description("是否混料模型")] + public bool IsMixModel + { + get => _isMixModel; + set + { + if (_isMixModel == value) return; + _isMixModel = value; + OnPropertyChanged(nameof(IsMixModel)); + } + } + + [Category("启用配置")] + [DisplayName("是否启用预处理")] + [Description("是否启用预处理")] + public bool IsPreEnabled + { + get => _isPreEnabled; + set + { + if (_isPreEnabled == value) return; + _isPreEnabled = value; + OnPropertyChanged(nameof(IsPreEnabled)); + } + } [Category("启用配置")] [DisplayName("是否启用该检测")] - [JsonPropertyName("is_enabled")] - public bool IsEnabled { get; set; } + [Description("是否启用该检测")] + public bool IsEnabled + { + get => _isEnabled; + set + { + if (_isEnabled == value) return; + _isEnabled = value; + OnPropertyChanged(nameof(IsEnabled)); + } + } [Category("启用配置")] [DisplayName("是否启用预处理")] @@ -548,133 +627,293 @@ namespace DH.Commons.Enums private bool _isAddStation; [Category("启用配置")] [DisplayName("是否加入检测工位")] - [JsonPropertyName("is_addstation")] + [Description("是否加入检测工位")] public bool IsAddStation { get => _isAddStation; set { - if (_isAddStation != value) - { - _isAddStation = value; - OnPropertyChanged(nameof(IsAddStation)); - } + if (_isAddStation == value) return; + _isAddStation = value; + OnPropertyChanged(nameof(IsAddStation)); + } + } + [Category("图片保存")] + [DisplayName("图片保存文件夹")] + [Description("图片保存文件夹")] + public virtual string ImageSaveDirectory + { + get => _imageSaveDirectory; + set + { + if (_imageSaveDirectory == value) return; + _imageSaveDirectory = value; + OnPropertyChanged(nameof(ImageSaveDirectory)); } } - #endregion - - #region 预处理(视觉算子) [Category("1.预处理(视觉算子)")] [DisplayName("预处理-算法文件路径")] - [JsonPropertyName("halcon_algorithemPath_pre")] - public string HalconAlgorithemPath_Pre { get; set; } + public string HalconAlgorithemPath_Pre + { + get => _halconAlgorithemPath_Pre; + set + { + if (_halconAlgorithemPath_Pre == value) return; + _halconAlgorithemPath_Pre = value; + OnPropertyChanged(nameof(HalconAlgorithemPath_Pre)); + } + } [Category("1.预处理(视觉算子)")] [DisplayName("预处理-参数列表")] - [JsonPropertyName("pre_treatParams")] - public List PreTreatParams { get; set; } = new(); - - [Category("1.预处理(视觉算子)")] - [DisplayName("预处理-输出参数列表")] - [JsonPropertyName("out_preTreatParams")] - public List OUTPreTreatParams { get; set; } = new(); - #endregion - - #region 深度学习检测 - [Category("2.中检测(深度学习)")] - [DisplayName("模型类型")] - [JsonPropertyName("model_Type")] - public MLModelType ModelType { get; set; } = MLModelType.ObjectDetection; - - [Category("2.中检测(深度学习)")] - [DisplayName("模型文件路径")] - [JsonPropertyName("model_Path")] - public string ModelPath { get; set; } - - [Category("2.中检测(深度学习)")] - [DisplayName("模型宽度")] - [JsonPropertyName("model_Width")] - public int ModelWidth { get; set; } = 640; - - [Category("2.中检测(深度学习)")] - [DisplayName("模型高度")] - [JsonPropertyName("model_Height")] - public int ModelHeight { get; set; } = 640; - - [Category("2.中检测(深度学习)")] - [DisplayName("模型节点名称")] - [JsonPropertyName("model_outNodeName")] - public string ModeloutNodeName { get; set; } = "output0"; - - [Category("2.中检测(深度学习)")] - [DisplayName("模型置信度")] - [JsonPropertyName("model_confThreshold")] - public float ModelconfThreshold { get; set; } = 0.5f; - - [Category("2.中检测(深度学习)")] - [DisplayName("模型标签路径")] - [JsonPropertyName("in_lablepath")] - public string in_lable_path { get; set; } - #endregion - - #region 尺寸测量 - - // public List PreTreatCollects { get; set; } = new(); - private List _preTreatParams = new(); - - [Category("1.尺寸测量集合")] - [DisplayName("尺寸测量集合")] - [JsonPropertyName("Pre_TreatCollects")] - public List PreTreatCollects + [Description("预处理-参数列表")] + public AntList PreTreatParams { get => _preTreatParams; set { - if (_preTreatParams != value) - { - _preTreatParams = value; - OnPropertyChanged(nameof(PreTreatCollects)); - - } + if (_preTreatParams == value) return; + _preTreatParams = value; + OnPropertyChanged(nameof(PreTreatParams)); } } - #endregion + [Category("1.预处理(视觉算子)")] + [DisplayName("预处理-输出参数列表")] + [Description("预处理-输出参数列表")] + public AntList OUTPreTreatParams + { + get => _outPreTreatParams; + set + { + if (_outPreTreatParams == value) return; + _outPreTreatParams = value; + OnPropertyChanged(nameof(OUTPreTreatParams)); + } + } - #region 过滤器 - [Category("4.最终过滤(逻辑过滤)")] - [DisplayName("过滤器集合")] - [JsonPropertyName("detection_filterList")] - public List DetectionFilterList { get; set; } = new(); - #endregion + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型类型")] + [Description("模型类型:ImageClassification-图片分类;ObjectDetection:目标检测;Segmentation-图像分割")] + public ModelType ModelType + { + get => _modelType; + set + { + if (_modelType == value) return; + _modelType = value; + OnPropertyChanged(nameof(ModelType)); + } + } - #region 其他信息 - [JsonPropertyName("Detection_LableList")] - public List DetectionLableList { get; set; } = new(); + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型文件路径")] + [Description("中处理 深度学习模型文件路径")] + public string ModelPath + { + get => _modelPath; + set + { + if (_modelPath == value) return; + _modelPath = value; + OnPropertyChanged(nameof(ModelPath)); + } + } + + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型宽度")] + [Description("中处理-模型宽度")] + public int ModelWidth + { + get => _modelWidth; + set + { + if (_modelWidth == value) return; + _modelWidth = value; + OnPropertyChanged(nameof(ModelWidth)); + } + } + + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型高度")] + [Description("中处理-模型高度")] + public int ModelHeight + { + get => _modelHeight; + set + { + if (_modelHeight == value) return; + _modelHeight = value; + OnPropertyChanged(nameof(ModelHeight)); + } + } + + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型节点名称")] + [Description("中处理-模型节点名称")] + public string ModeloutNodeName + { + get => _modeloutNodeName; + set + { + if (_modeloutNodeName == value) return; + _modeloutNodeName = value; + OnPropertyChanged(nameof(ModeloutNodeName)); + } + } + + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型置信度")] + [Description("中处理-模型置信度")] + public float ModelconfThreshold + { + get => _modelconfThreshold; + set + { + if (_modelconfThreshold == value) return; + _modelconfThreshold = value; + OnPropertyChanged(nameof(ModelconfThreshold)); + } + } + + [Category("2.中检测(深度学习)")] + [DisplayName("中检测-模型标签路径")] + [Description("中处理-模型标签路径")] + public string In_lable_path + { + get + { + if (string.IsNullOrEmpty(ModelPath) || string.IsNullOrWhiteSpace(ModelPath)) + { + return string.Empty; + } + + string dir = Path.GetDirectoryName(ModelPath); + string file = $"{Path.GetFileNameWithoutExtension(ModelPath)}.txt"; + return Path.Combine(dir, file); + } + set + { + if (_in_lable_path == value) return; + _in_lable_path = value; + OnPropertyChanged(nameof(In_lable_path)); + } + } + + [Category("检测配置")] + [DisplayName("检测类型")] + [Description("检测类型")] + public EnumDetectionType DetectionType + { + get => _detectionType; + set + { + if (_detectionType == value) return; + _detectionType = value; + OnPropertyChanged(nameof(DetectionType)); + } + } [Category("显示配置")] [DisplayName("显示位置")] - [JsonPropertyName("Show_Location")] - public CustomizedPoint ShowLocation { get; set; } = new(); - #endregion - //public event PropertyChangedEventHandler PropertyChanged; + [Description("检测信息显示位置")] + public CustomizedPoint ShowLocation + { + get => _showLocation; + set + { + if (_showLocation == value) return; + _showLocation = value; + OnPropertyChanged(nameof(ShowLocation)); + } + } - //protected virtual void OnPropertyChanged(string propertyName) - //{ - // PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - //} + /// + /// 标签集合(需确保DetectionLable也实现INotifyPropertyChanged) + /// + public AntList DetectionLableList + { + get => _detectionLableList; + set + { + if (_detectionLableList == value) return; + _detectionLableList = value; + OnPropertyChanged(nameof(DetectionLableList)); + } + } + + public AntList SizeTreatParamList + { + get => _sizeTreatParamList; + set + { + if (_sizeTreatParamList == value) return; + _sizeTreatParamList = value; + OnPropertyChanged(nameof(SizeTreatParamList)); + } + } + + + public bool SaveOKOriginal + { + get => _saveOKOriginal; + set + { + if (_saveOKOriginal == value) return; + _saveOKOriginal = value; + OnPropertyChanged(nameof(SaveOKOriginal)); + } + } + + public bool SaveNGOriginal + { + get => _saveNGOriginal; + set + { + if (_saveNGOriginal == value) return; + _saveNGOriginal = value; + OnPropertyChanged(nameof(SaveNGOriginal)); + } + } + public bool SaveOKDetect + { + get => _saveOKDetect; + set + { + if (_saveOKDetect == value) return; + _saveOKDetect = value; + OnPropertyChanged(nameof(SaveOKDetect)); + } + } + public bool SaveNGDetect + { + get => _saveNGDetect; + set + { + if (_saveNGDetect == value) return; + _saveNGDetect = value; + OnPropertyChanged(nameof(SaveNGDetect)); + } + } + #endregion #region 构造函数 public DetectionConfig() { } - public DetectionConfig(string name, MLModelType modelType, string modelPath, bool isEnableGPU, string sCameraSourceId) + public DetectionConfig( + string name, + ModelType modelType, + string modelPath, + bool isEnableGPU, + string sCameraSourceId) { + // 通过属性赋值触发通知 + ModelPath = modelPath ?? string.Empty; Name = name; ModelType = modelType; ModelPath = modelPath ?? string.Empty; IsEnableGPU = isEnableGPU; - CameraSourceId = sCameraSourceId; - Id = Guid.NewGuid().ToString(); + } #endregion } @@ -727,6 +966,7 @@ namespace DH.Commons.Enums } private CellLink[] cellLinks; + [JsonIgnore] public CellLink[] CellLinks { get { @@ -747,17 +987,18 @@ namespace DH.Commons.Enums public class DetectionLable : NotifyProperty { private bool _selected = false; + private string _labelId; private string _labelName; - private double _maxSource; - private double _minSource; + private double _maxScore; + private double _minScore; private double _maxArea; private double _minArea; private ResultState _resultState = ResultState.ResultTBD; - + public bool Selected { get { return _selected; } @@ -792,27 +1033,26 @@ namespace DH.Commons.Enums OnPropertyChanged(nameof(LabelName)); } } - [JsonPropertyName("maxSource")] - public double MaxSource + + public double MaxScore { - get { return _maxSource; } + get { return _maxScore; } set { - if (_maxSource.Equals(value)) return; - _maxSource = value; - OnPropertyChanged(nameof(MaxSource)); + if (_maxScore.Equals(value)) return; + _maxScore = value; + OnPropertyChanged(nameof(MaxScore)); } } - [JsonPropertyName("minSource")] - public double MinSource + public double MinScore { - get { return _minSource; } + get { return _minScore; } set { - if (_minSource.Equals(value)) return; - _minSource = value; - OnPropertyChanged(nameof(MinSource)); + if (_minScore.Equals(value)) return; + _minScore = value; + OnPropertyChanged(nameof(MinScore)); } } [JsonPropertyName("maxArea")] @@ -850,6 +1090,7 @@ namespace DH.Commons.Enums } private CellLink[] cellLinks; + [JsonIgnore] public CellLink[] CellLinks { get { @@ -862,6 +1103,15 @@ namespace DH.Commons.Enums OnPropertyChanged(nameof(CellLinks)); } } + + public bool FilterOperation(DetectionResultDetail recongnitionResult) + { + + double compareValue = recongnitionResult.Area; + double compareScoreValue = recongnitionResult.Score; + return (compareValue >= MinArea && compareValue <= MaxArea)&& (compareScoreValue >= MinScore && compareScoreValue <= MaxScore); + + } } public class PreTreatCollect { @@ -999,7 +1249,7 @@ namespace DH.Commons.Enums _resultShow = value; OnPropertyChanged(nameof(ResultShow)); } - + } public string OutResultShow @@ -1013,19 +1263,20 @@ namespace DH.Commons.Enums } } - //public string PrePath - //{ - // get { return _prePath; } - // set - // { - // if (_prePath.Equals(value)) return; - // _prePath = value; - // OnPropertyChanged(nameof(PrePath)); - // } - //} - + public string PrePath + { + get { return _prePath; } + set + { + if (_prePath.Equals(value)) return; + _prePath = value; + OnPropertyChanged(nameof(PrePath)); + } + } + private CellLink[] cellLinks; + [JsonIgnore] public CellLink[] CellLinks { get { return cellLinks; } @@ -1063,9 +1314,9 @@ namespace DH.Commons.Enums //[TypeConverter(typeof(LabelCategoryConverter))] public string LabelCategory { get; set; } = ""; - - + + } /// @@ -1126,8 +1377,8 @@ namespace DH.Commons.Enums //public string GetLabelName() //{ // var name = ""; - - + + // var mlBase = iConfig.DeviceConfigs.FirstOrDefault(c => c is VisionEngineInitialConfigBase) as VisionEngineInitialConfigBase; // if (mlBase != null) // { @@ -1138,7 +1389,7 @@ namespace DH.Commons.Enums // } // } - + // return name; //} } @@ -1199,11 +1450,11 @@ namespace DH.Commons.Enums [DisplayName("过滤条件集合")] [Description("过滤条件集合,集合之间为“且”关系")] //[TypeConverter(typeof(CollectionCountConvert))] - // [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] + // [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List FilterConditionsCollection { get; set; } = new List(); - - + + public bool FilterOperation(DetectionResultDetail recongnitionResult) { return FilterConditionsCollection.All(u => diff --git a/DH.Commons/Base/DeviceBase.cs b/DH.Commons/Base/DeviceBase.cs new file mode 100644 index 0000000..d1b3b92 --- /dev/null +++ b/DH.Commons/Base/DeviceBase.cs @@ -0,0 +1,389 @@ + +using DH.Commons.Enums; +using OpenCvSharp.Internal; +using System; +using System.ComponentModel; +using System.IO; +using System.Text.Json.Serialization; +using System.Threading; +using System.Threading.Tasks; +using static DH.Commons.Enums.EnumHelper; +using Timer = System.Threading.Timer; + +namespace DH.Commons.Base +{ + public abstract class DeviceBase : IDisposable + { + #region Event + [JsonIgnore] + [Browsable(false)] + public Action OnExceptionOccured { get; set; } + //public event Action OnLog; + public event Action OnLog; + // public event Action OnDeviceStateChanged; + public event PropertyChangedEventHandler PropertyChanged; + #endregion + + #region field + int RetryTime = 3; + /// + /// 和设备暂停状态关联的信号量 + /// + private readonly ManualResetEvent pauseHandle = new ManualResetEvent(true); + readonly Timer stateChangedTimer; + #endregion + + #region Property + #region State + private EnumHelper.DeviceState _currentStateToBe = EnumHelper.DeviceState.DSUninit; + /// + /// 当前设备状态 + /// + [JsonIgnore] + internal EnumHelper.DeviceState CurrentStateToBe + { + get + { + return _currentStateToBe; + } + set + { + if (value != _currentStateToBe) + { + var initialState = _currentStateToBe; + _currentStateToBe = value; + + if (_currentStateToBe != EnumHelper.DeviceState.DSExcept) + { + // OnStateChanged(initialState); + } + else + { + stateChangedTimer.Change(Timeout.Infinite, Timeout.Infinite); + } + } + } + } + + //private EnumHelper.DeviceState initialState = EnumHelper.DeviceState.DSUninit; + private EnumHelper.DeviceState _currentState = EnumHelper.DeviceState.DSUninit; + public EnumHelper.DeviceState CurrentState + { + get + { + return _currentState; + } + set + { + _currentState = value; + + if (value != EnumHelper.DeviceState.TBD) + { + // OnDeviceStateChanged?.Invoke(this, _currentState); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentState")); + } + //else + //{ + // initialState = _currentState; + //} + } + } + #endregion + + /// + /// 设备标识符 从数据库获取 + /// + public string Id { get; set; } + + /// + /// 设备名称 从数据库获取 + /// + public string Name { get; set; } + + //private IInitialConfig initialConfig = null; + ///// + ///// 设备初始化配置 从数据库获取 + ///// + //public virtual IInitialConfig InitialConfig + //{ + // get => initialConfig; + // set + // { + // initialConfig = value; + // Id = initialConfig.Id; + // Name = initialConfig.Name; + + // LoggerHelper.LogPath = initialConfig.LogPath; + // LoggerHelper.LogPrefix = initialConfig.Name; + // } + //} + #endregion + + #region 构造函数 + public DeviceBase() + { + RegisterFileWriterException(); + // stateChangedTimer = new Timer(new TimerCallback(CheckDeviceOpTimeOut), null, Timeout.Infinite, Timeout.Infinite); + } + #endregion + + #region 设备抽象方法 + protected virtual void Init() + { + LogAsync(DateTime.Now, LogLevel.Information, $"{Name}初始化完成"); + } + + + + protected virtual void Start() + { + LogAsync(DateTime.Now, LogLevel.Information, $"{Name}启动"); + } + + protected virtual void Stop() + { + LogAsync(DateTime.Now, LogLevel.Information, $"{Name}停止"); + } + + //public abstract void AttachToProcess(IProcess process); + #endregion + + /// + /// 常用操作封装方法 + /// + /// + /// + //public virtual ResponseMessage RunWrap(IOperationConfig opConfig) + //{ + // ResponseMessage msg = new ResponseMessage(); + // msg.Message = "设备基类默认操作"; + // return msg; + //} + + #region 状态切换 + //[DeviceExceptionAspect] + //public void StateChange(EnumHelper.DeviceState stateToBe) + //{ + // if (CurrentState == stateToBe) + // { + // return; + // } + + // if (!stateToBe.CheckPreStateValid((int)CurrentStateToBe)) + // { + // string currentStateStr = CurrentStateToBe.GetEnumDescription(); + // string stateToBeStr = stateToBe.GetEnumDescription(); + // throw new ProcessException($"{InitialConfig.Name}设备的当前状态为{currentStateStr},无法切换至{stateToBeStr}"); + // } + + // CurrentState = EnumHelper.DeviceState.TBD; + // CurrentStateToBe = stateToBe; + //} + + //[DeviceExceptionAspect] + //private void OnStateChanged(EnumHelper.DeviceState initialState) + //{ + // try + // { + // if (CurrentStateToBe != EnumHelper.DeviceState.DSExcept) + // { + // } + // else + // { + // if (CurrentState == EnumHelper.DeviceState.DSExcept) + // { + // return; + // } + // else + // { + // throw new ProcessException($"{InitialConfig.Name}设备操作超时"); + // } + // } + + // if (RetryTime >= 0) + // { + // if (initialState == CurrentStateToBe) + // { + // CurrentState = CurrentStateToBe; + // return; + // } + + // #region 状态切换操作 + // switch (CurrentStateToBe) + // { + // case EnumHelper.DeviceState.DSInit: + // if (initialState == EnumHelper.DeviceState.DSOpen) + // { + // return; + // } + // else + // { + // Init(); + // } + // break; + // case EnumHelper.DeviceState.DSOpen: + // if (initialState == EnumHelper.DeviceState.DSInit) + // { + // Start(); + // } + // else if (initialState == EnumHelper.DeviceState.DSPause) + // { + // Resume(); + // pauseHandle.Set(); + // } + // break; + // case EnumHelper.DeviceState.DSPause: + // pauseHandle.Reset(); + // Pause(); + // break; + // case EnumHelper.DeviceState.DSClose: + // if (initialState != DeviceState.DSUninit) + // { + // Stop(); + // } + // break; + // default: + // break; + // } + + // RetryTime = 3; + // CurrentState = CurrentStateToBe; + // #endregion + // } + + // stateChangedTimer.Change(Timeout.Infinite, Timeout.Infinite); + // } + // catch (Exception ex) + // { + // RetryTime--; + // if (RetryTime > 0) + // { + // OnStateChanged(initialState); + // } + // else + // { + // if (CurrentState != EnumHelper.DeviceState.DSExcept) + // { + // RetryTime = 3; + // throw new ProcessException($"设备{InitialConfig.Name}的{CurrentStateToBe.GetEnumDescription()}操作重复3次失败", ex, ExceptionLevel.Warning); + // } + // } + // } + //} + + //private void CheckDeviceOpTimeOut(object state) + //{ + // stateChangedTimer?.Change(Timeout.Infinite, Timeout.Infinite); + + // if (CurrentState != EnumHelper.DeviceState.DSExcept) + // { + // StateChange(EnumHelper.DeviceState.DSExcept); + // } + //} + #endregion + + #region 日志处理 + private void RegisterFileWriterException() + { + LoggerHelper.OnLogExceptionRaised -= LoggerHelper_OnLogExceptionRaised; + // CSVHelper.OnCSVExceptionRaised -= LoggerHelper_OnLogExceptionRaised; + + LoggerHelper.OnLogExceptionRaised += LoggerHelper_OnLogExceptionRaised; + // CSVHelper.OnCSVExceptionRaised += LoggerHelper_OnLogExceptionRaised; + } + // public CSVHelper CSVHelper { get; set; } = new CSVHelper(); + + public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper(); + + public virtual void LogAsync(LogMsg msg) + { + msg.MsgSource = Name; + msg.ThreadId = Thread.CurrentThread.ManagedThreadId; + + //OnLog?.BeginInvoke(msg, null, null); + OnLog?.Invoke(msg); + + //if (InitialConfig.IsEnableLog) + //{ + LoggerHelper.LogAsync(msg); + //} + } + + public virtual void LogAsync(DateTime dt, LogLevel logLevel, string msg) + { + LogAsync(new LogMsg(dt, logLevel, msg)); + } + private void LoggerHelper_OnLogExceptionRaised(DateTime dt, string msg) + { + OnLog?.Invoke(new LogMsg(dt, LogLevel.Error, msg)); + } + /// + /// CSV异步数据输出 + /// + /// CSV输出文件的文件全路径 + /// CSV输出数据 + /// CSV文件表头 + public virtual void CSVRecordAsync(string csvFile, string csvData, string csvHead = "") + { + // CSVHelper.CSVOutputAsync(csvFile, csvData, csvHead); + } + #endregion + + #region 报警记录 + //object _alarmLock = new object(); + //protected virtual async void SaveAlarmCSVAsync(DateTime now, string deviceName, IWarningSet ws) + //{ + // await Task.Run(() => + // { + // LogAsync(now, LogLevel.Warning, $"{ws.WarningCode}-{ws.WarningDescription} {(ws.CurrentStatus ? "发生" : "取消")}"); + + // if (string.IsNullOrWhiteSpace(this.InitialConfig.LogPath) || !InitialConfig.IsEnableCSV) + // return; + + // string path = Path.Combine(InitialConfig.LogPath, $"Alarm_{Name}_{now.ToString("yyyyMMdd")}.csv"); + // string head = "Time,Source,AlarmCode,AlarmDescription,AlarmStatus"; + // string data = $"{now.ToString("HH:mm:ss.fff")},{deviceName},{ws.WarningCode},{ws.WarningDescription},{(ws.CurrentStatus ? "报警发生" : "报警取消")}"; + // CSVRecordAsync(path, data, head); + // }); + //} + #endregion + + #region IDisposable Support + private bool disposedValue = false; // 要检测冗余调用 + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + //释放托管状态(托管对象)。 + stateChangedTimer?.Dispose(); + pauseHandle?.Dispose(); + } + + // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。 + // TODO: 将大型字段设置为 null。 + + disposedValue = true; + } + } + + // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。 + // ~DeviceBase() + // { + // // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。 + // Dispose(false); + // } + + // 添加此代码以正确实现可处置模式。 + public void Dispose() + { + // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。 + Dispose(true); + // TODO: 如果在以上内容中替代了终结器,则取消注释以下行。 + // GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/DH.Commons/Base/GlobalConfig.cs b/DH.Commons/Base/GlobalConfig.cs new file mode 100644 index 0000000..50d93b0 --- /dev/null +++ b/DH.Commons/Base/GlobalConfig.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using AntdUI; + +namespace DH.Commons.Base +{ + public class GlobalConfig : NotifyProperty + { + bool _EnableVibrator=false; + bool _EnableBelt = false; + int _ClearTime=0; + string _name; + private BindingList _InitProcessList = new BindingList(); + private BindingList _StartProcessList = new BindingList(); + private BindingList _StopProcessList = new BindingList(); + private BindingList _StartResetList = new BindingList(); + private BindingList _StopResetList = new BindingList(); + public string Name + { + get => _name; + set + { + if (_name != value) + { + _name = value; + OnPropertyChanged(nameof(Name)); + } + } + } + public bool EnableBelt + { + get => _EnableBelt; + set + { + if (_EnableBelt != value) + { + _EnableBelt = value; + OnPropertyChanged(nameof(EnableBelt)); + } + } + } + public bool EnableVibrator + { + get => _EnableVibrator; + set + { + if (_EnableVibrator != value) + { + _EnableVibrator = value; + OnPropertyChanged(nameof(EnableVibrator)); + } + } + } + public int ClearTime + { + get => _ClearTime; + set + { + if (_ClearTime != value) + { + _ClearTime = value; + OnPropertyChanged(nameof(ClearTime)); + } + } + } + public BindingList InitProcessList + { + get => _InitProcessList; + set + { + if (_InitProcessList == value) return; + _InitProcessList = value; + OnPropertyChanged(nameof(InitProcessList)); + } + } + public BindingList StartProcessList + { + get => _StartProcessList; + set + { + if (_StartProcessList == value) return; + _StartProcessList = value; + OnPropertyChanged(nameof(StartProcessList)); + } + } + public BindingList StopProcessList + { + get => _StopProcessList; + set + { + if (_StopProcessList == value) return; + _StopProcessList = value; + OnPropertyChanged(nameof(StopProcessList)); + } + } + public BindingList StartResetList + { + get => _StartResetList; + set + { + if (_StartResetList == value) return; + _StartResetList = value; + OnPropertyChanged(nameof(StartResetList)); + } + } + public BindingList StopResetList + { + get => _StopResetList; + set + { + if (_StopResetList == value) return; + _StopResetList = value; + OnPropertyChanged(nameof(StopResetList)); + } + } + + + string _imgSavePath; + string _dbSavePath; + string _configSavePath; + + public string ImgSavePath + { + get => _imgSavePath; + set + { + if (_imgSavePath != value) + { + _imgSavePath = value; + OnPropertyChanged(nameof(ImgSavePath)); + } + } + } + + public string DbSavePath + { + get => _dbSavePath; + set + { + if (_dbSavePath != value) + { + _dbSavePath = value; + OnPropertyChanged(nameof(DbSavePath)); + } + } + } + + public string ConfigSavePath + { + get => _configSavePath; + set + { + if (_configSavePath != value) + { + _configSavePath = value; + OnPropertyChanged(nameof(ConfigSavePath)); + } + } + } + } + + + +} diff --git a/DH.Commons/Base/PLCBase.cs b/DH.Commons/Base/PLCBase.cs new file mode 100644 index 0000000..d6e890f --- /dev/null +++ b/DH.Commons/Base/PLCBase.cs @@ -0,0 +1,378 @@ +using System.ComponentModel; +using System.IO.Ports; +using System.Text.Json.Serialization; +using AntdUI; +using DH.Commons.Enums; // 请确保此命名空间包含EnumPLCType + +namespace DH.Commons.Base +{ + public class PLCBase : NotifyProperty + { + + // 私有字段 + private bool _enable; + private bool _connected; + private string _plcName; + private EnumPLCType _plcType; + private string _com = "COM1"; + private int _baudRate = 9600; + private int _dataBit = 8; + private StopBits _stopBit = StopBits.One; + private Parity _parity = Parity.None; + private string _ip = "192.168.6.61"; + private int _port = 502; + private BindingList _PLCItemList = new BindingList(); + + [Category("设备配置")] + [DisplayName("是否启用")] + [Description("是否启用")] + public bool Enable + { + get => _enable; + set + { + if (_enable == value) return; + _enable = value; + OnPropertyChanged(nameof(Enable)); + } + } + + + [Category("状态监控")] + [DisplayName("连接状态")] + [Description("PLC连接状态")] + public bool Connected + { + get => _connected; + set + { + if (_connected == value) return; + _connected = value; + OnPropertyChanged(nameof(Connected)); + } + } + + [Category("设备配置")] + [DisplayName("PLC名称")] + [Description("PLC设备名称")] + public string PLCName + { + get => _plcName; + set + { + if (_plcName == value) return; + _plcName = value; + OnPropertyChanged(nameof(PLCName)); + } + } + + [Category("设备配置")] + [DisplayName("PLC类型")] + [Description("PLC通信协议类型")] + public EnumPLCType PLCType + { + get => _plcType; + set + { + if (_plcType == value) return; + _plcType = value; + OnPropertyChanged(nameof(PLCType)); + } + } + + [Category("串口配置")] + [DisplayName("COM端口")] + [Description("串口号,如COM1")] + public string COM + { + get => _com; + set + { + if (_com == value) return; + _com = value; + OnPropertyChanged(nameof(COM)); + } + } + + [Category("串口配置")] + [DisplayName("波特率")] + [Description("串口通信波特率")] + public int BaudRate + { + get => _baudRate; + set + { + if (_baudRate == value) return; + _baudRate = value; + OnPropertyChanged(nameof(BaudRate)); + } + } + + [Category("串口配置")] + [DisplayName("数据位")] + [Description("数据位长度(5/6/7/8)")] + public int DataBit + { + get => _dataBit; + set + { + if (_dataBit == value) return; + _dataBit = value; + OnPropertyChanged(nameof(DataBit)); + } + } + + [Category("串口配置")] + [DisplayName("停止位")] + [Description("停止位设置")] + public StopBits StopBit + { + get => _stopBit; + set + { + if (_stopBit == value) return; + _stopBit = value; + OnPropertyChanged(nameof(StopBit)); + } + } + + [Category("串口配置")] + [DisplayName("校验位")] + [Description("奇偶校验方式")] + public Parity Parity + { + get => _parity; + set + { + if (_parity == value) return; + _parity = value; + OnPropertyChanged(nameof(Parity)); + } + } + + [Category("网络配置")] + [DisplayName("IP地址")] + [Description("PLC网络地址")] + public string IP + { + get => _ip; + set + { + if (_ip == value) return; + _ip = value; + OnPropertyChanged(nameof(IP)); + } + } + + [Category("网络配置")] + [DisplayName("端口号")] + [Description("网络通信端口")] + public int Port + { + get => _port; + set + { + if (_port == value) return; + _port = value; + OnPropertyChanged(nameof(Port)); + } + } + + [Category("点位配置")] + [DisplayName("点位配置")] + [Description("点位配置")] + public BindingList PLCItemList + { + get => _PLCItemList; + set + { + if (_PLCItemList == value) return; + _PLCItemList = value; + OnPropertyChanged(nameof(PLCItemList)); + } + } + + + public virtual bool PLCConnect() + { + Connected = true; + return true; + } + + public virtual bool PLCDisConnect() + { + Connected = false; + return true; + } + + public virtual Int16 ReadInt16(string address) { return 0; } + + public virtual Int32 ReadInt32(string address) { return 0; } + + public virtual UInt16 ReadUInt16(string address) { return 0; } + + public virtual UInt32 ReadUInt32(string address) { return 0; } + public virtual float ReadFloat(string address) { return 0; } + public virtual bool ReadBool(string address) { return false; } + + public virtual bool WriteInt16(string address, Int16 value, bool waitForReply = true) { return false; } + public virtual bool WriteInt32(string address, Int32 value, bool waitForReply = true) { return false; } + + + public virtual bool WriteUInt16(string address, UInt16 value, bool waitForReply = true) { return false; } + public virtual bool WriteUInt32(string address, UInt32 value, bool waitForReply = true) { return false; } + + public virtual bool WriteFloat(string address, float value, bool waitForReply = true) { return false; } + public virtual bool WriteBool(string address, bool value, bool waitForReply = true) { return false; } + } + + + public class PLCItem : NotifyProperty + { + private bool _selected; + private string _name = string.Empty; + private EnumPLCDataType _type; + private string _value = string.Empty; + private bool _startexecute; + private int _startindex; + private string _address; + /// + /// 是否选中 + /// + public bool Selected + { + get => _selected; + set + { + if (_selected != value) + { + _selected = value; + OnPropertyChanged(nameof(Selected)); + } + } + } + + /// + /// 参数名称 + /// + public string Name + { + get => _name; + set + { + if (_name != value) + { + _name = value; + OnPropertyChanged(nameof(Name)); + } + } + } + public EnumPLCDataType Type + { + get => _type; + set + { + if (_type != value) + { + _type = value; + OnPropertyChanged(nameof(Type)); + } + } + } + /// + /// 参数类型 + /// + public string Address + { + get => _address; + set + { + if (_address != value) + { + _address = value; + OnPropertyChanged(nameof(Address)); + } + } + } + + /// + /// 参数值 + /// + public string Value + { + get => _value; + set + { + if (_value != value) + { + _value = value; + OnPropertyChanged(nameof(Value)); + } + } + } + + /// + /// 启用状态 + /// + public bool StartExecute + { + get => _startexecute; + set + { + if (_startexecute != value) + { + _startexecute = value; + OnPropertyChanged(nameof(StartExecute)); + } + } + } + + + + + + /// + /// 顺序 + /// + public int StartIndex + { + get => _startindex; + set + { + if (_startindex != value) + { + _startindex = value; + OnPropertyChanged(nameof(StartIndex)); + } + } + } + + private CellLink[] cellLinks; + [JsonIgnore] + public CellLink[] CellLinks + { + get { return cellLinks; } + set + { + if (cellLinks == value) return; + cellLinks = value; + OnPropertyChanged(nameof(CellLinks)); + } + } + + //private CellTag[] cellTags; + //[JsonIgnore] + //public CellTag[] CellTags + //{ + // get { return cellTags; } + // set + // { + // if (cellTags == value) return; + // cellTags = value; + // OnPropertyChanged(nameof(CellTags)); + // } + //} + } + + +} \ No newline at end of file diff --git a/DH.Commons/Base/VisionEngineBase.cs b/DH.Commons/Base/VisionEngineBase.cs new file mode 100644 index 0000000..3addef4 --- /dev/null +++ b/DH.Commons/Base/VisionEngineBase.cs @@ -0,0 +1,78 @@ +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Imaging; +using DH.Commons.Enums; +using DH.Commons.Helper; +using HalconDotNet; +using OpenCvSharp; + + + +namespace DH.Commons.Base +{ + /// + /// 视觉处理引擎:1.传统视觉 2.深度学习 + /// CV深度学习 四大领域 + /// Image Classification 图像分类:判别图中物体是什么,比如是猫还是狗; + /// Semantic Segmentation 语义分割:对图像进行像素级分类,预测每个像素属于的类别,不区分个体; + /// Object Detection 目标检测:寻找图像中的物体并进行定位; + /// Instance Segmentation 实例分割:定位图中每个物体,并进行像素级标注,区分不同个体; + /// + public abstract class VisionEngineBase : DeviceBase + { + public List DetectionConfigs = new List(); + #region event + public event Action> OnCropParamsOutput; + public event Action> OnDetectionDone; + public event Action OnDetectionWarningStop;//有无检测 需要报警停机 + #endregion + //public VisionEngineInitialConfigBase IConfig + //{ + // get => InitialConfig as VisionEngineInitialConfigBase; + //} + // public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper(); + public string BatchNO { get; set; } + + public HTuple hv_ModelID; + + public abstract DetectStationResult RunInference(MatSet originImgSet, string detectionId = null); + + //public abstract void SaveDetectResultAsync(DetectStationResult detectResult); + + + + public virtual void DetectionDone(string detectionId, Bitmap image, List detectionResults) + { + OnDetectionDone?.Invoke(detectionId, image, detectionResults); + } + + public virtual void DetectionWarningStop(string detectionDes) + { + OnDetectionWarningStop?.Invoke(detectionDes); + } + public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper(); + public virtual void SaveImageAsync(string fullname, Bitmap saveMap, ImageFormat imageFormat) + { + if (saveMap != null) + { + ImageSaveSet imageSaveSet = new ImageSaveSet() + { + FullName = fullname, + SaveImage = saveMap.CopyBitmap(), + ImageFormat = imageFormat.DeepSerializeClone() + + }; + + ImageSaveHelper.ImageSaveAsync(imageSaveSet); + } + } + } + + +} + + + + + diff --git a/DH.Commons/Base/VisualLocalization.cs b/DH.Commons/Base/VisualLocalization.cs new file mode 100644 index 0000000..66c7694 --- /dev/null +++ b/DH.Commons/Base/VisualLocalization.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; + +namespace DH.Commons.Base +{ + public class VisualLocalization + { + // 配置属性 + public string CameraName { get; set; } + public string ModelPath { get; set; } + public string ImgPath { get; set; } + public string Threshold { get; set; } + public string Direction { get; set; } + public string Speed { get; set; } + + public string MSpeed { get; set; } + + // 配置文件路径 + private const string ConfigFile = "VisualConfigs.json"; + private static readonly object _fileLock = new object(); + + /// + /// 保存当前配置(存在则更新,不存在则新增) + /// + public void Save() + { + lock (_fileLock) + { + var list = LoadAll(); + var existing = list.FirstOrDefault(c => c.CameraName == CameraName); + + if (existing != null) + { + // 更新现有配置 + existing.ModelPath = ModelPath; + existing.ImgPath = ImgPath; + existing.Threshold = Threshold; + existing.Direction = Direction; + existing.Speed = Speed; + existing.MSpeed = MSpeed; + } + else + { + list.Add(this); + } + + SaveAll(list); + } + } + + /// + /// 获取全部配置列表 + /// + public static List LoadAll() + { + lock (_fileLock) + { + if (!File.Exists(ConfigFile)) return new List(); + + var json = File.ReadAllText(ConfigFile); + return JsonSerializer.Deserialize>(json) + ?? new List(); + } + } + + private static void SaveAll(List list) + { + var options = new JsonSerializerOptions + { + WriteIndented = true, + IgnoreNullValues = true + }; + + File.WriteAllText(ConfigFile, JsonSerializer.Serialize(list, options)); + } + } +} \ No newline at end of file diff --git a/DH.Commons/DH.Commons.csproj b/DH.Commons/DH.Commons.csproj index 433b8fb..4771958 100644 --- a/DH.Commons/DH.Commons.csproj +++ b/DH.Commons/DH.Commons.csproj @@ -13,15 +13,23 @@ + + + + + + + ..\X64\Debug\DVPCameraCS64.dll + ..\x64\Debug\halcondotnet.dll diff --git a/DH.Commons/Enums/ClassHelper.cs b/DH.Commons/Enums/ClassHelper.cs deleted file mode 100644 index 6270021..0000000 --- a/DH.Commons/Enums/ClassHelper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DH.Commons.Enums -{ - public class CameraInfo - { - public string CamName { get; set; } - public string Serinum { get; set; } - public string IP { get; set; } - } - -} diff --git a/DH.Commons/Enums/Enum.cs b/DH.Commons/Enums/Enum.cs index 5405e52..e13843a 100644 --- a/DH.Commons/Enums/Enum.cs +++ b/DH.Commons/Enums/Enum.cs @@ -7,12 +7,62 @@ using System.Threading.Tasks; namespace DH.Commons.Enums { + public enum EnumStatus + { + 待机中, + 运行中, + 清料中, + 警告, + 异常 + } + public enum ModelType + { + 图像分类 = 1, + 目标检测 = 2, + 语义分割 = 3, + 实例分割 = 4, + 目标检测GPU = 5 + } + public enum SelectPicType + { + [Description("训练图片")] + train = 0, + [Description("测试图片")] + test + + } + public enum NetModel + { + [Description("目标检测")] + training = 0, + [Description("语义分割")] + train_seg, + [Description("模型导出")] + emport, + [Description("推理预测")] + infernce + + } + public enum EnumCamType + { + [Description("度申相机")] + 度申Do3think = 0, + [Description("海康相机")] + 海康hik , + + } + + public enum EnumPLCType { - 信捷XC_串口, - 信捷XC_网口, - 信捷XD_串口, - 信捷XD_网口 + [Description("信捷XC串口")] + 信捷XC串口 = 0, + [Description("信捷XC网口")] + 信捷XC网口 = 1, + [Description("信捷XD串口")] + 信捷XD串口 = 2, + [Description("信捷XD网口")] + 信捷XD网口 = 3 } @@ -28,32 +78,84 @@ namespace DH.Commons.Enums public enum EnumPLCOutputIO { 转盘方向=0, - 转盘速度=1, - 转盘使能=2, - 转盘启动=3, - 转盘清料=4, - 指示灯绿=5, - 指示灯黄=6, - 指示灯红=7, - 蜂鸣器=8, - 振动盘=9, - 皮带=10, - 工位1=11, - 工位2=12, - 工位3=13, - 工位4=14, - 工位5=15, - OK料盒=16, - NG料盒=17, - OK吹气时间=18, - NG吹气时间=19, - 产品计数=20, - 计数清零=21, - 工件最小值=22, - 工具最大值=23, - 启用心跳=24, - 心跳=25 + 转盘速度, + 转盘使能, + 转盘启动, + 转盘清料, + 指示灯绿, + 指示灯黄, + 指示灯红, + 蜂鸣器, + 振动盘, + 皮带, + 工位1, + 工位2, + 工位3, + 工位4, + 工位5, + 工位6 , + 工位7 , + 工位8 , + 工位9 , + 工位10 , + 相机触发时间, + 吹气时间, + 产品计数, + 计数清零, + 工件最小值, + 工件最大值, + 启用心跳, + 心跳地址, + 挡料电机回原点, + 挡料电机回原点速度, + 挡料电机速度, + 挡料电机顺时针, + 挡料电机逆时针, + 挡料电机位置, + OK脉冲, + NG脉冲, + 状态复位, + 启用定位, + 定位完成脉冲值, + 相机步进原点, + 相机步进位置, + 相机步进速度, + 相机步进顺时针, + 相机步进逆时针, + 点动相机步进, + 点动挡杆步进, + 相机步进实时位置, + 挡料电机实时位置 + + + + } + + + public enum EnumPLCDataType + { + 单字整型, + 双字整型, + 浮点型, + 布尔型 + } + + public enum EnumBool + { + 关闭, + 启用 + } + public enum EnumBool1 + { + False, + True + } + + public enum EnumDetectionType + { + 深度学习, + 尺寸测量 } diff --git a/DH.Commons/Exception/ExceptionHelper.cs b/DH.Commons/Exception/ExceptionHelper.cs new file mode 100644 index 0000000..9b49522 --- /dev/null +++ b/DH.Commons/Exception/ExceptionHelper.cs @@ -0,0 +1,64 @@ +using System; +using static DH.Commons.Enums.EnumHelper; + + +namespace DH.Commons.Helper +{ + public enum ExceptionLevel + { + Info = 0, + Warning = 1, + Fatal = 2, + } + + //public delegate void OnProcessExceptionRaisedDelegate(DateTime dt, ProcessException ex); + //[Serializable] + public class ProcessException : Exception + { + public ExceptionLevel Level { get; set; } = ExceptionLevel.Warning; + + public ProcessException() + { + } + + public ProcessException(Exception ex, ExceptionLevel lvl = ExceptionLevel.Warning) : base(ex.Message, ex) + { + Level = lvl; + ExceptionNotice(); + } + + public ProcessException(string error, Exception ex = null, ExceptionLevel lvl = ExceptionLevel.Warning) : base(error, ex) + { + Level = lvl; + ExceptionNotice(); + } + + public void ExceptionNotice() + { + //OnProcessExceptionRaised?.Invoke(DateTime.Now, this); + } + } + + public static class ExceptionHelper + { + public static LogLevel LogLevel = LogLevel.Information; + public static string GetExceptionMessage(this Exception ex) + { + string msg = "异常信息:" + ex.Message; + if (ex.InnerException != null) + { + msg += ";\t内部异常信息:" + ex.InnerException.GetExceptionMessage(); + } + + if (LogLevel <= LogLevel.Assist) + { + msg += (";\r\n\t\tStackTrace:" + ex.StackTrace); + } + return msg; + } + } + + public class AuthorityException : ProcessException + { + } +} diff --git a/DH.Commons/Helper/AttributeHelper.cs b/DH.Commons/Helper/AttributeHelper.cs new file mode 100644 index 0000000..5236ed2 --- /dev/null +++ b/DH.Commons/Helper/AttributeHelper.cs @@ -0,0 +1,162 @@ +using DH.Commons.Enums; +using System; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using static DH.Commons.Enums.EnumHelper; + + +namespace DH.Commons.Enums +{ + /// + /// 设备特性,指示该信息的设备类型,适用于设备信息和配置信息 + /// + public class DeviceAttribute : Attribute + { + /// + /// 设备类型 + /// + public string TypeCode { get; set; } + + public string TypeDescription { get; set; } + + /// + /// 特性修饰类别 + /// + public DeviceAttributeType AttrType { get; set; } + + public DeviceAttribute(string typeCode, string typeDesc, EnumHelper.DeviceAttributeType attrType) + { + TypeCode = typeCode; + TypeDescription = typeDesc; + AttrType = attrType; + } + } + + /// + /// 预置状态特性 指定该修饰信息的前置状态允许范围 + /// + public class PreStateAttribute : Attribute + { + public int PreState { get; set; } + public PreStateAttribute(int _preState) + { + PreState = _preState; + } + + /// + /// 检查当前待执行操作的前置状态要求是否合法 + /// + /// + /// + public bool CheckPreStateValid(int currentState) + { + return (currentState & PreState) == currentState; + } + } + + public class ColorSelectAttribute : Attribute + { + public string SelectedColor { get; set; } + public ColorSelectAttribute(string selectedColor) + { + SelectedColor = selectedColor; + } + } + + public class FontColorSelectAttribute : Attribute + { + public string SelectedColor { get; set; } + public FontColorSelectAttribute(string selectedColor) + { + SelectedColor = selectedColor; + } + } + + public enum InvokeType + { + /// + /// 不公开调用 + /// + [Description("不公开调用")] + NoneInvoke = 0, + /// + /// 测试调用 + /// + [Description("测试调用")] + TestInvoke = 1, + /// + /// 标定调用 + /// + [Description("标定调用")] + CalibInvoke = 2, + } + + /// + /// 用来修饰对外开放的调用方法的特性 + /// 调用方法参数顺序:IOperationConfig,InvokeDevice,SourceDevice + /// + public class ProcessMethodAttribute : Attribute + { + public string MethodCode { get; set; } + public string MethodDesc { get; set; } + + /// + /// 是否提供人工调用测试 + /// + public InvokeType InvokeType { get; set; } + + public string DeviceType { get; set; } + + public ProcessMethodAttribute(string deviceType, string code, string description, InvokeType invokeType) + { + DeviceType = deviceType; + MethodCode = code; + MethodDesc = description; + InvokeType = invokeType; + } + } + + public class SwitchDisplayAttribute : Attribute + { + public string SwitchName { get; set; } + + public bool SwithOnStatus { get; set; } = true; + + public SwitchDisplayAttribute(string name, bool status) + { + SwitchName = name; + SwithOnStatus = status; + } + } + + public class ElementAttribute : Attribute + { + public string Name { get; set; } + + public string Desc { get; set; } + + public string IconPath { get; set; } + + public bool IsShowInToolBar { get; set; } + + public ElementAttribute(string desc, string iconPath, bool isShowInToolBar = true, [CallerMemberName] string name = "") + { + Name = name; + Desc = desc; + IconPath = iconPath; + IsShowInToolBar = isShowInToolBar; + } + } + + public class ProcessAttribute : Attribute + { + public string ProcessCode { get; set; } + public DeviceAttributeType AttrType { get; set; } + + public ProcessAttribute(string stationCode, DeviceAttributeType attrType) + { + ProcessCode = stationCode; + AttrType = attrType; + } + } +} \ No newline at end of file diff --git a/DH.Commons/Helper/ConfigHelper.cs b/DH.Commons/Helper/ConfigHelper.cs new file mode 100644 index 0000000..b77febc --- /dev/null +++ b/DH.Commons/Helper/ConfigHelper.cs @@ -0,0 +1,280 @@ +using System; +using System.Diagnostics; +using System.IO; +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 +{ + public static class ConfigHelper + { + private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions + { + WriteIndented = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + IgnoreNullValues = true + }; + + /// + /// 配置存储根目录 + /// + private static string ConfigsRoot => Path.Combine( + AppDomain.CurrentDomain.BaseDirectory, + "configs"); + + /// + /// 获取当前方案的主配置文件路径 + /// + private static string CurrentConfigPath + { + get + { + ValidateCurrentScheme(); + return Path.Combine( + ConfigsRoot, + $"config_{SystemModel.CurrentScheme}.json"); + } + } + + /// + /// 获取当前方案的备份目录路径 + /// + private static string CurrentBackupDir + { + get + { + ValidateCurrentScheme(); + return Path.Combine( + ConfigsRoot, + $"bak_{SystemModel.CurrentScheme}"); + } + } + + /// + /// 初始化新方案(创建空文件) + /// + public static void InitializeScheme(string scheme) + { + SystemModel.CurrentScheme = scheme; + + // 创建空配置文件 + if (!File.Exists(CurrentConfigPath)) + { + Directory.CreateDirectory(ConfigsRoot); + File.WriteAllText(CurrentConfigPath, "{}"); + } + + // 创建备份目录 + Directory.CreateDirectory(CurrentBackupDir); + } + + /// + /// 保存当前配置(自动备份) + /// + public static void SaveConfig() + { + ValidateCurrentScheme(); + + // 确保配置目录存在 + Directory.CreateDirectory(ConfigsRoot); + + // 备份现有配置 + if (File.Exists(CurrentConfigPath)) + { + var backupName = $"config_{SystemModel.CurrentScheme}_{DateTime.Now:yyyyMMddHHmmss}.json"; + var backupPath = Path.Combine(CurrentBackupDir, backupName); + + Directory.CreateDirectory(CurrentBackupDir); + File.Copy(CurrentConfigPath, backupPath); + } + //重置标签文件路径和内容 + ConfigModel.DetectionList.ForEach(config => + { + GenerateLabelFile(config); + }); + + // 序列化当前配置 + var json = JsonSerializer.Serialize(new + { + ConfigModel.CameraBaseList, + ConfigModel.PLCBaseList, + ConfigModel.DetectionList, + ConfigModel.GlobalList, + }, _jsonOptions); + + // 写入新配置 + File.WriteAllText(CurrentConfigPath, json); + } + private static void GenerateLabelFile(DetectionConfig config) + { + try + { + if (config.DetectionLableList == null || string.IsNullOrEmpty(config.In_lable_path)) + return; + + // 确保目录存在 + var directory = Path.GetDirectoryName(config.In_lable_path); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + // 写入文件内容 + using (var writer = new StreamWriter(config.In_lable_path, false)) + { + foreach (var label in config.DetectionLableList) + { + //是否假如判断标签为中文转为为英文 + //string pinyinlabel = FileHelper.ConvertHanzitoPinyinWithNumbers(label.LabelName.ToString()); + //if (FileHelper.IsAlphaNumericOnly(pinyinlabel)) + //{ + + //} + + // 根据实际需求格式化输出 + writer.WriteLine(label.LabelName.ToString()); // 假设DetectionLable重写了ToString() + + // 或者明确指定格式: + // writer.WriteLine($"{label.Id},{label.Name},{label.Confidence}"); + } + } + } + catch (Exception ex) + { + Debug.WriteLine($"生成标签文件失败: {ex.Message}"); + // 可以考虑记录更详细的日志 + } + } + /// + /// 加载当前方案配置 + /// + public static void LoadConfig() + { + ValidateCurrentScheme(); + + if (!File.Exists(CurrentConfigPath)) + { + InitializeScheme(SystemModel.CurrentScheme); + return; + } + + var json = File.ReadAllText(CurrentConfigPath); + var data = JsonSerializer.Deserialize(json, _jsonOptions); + + ConfigModel.CameraBaseList = data?.Cameras ?? new List(); + ConfigModel.DetectionList = data?.Detections ?? new List(); + ConfigModel.PLCBaseList = data?.PLCs ?? new List(); + ConfigModel.GlobalList = data?.GlobalConfigs ?? new List(); + } + + /// + /// 验证当前方案有效性 + /// + private static void ValidateCurrentScheme() + { + if (string.IsNullOrWhiteSpace(SystemModel.CurrentScheme)) + throw new InvalidOperationException("当前方案未设置"); + } + /// + /// 派生新方案(基于当前方案创建副本) + /// + /// 新方案名称 + public static void DeriveScheme(string newSchemeName) + { + // 验证输入 + if (string.IsNullOrWhiteSpace(newSchemeName)) + { + throw new ArgumentException("新方案名称不能为空"); + } + + // 验证当前方案是否有效 + ValidateCurrentScheme(); + + // 检查新方案是否已存在 + var newConfigPath = Path.Combine(ConfigsRoot, $"config_{newSchemeName}.json"); + if (File.Exists(newConfigPath)) + { + throw new InvalidOperationException($"方案 {newSchemeName} 已存在"); + } + + // 保存当前配置确保最新 + SaveConfig(); + + try + { + // 复制配置文件 + File.Copy(CurrentConfigPath, newConfigPath); + + // 创建备份目录 + var newBackupDir = Path.Combine(ConfigsRoot, $"bak_{newSchemeName}"); + Directory.CreateDirectory(newBackupDir); + + // 可选:自动切换新方案 + // SystemModel.CurrentScheme = newSchemeName; + } + catch (IOException ex) + { + throw new InvalidOperationException($"方案派生失败: {ex.Message}", ex); + } + } + + /// + /// 删除指定方案的配置文件及备份目录 + /// + /// 要删除的方案名称 + /// 当方案名称为空时抛出 + /// 文件操作失败时抛出 + public static void DeleteSchemeConfig(string schemeName) + { + if (string.IsNullOrWhiteSpace(schemeName)) + throw new ArgumentException("方案名称无效"); + + // 构造路径 + var configPath = Path.Combine(ConfigsRoot, $"config_{schemeName}.json"); + var backupDir = Path.Combine(ConfigsRoot, $"bak_{schemeName}"); + + try + { + // 删除配置文件 + if (File.Exists(configPath)) + { + File.Delete(configPath); + } + + // 删除备份目录(递归删除) + if (Directory.Exists(backupDir)) + { + Directory.Delete(backupDir, true); + } + } + catch (Exception ex) when (ex is IOException || ex is UnauthorizedAccessException) + { + throw new IOException($"删除方案 {schemeName} 的配置文件失败: {ex.Message}", ex); + } + } + + + /// + /// 配置数据模型(内部类) + /// + private class ConfigData + { + [JsonPropertyName("cameraBaseList")] + public List Cameras { get; set; } = new List(); + + [JsonPropertyName("plcBaseList")] + public List PLCs { get; set; } = new List(); + + [JsonPropertyName("detectionList")] + public List Detections { get; set; } = new List(); + [JsonPropertyName("globalList")] + public List GlobalConfigs { get; set; } = new List(); + + + } + } +} \ No newline at end of file diff --git a/DH.Commons/Helper/EnumHelper.cs b/DH.Commons/Helper/EnumHelper.cs index 0308390..10898bc 100644 --- a/DH.Commons/Helper/EnumHelper.cs +++ b/DH.Commons/Helper/EnumHelper.cs @@ -76,159 +76,83 @@ namespace DH.Commons.Enums } } - //public static System.Windows.Media.Color GetEnumSelectedMediaColor(this Enum enumObj) - //{ - // Type t = enumObj.GetType(); - // FieldInfo f = t.GetField(enumObj.ToString()); - - // ColorSelectAttribute attr = f.GetCustomAttribute(); - // if (attr != null) - // { - // var prop = typeof(System.Windows.Media.Colors).GetProperties().FirstOrDefault(p => p.Name == attr.SelectedColor); - // if (prop != null) - // { - // return (System.Windows.Media.Color)prop.GetValue(null); - // } - // } - // return System.Windows.Media.Colors.Transparent; - //} - - //public static System.Drawing.Color GetEnumSelectedColor(this Enum enumObj) - //{ - // Type t = enumObj.GetType(); - // FieldInfo f = t.GetField(enumObj.ToString()); - - // ColorSelectAttribute attr = f.GetCustomAttribute(); - // if (attr != null) - // { - // return System.Drawing.Color.FromName(attr.SelectedColor); - // } - // else - // { - // return System.Drawing.Color.Transparent; - // } - //} - - //public static System.Drawing.Color GetEnumSelectedFontColor(this Enum enumObj) - //{ - // Type t = enumObj.GetType(); - // FieldInfo f = t.GetField(enumObj.ToString()); - - // var attr = f.GetCustomAttribute(); - // if (attr != null) - // { - // return System.Drawing.Color.FromName(attr.SelectedColor); - // } - // else - // { - // return System.Drawing.Color.Transparent; - // } - //} - - //public static string GetEnumSelectedColorString(this Enum enumObj) - //{ - // Type t = enumObj.GetType(); - // FieldInfo f = t.GetField(enumObj.ToString()); - - // ColorSelectAttribute attr = f.GetCustomAttribute(); - // if (attr != null) - // { - // return attr.SelectedColor; - // } - // else - // { - // return "Transparent"; - // } - //} - + // 根据描述获取枚举值(泛型方法) + public static T GetEnumFromDescription(string description) where T : Enum + { + Type enumType = typeof(T); + foreach (T value in Enum.GetValues(enumType)) + { + string desc = GetEnumDescription(value); + if (desc == description) + { + return value; + } + } + throw new ArgumentException($"在枚举 {enumType.Name} 中未找到描述为 '{description}' 的值"); + } /// - /// 当枚举牵涉到状态变换,检查现状态是否满足待转换的状态的前置状态要求 + /// 获取枚举类型的所有描述文本 /// - /// - /// - /// - //public static bool CheckPreStateValid(this Enum stateToBe, int currentState) - //{ - // Type t = stateToBe.GetType(); - // FieldInfo f = t.GetField(stateToBe.ToString()); + /// 枚举类型 + /// 描述文本列表 + public static List GetEnumDescriptions(Type enumType) + { + // 验证类型是否为枚举 + if (!enumType.IsEnum) + throw new ArgumentException("传入的类型必须是枚举类型", nameof(enumType)); - // PreStateAttribute attr = f.GetCustomAttribute(); - // if (attr == null) - // { - // return true; - // } - // else - // { - // return attr.CheckPreStateValid(currentState); - // } - //} + var descriptions = new List(); - /// - /// 设备状态定义 - /// 未初始化和异常状态无前置状态要求 - /// 初始化操作前置状态必须是未初始化、关闭状态和异常状态 - /// 打开前置必须是初始化和暂停 - /// 关闭前置必须是打开和暂停和异常 - /// 暂停前置必须是打开 - /// - //public enum DeviceState - //{ - // TBD = -1, + foreach (var value in Enum.GetValues(enumType)) + { + var fieldInfo = enumType.GetField(value.ToString()); + var attribute = fieldInfo.GetCustomAttribute(); + descriptions.Add(attribute?.Description ?? value.ToString()); + } - // [ColorSelect("Gray")] - // [FontColorSelect("Black")] - // [Description("未初始化")] - // DSUninit = 1, + return descriptions; + } + public static string GetEnumDescription1(Enum value) + { + var field = value.GetType().GetField(value.ToString()); + var attribute = field.GetCustomAttributes(typeof(DescriptionAttribute), false) + .FirstOrDefault() as DescriptionAttribute; + return attribute?.Description ?? value.ToString(); + } - // [ColorSelect("Gold")] - // [FontColorSelect("White")] - // [PreState(1 + 2 + 4 + 8 + 32)] - // [Description("初始化")] - // DSInit = 2, + public static System.Drawing.Color GetEnumSelectedColor(this Enum enumObj) + { + Type t = enumObj.GetType(); + FieldInfo f = t.GetField(enumObj.ToString()); - // [ColorSelect("Lime")] - // [FontColorSelect("Black")] - // [PreState(2 + 4 + 16)] - // [Description("运行中")] - // DSOpen = 4, + ColorSelectAttribute attr = f.GetCustomAttribute(); + if (attr != null) + { + return System.Drawing.Color.FromName(attr.SelectedColor); + } + else + { + return System.Drawing.Color.Transparent; + } + } - // [ColorSelect("Gray")] - // [FontColorSelect("White")] - // [PreState(1 + 4 + 8 + 16 + 32)] - // [Description("关闭")] - // DSClose = 8, + public static System.Drawing.Color GetEnumSelectedFontColor(this Enum enumObj) + { + Type t = enumObj.GetType(); + FieldInfo f = t.GetField(enumObj.ToString()); - // [ColorSelect("Gold")] - // [FontColorSelect("White")] - // [PreState(4 + 16)] - // [Description("暂停")] - // DSPause = 16, + var attr = f.GetCustomAttribute(); + if (attr != null) + { + return System.Drawing.Color.FromName(attr.SelectedColor); + } + else + { + return System.Drawing.Color.Transparent; + } + } - // [ColorSelect("Red")] - // [FontColorSelect("White")] - // [Description("异常")] - // DSExcept = 32 - //} - - ///// - ///// 工序状态 - ///// - //public enum RunState - //{ - // [ColorSelect("Gold")] - // [Description("空闲")] - // Idle = 1, - // [ColorSelect("Lime")] - // [Description("运行中")] - // Running = 2, - // [ColorSelect("Gray")] - // [Description("停止")] - // Stop = 3, - // [ColorSelect("Red")] - // [Description("宕机")] - // Down = 99, - //} [Flags] public enum DeviceAttributeType @@ -361,7 +285,38 @@ namespace DH.Commons.Enums [Description("测量结果")] MeasureResult = 31, } - + + public enum LogLevel + { + [Description("详细")] + [ColorSelect("White")] + [FontColorSelect("Green")] + Detail = 2, + [Description("信息")] + [ColorSelect("White")] + [FontColorSelect("Dark")] + Information = 3, + [Description("辅助")] + [ColorSelect("White")] + [FontColorSelect("Blue")] + Assist = 4, + [Description("动作")] + [ColorSelect("DarkGreen")] + [FontColorSelect("Yellow")] + Action = 5, + [Description("错误")] + [ColorSelect("Orange")] + [FontColorSelect("White")] + Error = 6, + [Description("警报")] + [ColorSelect("Brown")] + [FontColorSelect("White")] + Warning = 7, + [Description("异常")] + [ColorSelect("Red")] + [FontColorSelect("White")] + Exception = 8, + } //public enum CameraDriverType //{ // Halcon, @@ -382,6 +337,59 @@ namespace DH.Commons.Enums // NG = -1, // IGNORE = -999, //} + public enum DeviceState + { + TBD = -1, + + [ColorSelect("Gray")] + [FontColorSelect("Black")] + [Description("未初始化")] + DSUninit = 1, + + [ColorSelect("Gold")] + [FontColorSelect("White")] + [PreState(1 + 2 + 4 + 8 + 32)] + [Description("初始化")] + DSInit = 2, + + [ColorSelect("Lime")] + [FontColorSelect("Black")] + [PreState(2 + 4 + 16)] + [Description("运行中")] + DSOpen = 4, + + [ColorSelect("Gray")] + [FontColorSelect("White")] + [PreState(1 + 4 + 8 + 16 + 32)] + [Description("关闭")] + DSClose = 8, + + [ColorSelect("Gold")] + [FontColorSelect("White")] + [PreState(4 + 16)] + [Description("暂停")] + DSPause = 16, + + [ColorSelect("Red")] + [FontColorSelect("White")] + [Description("异常")] + DSExcept = 32 + } + public enum RunState + { + [ColorSelect("Gold")] + [Description("空闲")] + Idle = 1, + [ColorSelect("Lime")] + [Description("运行中")] + Running = 2, + [ColorSelect("Gray")] + [Description("停止")] + Stop = 3, + [ColorSelect("Red")] + [Description("宕机")] + Down = 99, + } public enum PriorityDirection { 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.Commons/Helper/ImageSaveHelper.cs b/DH.Commons/Helper/ImageSaveHelper.cs new file mode 100644 index 0000000..3482766 --- /dev/null +++ b/DH.Commons/Helper/ImageSaveHelper.cs @@ -0,0 +1,107 @@ + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using DH.Commons.Helper; + +namespace DH.Commons.Enums +{ + public class ImageSaveHelper + { + public event Action OnImageSaveExceptionRaised; + + //private string baseDirectory = ""; + //public string BaseDirectory + //{ + // get => baseDirectory; + // set + // { + // baseDirectory = value; + // if (string.IsNullOrWhiteSpace(baseDirectory) || !Path.IsPathRooted(baseDirectory)) + // { + // baseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images"); + // } + // } + //} + public bool EnableImageSave { get; set; } = true; + + public ImageSaveHelper() { } + public ImageSaveHelper(bool enableImageSave = true) + { + EnableImageSave = enableImageSave; + } + + + object lockObj = new object(); + ////耗时操作从 _taskFactory分配线程 + //public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); + readonly ConcurrentQueue _imageQueue = new ConcurrentQueue(); + Task _saveTask = null; + readonly object _saveLock = new object(); + + public async void ImageSaveAsync(ImageSaveSet set) + { + if (!EnableImageSave) + return; + + await Task.Run(() => + { + _imageQueue.Enqueue(set); + + lock (_saveLock) + { + if (_saveTask == null) + { + _saveTask = Task.Run(async () => + { + try + { + while (true) + { + while (_imageQueue.Count > 0) + { + if (_imageQueue.TryDequeue(out ImageSaveSet saveSet)) + { + if (!Directory.Exists(Path.GetDirectoryName(saveSet.FullName))) + { + Directory.CreateDirectory(Path.GetDirectoryName(saveSet.FullName)); + } + if (saveSet.SaveImage != null) + { + saveSet.SaveImage.Save(saveSet.FullName, saveSet.ImageFormat); + saveSet.SaveImage.Dispose(); + } + saveSet = null; + } + } + + await Task.Delay(2000); + } + } + catch (Exception ex) + { + OnImageSaveExceptionRaised?.Invoke(DateTime.Now, $"图片保存异常:{ex.GetExceptionMessage()}"); + } + }); + } + } + }); + } + } + + public class ImageSaveSet + { + public string FullName { get; set; }//带后缀 全路径 + + public Bitmap SaveImage { get; set; } + + public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg; + } +} diff --git a/DH.Commons/Helper/LoggerHelper.cs b/DH.Commons/Helper/LoggerHelper.cs new file mode 100644 index 0000000..d8161c6 --- /dev/null +++ b/DH.Commons/Helper/LoggerHelper.cs @@ -0,0 +1,138 @@ +using DH.Commons.Helper; +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using static DH.Commons.Enums.EnumHelper; + +namespace DH.Commons.Enums +{ + public interface ILogOutput + { + event Action OnLogMsgOutput; + void LogDisplay(LogMsg msg); + } + public interface ILogger + { + event Action OnLog; + LoggerHelper LoggerHelper { get; set; } + //void LogAsync(DateTime dt, LogLevel loglevel, string msg); + void LogAsync(LogMsg msg); + } + public class LoggerHelper + { + public event Action OnLogExceptionRaised; + + public string LogPath { get; set; } + public string LogPrefix { get; set; } + + LogLevel LogLevel = LogLevel.Information; + + public LoggerHelper() { } + public LoggerHelper(string logPath, string logPrefix, LogLevel logLevel = LogLevel.Information) + { + LogPath = logPath; + LogPrefix = logPrefix; + + LogLevel = logLevel; + } + + public void SetLogLevel(LogLevel logLevel) + { + if (LogLevel != logLevel) + LogLevel = logLevel; + } + ////耗时操作从 _taskFactory分配线程 + //public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); + readonly ConcurrentQueue _logQueue = new ConcurrentQueue(); + Task _logTask = null; + readonly object _logLock = new object(); + + public async void LogAsync(LogMsg msg) + { + await Task.Run(() => + { + _logQueue.Enqueue(msg); + + lock (_logLock) + { + if (_logTask == null) + { + _logTask = Task.Run(async () => + { + string filePath = Path.Combine(LogPath, $"{(string.IsNullOrWhiteSpace(LogPrefix) ? "Log_" : ("Log_" + LogPrefix + "_"))}{DateTime.Now.ToString("yyyyMMdd")}.txt"); + try + { + if (!StaticHelper.CheckFilesCanUse(filePath)) + { + OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}被占用,无法写入"); + return; + } + using (StreamWriter writer = new StreamWriter(filePath, true, System.Text.Encoding.UTF8)) + { + while (true) + { + if (!Directory.Exists(LogPath)) + { + Directory.CreateDirectory(LogPath); + } + + while (_logQueue.Count > 0) + { + if (_logQueue.TryDequeue(out LogMsg log)) + { + if (log.LogLevel >= LogLevel) + { + writer.WriteLine($"{log.LogTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}[{log.ThreadId}]\t{log.LogLevel.GetEnumDescription()}\t{log.Msg}"); + } + } + } + writer.Flush(); + + await Task.Delay(2000); + } + } + } + catch (Exception ex) + { + //OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}写入异常:/*{ex.GetExceptionMessage()*/}"); + OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}写入异常"); + } + }); + } + } + }); + } + + public void LogAsync(DateTime dt, LogLevel logLevel, string msg) + { + LogAsync(new LogMsg(dt, logLevel, msg)); + } + } + + public class LogMsg + { + public DateTime LogTime { get; set; } + public LogLevel LogLevel { get; set; } + //public string Prefix { get; set; } + public string Msg { get; set; } + + public string MsgSource { get; set; } + + public int ThreadId { get; set; } + + public LogMsg() { } + public LogMsg(DateTime dt, LogLevel logLevel, string msg) + { + LogTime = dt; + LogLevel = logLevel; + Msg = msg; + } + + public override string ToString() + { + return $"{LogTime.ToString("HH:mm:ss.fff")}\t{MsgSource}\t{Msg}"; + } + } +} diff --git a/DH.Commons/Helper/SchemeHelper.cs b/DH.Commons/Helper/SchemeHelper.cs new file mode 100644 index 0000000..5e1be07 --- /dev/null +++ b/DH.Commons/Helper/SchemeHelper.cs @@ -0,0 +1,169 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; + +namespace DH.Commons.Helper +{ + public static class SchemeHelper + { + private const string DefaultSchemeName = "默认方案"; + private static readonly string ConfigFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "schemes.json"); + + /// + /// 方案配置数据结构 + /// + private class SchemeConfig + { + public List Schemes { get; set; } = new List(); + public string CurrentScheme { get; set; } = DefaultSchemeName; + } + + /// + /// 初始化配置(首次运行时调用) + /// + public static void Initialize() + { + if (!File.Exists(ConfigFilePath)) + { + var defaultConfig = new SchemeConfig + { + Schemes = new List { DefaultSchemeName }, + CurrentScheme = DefaultSchemeName + }; + SaveConfig(defaultConfig); + } + } + + /// + /// 获取所有方案 + /// + public static List GetAllSchemes() + { + var config = LoadConfig(); + return config.Schemes ?? new List(); + } + + /// + /// 添加新方案 + /// + public static void AddScheme(string schemeName) + { + if (string.IsNullOrWhiteSpace(schemeName)) + throw new ArgumentException("方案名称无效"); + + var config = LoadConfig(); + + if (config.Schemes.Contains(schemeName)) + throw new InvalidOperationException($"方案 {schemeName} 已存在"); + + config.Schemes.Add(schemeName); + SaveConfig(config); + } + + /// + /// 设置当前方案 + /// + public static void SetCurrentScheme(string schemeName) + { + var config = LoadConfig(); + + if (!config.Schemes.Contains(schemeName)) + throw new KeyNotFoundException($"方案 {schemeName} 不存在"); + + config.CurrentScheme = schemeName; + SaveConfig(config); + } + + /// + /// 获取当前方案 + /// + public static string GetCurrentScheme() + { + var config = LoadConfig(); + return !string.IsNullOrEmpty(config.CurrentScheme) + ? config.CurrentScheme + : DefaultSchemeName; + } + + /// + /// 删除指定方案 + /// + public static void DeleteScheme(string schemeName) + { + if (string.IsNullOrWhiteSpace(schemeName)) + throw new ArgumentException("方案名称无效"); + + var config = LoadConfig(); + + if (!config.Schemes.Contains(schemeName)) + throw new KeyNotFoundException($"方案 {schemeName} 不存在"); + + // 如果是当前方案,需要先切换 + if (config.CurrentScheme == schemeName) + { + var otherScheme = config.Schemes.FirstOrDefault(s => s != schemeName); + if (otherScheme != null) + { + config.CurrentScheme = otherScheme; + } + else + { + config.CurrentScheme = DefaultSchemeName; + if (!config.Schemes.Contains(DefaultSchemeName)) + { + config.Schemes.Add(DefaultSchemeName); + } + } + } + + config.Schemes.Remove(schemeName); + SaveConfig(config); + } + + /// + /// 加载配置文件 + /// + private static SchemeConfig LoadConfig() + { + if (!File.Exists(ConfigFilePath)) + { + Initialize(); + } + + try + { + string json = File.ReadAllText(ConfigFilePath); + return JsonConvert.DeserializeObject(json) ?? new SchemeConfig(); + } + catch + { + // 如果读取失败,返回默认配置 + return new SchemeConfig + { + Schemes = new List { DefaultSchemeName }, + CurrentScheme = DefaultSchemeName + }; + } + } + + /// + /// 保存配置文件 + /// + private static void SaveConfig(SchemeConfig config) + { + try + { + string json = JsonConvert.SerializeObject(config, Formatting.Indented); + File.WriteAllText(ConfigFilePath, json); + } + catch (Exception ex) + { + // 处理保存失败的情况 + throw new InvalidOperationException("保存方案配置失败", ex); + } + } + } +} \ No newline at end of file diff --git a/DH.Commons/Helper/StaticHelper.cs b/DH.Commons/Helper/StaticHelper.cs new file mode 100644 index 0000000..3a75811 --- /dev/null +++ b/DH.Commons/Helper/StaticHelper.cs @@ -0,0 +1,680 @@ +using Microsoft.CSharp.RuntimeBinder; +using Newtonsoft.Json; +using System.Collections.ObjectModel; +using System.Drawing.Imaging; +using System.Dynamic; +using System.Linq.Expressions; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.ExceptionServices; +using System.Runtime.InteropServices; +using System.Runtime.Serialization.Formatters.Binary; + +namespace DH.Commons.Helper +{ + public static class StaticHelper + { + /// + /// 数值转换为byte数组 高位在前,低位在后 + /// + /// + /// + /// + public static byte[] IntToBytes(this int number, int size = 2) + { + byte[] result = new byte[size]; + + int temp = size; + while (temp > 0) + { + result[size - temp] = (byte)(number >> ((temp - 1) * 8) & 0xff); + + temp--; + } + + return result; + } + public static T DeepSerializeClone(this T t) + { + return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(t)); + } + /// + /// 字节数组转换为整数 + /// + /// 字节数组 + /// true:数组序号低的在高位 false:数组序号低的在低位 + /// + public static int BytesToInt(this byte[] data, bool HtL = true) + { + int res = 0; + + for (int i = 0; i < data.Length; i++) + { + int index = i; + + if (HtL) + { + index = data.Length - 1 - i; + } + + res += data[index] << (8 * i); + } + + return res; + } + + /// + /// 获取一个类指定的属性值 + /// + /// object对象 + /// 属性名称 + /// + public static object GetPropertyValue(object info, string field) + { + if (info == null) return null; + Type t = info.GetType(); + IEnumerable property = from pi in t.GetProperties() where pi.Name.ToLower() == field.ToLower() select pi; + return property.First().GetValue(info, null); + } + + /// + /// 将32位整形拆分为无符号16位整形 + /// + /// 需要拆分的32位整形 + /// 拆分为16位整形的位数 1或者2 + /// true:高位在前,低位在后;false:高位在后,低位在前 + /// + public static List ParseIntToUnsignShortList(this int num, int bitNum = 2, bool HtL = false) + { + if (bitNum == 2) + { + ushort high = (ushort)(num >> 16); + ushort low = (ushort)num; + + if (HtL) + { + return new List() { high, low }; + } + else + { + return new List() { low, high }; + } + } + else + { + if (num < 0) + { + num = ushort.MaxValue + 1 + num; + } + + return new List() { (ushort)num }; + } + } + + /// + /// 将32位整形数组拆分为无符号16位整形数组 + /// + /// 需要拆分的32位整形 + /// 拆分为16位整形的位数 1或者2 + /// true:高位在前,低位在后;false:高位在后,低位在前 + /// + public static List ParseIntToUnsignShortList(this List list, int bitNum = 2, bool HtL = false) + { + return list.SelectMany(u => u.ParseIntToUnsignShortList(bitNum, HtL)).ToList(); + } + + /// + /// 将ushort的集合转换为16位带符号整形 + /// + /// + /// 合并的位数 1或者2 + /// true:高位在前,低位在后;false:高位在后,低位在前 + /// + public static List ParseUnsignShortListToInt(this List numList, int bitNum = 2, bool HtL = false) + { + if (bitNum == 1) + { + return numList.ConvertAll(n => + { + int num = n; + if (num > short.MaxValue) + { + num = num - ushort.MaxValue - 1; + } + + return num; + }); + } + else + { + List list = new List(); + for (int i = 0; i < numList.Count; i += 2) + { + int high = HtL ? numList[i] : numList[i + 1]; + int low = HtL ? numList[i + 1] : numList[i]; + list.Add((high << 16) | low); + } + + return list; + } + } + + //public static T DeepSerializeClone(this T t) + //{ + // return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(t)); + //} + + public static void DataFrom(this T1 destT, T2 sourceT, List exceptionProps = null) where T1 : class where T2 : class + { + if (sourceT == null) + { + destT = null; + return; + } + + PropertyInfo[] propDest = destT.GetType().GetProperties();//.Where(p => !(p.GetMethod.IsVirtual && !p.GetMethod.IsFinal)).ToArray(); + PropertyInfo[] propSource = sourceT.GetType().GetProperties(); + + Array.ForEach(propDest, prop => + { + if (exceptionProps == null || !exceptionProps.Contains(prop.Name)) + { + if (prop.CanWrite) + { + PropertyInfo propS = propSource.FirstOrDefault(p => p.Name == prop.Name); + if (propS != null && propS.CanRead) + { + prop.SetValue(destT, propS.GetValue(sourceT)); + } + } + } + }); + } + + + //RtlMoveMemory + [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)] + public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count); + [HandleProcessCorruptedStateExceptions] + //public static Bitmap CopyBitmap(this Bitmap source) + //{ + // Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat); + // try + // { + // int PixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8; + // if (PixelSize == 1) + // { + // ColorPalette cp = clone.Palette; + // for (int i = 0; i < 256; i++) + // { + // cp.Entries[i] = Color.FromArgb(255, i, i, i); + // } + // clone.Palette = cp; + // } + + // Rectangle rect = new Rectangle(0, 0, source.Width, source.Height); + // BitmapData sourceData = source.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat); + // BitmapData cloneData = clone.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat); + // if (source.Width % 4 == 0) + // { + // unsafe + // { + // CopyMemory(cloneData.Scan0, sourceData.Scan0, (uint)(sourceData.Stride * sourceData.Height)); + // } + // } + // else + // { + // Parallel.For(0, source.Height, h => + // { + // unsafe + // { + // CopyMemory(cloneData.Scan0 + h * sourceData.Stride, sourceData.Scan0 + h * sourceData.Stride, (uint)sourceData.Width); + // } + // }); + // } + + // clone.UnlockBits(cloneData); + // source.UnlockBits(sourceData); + + // } + // catch (Exception ex) + // { + // return clone; + // } + + // return clone; + //} + public static Bitmap CopyBitmap(this Bitmap source) + { + Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat); + + try + { + int pixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8; + if (pixelSize == 1) + { + ColorPalette cp = clone.Palette; + for (int i = 0; i < 256; i++) + { + cp.Entries[i] = Color.FromArgb(255, i, i, i); + } + clone.Palette = cp; + } + + Rectangle rect = new Rectangle(0, 0, source.Width, source.Height); + BitmapData sourceData = source.LockBits(rect, ImageLockMode.ReadOnly, source.PixelFormat); + BitmapData cloneData = clone.LockBits(rect, ImageLockMode.WriteOnly, source.PixelFormat); + + int stride = sourceData.Stride; + int height = sourceData.Height; + + if (stride % 4 == 0) + { + unsafe + { + CopyMemory(cloneData.Scan0, sourceData.Scan0, (uint)(stride * height)); + } + } + else + { + Parallel.For(0, height, h => + { + unsafe + { + CopyMemory(cloneData.Scan0 + h * stride, sourceData.Scan0 + h * stride, (uint)stride); + } + }); + } + source.UnlockBits(sourceData); clone.UnlockBits(cloneData); + } + catch (Exception ex) + { // Handle or log exception if needed + } return clone; } + + + public static Bitmap BitmapDeepClone(Bitmap source) + { + Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat); + + try + { + int PixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8; + if (PixelSize == 1) + { + ColorPalette cp = clone.Palette; + for (int i = 0; i < 256; i++) + { + cp.Entries[i] = Color.FromArgb(255, i, i, i); + } + clone.Palette = cp; + } + Rectangle rect = new Rectangle(0, 0, source.Width, source.Height); + BitmapData source_bitmap = source.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat); + BitmapData destination_bitmap = clone.LockBits(rect, ImageLockMode.ReadWrite, clone.PixelFormat); + + int depth_width = source_bitmap.Width * PixelSize; + + unsafe + { + byte* source_ptr = (byte*)source_bitmap.Scan0; + byte* destination_ptr = (byte*)destination_bitmap.Scan0; + + int offset = source_bitmap.Stride - depth_width; + + for (int i = 0; i < source_bitmap.Height; i++) + { + for (int j = 0; j < depth_width; j++, source_ptr++, destination_ptr++) + { + *destination_ptr = *source_ptr; + } + + source_ptr += offset; + destination_ptr += offset; + } + } + + source.UnlockBits(source_bitmap); + clone.UnlockBits(destination_bitmap); + } + catch (Exception ex) + { + + } + return clone; + } + + + + public static Bitmap HConnectBitmap(this Bitmap map1, Bitmap map2) + { + Bitmap connectImage = null; + if (map1 == null || map2 == null) + return null; + //横向拼接 + int width = map1.Width + map2.Width; + //高度不变 + int height = Math.Max(map1.Height, map2.Height); + connectImage = new Bitmap(width, height); + using (Graphics graph = Graphics.FromImage(connectImage)) + { + graph.DrawImage(connectImage, width, height); + graph.Clear(System.Drawing.Color.White); + graph.DrawImage(map1, 0, 0); + graph.DrawImage(map2, map1.Width, 0); + } + return connectImage; + } + + public static IntPtr FloatToIntptr(float[] bytes) + { + GCHandle hObject = GCHandle.Alloc(bytes, GCHandleType.Pinned); + return hObject.AddrOfPinnedObject(); + } + + // 将Btimap类转换为byte[]类函数 + public static byte[] GetBGRValues(Bitmap bmp, out int stride) + { + var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); + var bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat); + stride = bmpData.Stride; + var rowBytes = bmpData.Width * Image.GetPixelFormatSize(bmp.PixelFormat) / 8; + var imgBytes = bmp.Height * rowBytes; + byte[] rgbValues = new byte[imgBytes]; + IntPtr ptr = bmpData.Scan0; + for (var i = 0; i < bmp.Height; i++) + { + Marshal.Copy(ptr, rgbValues, i * rowBytes, rowBytes); + ptr += bmpData.Stride; + } + bmp.UnlockBits(bmpData); + return rgbValues; + } + /// + /// 缺陷灰度图转彩色图像函数 + /// + /// 灰度图 + /// 返回构造的伪彩色图像 + public static Bitmap GrayMapToColorMap(this Bitmap src, Dictionary indexColorDict = null) + { + try + { + //Stopwatch sw = new Stopwatch(); + //sw.Start(); + + Bitmap dest = new Bitmap(src.Width, src.Height, PixelFormat.Format32bppArgb); + + int destHeight = dest.Height; + int destWidth = dest.Width; + + Rectangle rect = new Rectangle(0, 0, destWidth, destHeight); + BitmapData bmpDataDest = dest.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); + BitmapData bmpDataSrc = src.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed); + int strideDest = bmpDataDest.Stride; + + int strideSrc = bmpDataSrc.Stride; + unsafe + { + byte* pDest = (byte*)bmpDataDest.Scan0.ToPointer(); + byte* pSrc = (byte*)bmpDataSrc.Scan0.ToPointer(); + + Parallel.For(0, destHeight, y => + { + Parallel.For(0, destWidth, x => + { + int pixel = pSrc[y * strideSrc + x]; + int startIndex = y * strideDest + x * 4; + if (pixel >= 0 && pixel <= 63) + { + Color color = Color.Red; + if (indexColorDict != null && indexColorDict.ContainsKey(pixel)) + { + color = indexColorDict[pixel]; + } + + byte R = color.R; + byte G = color.G; + byte B = color.B; + + pDest[startIndex] = B; + pDest[startIndex + 1] = G; + pDest[startIndex + 2] = R; + pDest[startIndex + 3] = 100; + } + else + { + pDest[startIndex] = 255; + pDest[startIndex + 1] = 255; + pDest[startIndex + 2] = 255; + pDest[startIndex + 3] = 0; + } + }); + }); + } + dest.UnlockBits(bmpDataDest); + src.UnlockBits(bmpDataSrc); + + //sw.Stop(); + //Console.WriteLine($"转换耗时:{sw.ElapsedMilliseconds}"); + + return dest; + } + catch (Exception ex) + { + return null; + } + } + + public static void Sort(this ObservableCollection collection) where T : IComparable + { + List sortedList = collection.OrderByDescending(x => x).ToList();//这里用降序 + for (int i = 0; i < sortedList.Count(); i++) + { + collection.Move(collection.IndexOf(sortedList[i]), i); + } + } + + /// + /// 获得字符串中开始和结束字符串中间的值 + /// + /// + /// + /// + /// + public static string GetMidString(string sourse, string startstr, string endstr) + { + string result = string.Empty; + int startindex, endindex; + try + { + startindex = sourse.IndexOf(startstr); + if (startindex == -1) + return result; + string tmpstr = sourse.Substring(startindex + startstr.Length); + endindex = tmpstr.IndexOf(endstr); + if (endindex == -1) + return result; + result = tmpstr.Remove(endindex); + } + catch (Exception ex) + { + return ""; + } + return result; + } + + /// + /// 获得字符串中开始和结束字符串中间的值 + /// + /// 字符串 + /// 开始 + /// 结束 + /// + private static string GetMidString2(string sourse, string startstr, string endstr) //截取指定文本,和易语言的取文本中间差不多 + { + try //异常捕捉 + { + var kn = sourse.IndexOf(startstr, StringComparison.Ordinal) + startstr.Length; + var jn = sourse.IndexOf(endstr, kn, StringComparison.Ordinal); + return sourse.Substring(kn, jn - kn); + } + catch //如果发现未知的错误,比如上面的代码出错了,就执行下面这句代码 + { + return ""; //返回空 + } + + } + + // 布尔类型转换为整型 + public static int ToInt(this object obj) + { + if (Convert.ToBoolean(obj) == true) + return 1; + else + return 0; + } + + // 整型转换为布尔类型 + public static bool ToBool(this object obj) + { + if (Convert.ToInt32(obj) == 1) + return true; + else + return false; + } + + public static object GetProperty(this object o, string member) + { + if (o == null) throw new ArgumentNullException("o"); + if (member == null) throw new ArgumentNullException("member"); + Type scope = o.GetType(); + IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider; + if (provider != null) + { + ParameterExpression param = Expression.Parameter(typeof(object)); + DynamicMetaObject mobj = provider.GetMetaObject(param); + GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(0, null) }); + DynamicMetaObject ret = mobj.BindGetMember(binder); + BlockExpression final = Expression.Block( + Expression.Label(CallSiteBinder.UpdateLabel), + ret.Expression + ); + LambdaExpression lambda = Expression.Lambda(final, param); + Delegate del = lambda.Compile(); + return del.DynamicInvoke(o); + } + else + { + return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null); + } + } + + #region 检测文件状态及操作方式选择 + [DllImport("kernel32.dll")] + private static extern IntPtr _lopen(string lpPathName, int iReadWrite); + [DllImport("kernel32.dll")] + private static extern bool CloseHandle(IntPtr hObject); + private const int OF_READWRITE = 2; + private const int OF_SHARE_DENY_NONE = 0x40; + private static readonly IntPtr HFILE_ERROR = new IntPtr(-1); + /// + /// 检测文件是否只读或被使用 + /// + /// 要检测的文件 + /// true可用,false在用或只读 + public static bool CheckFilesCanUse(string fileName) + { + if (!File.Exists(fileName)) + return true;//文件不存在 + if ((File.GetAttributes(fileName) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) + return false; //文件只读 + IntPtr vHandle = _lopen(fileName, OF_READWRITE | OF_SHARE_DENY_NONE); + if (vHandle == HFILE_ERROR) + { + CloseHandle(vHandle); + return false; //文件被占用 + } + + CloseHandle(vHandle); //文件没被占用 + return true; + } + #endregion + + /// + /// 获取指定文件夹下所有的文件名称 + /// + /// 指定文件夹名称,绝对路径 + /// 文件类型过滤,根据文件后缀名,如:*,*.txt,*.xls + /// 是否包含子文件夹 + /// ArrayList数组,为所有需要的文件路径名称 + public static List GetAllFilesByFolder(string folderName, string fileFilter, bool isContainSubFolder = false) + { + List resList = new List(); + try + { + DirectoryInfo currDir = new DirectoryInfo(folderName);//当前目录 + FileInfo[] currFiles = currDir.GetFiles(fileFilter);//当前目录文件 + foreach (FileInfo file in currFiles) + { + if (fileFilter.ToLower().IndexOf(file.Extension.ToLower()) >= 0) + { + resList.Add(file); + } + } + if (isContainSubFolder) + { + string[] subFolders = Directory.GetDirectories(folderName); + foreach (string subFolder in subFolders) + { + resList.AddRange(GetAllFilesByFolder(subFolder, fileFilter));//递归 + } + } + } + catch (Exception ex) + { + throw ex; + } + return resList; + } + + /// + /// 获取指定文件夹下所有的文件名称,不过滤文件类型 + /// + /// 指定文件夹名称,绝对路径 + /// 是否包含子文件夹 + /// ArrayList数组,为所有需要的文件路径名称 + public static List GetAllFilesByFolder(string folderName, bool isContainSubFolder) + { + return GetAllFilesByFolder(folderName, "*", isContainSubFolder); + } + } + + public class Compare : IEqualityComparer + { + private Func _getField; + public Compare(Func getfield) + { + _getField = getfield; + } + public bool Equals(T x, T y) + { + return EqualityComparer.Default.Equals(_getField(x), _getField(y)); + } + public int GetHashCode(T obj) + { + return EqualityComparer.Default.GetHashCode(_getField(obj)); + } + } + + public static class ObjectExtensions + { + public static IEnumerable DistinctBy(this IEnumerable source, Func getfield) + { + return source.Distinct(new Compare(getfield)); + } + + public static IQueryable DistinctBy(this IQueryable source, Func getfield) + { + return source.Distinct(new Compare(getfield)); + } + } +} diff --git a/DH.Commons/Helper/SystemConfigHelper.cs b/DH.Commons/Helper/SystemConfigHelper.cs new file mode 100644 index 0000000..1f7bd95 --- /dev/null +++ b/DH.Commons/Helper/SystemConfigHelper.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace DH.Commons.Helper +{ + /// + /// 配置文件操作工具类(自动定位主程序配置) + /// + public static class SystemConfigHelper + { + private static Configuration _mainConfig; + private static readonly object _lock = new object(); + + /// + /// 获取主程序配置对象 + /// + private static Configuration MainConfiguration + { + get + { + if (_mainConfig == null) + { + lock (_lock) + { + if (_mainConfig == null) + { + // 获取主程序路径 + string exePath = Assembly.GetEntryAssembly().Location; + var configFile = exePath + ".config"; + + // 加载主程序配置 + var fileMap = new ExeConfigurationFileMap + { + ExeConfigFilename = configFile + }; + _mainConfig = ConfigurationManager.OpenMappedExeConfiguration( + fileMap, + ConfigurationUserLevel.None + ); + } + } + } + return _mainConfig; + } + } + + /// + /// 检查配置项是否存在 + /// + public static bool KeyExists(string key) + { + return MainConfiguration.AppSettings.Settings[key] != null; + } + + /// + /// 读取配置项(带类型自动转换) + /// + public static T GetValue(string key, T defaultValue = default) + { + try + { + var setting = MainConfiguration.AppSettings.Settings[key]; + if (setting == null) return defaultValue; + + return (T)Convert.ChangeType(setting.Value, typeof(T)); + } + catch + { + return defaultValue; + } + } + + /// + /// 写入配置项(自动保存) + /// + public static void SetValue(string key, object value) + { + var settings = MainConfiguration.AppSettings.Settings; + var stringValue = value?.ToString() ?? string.Empty; + + if (settings[key] == null) + { + settings.Add(key, stringValue); + } + else + { + settings[key].Value = stringValue; + } + + SaveChanges(); + } + + /// + /// 删除指定配置项 + /// + public static void RemoveKey(string key) + { + if (KeyExists(key)) + { + MainConfiguration.AppSettings.Settings.Remove(key); + SaveChanges(); + } + } + + /// + /// 保存配置修改 + /// + private static void SaveChanges() + { + MainConfiguration.Save(ConfigurationSaveMode.Modified); + ConfigurationManager.RefreshSection("appSettings"); + } + } + +} diff --git a/DH.Commons/Interface/Spec.cs b/DH.Commons/Interface/Spec.cs new file mode 100644 index 0000000..06fe034 --- /dev/null +++ b/DH.Commons/Interface/Spec.cs @@ -0,0 +1,109 @@ + +using System; +using System.ComponentModel; +using System.Drawing.Design; + +namespace DH.Commons.Enums +{ + + /// + /// 标准配置 + /// + public class Spec + { + [Category("通用配置")] + [Description("标准代码")] + public virtual string Code { get; set; } + + [Category("通用配置")] + [Description("启用状态,true:启用;false:禁用")] + [DisplayName("启用状态")] + public bool IsEnabled { get; set; } + + [Category("标准配置")] + [Description("标准值")] + [DisplayName("标准值")] + public double StandardValue { get; set; } + + [Category("标准配置")] + [Description("正公差")] + [DisplayName("正公差")] + public double Tolrenance_Positive { get; set; } + + [Category("标准配置")] + [Description("负公差")] + [DisplayName("负公差")] + public double Tolrenance_Negative { get; set; } + + protected double? actualValue = null; + [Browsable(false)] + + public virtual double? ActualValue + { + get + { + return actualValue; + } + set + { + //if (actualValue != value && value != null) + if (value != null) + { + if (value.Value >= (StandardValue - Tolrenance_Negative) && value.Value <= (StandardValue + Tolrenance_Positive)) + { + MeasureResult = true; + } + else + { + MeasureResult = false; + } + } + + actualValue = value; + } + } + + [Browsable(false)] + + public bool? MeasureResult { get; set; } = null; + + + public Spec Copy() + { + Spec spec = new Spec(); + + spec.Code = this.Code; + spec.IsEnabled = this.IsEnabled; + spec.StandardValue = this.StandardValue; + spec.Tolrenance_Positive = this.Tolrenance_Positive; + spec.Tolrenance_Negative = this.Tolrenance_Negative; + + return spec; + } + } + + + + public class IndexedSpec : Spec + { + [Category("数据源配置")] + [Description("数据源输出索引")] + [DisplayName("数据源输出索引")] + public int OutputIndex { get; set; } + + public new IndexedSpec Copy() + { + IndexedSpec spec = new IndexedSpec(); + + spec.Code = this.Code; + spec.IsEnabled = this.IsEnabled; + spec.StandardValue = this.StandardValue; + spec.Tolrenance_Positive = this.Tolrenance_Positive; + spec.Tolrenance_Negative = this.Tolrenance_Negative; + + spec.OutputIndex = this.OutputIndex; + + return spec; + } + } +} diff --git a/DH.Commons/Models/ProductSummary.cs b/DH.Commons/Models/ProductSummary.cs new file mode 100644 index 0000000..904f59e --- /dev/null +++ b/DH.Commons/Models/ProductSummary.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.Commons.Models +{ + public class CameraSummary + { + public string CameraName { get; set; } // 相机名称 + public int TiggerCount { get; set; } //触发数 + public int OKCount { get; set; } // OK 数 + public int NGCount { get; set; } // NG 数 + public int TotalCount => OKCount + NGCount; // 总检测数量 + public string YieldStr => $"{Yield:f2} %"; // 良率(字符串形式) + public double Yield => OKCount + NGCount > 0 ? (double)OKCount / (OKCount + NGCount) * 100 : 0; + } + + public class ProductSummary + { + public int ProductAmount { get; set; } + public string ResultDesc { get; set; } + public string PercentStr { get; set; } + } +} diff --git a/DH.Commons/Models/SystemModel.cs b/DH.Commons/Models/SystemModel.cs new file mode 100644 index 0000000..8090d1e --- /dev/null +++ b/DH.Commons/Models/SystemModel.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.Commons.Base; +using DH.Commons.Enums; + +namespace DH.Commons.Models +{ + public static class SystemModel + { + /// + /// 当前方案 + /// + public static string CurrentScheme=string.Empty; + + /// + /// 当前状态 + /// + public static EnumStatus CurrentStatus =EnumStatus.待机中; + } + + /// + /// 配置集合 + /// + public static class ConfigModel + { + public static List CameraBaseList = new List(); + public static List PLCBaseList = new List(); + public static List DetectionList = new List(); + public static List GlobalList = new List(); + } +} diff --git a/DH.Devices.Camera/DH.Devices.Camera.csproj b/DH.Devices.Camera/DH.Devices.Camera.csproj index c6c8d9e..31ea55d 100644 --- a/DH.Devices.Camera/DH.Devices.Camera.csproj +++ b/DH.Devices.Camera/DH.Devices.Camera.csproj @@ -24,7 +24,6 @@ - diff --git a/DH.Devices.Camera/Do3ThinkCamera.cs b/DH.Devices.Camera/Do3ThinkCamera.cs index 1cda2a5..2e018a7 100644 --- a/DH.Devices.Camera/Do3ThinkCamera.cs +++ b/DH.Devices.Camera/Do3ThinkCamera.cs @@ -1,31 +1,45 @@ -using System.Diagnostics; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; using System.Reflection.Metadata; using System.Xml.Linq; -using DH.Devices.Devices; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Helper; using DVPCameraType; using OpenCvSharp; +using OpenCvSharp.Extensions; using static System.Net.Mime.MediaTypeNames; - +using static MvCamCtrl.NET.MyCamera; +using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel; namespace DH.Devices.Camera { - public class Do3ThinkCamera : CameraBase + public class Do3ThinkCamera : CameraBase, ILogger { private dvpCameraInfo stDevInfo = new dvpCameraInfo(); 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; + // public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24; public int m_CamCount = 0; public Double m_dfDisplayCount = 0; + + public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper(); + public event Action OnLog; + public ConcurrentDictionary _imageSetList = new ConcurrentDictionary(); + + public Do3ThinkCamera() { + LoggerHelper.LogPath = "D://"; + LoggerHelper.LogPrefix = CameraName; } @@ -49,6 +63,9 @@ namespace DH.Devices.Camera { try { + if (CameraName == "Cam1") + Console.WriteLine(""); + pCallBackFunc = new DVPCamera.dvpEventCallback(cbExceptiondelegate); nRet = DVPCamera.dvpOpenByUserId(CameraName, dvpOpenMode.OPEN_NORMAL, ref m_handle); @@ -59,7 +76,7 @@ namespace DH.Devices.Camera throw new Exception($"Create device failed:{nRet:x8}"); } - nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)dvpStreamFormat); + nRet = DVPCamera.dvpSetTargetFormat(m_handle, (dvpStreamFormat)DvpImageFormat); if (dvpStatus.DVP_STATUS_OK != nRet) { throw new Exception($"Set image format failed:{nRet:x8}"); @@ -69,13 +86,13 @@ namespace DH.Devices.Camera nRet = DVPCamera.dvpGetCameraInfo(m_handle, ref camerainfo); SerialNumber = camerainfo.SerialNumber; - // ch:注册异常回调函数 | en:Register Exception Callback - //nRet = DVPCamera.dvpRegisterEventCallback(m_handle, pCallBackFunc, dvpEvent.EVENT_DISCONNECTED, IntPtr.Zero); - //if (nRet != dvpStatus.DVP_STATUS_OK) - //{ - // throw new Exception($"Register expection callback failed:{nRet}"); - //} - //GC.KeepAlive(pCallBackFunc); + //ch: 注册异常回调函数 | en:Register Exception Callback + nRet = DVPCamera.dvpRegisterEventCallback(m_handle, pCallBackFunc, dvpEvent.EVENT_DISCONNECTED, IntPtr.Zero); + if (nRet != dvpStatus.DVP_STATUS_OK) + { + throw new Exception($"Register expection callback failed:{nRet}"); + } + GC.KeepAlive(pCallBackFunc); //// ch:设置采集连续模式 | en:Set Continues Aquisition Mode if (IsContinueMode) @@ -130,53 +147,78 @@ namespace DH.Devices.Camera throw new Exception($"Start grabbing failed:{nRet:x8}"); } //// 曝光 - //if (IIConfig.DefaultExposure != 0) - //{ - // SetExposure(IIConfig.DefaultExposure); - //} + if (Exposure != 0) + { + SetExposure(Exposure); + } //// 增益 - //if (IIConfig.Gain >= 0) - //{ - // SetGain(IIConfig.Gain); - //} - //SetPictureRoi(IIConfig.VelocityPara.A_Pic_X, IIConfig.VelocityPara.A_Pic_Y, IIConfig.VelocityPara.Width, IIConfig.VelocityPara.Hight); + if (Gain >= 0) + { + SetGain(Gain); + } + //全画幅 + if (!IsAllPicEnabled) + { + SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH); + } + //// 设置 触发延迟 - //if (IIConfig.TriggerDelay > 0) - //{ - // nRet = DVPCamera.dvpSetTriggerDelay(m_handle, IIConfig.TriggerDelay); - // if (nRet != dvpStatus.DVP_STATUS_OK) - // { - // throw new Exception("Set TriggerDelay failed!"); - // } - //} + if (TriggerDelay > 0) + { + nRet = DVPCamera.dvpSetTriggerDelay(m_handle, TriggerDelay); + if (nRet != dvpStatus.DVP_STATUS_OK) + { + throw new Exception("Set TriggerDelay failed!"); + } + } //// 信号消抖 - //if (IIConfig.LineDebouncerTime > 0) - //{ - // nRet = DVPCamera.dvpSetTriggerJitterFilter(m_handle, IIConfig.LineDebouncerTime); - // if (nRet != dvpStatus.DVP_STATUS_OK) - // { - // throw new Exception($"LineDebouncerTime set failed:{nRet}"); - // } - //} + if (LineDebouncerTime > 0) + { + nRet = DVPCamera.dvpSetTriggerJitterFilter(m_handle, LineDebouncerTime); + if (nRet != dvpStatus.DVP_STATUS_OK) + { + throw new Exception($"LineDebouncerTime set failed:{nRet}"); + } + } //IIConfig.PropertyChanged -= IIConfig_PropertyChanged; //IIConfig.PropertyChanged += IIConfig_PropertyChanged; + Connected = true; - } return true; } catch { + Connected = false; return false; } } + /// + /// 回调函数 + /// + /// + /// + /// + /// + /// + /// + public int cbExceptiondelegate(uint handle, dvpEvent _event, IntPtr pContext, int param, ref dvpVariant refVariant) + { + if (_event == dvpEvent.EVENT_DISCONNECTED) + { + + } + + + return dvpStatus.DVP_STATUS_OK.ToInt(); + } private void IIConfig_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { @@ -313,14 +355,7 @@ namespace DH.Devices.Camera public int ImageCallbackFunc(uint handle, dvpStreamEvent _event, IntPtr pContext, ref dvpFrame refFrame, IntPtr pBuffer) { Mat cvImage = new Mat(); - if (this.CameraName.Equals("Cam1")) - { - Console.WriteLine( ); - } - if (this.CameraName.Equals("Cam2")) - { - Console.WriteLine(); - } + try { @@ -350,10 +385,39 @@ namespace DH.Devices.Camera cvImage = Mat.FromPixelData(nHeight, nWidth, MatType.CV_8UC1, pBuffer); break; } + Mat smat = cvImage.Clone(); - OnHImageOutput?.Invoke(DateTime.Now, this, smat); + Mat rotated = new Mat(); // 显式创建输出对象 + switch (RotateImage) + { + case 90: + Cv2.Rotate(smat, rotated, RotateFlags.Rotate90Clockwise); + break; + case 180: + Cv2.Rotate(smat, rotated, RotateFlags.Rotate180); + break; + case 270: + Cv2.Rotate(smat, rotated, RotateFlags.Rotate90Counterclockwise); + break; + default: + rotated = smat.Clone(); // 无旋转时保持原图 + break; + } + var imageSet = new MatSet + { + + _mat = rotated, + + }; + InitialImageSet(imageSet); + + var outImgSet = CopyImageSet(imageSet); + OnHImageOutput?.Invoke(DateTime.Now, this, outImgSet); + + //存图 + DisplayAndSaveOriginImage(imageSet.Id, SnapshotCount); @@ -369,36 +433,135 @@ namespace DH.Devices.Camera } return 0; } + public void InitialImageSet(MatSet set) + { + //if (saveOption != null) + //{ + // set.ImageSaveOption = saveOption.Copy(); + //} + //set.IsOriginSaved = !set.ImageSaveOption.IsSaveOriginImage; + //set.IsFitSaved = !set.ImageSaveOption.IsSaveFitImage; + //set.IsAddtionalSaved = string.IsNullOrWhiteSpace(set.ImageSaveOption.AddtionalSaveType); + set.CameraId = this.CameraName; + + set.ImageTime = DateTime.Now; + _imageSetList[set.Id] = set; + } + + public virtual async void DisplayAndSaveOriginImage(string imgSetId, int _counter) + { + MatSet set = _imageSetList.Values.FirstOrDefault(u => u.Id == imgSetId); + + if (set != null && set._mat != null) + { + await Task.Run(() => + { + Bitmap? showImage = null; + + try + { + showImage = set._mat.ToBitmap(); + } + catch (Exception) + { + //释放 himage + ClearImageSet(set); + return; + } + + // showImage.Save("D:/test333.bmp"); + // Marshal.Copy(pbyteImageBuffer, 0, (IntPtr)lAddrImage, (int)dwBufferSize); + // Bitmap saveImage = showImage?.CopyBitmap(); + // saveImage.Save("d://TEST444.BMP"); + // OnShowImageUpdated?.Invoke(this, showImage, imgSetId); + if (IsSavePicEnabled && showImage != null) + { + string fullname = Path.Combine(ImageSaveDirectory, $"{CameraName}_{_counter:D7}_{set.Id}.{set._imageFormat.ToString().ToLower()}"); + ImageSaveAsync(fullname, showImage); + } + + //释放 himage + ClearImageSet(set); + }); + } + } + static object _imageSetLock = new object(); + public void ClearImageSet(MatSet set) + { + try + { + bool flag = false; + lock (_imageSetLock) + { + flag = _imageSetList.TryRemove(set.Id, out set); + if (flag) + { + set.Dispose(); + } + //LogAsync(DateTime.Now, $"{Name}移除图片信息{(flag ? "成功" : "失败")},当前缓存数量:{_imageSetList.Count}", ""); + } + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Exception, $"清理图片缓存异常,当前缓存数量{_imageSetList.Count},{ex.GetExceptionMessage()}"); + } + } + public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper(); + public virtual void ImageSaveAsync(string fullName, Bitmap map) + { + if (!IsSavePicEnabled) + { + map?.Dispose(); + return; + } + + ImageSaveSet imageSaveSet = new ImageSaveSet() + { + FullName = fullName, + SaveImage = map, + + }; + + ImageSaveHelper.ImageSaveAsync(imageSaveSet); + } public override bool CameraDisConnect() { try { - dvpStreamState StreamState = new dvpStreamState(); - nRet = DVPCamera.dvpGetStreamState(m_handle, ref StreamState); - Debug.Assert(nRet == dvpStatus.DVP_STATUS_OK); - if (StreamState == dvpStreamState.STATE_STARTED) + + // 1. 停止采集(如果正在运行) + dvpStreamState streamState = new dvpStreamState(); + nRet = DVPCamera.dvpGetStreamState(m_handle, ref streamState); + if (streamState == dvpStreamState.STATE_STARTED) { - // stop camera + // 先停止采集流 nRet = DVPCamera.dvpStop(m_handle); - Debug.Assert(nRet == dvpStatus.DVP_STATUS_OK); if (nRet != dvpStatus.DVP_STATUS_OK) { - throw new Exception($"Stop grabbing failed{nRet:x8}"); + throw new Exception($"停止采集失败,错误码:0x{nRet:X8}"); } } + // 2. 设置触发源为软件触发(此时设备已停止) + nRet = DVPCamera.dvpSetTriggerState(m_handle, false); + if (nRet != dvpStatus.DVP_STATUS_OK) + { + throw new Exception($"设置软件触发失败,错误码:0x{nRet:X8}"); + } + + // 3. 注销事件回调 nRet = DVPCamera.dvpUnregisterEventCallback(m_handle, pCallBackFunc, dvpEvent.EVENT_DISCONNECTED, IntPtr.Zero); if (nRet != dvpStatus.DVP_STATUS_OK) { - throw new Exception($"Unregister expection callback failed:{nRet}"); + throw new Exception($"注销事件回调失败,错误码:0x{nRet:X8}"); } - // ch:关闭设备 | en:Close device + // 4. 关闭设备 nRet = DVPCamera.dvpClose(m_handle); if (nRet != dvpStatus.DVP_STATUS_OK) { - throw new Exception($"Close device failed{nRet:x8}"); + throw new Exception($"关闭设备失败,错误码:0x{nRet:X8}"); } m_handle = 0; @@ -411,6 +574,28 @@ namespace DH.Devices.Camera } + public void Snapshot() + { + DVPCamera.dvpTriggerFire(m_handle); + } + + public void LogAsync(LogMsg msg) + { + msg.MsgSource = CameraName; + msg.ThreadId = Thread.CurrentThread.ManagedThreadId; + + //OnLog?.BeginInvoke(msg, null, null); + OnLog?.Invoke(msg); + + //if (InitialConfig.IsEnableLog) + { + LoggerHelper.LogAsync(msg); + } + } + public void LogAsync(DateTime dt, LogLevel logLevel, string msg) + { + LogAsync(new LogMsg(dt, logLevel, msg)); + } } } diff --git a/DH.Devices.Camera/HikVisionCamera.cs b/DH.Devices.Camera/HikVisionCamera.cs index 159b080..5b2eb93 100644 --- a/DH.Devices.Camera/HikVisionCamera.cs +++ b/DH.Devices.Camera/HikVisionCamera.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; using System.Xml.Linq; using DH.Commons.Enums; using static MvCamCtrl.NET.MyCamera; -using DH.Devices.Devices; +using DH.Commons.Base; @@ -368,7 +368,7 @@ namespace DH.Devices.Camera throw new NotSupportedException($"Unsupported pixel type: {pFrameInfo.enPixelType}"); } - OnHImageOutput?.Invoke(DateTime.Now, this, cvImage); + //OnHImageOutput?.Invoke(DateTime.Now, this, cvImage); } catch (Exception ex) diff --git a/DH.Devices.Motion/SLDMotion.cs b/DH.Devices.Motion/SLDMotion.cs index 72e5620..50d459b 100644 --- a/DH.Devices.Motion/SLDMotion.cs +++ b/DH.Devices.Motion/SLDMotion.cs @@ -85,11 +85,15 @@ namespace DH.Devices.Motion public void NewPieces(int diskIndex, uint pieceNumber) { - _taskFactory.StartNew(() => + Task.Run(() => { - Thread.CurrentThread.Priority = ThreadPriority.Highest; + try { + Thread.CurrentThread.Priority = ThreadPriority.Highest; - OnNewPieces?.Invoke(diskIndex, pieceNumber); + OnNewPieces?.Invoke(diskIndex, pieceNumber); + } + catch (Exception ex) { /* 记录异常 */ } + }); } public void SetResetFlag(bool isReset) diff --git a/DH.Devices.PLC/DH.Devices.PLC.csproj b/DH.Devices.PLC/DH.Devices.PLC.csproj index 74bc23a..7f09546 100644 --- a/DH.Devices.PLC/DH.Devices.PLC.csproj +++ b/DH.Devices.PLC/DH.Devices.PLC.csproj @@ -12,10 +12,6 @@ AnyCPU;x64 - - - - diff --git a/DH.Devices.PLC/PLCBase.cs b/DH.Devices.PLC/PLCBase.cs deleted file mode 100644 index cb414df..0000000 --- a/DH.Devices.PLC/PLCBase.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System.IO.Ports; -using DH.Commons.Enums; -using HslCommunication; - -namespace DH.Devices.PLC -{ - public class PLCBase - { - /// - /// 连接状态 - /// - public bool connected = false; - - public string PLCName; - /// - /// 类型 - /// - public EnumPLCType PLCType=EnumPLCType.信捷XD_网口; - - /// - /// 串口号 - /// - public string portName="COM1"; - - /// - /// 波特率 - /// - public int baudRate = 9600; - - /// - /// 数据位 - /// - public int dataBit = 8; - - /// - /// 停止位 - /// - public StopBits stopBit = (StopBits)Enum.Parse(typeof(StopBits), "One"); - - /// - /// 奇偶效验位 - /// - public Parity parity = (Parity)Enum.Parse(typeof(Parity), "None"); - - /// - /// IP地址 - /// - public string IP = "192.168.6.6"; - - /// - /// 端口号 - /// - public int Port = 502; - - /// - /// 初始化 - /// - /// - public virtual bool PLCConnect() { return false; } - - public virtual bool PLCDisConnect() { return false; } - - public virtual ushort ReadShort(string address) { return 0; } - - public virtual int ReadInt(string address) { return 0; } - - - public virtual float ReadFloat(string address) { return 0; } - - public virtual bool ReadBool(string address) { return false; } - - public virtual bool WriteShort(string address, short value, bool waitForReply = true) { return false; } - - public virtual bool WriteInt(string address, int value, bool waitForReply = true) { return false; } - - public virtual bool WriteDInt(string address, int value, bool waitForReply = true) { return false; } - - public virtual bool WriteFloat(string address, float value, bool waitForReply = true) { return false; } - - public virtual bool WriteBool(string address, bool value, bool waitForReply = true) { return false; } - } -} diff --git a/DH.Devices.PLC/XinJEPLCTcpNet.cs b/DH.Devices.PLC/XinJEPLCTcpNet.cs index ac98610..5797b0c 100644 --- a/DH.Devices.PLC/XinJEPLCTcpNet.cs +++ b/DH.Devices.PLC/XinJEPLCTcpNet.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; @@ -8,14 +9,19 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Xml.Linq; +using DH.Commons.Base; using DH.Commons.Enums; +using DH.Commons.Helper; +using DH.Commons.Models; using HslCommunication; using HslCommunication.Enthernet; using HslCommunication.Profinet.XINJE; +using OpenCvSharp; +using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel; namespace DH.Devices.PLC { - public class XinJEPLCTcpNet : PLCBase + public class XinJEPLCTcpNet : PLCBase, ILogger { private static XinJEPLCTcpNet _instance; public static XinJEPLCTcpNet Instance @@ -27,13 +33,20 @@ namespace DH.Devices.PLC return _instance; } } - + + public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper(); + public event Action OnLog; private XinJETcpNet TcpNet = new XinJETcpNet(); + private TaskFactory _taskFac = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); + public override bool PLCConnect() { try { + LoggerHelper.LogPath = "D://PROJECTS//Logs//"; + LoggerHelper.LogPrefix = "PLC"; + TcpNet.IpAddress = IP; TcpNet.Port = Port; TcpNet.ConnectTimeOut = 5000; @@ -41,74 +54,175 @@ namespace DH.Devices.PLC TcpNet.SleepTime = 0; TcpNet.AddressStartWithZero = true; TcpNet.IsStringReverse = false; - TcpNet.DataFormat = HslCommunication.Core.DataFormat.ABCD; TcpNet.Station = 1; - TcpNet.Series = XinJESeries.XD; + switch (PLCType) + { + case EnumPLCType.信捷XD网口: + TcpNet.Series = XinJESeries.XD; + TcpNet.DataFormat = HslCommunication.Core.DataFormat.CDAB; + break; + case EnumPLCType.信捷XC网口: + TcpNet.Series = XinJESeries.XC; + TcpNet.DataFormat = HslCommunication.Core.DataFormat.CDAB; + break; + } OperateResult ret = TcpNet.ConnectServer(); if (ret.IsSuccess) { - connected = true; - MonitorPieces(); - TurntableOpen(12000,true); - + Connected = true; + //初始化流程 + InitProcess(); + LogAsync(DateTime.Now, LogLevel.Information, $"{IP}:{Port}PLC连接成功"); return true; } else { + Connected = false; + LogAsync(DateTime.Now, LogLevel.Error, $"PLC初始化失败"); return false; + //throw new Exception($"{IP}:{Port}PLC连接失败!"); } + + } - catch + catch (Exception ex) { + Connected = false; + LogAsync(DateTime.Now, LogLevel.Error, $"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}"); return false; + //throw new Exception($"{IP}:{Port}PLC连接失败!失败原因:{ex.ToString()}"); } } - - public override ushort ReadShort(string address) + public override Int16 ReadInt16(string address) { try { - // 读取Int变量 - var result = TcpNet.ReadInt16(address); - if (result.IsSuccess) + if (Connected) { - return (ushort)result.Content; + // 读取Int变量 + var result = TcpNet.ReadInt16(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取int16失败,地址{address}"); + throw new Exception($"PLC操作读取int16失败,地址{address}"); + + } } else { - return 0; + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); } } catch (Exception ex) { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取int16失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取int16失败,地址{address},失败原因:{ex.ToString()}"); + } + } - return 0; + public override Int32 ReadInt32(string address) + { + try + { + if (Connected) + { + // 读取Int变量 + var result = TcpNet.ReadInt32(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取int32失败,地址{address}"); + + throw new Exception($"PLC操作读取int32失败,地址{address}"); + } + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); + } + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取int32失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取int32失败,地址{address},失败原因:{ex.ToString()}"); } } - - public override int ReadInt(string address) + public override UInt16 ReadUInt16(string address) { try { - // 读取Int变量 - var result = TcpNet.ReadInt32(address); - if (result.IsSuccess) + if (Connected) { - return result.Content; + // 读取Int变量 + var result = TcpNet.ReadUInt16(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取uint16失败,地址{address}"); + + throw new Exception($"PLC操作读取uint16失败,地址{address}"); + + } } else { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); + } - return -1; + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取uint16失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取uint16失败,地址{address},失败原因:{ex.ToString()}"); + } + } + + public override UInt32 ReadUInt32(string address) + { + try + { + if (Connected) + { + // 读取Int变量 + var result = TcpNet.ReadUInt32(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作uint32失败,地址{address}"); + + throw new Exception($"PLC操作uint32失败,地址{address}"); + } + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); } } catch (Exception ex) { - return -1; + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取uint32失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取uint32失败,地址{address},失败原因:{ex.ToString()}"); } } @@ -117,20 +231,30 @@ namespace DH.Devices.PLC { try { - // 读取Float变量 - var result = TcpNet.ReadFloat(address); - if (result.IsSuccess) + if (Connected) { - return result.Content; + // 读取Float变量 + var result = TcpNet.ReadFloat(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取float失败,地址{address}"); + throw new Exception($"PLC操作读取float失败,地址{address}"); + } } else { - return -1; + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); } } catch (Exception ex) { - return -1; + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取float失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取float失败,地址{address},失败原因:{ex.ToString()}"); } } @@ -138,161 +262,226 @@ namespace DH.Devices.PLC { try { - // 读取Bool变量 - var result = TcpNet.ReadBool(address); - if (result.IsSuccess) + if (Connected) { - return result.Content; + // 读取Bool变量 + var result = TcpNet.ReadBool(address); + if (result.IsSuccess) + { + return result.Content; + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取bool失败,地址{address}"); + throw new Exception($"PLC操作读取bool失败,地址{address}"); + } } else { - return false; // 或者可以考虑返回其他的错误标识符 + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); } } catch (Exception ex) { - return false; // 或者返回其他的错误标识符 + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作读取bool失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作读取bool失败,地址{address},失败原因:{ex.ToString()}"); } } /// - /// 写单独地址 short 值 + /// 写单独地址 uint32 值 /// /// 地址 /// 要写入的 int 值 /// 是否等待回复 - public override bool WriteShort(string address, short writeValue, bool waitForReply = true) + public override bool WriteUInt32(string address, UInt32 writeValue, bool waitForReply = true) { - if (string.IsNullOrEmpty(address)) + if (Connected) { - return false; + + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作写入uint32失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作写入uint32失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); } - - int repeatTime = 3; - Stopwatch sw = new Stopwatch(); - sw.Start(); // 启动计时 - - do + else { - try - { - var result = TcpNet.Write(address, (short)writeValue); - if (result.IsSuccess) - { - sw.Stop(); - //LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"{Name} {address},写入 {writeValue} 完成,耗时:{sw.ElapsedMilliseconds} ms"); - return true; - } - } - catch (Exception ex) - { - repeatTime--; - if (repeatTime <= 0) - { - return false; - } - } - } while (repeatTime > 0); + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); - sw.Stop(); + throw new Exception($"PLC未连接,地址{address}"); + } return false; } - /// - /// 写单独地址 int 值 + /// 写单独地址 uint16 值 /// /// 地址 /// 要写入的 int 值 /// 是否等待回复 - public override bool WriteInt(string address, int writeValue, bool waitForReply = true) + + public override bool WriteUInt16(string address, UInt16 writeValue, bool waitForReply = true) { - if (string.IsNullOrEmpty(address)) + if (Connected) { - return false; + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作写入uint16失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作写入uint16失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); } - - int repeatTime = 3; - Stopwatch sw = new Stopwatch(); - sw.Start(); // 启动计时 - - do + else { - try - { - var result = TcpNet.Write(address, writeValue); - if (result.IsSuccess) - { - sw.Stop(); - return true; - } - } - catch (Exception ex) - { - repeatTime--; - if (repeatTime <= 0) - { - return false; - } - } - } while (repeatTime > 0); + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); - sw.Stop(); + throw new Exception($"PLC未连接,地址{address}"); + } return false; } + /// - /// 写单独地址 Dint 值 + /// 写单独地址 int32 值 /// /// 地址 - /// 要写入的 Dint 值 + /// 要写入的 int 值 /// 是否等待回复 - public override bool WriteDInt(string address, int writeValue, bool waitForReply = true) + public override bool WriteInt32(string address, Int32 writeValue, bool waitForReply = true) { - if (string.IsNullOrEmpty(address)) + if (Connected) { - return false; + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作写入int32失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作写入int32失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); } - - int repeatTime = 3; - Stopwatch sw = new Stopwatch(); - sw.Start(); // 启动计时 - - do + else { - try - { - string result = Regex.Replace(address, @"\D", ""); - int r = Convert.ToInt32(result) + 1; - string address1 = "HD" + r.ToString(); - short high = (short)(writeValue >> 16); // 高 16 位 - short low = (short)(writeValue & 0xFFFF); // 低 16 位 - TcpNet.Write(address1, high); - Thread.Sleep(10); - var res = TcpNet.Write(address, low); - if (res.IsSuccess) - { - sw.Stop(); - return true; - } - } - catch (Exception ex) - { - repeatTime--; - if (repeatTime <= 0) - { - return false; - } - } - } while (repeatTime > 0); - - sw.Stop(); + throw new Exception($"PLC未连接,地址{address}"); + } return false; } + /// + /// 写单独地址 int16 值 + /// + /// 地址 + /// 要写入的 int 值 + /// 是否等待回复 + + public override bool WriteInt16(string address, Int16 writeValue, bool waitForReply = true) + { + if (Connected) + { + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + throw new Exception($"PLC操作写入int16失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); + } + else + { + throw new Exception($"PLC未连接,地址{address}"); + } + + return false; + } + + + /// /// 写单独地址 float 值 @@ -302,37 +491,42 @@ namespace DH.Devices.PLC /// 是否等待回复 public override bool WriteFloat(string address, float writeValue, bool waitForReply = true) { - if (string.IsNullOrEmpty(address)) + if (Connected) { - return false; + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作写入float失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作写入float失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); } - - int repeatTime = 3; - Stopwatch sw = new Stopwatch(); - sw.Start(); // 启动计时 - - do + else { - try - { - var result = TcpNet.Write(address, writeValue); - if (result.IsSuccess) - { - sw.Stop(); - return true; - } - } - catch (Exception ex) - { - repeatTime--; - if (repeatTime <= 0) - { - return false; - } - } - } while (repeatTime > 0); + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); - sw.Stop(); + throw new Exception($"PLC未连接,地址{address}"); + } return false; } @@ -344,51 +538,58 @@ namespace DH.Devices.PLC /// 是否等待回复 public override bool WriteBool(string address, bool writeValue, bool waitForReply = true) { - if (string.IsNullOrEmpty(address)) + if (Connected) { - return false; + if (string.IsNullOrEmpty(address)) + { + return false; + } + + int repeatTime = 3; + do + { + try + { + var result = TcpNet.Write(address, writeValue); + if (result.IsSuccess) + { + return true; + } + } + catch (Exception ex) + { + repeatTime--; + if (repeatTime <= 0) + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC操作写入bool失败,地址{address},失败原因:{ex.ToString()}"); + throw new Exception($"PLC操作写入bool失败,地址{address},失败原因:{ex.ToString()}"); + } + } + } while (repeatTime > 0); + + Thread.Sleep(30); + } + else + { + LogAsync(DateTime.Now, LogLevel.Error, $"PLC未连接,地址{address}"); + throw new Exception($"PLC未连接,地址{address}"); } - int repeatTime = 3; - Stopwatch sw = new Stopwatch(); - sw.Start(); // 启动计时 - - do - { - try - { - var result = TcpNet.Write(address, writeValue); - if (result.IsSuccess) - { - sw.Stop(); - return true; - } - } - catch (Exception ex) - { - repeatTime--; - if (repeatTime <= 0) - { - return false; - } - } - } while (repeatTime > 0); - - sw.Stop(); - Thread.Sleep(10); return false; } public override bool PLCDisConnect() { - if (connected) + + if (Connected) { - TurntableStop(); + var res = TcpNet.ConnectClose(); if (res.IsSuccess) { - connected = false; + LogAsync(DateTime.Now, LogLevel.Information, $"{IP}:{Port}停止"); + Connected = false; return true; } return false; @@ -401,7 +602,7 @@ namespace DH.Devices.PLC private void MonitorPieces() { - + ThreadStart ts = new ThreadStart(MonitorPiecesImpl); Thread th = new Thread(ts); th.Priority = ThreadPriority.AboveNormal; @@ -420,16 +621,75 @@ namespace DH.Devices.PLC /// int,int 轴号 捕获位置 /// public event Action OnNewPieces; + private System.Threading.Timer timer; + private System.Threading.TimerCallback timerCallback; + public void NewPieces(int axisIndex, uint pieceNumber) { - _taskFactory.StartNew(() => - { - Thread.CurrentThread.Priority = ThreadPriority.Highest; + //_taskFactory.StartNew(() => + //{ + // Thread.CurrentThread.Priority = ThreadPriority.Highest; + + // OnNewPieces?.Invoke(axisIndex, pieceNumber); + //}); + Task.Run(() => + { + try + { + Thread.CurrentThread.Priority = ThreadPriority.Highest; + + OnNewPieces?.Invoke(axisIndex, pieceNumber); + } + catch (Exception ex) { /* 记录异常 */ } - OnNewPieces?.Invoke(axisIndex, pieceNumber); }); } + public async Task HeartbeatAsync1() + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "心跳地址"); +#if false + + Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; + if (pLCItem == null) + return; + while (Connected) + { + try + { + LogAsync(DateTime.Now, LogLevel.Information, $"心跳\t"); + + WriteBool(pLCItem.Address, true); + await Task.Delay(2000); // 非阻塞,等待1秒 + } + catch (Exception ex) { } + } +#else + + timerCallback = (object? state) => + { + timer.Change(2000, 2000); + try + { + + //WriteBool(pLCItem.Address, true); + WriteBool("M31", true); + + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Error, $"心跳:{ex.Message}"); + } + + }; + + + timer = new System.Threading.Timer( + timerCallback, null, 0, 2000); + + timer.Change(2000, 2000); +#endif + } /// /// 入料监听 /// @@ -437,20 +697,25 @@ namespace DH.Devices.PLC private void MonitorPiecesImpl() { + PLCItem pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "产品计数"); + if (pLCItem == null) + return; + string Count = pLCItem.Address; DateTime startTime = DateTime.Now; DateTime endTime = startTime; TimeSpan timeSpan = endTime - startTime; Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; //while (CurrentState != DeviceState.DSClose && CurrentState != DeviceState.DSExcept && CurrentState != DeviceState.DSUninit) - while (connected) + while (Connected) { - Stopwatch sw = new Stopwatch(); + // Stopwatch sw = new Stopwatch(); uint tmpPieceNumber = 0; - sw.Start(); + // sw.Start(); - var ret = TcpNet.ReadUInt16("D1016"); + // var ret = TcpNet.ReadUInt16("D1016"); + var ret = TcpNet.ReadUInt32(Count); - sw.Stop(); + //sw.Stop(); if (ret.IsSuccess) { tmpPieceNumber = ret.Content; @@ -458,20 +723,20 @@ namespace DH.Devices.PLC if (ret.IsSuccess && ret.Content > piecesCount) { - sw.Start(); + // sw.Start(); // Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 板卡{station}产品入列触发{tmpPieceNumber}"); //LogAsync(DateTime.Now, LogLevel.Information, $"转盘{0}产品入列 {piecesCountDic[0]} size:{sum}"); if (tmpPieceNumber != piecesCount + 1) { - //LogAsync(DateTime.Now, LogLevel.Information, $"入列触发丢失\t{tmpPieceNumber}"); + LogAsync(DateTime.Now, LogLevel.Information, $"入列触发丢失\t{tmpPieceNumber}"); // Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")}\t板卡{station}产品入列触发丢失,{piecesCountDic[station]}\t{tmpPieceNumber}"); } piecesCount = tmpPieceNumber; //NewPieces(ai, piecesCountDic[station]); - NewPieces(1, piecesCount); - sw.Stop(); - startTime = DateTime.Now; + NewPieces(1, piecesCount); + // sw.Stop(); + // startTime = DateTime.Now; //if (idalarm) //{ // idalarm = false; @@ -480,52 +745,291 @@ namespace DH.Devices.PLC } - Thread.Sleep(1); + Thread.Sleep(2); } } + public void InitProcess() + { + //启用心跳 + OpenHeartbeat(true); + // LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳"); + //状态复位 + StatusReset(); + //LogAsync(DateTime.Now, LogLevel.Information, $"状态复位"); + //关闭定位 + VisionPos(false); + // LogAsync(DateTime.Now, LogLevel.Information, $"关闭定位"); + //写入流程加载点位配置 + InitProcessAction(); + //LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置"); + //计数清零 + CountToZero(); + // LogAsync(DateTime.Now, LogLevel.Information, $"计数清零"); + //停止转盘 + TurnStart(false); + //LogAsync(DateTime.Now, LogLevel.Information, $"停止转盘"); + //转盘使能 + TurnEnable(true); + RedLight(false); + YellowLight(false); + //绿灯 + GreenLight(true); + LogAsync(DateTime.Now, LogLevel.Information, $"启用心跳-状态复位-关闭定位-写入流程加载点位配置-计数清零-停止转盘-转盘使能"); + //开启入料监听 + MonitorPieces(); + + + } + + + public void StartProcess() + { + //状态复位 + StatusReset(); + // LogAsync(DateTime.Now, LogLevel.Information, $"状态复位"); + //关闭定位 + VisionPos(false); + // LogAsync(DateTime.Now, LogLevel.Information, $"关闭定位"); + //写入流程启动点位配置 + StartProcessAction(); + PLCItem? pLCItem = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "挡料电机回原点速度").FirstOrDefault(); + if (pLCItem == null) + { + throw new Exception($"未找到挡料电机回原点速度地址,请检查该地址是否存在于点位表!"); + } + PLCItem? pLCItem1 = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "挡料电机位置").FirstOrDefault(); + if (pLCItem1 == null) + { + throw new Exception($"未找到挡料电机位置地址,请检查该地址是否存在于点位表!"); + } + FeedingMotor(true, Convert.ToInt32(pLCItem.Value), Convert.ToInt32(pLCItem1.Value)); + + + PLCItem? pLCItemmontor = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "相机步进速度").FirstOrDefault(); + if (pLCItemmontor == null) + { + throw new Exception($"未找到相机步进速度地址,请检查该地址是否存在于点位表!"); + } + PLCItem? pLCItemmontor1 = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "相机步进位置").FirstOrDefault(); + if (pLCItemmontor1 == null) + { + throw new Exception($"未找到相机步进位置地址,请检查该地址是否存在于点位表!"); + } + + Motor(true, Convert.ToInt32(pLCItemmontor.Value), Convert.ToInt32(pLCItemmontor1.Value)); + // if (_PLCConfig?.Enable == true) + //挡料电机操作 + // _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection); + + //流程开启操作配置 + // ProcessInitialAction(); + // if (_PLC?Enabled == true) + + + + // LogAsync(DateTime.Now, LogLevel.Information, $"写入流程加载点位配置"); + + bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt; + if (enableBelt == true) + { + Belt(true); + } + Thread.Sleep(1000); + bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator; + if (enableVibrator == true) + { + Vibrator(true); + } + Thread.Sleep(1000); + //转盘使能 + TurnEnable(true); + //转盘启动 + TurnStart(true); + Thread.Sleep(1000); + //计数清零 + CountToZero(); + Thread.Sleep(1000); + + LogAsync(DateTime.Now, LogLevel.Information, $"状态复位-关闭定位-写入流程加载点位配置-计数清零"); + + Thread.Sleep(200); + } + + public void StopProcess() + { + StatusReset(); + VisionPos(false); + CountToZero(); + bool? enableVibrator = ConfigModel.GlobalList?.FirstOrDefault()?.EnableVibrator; + if (enableVibrator == true) + { + Vibrator(true); + } + Thread.Sleep(1000); + bool? enableBelt = ConfigModel.GlobalList?.FirstOrDefault()?.EnableBelt; + if (enableBelt == true) + { + Belt(false); + } + Thread.Sleep(1000); + StopProcessAction(); + TurnStart(false); + + + + } + + public async Task ExecuteClearDelayAsync() + { + int? clearTime = ConfigModel.GlobalList?.FirstOrDefault()?.ClearTime; + if (clearTime != null) + { + TurnClear(true); + await Task.Delay(clearTime.Value * 1000); + TurnClear(false); + } + } + public void CloseProcess() + { + StatusReset(); + VisionPos(false); + CountToZero(); + TurnStart(false); + TurnEnable(false); + StopProcessAction(); + TurnClear(false); + OpenHeartbeat(false); + GreenLight(false); + YellowLight(false); + RedLight(true); + PLCDisConnect(); + // LogAsync(DateTime.Now, LogLevel.Information, $"PLC断开连接"); + } + public void InitProcessAction() => + ProcessAction(ConfigModel.GlobalList?.FirstOrDefault()?.InitProcessList?.ToList() ?? new List()); + + public void StartProcessAction() => + ProcessAction(ConfigModel.GlobalList?.FirstOrDefault()?.StartProcessList?.ToList() ?? new List()); + + public void StopProcessAction() => + ProcessAction(ConfigModel.GlobalList?.FirstOrDefault()?.StopProcessList?.ToList() ?? new List()); + + public void StartResetAction() => + ProcessAction(ConfigModel.GlobalList?.FirstOrDefault()?.StartResetList?.ToList() ?? new List()); + + public void StopResetAction() => + ProcessAction(ConfigModel.GlobalList?.FirstOrDefault()?.StopResetList?.ToList() ?? new List()); + + // 处理方法:无需再检查 null + private void ProcessAction(List items) + { + if (items.Count == 0) return; + + foreach (var item in items.OrderBy(x => x.StartIndex)) + { + switch (item.Type) + { + case EnumPLCDataType.单字整型: + WriteUInt16(item.Address, ushort.Parse(item.Value)); + break; + case EnumPLCDataType.双字整型: + WriteUInt32(item.Address, uint.Parse(item.Value)); + break; + case EnumPLCDataType.浮点型: + WriteFloat(item.Address, float.Parse(item.Value)); + break; + case EnumPLCDataType.布尔型: + WriteBool(item.Address, item.Value.Equals("true", StringComparison.OrdinalIgnoreCase)); + break; + } + } + } + /// + /// 状态复位 + /// + public void StatusReset() + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "状态复位"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, false); + } /// - /// 转盘开启操作 + /// 开启关闭视觉定位 /// - public void TurntableOpen(int speed, bool Direction) + public void VisionPos(bool b) { - WriteBool("M122", true); - Thread.Sleep(10); - WriteBool("M10", false); - Thread.Sleep(10); - //速度 - TcpNet.Write("HD10", (ushort)speed); - Thread.Sleep(10); - //方向 - WriteBool("M1", Direction); - Thread.Sleep(10); - //使能 - WriteBool("M2", true); - Thread.Sleep(10); - //启动 - WriteBool("M0", true); - Thread.Sleep(10); - // _mainMotion.CurrentState = DeviceState.DSOpen; + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "启用定位"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + } + + /// + /// 转盘方向 + /// + /// + public void TurnDirection(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "转盘方向"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + + } + + /// + /// 转盘速度 + /// + /// + public void TurnSpeed(int speed) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "转盘速度"); + if (pLCItem == null) + return; + WriteUInt16(pLCItem.Address, (ushort)speed); + + } + + /// + /// 转盘启停 + /// + public void TurnStart(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "转盘启动"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); piecesCount = 0; } - /// - /// 转盘停止操作 + /// 转盘使能 /// - public void TurntableStop() + /// + public void TurnEnable(bool b) { - WriteBool("M122", true); - Thread.Sleep(50); - WriteBool("M0", false); - Thread.Sleep(50); - WriteBool("M2", false); - Thread.Sleep(50); - WriteBool("M50", false); - piecesCount = 0; + PLCItem? DiskOpenItem = PLCItemList.FirstOrDefault(u => u.Name == "转盘使能"); + if (DiskOpenItem == null) + return; + WriteBool(DiskOpenItem.Address, b); + Thread.Sleep(30); } /// @@ -533,8 +1037,536 @@ namespace DH.Devices.PLC /// public void CountToZero() { - WriteBool("M120", true); + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "计数清零"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, true); + Thread.Sleep(30); + } + public void RedLight(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "指示灯红"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + } + + public void GreenLight(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "指示灯绿"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + + } + + public void YellowLight(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "指示灯黄"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + } + + public void Buzzer(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "蜂鸣器"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + } + + public void Belt(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "皮带"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + + } + public void Vibrator(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "振动盘"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + + } + public void Motor(bool direction, int speed, int pos) + { + + + int timeout = 60000; + int elapsedTime = 0; + int checkInterval = 100; + MotorToZero(false); + Thread.Sleep(300); + + MotorClockwise(false); + Thread.Sleep(300); + MotorCounterclockwise(false); + Thread.Sleep(300); + + MotorSpeed(speed); // 速度 + Thread.Sleep(300); + // 发送回原点指令 + MotorToZero(true); + Thread.Sleep(1000); // 给设备一些时间响应 + + + + // 等待回到原点 + while (true) + { + if (elapsedTime >= timeout) + { + LogAsync(DateTime.Now, LogLevel.Error, $"超时"); + + break; + } + + if (ReadMotorRealPos() == 0) + { + break; + } + Thread.Sleep(checkInterval); + elapsedTime += checkInterval; + } + + MotorToZero(false); + Thread.Sleep(200); + MotorClockwise(false); + Thread.Sleep(200); + MotorCounterclockwise(false); + // 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置 + // MotorSpeed(speed); + + Thread.Sleep(300); + MotorPos(pos); // 目标位置 + Thread.Sleep(300); + if (direction) + { + MotorClockwise(true); // 顺时针转动 + + } + else + { + MotorCounterclockwise(true); // 逆时针转动 + + } + + + int timeout1 = 60000; + int elapsedTime1 = 0; + int checkInterval1 = 100; + + while (true) + { + if (elapsedTime1 >= timeout1) + { + break; + } + + if (ReadMotorRealPos() == pos) + { + break; + } + Thread.Sleep(checkInterval1); + elapsedTime1 += checkInterval1; + } + Thread.Sleep(1500); + + } + + /// + /// 挡料电机操作 + /// true: 顺时针 + /// False: 逆时针 + /// + /// + public void FeedingMotor(bool direction, int speed, int pos) + { + + + int timeout = 10000; + int elapsedTime = 0; + int checkInterval = 100; + + BarrierToZero(false); + Thread.Sleep(300); + // 检查是否不在原点,如果不在,则回原点 + BarrierClockwise(false); + Thread.Sleep(300); + BarrierCounterclockwise(false); + Thread.Sleep(300); + BarrierToZeroSpeed(speed); // 速度 + Thread.Sleep(300); + // 发送回原点指令 + BarrierToZero(true); + Thread.Sleep(300); // 给设备一些时间响应 + + // 等待回到原点 + while (true) + { + if (elapsedTime >= timeout) + { + break; + } + + if (ReadBarrierRealPos() == 0) + { + break; + } + Thread.Sleep(checkInterval); + elapsedTime += checkInterval; + } + + BarrierToZero(false); + Thread.Sleep(300); + // 检查是否不在原点,如果不在,则回原点 + BarrierClockwise(false); + Thread.Sleep(300); + BarrierCounterclockwise(false); + Thread.Sleep(300); + // 无论是刚回到原点还是已经在原点,执行目标位置、速度和方向设置 + BarrierSpeed(speed); + Thread.Sleep(300); + + if (direction) + { + BarrierClockwise(true); // 顺时针转动 + + } + else + { + BarrierCounterclockwise(true); // 逆时针转动 + + } + Thread.Sleep(300); + BarrierPos(pos); // 目标位置 + Thread.Sleep(300); + int timeout1 = 10000; + int elapsedTime1 = 0; + int checkInterval1 = 100; + + while (true) + { + if (elapsedTime1 >= timeout1) + { + break; + } + + if (ReadBarrierRealPos() == pos) + { + break; + } + Thread.Sleep(checkInterval1); + elapsedTime1 += checkInterval1; + } + Thread.Sleep(300); + } + + + + /// + /// 转盘清料 + /// + /// + public void TurnClear(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "转盘清料"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + } + + /// + /// 开启心跳 + /// + /// + public void OpenHeartbeat(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "启用心跳"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + Thread.Sleep(30); + if (b) + { + //开启心跳 + //Task.Run(async () => await HeartbeatAsync1()); + _taskFac.StartNew(async () => await HeartbeatAsync1()); + } + } + + int currentRegister = 0; + public void Blowing(uint productNumber, UInt16 value) + { + int Register = (int)((productNumber - 1) % 30); + currentRegister = 411 + Register; + WriteUInt16($"D{currentRegister}", value); + + } + + /// + /// 读取定位脉冲 + /// + /// + + public int ReadVisionPos() + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "定位完成脉冲值"); + if (pLCItem == null) + return 0; + int value = ReadInt32(pLCItem.Address); + Thread.Sleep(100); + return Math.Abs(value); + } + + /// + /// 挡杆回原点 + /// + public void BarrierToZero(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + } + /// + /// 变焦相机回原点 + /// + public void ZoomcameraToZero(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "步进电机回原点"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + } + + /// + /// 读取挡料电机实时位置 + /// + /// + public int ReadBarrierRealPos() + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机实时位置"); + if (pLCItem == null) + { + throw new Exception("未找到挡料电机实时位置点位"); + } + + return ReadInt16(pLCItem.Address); + } + /// + /// 读取 挡杆回原点状态 + /// + /// + /// + + public bool ReadBarrierToZero() + { + //PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点"); + //if (pLCItem == null) + //{ + // throw new Exception("未找到挡料电机回原点点位"); + //} + //挡料电机传感器感应点 + return ReadBool("X11"); + } + + /// + /// 挡杆回原点速度 + /// + public void BarrierToZeroSpeed(int speed) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机回原点速度"); + if (pLCItem == null) + return; + WriteInt32(pLCItem.Address, speed); + } + + + /// + /// 挡杆位置 + /// + public void BarrierPos(int value) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机位置"); + if (pLCItem == null) + return; + WriteInt16(pLCItem.Address, (short)value); + } + + + /// + /// 挡杆速度 + /// + public void BarrierSpeed(int value) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机速度"); + if (pLCItem == null) + return; + WriteUInt32(pLCItem.Address, (uint)value); + } + + + /// + /// 挡杆顺时针 + /// + public void BarrierClockwise(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机顺时针"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); + Thread.Sleep(30); + } + + /// + /// 挡杆逆时针 + /// + public void BarrierCounterclockwise(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "挡料电机逆时针"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); + Thread.Sleep(30); + } + + + + /// + /// 相机步进电机回原点 + /// + /// + public void MotorToZero(bool b) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进原点"); + if (pLCItem == null) + return; + WriteBool(pLCItem.Address, b); + } + + /// + /// 读取相机步进电机回原点状态 + /// + /// + /// + public bool ReadMotorToZero() + { + //PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进原点"); + //if (pLCItem == null) + //{ + // throw new Exception("未找到挡料电机回原点点位"); + //} + //return ReadBool(pLCItem.Address); + return ReadBool("X10"); + } + + + /// + /// 相机步进电机位置 + /// + /// + public void MotorPos(int value) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进位置"); + if (pLCItem == null) + return; + WriteInt32(pLCItem.Address, (ushort)value); + } + + + + + + public int ReadMotorRealPos() + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进实时位置"); + if (pLCItem == null) + { + throw new Exception("未找到相机步进实时位置"); + } + return ReadInt32(pLCItem.Address); + } + + + + /// + /// 相机步进电机速度 + /// + /// + public void MotorSpeed(int speed) + { + PLCItem? pLCItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进速度"); + if (pLCItem == null) + return; + WriteInt32(pLCItem.Address, speed); + } + + + /// + /// 相机步进顺时针 + /// + public void MotorClockwise(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进顺时针"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); + Thread.Sleep(30); + } + + /// + /// 相机步进逆时针 + /// + public void MotorCounterclockwise(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "相机步进逆时针"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); + Thread.Sleep(30); + } + + /// + /// 相机步进点动 + /// + public void MotorTest(bool b) + { + PLCItem? DiskRunItem = PLCItemList.FirstOrDefault(u => u.Name == "点动相机步进"); + if (DiskRunItem == null) + return; + WriteBool(DiskRunItem.Address, b); + Thread.Sleep(30); + } + + public void LogAsync(LogMsg msg) + { + msg.MsgSource = "PLC"; + msg.ThreadId = Thread.CurrentThread.ManagedThreadId; + + //OnLog?.BeginInvoke(msg, null, null); + OnLog?.Invoke(msg); + + //if (InitialConfig.IsEnableLog) + { + LoggerHelper.LogAsync(msg); + } + } + public void LogAsync(DateTime dt, LogLevel logLevel, string msg) + { + LogAsync(new LogMsg(dt, logLevel, msg)); } } } diff --git a/DH.Devices.Vision/DH.Devices.Vision.csproj b/DH.Devices.Vision/DH.Devices.Vision.csproj index 9937409..cbe8a69 100644 --- a/DH.Devices.Vision/DH.Devices.Vision.csproj +++ b/DH.Devices.Vision/DH.Devices.Vision.csproj @@ -11,6 +11,14 @@ AnyCPU;x64 + + False + + + + False + + @@ -28,7 +36,6 @@ - diff --git a/DH.Devices.Vision/SimboDetection.cs b/DH.Devices.Vision/SimboDetection.cs index 53587a6..920d915 100644 --- a/DH.Devices.Vision/SimboDetection.cs +++ b/DH.Devices.Vision/SimboDetection.cs @@ -13,13 +13,13 @@ using System.Threading.Tasks; using System.Security.Cryptography.Xml; using System.Runtime.InteropServices; using Newtonsoft.Json; -using DH.Commons.Enums; +using DH.Commons.Base; namespace DH.Devices.Vision { - + /// /// 目标检测 GPU @@ -32,6 +32,10 @@ namespace DH.Devices.Vision bool res = false; try { + if (!Path.GetExtension(mLInit.ModelFile).Equals(".trt", StringComparison.OrdinalIgnoreCase)) + { + throw new Exception("选择的模型不是trt格式"); + } Model = MLGPUEngine.InitModel(mLInit.ModelFile, 1, mLInit.Score_thre, mLInit.GPUId, 3, 8); //Model = MLEngine.InitModel(mLInit.ModelFile, 1, 0.45f, 0, 3); @@ -104,18 +108,18 @@ namespace DH.Devices.Vision // json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}"; // Console.WriteLine("检测结果JSON:" + json); -#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + HYoloResult detResult = JsonConvert.DeserializeObject(json); -#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + if (detResult == null) { return; } int iNum = detResult.HYolo.Count; -#pragma warning disable CS0219 // 变量已被赋值,但从未使用过它的值 + int IokNum = 0; -#pragma warning restore CS0219 // 变量已被赋值,但从未使用过它的值 + for (int ix = 0; ix < iNum; ix++) { var det = detResult.HYolo[ix]; @@ -145,7 +149,6 @@ namespace DH.Devices.Vision Mat originMat = new Mat(); Mat detectMat = new Mat(); -#pragma warning disable CS0168 // 声明了变量,但从未使用过 try { if (req.mImage == null) diff --git a/DH.Devices.Vision/SimboInstanceSegmentation.cs b/DH.Devices.Vision/SimboInstanceSegmentation.cs index 9ede8ff..b062f53 100644 --- a/DH.Devices.Vision/SimboInstanceSegmentation.cs +++ b/DH.Devices.Vision/SimboInstanceSegmentation.cs @@ -12,7 +12,7 @@ using System.Threading; using System.Threading.Tasks; using System.Runtime.InteropServices; using Newtonsoft.Json; -using DH.Commons.Enums; +using DH.Commons.Base; namespace DH.Devices.Vision diff --git a/DH.Devices.Vision/SimboObjectDetection.cs b/DH.Devices.Vision/SimboObjectDetection.cs index c8e425e..e21a7ff 100644 --- a/DH.Devices.Vision/SimboObjectDetection.cs +++ b/DH.Devices.Vision/SimboObjectDetection.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; using System.Runtime.InteropServices; using Newtonsoft.Json; using System.Xml; -using DH.Commons.Enums; +using DH.Commons.Base; namespace DH.Devices.Vision @@ -136,9 +136,8 @@ namespace DH.Devices.Vision // json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}"; // Console.WriteLine("检测结果JSON:" + json); -#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + SegResult detResult = JsonConvert.DeserializeObject(json); -#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 if (detResult == null) { return; @@ -176,7 +175,6 @@ namespace DH.Devices.Vision MLResult mlResult = new MLResult(); Mat originMat=new Mat() ; Mat detectMat= new Mat(); -#pragma warning disable CS0168 // 声明了变量,但从未使用过 try { if (req.mImage == null) @@ -266,25 +264,24 @@ namespace DH.Devices.Vision // 释放 Mat 资源 if (detectMat != null) { - detectMat.Dispose(); -#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + detectMat = null; -#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + } if (originMat != null) { originMat.Dispose(); -#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + originMat = null; -#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 + } // GC.Collect(); } -#pragma warning restore CS0168 // 声明了变量,但从未使用过 + } diff --git a/DH.Devices.Vision/SimboVisionDriver.cs b/DH.Devices.Vision/SimboVisionDriver.cs index 7d22468..9e1c79b 100644 --- a/DH.Devices.Vision/SimboVisionDriver.cs +++ b/DH.Devices.Vision/SimboVisionDriver.cs @@ -1,5 +1,6 @@ -using DH.Commons.Enums; -using DH.Devices.Devices; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Helper; using DH.UI.Model.Winform; using HalconDotNet; using OpenCvSharp; @@ -7,6 +8,8 @@ using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.Eventing.Reader; +using System.Drawing.Imaging; using System.Linq; using System.Runtime.ExceptionServices; using System.Text; @@ -15,7 +18,8 @@ using System.Windows.Forms; using System.Xml.Linq; using XKRS.UI.Model.Winform; using static DH.Commons.Enums.EnumHelper; -using ResultState = DH.Commons.Enums.ResultState; +using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel; +using ResultState = DH.Commons.Base.ResultState; namespace DH.Devices.Vision @@ -28,20 +32,41 @@ namespace DH.Devices.Vision public void Init() { - //InitialQueue(); - InitialHalconTools(); - InitialSimboMLEnginesAsync(); + try + { + //InitialQueue(); + InitialHalconTools(); + InitialSimboMLEnginesAsync(); + + // ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised; + // ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised; + // base.Init(); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } - // ImageSaveHelper.OnImageSaveExceptionRaised -= ImageSaveHelper_OnImageSaveExceptionRaised; - // ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised; - // base.Init(); } - + public void Stop() + { + SimboStationMLEngineList.ToList().ForEach(sm => + { + if (sm.IsUseGPU) + { + sm.StationMLEngine.Dispose(); + } + else + { + sm.StationMLEngine.Dispose2(); + } + }); + } //private void ImageSaveHelper_OnImageSaveExceptionRaised(DateTime dt, string msg) //{ // LogAsync(new LogMsg(dt, LogLevel.Error, msg)); //} - public override DetectStationResult RunInference(Mat originImgSet, string detectionId = null) + public override DetectStationResult RunInference(MatSet originImgSet, string detectionId = null) { DetectStationResult detectResult = new DetectStationResult(); DetectionConfig detectConfig = null; @@ -57,16 +82,31 @@ namespace DH.Devices.Vision if (detectConfig == null) { - + LogAsync(DateTime.Now, LogLevel.Exception, $"异常:未能获取检测配置"); //未能获得检测配置 return detectResult; } + detectResult.Id = originImgSet.Id; + detectResult.DetectName = detectConfig.Name; + detectResult.ImageSaveDirectory=detectConfig.ImageSaveDirectory; + detectResult.SaveNGDetect=detectConfig.SaveNGDetect; + detectResult.SaveNGOriginal=detectConfig.SaveNGOriginal; + detectResult.SaveOKDetect=detectConfig.SaveOKDetect; + detectResult.SaveOKOriginal=detectConfig.SaveOKOriginal; + Mat OriginImage = originImgSet._mat.Clone(); + detectResult.DetectionOriginImage = CopyBitmapWithLockBits(OriginImage.ToBitmap()); + //detectResult.DetectionOriginImage = originImgSet.Clone().ToBitmap(); + Stopwatch sw = new Stopwatch(); #region 1.预处理 - - using (Mat PreTMat = originImgSet.Clone()) + sw.Start(); + using (Mat PreTMat = originImgSet._mat.Clone()) { PreTreated(detectConfig, detectResult, PreTMat); + PreTreated2(detectConfig, detectResult, PreTMat); } + sw.Stop(); + LogAsync(DateTime.Now, LogLevel.Information, $"产品:{detectResult.Pid} {detectConfig.Name}预处理耗时:{sw.ElapsedMilliseconds}ms。SpecsResults:{string.Join(";", detectResult.realSpecs.Select(u => $"{u.Code} {u.ActualValue}"))}"); + // 工位2尺寸测量 @@ -98,7 +138,7 @@ namespace DH.Devices.Vision } #region 2.深度学习推理 - //LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} 模型检测执行"); + LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} 模型检测执行"); if (!string.IsNullOrWhiteSpace(detectConfig.ModelPath)) { @@ -111,9 +151,9 @@ namespace DH.Devices.Vision req.ResizeHeight = (int)detectConfig.ModelHeight; // req.LabelNames = detectConfig.GetLabelNames(); // req.Score = IIConfig.Score; - req.mImage = originImgSet.Clone(); + req.mImage = originImgSet._mat.Clone(); - req.in_lable_path = detectConfig.in_lable_path; + req.in_lable_path = detectConfig.In_lable_path; req.confThreshold = detectConfig.ModelconfThreshold; req.iouThreshold = 0.3f; @@ -121,16 +161,16 @@ namespace DH.Devices.Vision req.out_node_name = "output0"; switch (detectConfig.ModelType) { - case MLModelType.ImageClassification: + case ModelType.图像分类: break; - case MLModelType.ObjectDetection: + case ModelType.目标检测: break; - case MLModelType.SemanticSegmentation: + case ModelType.语义分割: break; - case MLModelType.InstanceSegmentation: + case ModelType.实例分割: break; - case MLModelType.ObjectGPUDetection: + case ModelType.目标检测GPU: break; default: @@ -139,47 +179,18 @@ namespace DH.Devices.Vision // LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} RunInference BEGIN"); mlWatch.Start(); - //20230802改成多线程推理 RunInferenceFixed - var result = mlSet.StationMLEngine.RunInference(req); - // var result = mlSet.StationMLEngine.RunInferenceFixed(req); + var result = mlSet.StationMLEngine.RunInference(req); + mlWatch.Stop(); - // LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} RunInference END"); - - - - - - - // var req = new MLRequest(); - - //req.mImage = inferenceImage; - - //req.ResizeWidth = detectConfig.ModelWidth; - //req.ResizeHeight = detectConfig.ModelHeight; - //req.confThreshold = detectConfig.ModelconfThreshold; - //req.iouThreshold = 0.3f; - //req.out_node_name = "output0"; - //req.in_lable_path = detectConfig.in_lable_path; - - //Stopwatch sw = Stopwatch.StartNew(); - //var result = Dectection[detectionId].RunInference(req); - //sw.Stop(); - //LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 推理进度1.1,产品{productNumber},耗时{sw.ElapsedMilliseconds}ms"); - - //this.BeginInvoke(new MethodInvoker(delegate () - //{ - // // pictureBox1.Image?.Dispose(); // 释放旧图像 - // // pictureBox1.Image = result.ResultMap; - // richTextBox1.AppendText($"推理成功 {productNumber}, {result.IsSuccess}相机名字{camera.CameraName} 耗时 {mlWatch.ElapsedMilliseconds}ms\n"); - //})); - //req.mImage?.Dispose(); if (result == null || (result != null && !result.IsSuccess)) { + LogAsync(DateTime.Now, LogLevel.Exception, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectConfig.Name} 模型检测异常,{result?.ResultMessage}"); + detectResult.IsMLDetectDone = false; } if (result != null && result.IsSuccess) @@ -187,9 +198,13 @@ namespace DH.Devices.Vision detectResult.DetectDetails = result.ResultDetails; if (detectResult.DetectDetails != null) { + LogAsync(DateTime.Now, LogLevel.Information, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectResult.DetectName} 模型检测总耗时:{mlWatch.ElapsedMilliseconds} ms {result.ResultMessage},{string.Join(";", detectResult.DetectDetails.Select(u => $"{u.LabelName} X:{u.Rect.X} Y:{u.Rect.Y} Area:{u.Area.ToString("f2")} W:{u.Rect.Width} H:{u.Rect.Height}"))}"); + } else { + LogAsync(DateTime.Now, LogLevel.Exception, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectConfig.Name} 模型检测异常返回 null"); + detectResult.IsMLDetectDone = false; } } @@ -206,18 +221,13 @@ namespace DH.Devices.Vision { - //当前检测项的 过滤条件 - //var conditionList = detectConfig.DetectionFilterList - // .Where(u => u.IsEnabled && u.LabelName == d.LabelName) - // .GroupBy(u => u.ResultState) - // .OrderBy(u => u.Key) - // .ToList(); - //当前检测项的 过滤条件 - var conditionList = detectConfig.DetectionFilterList - .Where(u => u.IsEnabled && u.LabelName == d.LabelName) + // 当前检测项的 过滤条件 + var conditionList = detectConfig.DetectionLableList + .Where(u=>u.LabelName == d.LabelName) .GroupBy(u => u.ResultState) .OrderBy(u => u.Key) .ToList(); + if (conditionList.Count == 0) { @@ -236,29 +246,21 @@ namespace DH.Devices.Vision } - foreach (IGrouping group in conditionList) + foreach (IGrouping group in conditionList) { - //bool b = group.ToList().Any(f => - //{ - // return f.FilterOperation(d); - //}); + bool b = group.ToList().Any(f => + { + return f.FilterOperation(d); + }); - //if (b) - //{ - // d.FinalResult = group.Key; - // break; - //} - - if (group.Any(f => f.FilterOperation(d))) + if (b) { d.FinalResult = group.Key; break; } - //else - //{ - // d.FinalResult = d.InferenceResult = ResultState.OK; - //} + + } }); #endregion @@ -280,10 +282,11 @@ namespace DH.Devices.Vision #endregion + LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 检测结果:{detectResult.ResultState.GetEnumDescription()}"); - DisplayDetectionResult(detectResult, originImgSet.Clone(), detectionId); + DisplayDetectionResult(detectResult, originImgSet._mat.Clone(), detectionId); @@ -297,9 +300,16 @@ namespace DH.Devices.Vision /// private bool InitialSimboMLEnginesAsync() { - //深度学习 模型加载 - var resultOK = MLLoadModel(); - return resultOK; + try + { + //深度学习 模型加载 + var resultOK = MLLoadModel(); + return resultOK; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } /// /// 深度学习 模型加载 @@ -363,6 +373,7 @@ namespace DH.Devices.Vision { // LogAsync(DateTime.Now, LogLevel.Exception, $"异常:模型并发加载异常:{ex.GetExceptionMessage()}"); resultOK = false; + throw new Exception(ex.Message); } return resultOK; @@ -395,18 +406,18 @@ namespace DH.Devices.Vision // 根据算法类型创建不同的实例 switch (dc.ModelType) { - case MLModelType.ImageClassification: + case ModelType.图像分类: break; - case MLModelType.ObjectDetection: + case ModelType.目标检测: mLEngineSet.StationMLEngine = new SimboObjectDetection(); break; - case MLModelType.SemanticSegmentation: + case ModelType.语义分割: break; - case MLModelType.InstanceSegmentation: + case ModelType.实例分割: mLEngineSet.StationMLEngine = new SimboInstanceSegmentation(); break; - case MLModelType.ObjectGPUDetection: + case ModelType.目标检测GPU: mLEngineSet.StationMLEngine = new SimboDetection(); break; default: @@ -414,7 +425,7 @@ namespace DH.Devices.Vision } MLInit mLInit; string inferenceDevice = "CPU"; - if (dc.IsEnableGPU) + if (dc.ModelType== ModelType.目标检测GPU) { inferenceDevice = "GPU"; mLInit = new MLInit(dc.ModelPath, isGPU, coreInx, dc.ModelconfThreshold); @@ -430,12 +441,14 @@ namespace DH.Devices.Vision { // throw new ProcessException("异常:模型加载异常", null); } - //LogAsync(DateTime.Now, LogLevel.Information, $"模型加载成功;是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}"); + LogAsync(DateTime.Now, LogLevel.Action, $"模型加载成功;是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}"); } } catch (Exception ex) { - //throw new ProcessException($"异常:是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}"); + // LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功;是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}"); + + throw new Exception($"异常:是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.Message}"); } return mLEngineSet; } @@ -519,7 +532,7 @@ namespace DH.Devices.Vision if (!tool.RunProcedure(out string errorMsg, out _)) { // detectResult.PreTreatedFlag = false; - + LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常,{errorMsg}"); detectResult.IsPreTreatDone = false; @@ -534,12 +547,82 @@ namespace DH.Devices.Vision // detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = preTreatRet == 1; //detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = true; // detectResult.VisionImageSet.PreTreatedTime = DateTime.Now; - - for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++) + switch (preTreatRet) { - var param = detectConfig.OUTPreTreatParams[i]; - tool.InputTupleDic[param.Name] = double.Parse(param.Value); + case 0: // 预处理算法无异常 + { + + for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++) + { + + var param = detectConfig.OUTPreTreatParams[i]; + + var Value = tool.GetResultTuple(param.Name); + + // 显示结果 + IndexedSpec specRCricularity = new() + { + Code = param.Name, + ActualValue = Value + }; + detectResult.realSpecs.Add(specRCricularity); + } + detectResult.IsPreTreatNG = false; + detectResult.IsPreTreatDone = true; + } + break; + case -111: // 检测结果为NG + { + /// detectResult.VisionImageSet.DetectionResultImage = + // tool.GetResultObject("OUTPUT_PreTreatedImage").ConvertHImageToBitmap(); + for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++) + { + + var param = detectConfig.OUTPreTreatParams[i]; + + var Value = tool.GetResultTuple(param.Name); + + // 显示结果 + IndexedSpec specRCricularity = new() + { + Code = param.Name, + ActualValue = Value + }; + detectResult.realSpecs.Add(specRCricularity); + } + // 结果为NG + detectResult.ResultState = ResultState.DetectNG; + detectResult.IsPreTreatNG = true; + detectResult.IsPreTreatDone = true; + break; + } + default: + case -999: // 算法异常 + { + // 算法异常时,结果图 + // detectResult.VisionImageSet.DetectionResultImage = + // tool.GetResultObject("OUTPUT_PreTreatedImage").ConvertHImageToBitmap(); + + for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++) + { + + + var param = detectConfig.OUTPreTreatParams[i]; + // 显示结果 + IndexedSpec specRCricularity = new() + { + Code = param.Name, + ActualValue = -1, + }; + detectResult.realSpecs.Add(specRCricularity); + } + + // 结果保持TBD + detectResult.IsPreTreatDone = true; + break; + } } + @@ -571,7 +654,7 @@ namespace DH.Devices.Vision } catch (Exception ex) { - + LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常:{ex.GetExceptionMessage()}"); } finally { @@ -582,6 +665,266 @@ namespace DH.Devices.Vision } } + public void PreTreated2(DetectionConfig detectConfig, DetectStationResult detectResult,Mat MhImage) + { + try + { + + if (detectConfig.SizeTreatParamList != null && detectConfig.SizeTreatParamList.Count > 0) + { + foreach (var preTreat in detectConfig.SizeTreatParamList) + { + if (!string.IsNullOrWhiteSpace(preTreat.PrePath)) + { + string toolKey = preTreat.PrePath; + if (!HalconToolDict.ContainsKey(toolKey)) + { + LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}未获取预处理{preTreat.PreName}算法"); + return; + } + //Mean_Thre Deviation_Thre Mean_standard Deviation_standard + var tool = HalconToolDict[toolKey]; + + //tool.InputTupleDic["Mean_Thre"] = 123; + List PreParams = new List(); + preoutparms(PreParams, preTreat.ResultShow); + for (int i = 0; i < PreParams.Count(); i++) + { + var param = PreParams[i]; + if (param.Value.Contains(",")) + { + string[] strings = param.Value.Split(","); + float[] array = strings.Select(s => float.Parse(s)).ToArray(); + HTuple hTupleArray = new HTuple(array); + + tool.InputTupleDic[param.Name] = hTupleArray; + } + else + { + tool.InputTupleDic[param.Name] = double.Parse(param.Value);// param.Value.ToInt(); + } + + IndexedSpec spec1 = new IndexedSpec(); + + switch (preTreat.PreType) + { + case SizeEnum.线线测量: + + break; + case SizeEnum.线圆测量: + + break; + case SizeEnum.圆形测量: + break; + case SizeEnum.高度测量: + spec1.Code = $"in-{param.Name}"; + spec1.ActualValue = double.Parse(param.Value); + break; + case SizeEnum.直线测量: + break; + } + + + + detectResult.realSpecs.Add(spec1); + } + //// 指定保存路径 + //string filePath = @"D:\saved_image.jpg"; // 你可以根据需要更改路径和文件名 + + //// 使用WriteImage保存图像 + //detectResult.VisionImageSet.HImage.WriteImage("jpeg", 0, filePath); // "jpeg" 表示图像格式,0表示不使用压缩 + HObject obj = OpenCVHelper.MatToHImage(MhImage); + HImage hImage = HalconHelper.ConvertHObjectToHImage(obj); + tool.InputImageDic["INPUT_Image"] = hImage; + if (!tool.RunProcedure(out string errorMsg, out _)) + { + // detectResult.VisionImageSet.PreTreatedFlag = false; + LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常,{errorMsg}"); + detectResult.IsPreTreatDone = false; + + // HandleDetectDone(detectResult, detectConfig); + return; + } + + var preTreatRet = tool.GetResultTuple("OUTPUT_Flag").I; + //double MatchScore = 1; + //MatchScore = tool.GetResultTuple("MatchScore"); + + + detectResult.IsPreTreatDone = preTreatRet == 1; + // detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = true; + // detectResult.VisionImageSet.PreTreatedTime = DateTime.Now; + + + //IndexedSpec spec1 = new IndexedSpec(); + //spec1.Code = "score"; + //spec1.ActualValue = MatchScore; + + + //detectResult.realSpecs.Add(spec1); + ; + + + // 2023/10/16 新增预处理结果反馈,如果预处理结果为NG,直接返回 + if (preTreatRet != 0) + { + detectResult.ResultState = ResultState.DetectNG; + + detectResult.IsPreTreatNG = true; + // detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap(); + + + } + else + { + + switch (preTreat.PreType) + { + case SizeEnum.线线测量: + isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet); + break; + case SizeEnum.线圆测量: + isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet); + break; + case SizeEnum.圆形测量: + break; + case SizeEnum.高度测量: + { + + isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet); + } + break; + case SizeEnum.直线测量: + break; + } + + + + } + } + } + + + + } + + + + + + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}尺寸预处理异常:{ex.GetExceptionMessage()}"); + } + finally + { + //detectResult.VisionImageSet.HImage?.Dispose(); + //detectResult.VisionImageSet.HImage = null; + } + } + public void isPreOutparams(ref DetectStationResult detectResult, SizeTreatParam preTreat, HDevEngineTool tool, ref int preTreatRet) + { + List PreParams = new List(); + preoutparms(PreParams, preTreat.OutResultShow); + + for (int i = 0; i < PreParams.Count; i++) + { + var param = PreParams[i]; + double dParam = double.Parse(param.Value); + double heights = tool.GetResultTuple(param.Name).D; + switch (preTreat.PreType) + { + case SizeEnum.高度测量: + + + IndexedSpec spec2 = new IndexedSpec(); + spec2.Code = $"out-{param.Name}"; + spec2.ActualValue = Convert.ToDouble(param.Value); + + + detectResult.realSpecs.Add(spec2); + + + IndexedSpec spec1 = new IndexedSpec(); + spec1.Code = $"actual-{param.Name}"; + spec1.ActualValue = heights; + + + detectResult.realSpecs.Add(spec1); + + break; + default: break; + } + + + + if ((heights > dParam - preTreat.PrePix) && (heights < dParam + preTreat.PrePix)) + { + + + } + else + { + preTreatRet = -1; + break; + } + + } + + if (preTreatRet != 0) + { + detectResult.ResultState = ResultState.DetectNG; + + detectResult.IsPreTreatNG = true; + //detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap(); + + } + else + { + // detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap(); + + } + } + + + public void preoutparms(List preTreatParams, string defectRows) + { + // 解析 ReslutShow 字符串,构建 PreTreatParam 列表 + if (!string.IsNullOrEmpty(defectRows)) + { + var keyValuePairs = defectRows.Split(';'); + + foreach (var pair in keyValuePairs) + { + var parts = pair.Split(':'); + if (parts.Length == 2) + { + PreTreatParam param; + if (parts[1].Trim().Contains(",")) + { + param = new PreTreatParam + { + Name = parts[0].Trim(), // 去除多余的空格 + Value = parts[1].Trim() // 转换为 double,失败则为0 + }; + } + else + { + double dvalue = double.TryParse(parts[1].Trim(), out double value) ? value : 0; + + param = new PreTreatParam + { + Name = parts[0].Trim(), // 去除多余的空格 + Value = dvalue.ToString() // 转换为 double,失败则为0 + }; + } + + preTreatParams.Add(param); + } + } + } + } /// /// 显示检测结果 @@ -606,15 +949,15 @@ namespace DH.Devices.Vision }); } - //if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0) - //{ - // detectResult.realSpecs.ForEach(d => - // { - // displayTxt += - // $"{d.Code} :{d.ActualValue} \r\n"; - // }); - //} - Bitmap resultMask=result.ToBitmap(); + if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0) + { + detectResult.realSpecs.ForEach(d => + { + displayTxt += + $"{d.Code} :{d.ActualValue} \r\n"; + }); + } + Bitmap resultMask =result.ToBitmap(); //if (detectResult.VisionImageSet.DetectionResultImage == null && detectResult.VisionImageSet.SizeResultImage == null) //{ // return; @@ -648,14 +991,14 @@ namespace DH.Devices.Vision List detectionResultShapesClone = new List(detectionResultShapes); DetectionDone(DetectionId, resultMask, detectionResultShapes); - - //SaveDetectResultImageAsync(detectResult); + //detectResult.DetectionOriginImage = CopyBitmapWithLockBits(resultMask); + SaveDetectResultImageAsync(detectResult); // SaveDetectResultCSVAsync(detectResult); } catch (Exception ex) { - // LogAsync(DateTime.Now, LogLevel.Exception, - // $"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}"); + //LogAsync(DateTime.Now, LogLevel.Exception, + // $"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}"); } finally { @@ -664,6 +1007,343 @@ namespace DH.Devices.Vision } }); } + public static Bitmap CopyBitmapWithLockBits(Bitmap original) + { + Bitmap copy = new Bitmap(original.Width, original.Height, original.PixelFormat); + BitmapData originalData = original.LockBits( + new Rectangle(0, 0, original.Width, original.Height), + ImageLockMode.ReadOnly, + original.PixelFormat + ); + BitmapData copyData = copy.LockBits( + new Rectangle(0, 0, copy.Width, copy.Height), + ImageLockMode.WriteOnly, + copy.PixelFormat + ); + int bytesPerPixel = Image.GetPixelFormatSize(original.PixelFormat) / 8; + int byteCount = originalData.Stride * original.Height; + byte[] buffer = new byte[byteCount]; + System.Runtime.InteropServices.Marshal.Copy(originalData.Scan0, buffer, 0, byteCount); + System.Runtime.InteropServices.Marshal.Copy(buffer, 0, copyData.Scan0, byteCount); + original.UnlockBits(originalData); + copy.UnlockBits(copyData); + return copy; + } + /// + ///图片异步保存 + /// + public void SaveDetectResultImageAsync1(DetectStationResult detectResult) + { + string format = detectResult.ImageFormat.ToString().ToLower(); + if(detectResult.ImageSaveDirectory!=null) + { + if (!Directory.Exists(detectResult.ImageSaveDirectory)) + { + + } + else + { + + } + + }else + { + return; + } + + + + + + //根目录 + string rootPath = Path.Combine(detectResult.ImageSaveDirectory, + DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName); + + if (detectResult.ResultState != ResultState.OK) + { + + // NG原图 + if (detectResult.SaveNGOriginal && detectResult.DetectionOriginImage != null) + { + string prefix = Path.Combine(rootPath, "NGRawImages", detectResult.ResultLabel); + string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}"); + SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat); + } + + + //NG结果图 + if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null) + { + // 没有预处理,则保存原始图+检测结果图 + // if (detectResult.VisionImageSet.PreTreatedBitmap == null) + { + //string displayTxt = detectResult.ResultState.ToString() + "\r\n"; + string displayTxt = ""; + detectResult.DetectDetails.ForEach(d => + { + displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n"; + }); + if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0) + { + detectResult.realSpecs.ForEach(d => + { + displayTxt += + $"{d.Code} score:{d.ActualValue} \r\n"; + }); + } + Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap(); + + Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap(); + + //List detectionResultShapes = new List(detectResult.DetectionResultShapes); + //DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt); + //detectionResultShapes.Add(resultDisplay); + + Bitmap resultMap = GetResultImage(resultMask, detectResult.DetectionResultShapes); + + + // resultDisplay.Dispose(); + //detectionResultShapes.Clear(); + + + Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap); + + string prefix = Path.Combine(rootPath, "NGFitImages", detectResult.ResultLabel); + Directory.CreateDirectory(prefix); // 自动创建所有缺失的目录 + string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}"); + + + + // SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat); + // 使用回调或 Task.ContinueWith 确保保存完成后再释放资源 + //SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat) + // .ContinueWith(t => + // { + // resultMask?.Dispose(); + // preTreatedBitmap?.Dispose(); + // resultMap?.Dispose(); + // detectionFitImage?.Dispose(); + // }, TaskScheduler.Default); + + resultMask?.Dispose(); + preTreatedBitmap?.Dispose(); + resultMap?.Dispose(); + detectionFitImage?.Dispose(); + } + + + } + } + else + { // OK原图 + if (detectResult.SaveOKOriginal && detectResult.DetectionOriginImage != null) + { + string prefix = Path.Combine(rootPath, "OKRawImages", detectResult.ResultLabel); + string fullname = Path.Combine(prefix, $"{detectResult.Pid}_OKRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}"); + SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat); + } + + //ok结果图 + if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null) + { + // 没有预处理,则保存原始图+检测结果图 + // if (detectResult.VisionImageSet.PreTreatedBitmap == null) + { + //string displayTxt = detectResult.ResultState.ToString() + "\r\n"; + string displayTxt = ""; + detectResult.DetectDetails.ForEach(d => + { + displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n"; + }); + if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0) + { + detectResult.realSpecs.ForEach(d => + { + displayTxt += + $"{d.Code} score:{d.ActualValue} \r\n"; + }); + } + Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap(); + + Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap(); + + List detectionResultShapes = new List(detectResult.DetectionResultShapes); + DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt); + detectionResultShapes.Add(resultDisplay); + + Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes); + + + + + + Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap); + + string prefix = Path.Combine(rootPath, "OKFitImages", detectResult.ResultLabel); + string fullname = Path.Combine(prefix, $"{detectResult.Pid}_" + + $"OKFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}"); + + + + SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat); + + //resultDisplay.Dispose(); + //detectionResultShapes.Clear(); + //resultMask?.Dispose(); + //preTreatedBitmap?.Dispose(); + //resultMap?.Dispose(); + //detectionFitImage?.Dispose(); + } + + + } + + + } + + + } + + public virtual Bitmap GetResultImage(Bitmap baseImage, List eleList) + { + try + { + // 重新生成画布 避免 无法从带有索引像素格式的图像创建graphics对象 + Bitmap image = new Bitmap(baseImage.Width, baseImage.Height); + + using (Graphics g = Graphics.FromImage(image)) + { + g.DrawImage(baseImage, 0, 0); + + // 创建临时拷贝避免共享状态 + // var tempElements = eleList.Select(e => e.Clone()).Cast().ToList(); + + eleList.ForEach(e => + { + e.State = ElementState.Normal; + e.Draw(g); + }); + } + return image; + } + catch (Exception ex) + { + LogAsync(DateTime.Now, LogLevel.Exception, $"获取叠加结果图片异常:{ex.GetExceptionMessage()}"); + return null; + } + + } + + + + public void SaveDetectResultImageAsync(DetectStationResult detectResult) + { + if (detectResult.ImageSaveDirectory == null) return; + + string format = detectResult.ImageFormat.ToString().ToLower(); + string rootPath = Path.Combine(detectResult.ImageSaveDirectory, + DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName); + + try + { + if (detectResult.ResultState != ResultState.OK) + { + SaveNGImages(detectResult, rootPath, format); + } + else + { + SaveOKImages(detectResult, rootPath, format); + } + } + catch (Exception ex) + { + // Logger.Error($"保存检测结果失败: {ex.Message}"); + } + finally { + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + } + private void SaveNGImages(DetectStationResult result, string rootPath, string format) + { + // NG 原图 + if (result.SaveNGOriginal && result.DetectionOriginImage != null) + { + string prefix = Path.Combine(rootPath, "NGRawImages", result.ResultLabel); + Directory.CreateDirectory(prefix); + string fullname = Path.Combine(prefix, $"{result.Pid}_NGRawImage_{result.DetectName}_{result.Id}.{format}"); + SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat); + } + + // NG 结果图 + if (result.SaveOKDetect && result.DetectionOriginImage != null) + { + string displayTxt = BuildDisplayText(result); + using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap()) + using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap()) + { + var detectionResultShapes = new List() + { + new DetectResultDisplay(result, resultMask, displayTxt) + }; + + using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes)) + using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap)) + { + string prefix = Path.Combine(rootPath, "NGFitImages", result.ResultLabel); + Directory.CreateDirectory(prefix); + string fullname = Path.Combine(prefix, $"{result.Pid}_NGFitImage_{result.DetectName}_{result.Id}.{format}"); + SaveImageAsync(fullname, detectionFitImage, result.ImageFormat); + } + } + } + } + private void SaveOKImages(DetectStationResult result, string rootPath, string format) + { + // OK 原图 + if (result.SaveOKOriginal && result.DetectionOriginImage != null) + { + string prefix = Path.Combine(rootPath, "OKRawImages", result.ResultLabel); + Directory.CreateDirectory(prefix); + string fullname = Path.Combine(prefix, $"{result.Pid}_OKRawImage_{result.DetectName}_{result.Id}.{format}"); + SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat); + } + + // OK 结果图 + if (result.SaveOKDetect && result.DetectionOriginImage != null) + { + string displayTxt = BuildDisplayText(result); + using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap()) + using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap()) + { + var detectionResultShapes = new List() + { + new DetectResultDisplay(result, resultMask, displayTxt) + }; + + using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes)) + using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap)) + { + string prefix = Path.Combine(rootPath, "OKFitImages", result.ResultLabel); + Directory.CreateDirectory(prefix); + string fullname = Path.Combine(prefix, $"{result.Pid}_OKFitImage_{result.DetectName}_{result.Id}.{format}"); + SaveImageAsync(fullname, detectionFitImage, result.ImageFormat); + } + + } + } + } + + private string BuildDisplayText(DetectStationResult result) + { + StringBuilder sb = new StringBuilder(); + result.DetectDetails.ForEach(d => sb.AppendLine($"{d.LabelName} score:{d.Score:f2} area:{d.Area:f2}")); + if (result.realSpecs?.Count > 0) + { + result.realSpecs.ForEach(d => sb.AppendLine($"{d.Code} score:{d.ActualValue}")); + } + return sb.ToString(); + } } } diff --git a/DH.Devices.Vision/SimboVisionMLBase.cs b/DH.Devices.Vision/SimboVisionMLBase.cs index 0580f83..cf54478 100644 --- a/DH.Devices.Vision/SimboVisionMLBase.cs +++ b/DH.Devices.Vision/SimboVisionMLBase.cs @@ -1,5 +1,5 @@ using AntdUI; - +using DH.Commons.Base; using DH.Commons.Enums; using OpenCvSharp; using System; @@ -17,7 +17,7 @@ namespace DH.Devices.Vision public Mat ColorLut { get; set; } public byte[] ColorMap { get; set; } - public MLModelType ModelType { get; set; } + public ModelType ModelType { get; set; } public IntPtr Model { get; set; } diff --git a/DH.RBAC/AccountForm.Designer.cs b/DH.RBAC/AccountForm.Designer.cs new file mode 100644 index 0000000..9065606 --- /dev/null +++ b/DH.RBAC/AccountForm.Designer.cs @@ -0,0 +1,879 @@ +namespace DH.RBAC +{ + partial class AccountForm + { + /// + /// 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(AccountForm)); + this.uiPanel1 = new Sunny.UI.UIPanel(); + this.titlePanel = new System.Windows.Forms.Panel(); + this.uiLabel15 = new Sunny.UI.UILabel(); + this.btnClose = new Sunny.UI.UISymbolLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.lblCurrentUser = new System.Windows.Forms.Label(); + this.imageAvator = new System.Windows.Forms.PictureBox(); + this.uiTabControl1 = new Sunny.UI.UITabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.txtBirthday = new Sunny.UI.UIDatePicker(); + this.btnSave = new Sunny.UI.UIButton(); + this.txtSignature = new Sunny.UI.UITextBox(); + this.lblSignature = new Sunny.UI.UILabel(); + this.txtAddress = new Sunny.UI.UITextBox(); + this.lblAddress = new Sunny.UI.UILabel(); + this.txtTel = new Sunny.UI.UITextBox(); + this.lblTel = new Sunny.UI.UILabel(); + this.txtEmail = new Sunny.UI.UITextBox(); + this.lblEmail = new Sunny.UI.UILabel(); + this.lblBirthday = new Sunny.UI.UILabel(); + this.rdFemale = new Sunny.UI.UIRadioButton(); + this.rdMale = new Sunny.UI.UIRadioButton(); + this.txtNickName = new Sunny.UI.UITextBox(); + this.lblGender = new Sunny.UI.UILabel(); + this.lblNickName = new Sunny.UI.UILabel(); + this.txtName = new Sunny.UI.UITextBox(); + this.lblName = new Sunny.UI.UILabel(); + this.txtAccount = new Sunny.UI.UITextBox(); + this.lblAccount = new Sunny.UI.UILabel(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.btnSelectAvator = new Sunny.UI.UIButton(); + this.uiLabel10 = new Sunny.UI.UILabel(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.btnReset = new Sunny.UI.UIButton(); + this.btnChangePassword = new Sunny.UI.UIButton(); + this.txtComfirmPassword = new Sunny.UI.UITextBox(); + this.txtNewPassword = new Sunny.UI.UITextBox(); + this.lblComfirmPassword = new Sunny.UI.UILabel(); + this.lblNewPassword = new Sunny.UI.UILabel(); + this.txtOldPassword = new Sunny.UI.UITextBox(); + this.lblOldPassword = new Sunny.UI.UILabel(); + this.uiLabel11 = new Sunny.UI.UILabel(); + this.uiPanel1.SuspendLayout(); + this.titlePanel.SuspendLayout(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.imageAvator)).BeginInit(); + this.uiTabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.SuspendLayout(); + // + // uiPanel1 + // + this.uiPanel1.Controls.Add(this.titlePanel); + this.uiPanel1.Controls.Add(this.panel1); + this.uiPanel1.Controls.Add(this.uiTabControl1); + this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiPanel1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(241)))), ((int)(((byte)(243))))); + this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiPanel1.Location = new System.Drawing.Point(0, 0); + this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1); + this.uiPanel1.Name = "uiPanel1"; + this.uiPanel1.RectColor = System.Drawing.Color.Silver; + this.uiPanel1.Size = new System.Drawing.Size(1031, 558); + this.uiPanel1.Style = Sunny.UI.UIStyle.Custom; + this.uiPanel1.StyleCustomMode = true; + this.uiPanel1.TabIndex = 6; + this.uiPanel1.Text = null; + this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // titlePanel + // + this.titlePanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.titlePanel.Controls.Add(this.uiLabel15); + this.titlePanel.Controls.Add(this.btnClose); + this.titlePanel.Location = new System.Drawing.Point(0, -1); + this.titlePanel.Name = "titlePanel"; + this.titlePanel.Size = new System.Drawing.Size(1031, 43); + this.titlePanel.TabIndex = 7; + this.titlePanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.titlePanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // uiLabel15 + // + this.uiLabel15.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiLabel15.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel15.Location = new System.Drawing.Point(0, 0); + this.uiLabel15.Name = "uiLabel15"; + this.uiLabel15.Size = new System.Drawing.Size(986, 43); + this.uiLabel15.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel15.TabIndex = 1; + this.uiLabel15.Text = "用户账号管理"; + this.uiLabel15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.uiLabel15.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.uiLabel15.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // btnClose + // + this.btnClose.Dock = System.Windows.Forms.DockStyle.Right; + this.btnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnClose.Location = new System.Drawing.Point(986, 0); + this.btnClose.MinimumSize = new System.Drawing.Size(1, 1); + this.btnClose.Name = "btnClose"; + this.btnClose.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0); + this.btnClose.Size = new System.Drawing.Size(45, 43); + this.btnClose.Style = Sunny.UI.UIStyle.Custom; + this.btnClose.Symbol = 77; + this.btnClose.SymbolSize = 60; + this.btnClose.TabIndex = 0; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + this.btnClose.MouseEnter += new System.EventHandler(this.btnClose_MouseEnter); + this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.lblCurrentUser); + this.panel1.Controls.Add(this.imageAvator); + this.panel1.Location = new System.Drawing.Point(12, 56); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(241, 218); + this.panel1.TabIndex = 6; + // + // lblCurrentUser + // + this.lblCurrentUser.Location = new System.Drawing.Point(3, 176); + this.lblCurrentUser.Name = "lblCurrentUser"; + this.lblCurrentUser.Size = new System.Drawing.Size(235, 27); + this.lblCurrentUser.TabIndex = 4; + this.lblCurrentUser.Text = "admin@管理员"; + this.lblCurrentUser.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // imageAvator + // + this.imageAvator.Image = global:: DH.RBAC.Properties.Resources.avatar; + this.imageAvator.Location = new System.Drawing.Point(49, 27); + this.imageAvator.Name = "imageAvator"; + this.imageAvator.Size = new System.Drawing.Size(139, 136); + this.imageAvator.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.imageAvator.TabIndex = 3; + this.imageAvator.TabStop = false; + // + // uiTabControl1 + // + this.uiTabControl1.Controls.Add(this.tabPage1); + this.uiTabControl1.Controls.Add(this.tabPage2); + this.uiTabControl1.Controls.Add(this.tabPage3); + this.uiTabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; + this.uiTabControl1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiTabControl1.ItemSize = new System.Drawing.Size(150, 40); + this.uiTabControl1.Location = new System.Drawing.Point(275, 56); + this.uiTabControl1.MainPage = ""; + this.uiTabControl1.MenuStyle = Sunny.UI.UIMenuStyle.Custom; + this.uiTabControl1.Name = "uiTabControl1"; + this.uiTabControl1.SelectedIndex = 0; + this.uiTabControl1.Size = new System.Drawing.Size(734, 490); + this.uiTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.uiTabControl1.Style = Sunny.UI.UIStyle.Custom; + this.uiTabControl1.TabBackColor = System.Drawing.Color.White; + this.uiTabControl1.TabIndex = 5; + this.uiTabControl1.TabSelectedColor = System.Drawing.Color.White; + this.uiTabControl1.TabUnSelectedForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(82)))), ((int)(((byte)(91))))); + // + // tabPage1 + // + this.tabPage1.BackColor = System.Drawing.Color.White; + this.tabPage1.Controls.Add(this.txtBirthday); + this.tabPage1.Controls.Add(this.btnSave); + this.tabPage1.Controls.Add(this.txtSignature); + this.tabPage1.Controls.Add(this.lblSignature); + this.tabPage1.Controls.Add(this.txtAddress); + this.tabPage1.Controls.Add(this.lblAddress); + this.tabPage1.Controls.Add(this.txtTel); + this.tabPage1.Controls.Add(this.lblTel); + this.tabPage1.Controls.Add(this.txtEmail); + this.tabPage1.Controls.Add(this.lblEmail); + this.tabPage1.Controls.Add(this.lblBirthday); + this.tabPage1.Controls.Add(this.rdFemale); + this.tabPage1.Controls.Add(this.rdMale); + this.tabPage1.Controls.Add(this.txtNickName); + this.tabPage1.Controls.Add(this.lblGender); + this.tabPage1.Controls.Add(this.lblNickName); + this.tabPage1.Controls.Add(this.txtName); + this.tabPage1.Controls.Add(this.lblName); + this.tabPage1.Controls.Add(this.txtAccount); + this.tabPage1.Controls.Add(this.lblAccount); + this.tabPage1.Location = new System.Drawing.Point(0, 40); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Size = new System.Drawing.Size(734, 450); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "资料"; + // + // txtBirthday + // + this.txtBirthday.FillColor = System.Drawing.Color.White; + this.txtBirthday.FillColor2 = System.Drawing.Color.White; + this.txtBirthday.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtBirthday.Location = new System.Drawing.Point(117, 139); + this.txtBirthday.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtBirthday.MaxLength = 10; + this.txtBirthday.MinimumSize = new System.Drawing.Size(63, 0); + this.txtBirthday.Name = "txtBirthday"; + this.txtBirthday.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2); + this.txtBirthday.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtBirthday.Size = new System.Drawing.Size(188, 36); + + this.txtBirthday.StyleCustomMode = true; + this.txtBirthday.SymbolDropDown = 61555; + this.txtBirthday.SymbolNormal = 61555; + this.txtBirthday.TabIndex = 20; + this.txtBirthday.Text = "2021-12-29"; + this.txtBirthday.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + this.txtBirthday.Value = new System.DateTime(2021, 12, 29, 0, 0, 0, 0); + // + // btnSave + // + this.btnSave.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnSave.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnSave.Location = new System.Drawing.Point(117, 379); + this.btnSave.MinimumSize = new System.Drawing.Size(1, 1); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(125, 44); + this.btnSave.Style = Sunny.UI.UIStyle.Custom; + this.btnSave.TabIndex = 19; + this.btnSave.Text = "保存"; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // txtSignature + // + this.txtSignature.ButtonFillColor = System.Drawing.Color.White; + this.txtSignature.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtSignature.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtSignature.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtSignature.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtSignature.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtSignature.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtSignature.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtSignature.ButtonSymbol = 61761; + this.txtSignature.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtSignature.FillColor2 = System.Drawing.Color.White; + this.txtSignature.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtSignature.Location = new System.Drawing.Point(117, 252); + this.txtSignature.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtSignature.Maximum = 2147483647D; + this.txtSignature.MaxLength = 128; + this.txtSignature.Minimum = -2147483648D; + this.txtSignature.MinimumSize = new System.Drawing.Size(1, 16); + this.txtSignature.Multiline = true; + this.txtSignature.Name = "txtSignature"; + this.txtSignature.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtSignature.Size = new System.Drawing.Size(581, 103); + + this.txtSignature.StyleCustomMode = true; + this.txtSignature.TabIndex = 18; + this.txtSignature.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblSignature + // + this.lblSignature.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblSignature.Location = new System.Drawing.Point(3, 252); + this.lblSignature.Name = "lblSignature"; + this.lblSignature.Size = new System.Drawing.Size(107, 29); + this.lblSignature.Style = Sunny.UI.UIStyle.Custom; + this.lblSignature.TabIndex = 17; + this.lblSignature.Text = "个性签名"; + this.lblSignature.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtAddress + // + this.txtAddress.ButtonFillColor = System.Drawing.Color.White; + this.txtAddress.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtAddress.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtAddress.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAddress.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonSymbol = 61761; + this.txtAddress.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtAddress.FillColor2 = System.Drawing.Color.White; + this.txtAddress.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtAddress.Location = new System.Drawing.Point(429, 191); + this.txtAddress.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtAddress.Maximum = 2147483647D; + this.txtAddress.MaxLength = 128; + this.txtAddress.Minimum = -2147483648D; + this.txtAddress.MinimumSize = new System.Drawing.Size(1, 16); + this.txtAddress.Name = "txtAddress"; + this.txtAddress.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAddress.Size = new System.Drawing.Size(269, 42); + + this.txtAddress.StyleCustomMode = true; + this.txtAddress.TabIndex = 16; + this.txtAddress.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblAddress + // + this.lblAddress.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblAddress.Location = new System.Drawing.Point(312, 198); + this.lblAddress.Name = "lblAddress"; + this.lblAddress.Size = new System.Drawing.Size(110, 29); + this.lblAddress.Style = Sunny.UI.UIStyle.Custom; + this.lblAddress.TabIndex = 15; + this.lblAddress.Text = "联系地址"; + this.lblAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtTel + // + this.txtTel.ButtonFillColor = System.Drawing.Color.White; + this.txtTel.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtTel.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtTel.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtTel.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtTel.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtTel.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtTel.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtTel.ButtonSymbol = 61761; + this.txtTel.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtTel.FillColor2 = System.Drawing.Color.White; + this.txtTel.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtTel.Location = new System.Drawing.Point(117, 191); + this.txtTel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtTel.Maximum = 2147483647D; + this.txtTel.MaxLength = 20; + this.txtTel.Minimum = -2147483648D; + this.txtTel.MinimumSize = new System.Drawing.Size(1, 16); + this.txtTel.Name = "txtTel"; + this.txtTel.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtTel.Size = new System.Drawing.Size(188, 42); + + this.txtTel.StyleCustomMode = true; + this.txtTel.TabIndex = 14; + this.txtTel.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblTel + // + this.lblTel.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblTel.Location = new System.Drawing.Point(3, 198); + this.lblTel.Name = "lblTel"; + this.lblTel.Size = new System.Drawing.Size(107, 29); + this.lblTel.Style = Sunny.UI.UIStyle.Custom; + this.lblTel.TabIndex = 13; + this.lblTel.Text = "移动电话"; + this.lblTel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtEmail + // + this.txtEmail.ButtonFillColor = System.Drawing.Color.White; + this.txtEmail.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtEmail.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtEmail.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEmail.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonSymbol = 61761; + this.txtEmail.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtEmail.FillColor2 = System.Drawing.Color.White; + this.txtEmail.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtEmail.Location = new System.Drawing.Point(429, 136); + this.txtEmail.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtEmail.Maximum = 2147483647D; + this.txtEmail.MaxLength = 60; + this.txtEmail.Minimum = -2147483648D; + this.txtEmail.MinimumSize = new System.Drawing.Size(1, 16); + this.txtEmail.Name = "txtEmail"; + this.txtEmail.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEmail.Size = new System.Drawing.Size(269, 42); + + this.txtEmail.StyleCustomMode = true; + this.txtEmail.TabIndex = 12; + this.txtEmail.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblEmail + // + this.lblEmail.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblEmail.Location = new System.Drawing.Point(357, 143); + this.lblEmail.Name = "lblEmail"; + this.lblEmail.Size = new System.Drawing.Size(65, 29); + this.lblEmail.Style = Sunny.UI.UIStyle.Custom; + this.lblEmail.TabIndex = 11; + this.lblEmail.Text = "邮箱"; + this.lblEmail.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // lblBirthday + // + this.lblBirthday.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblBirthday.Location = new System.Drawing.Point(3, 143); + this.lblBirthday.Name = "lblBirthday"; + this.lblBirthday.Size = new System.Drawing.Size(107, 29); + this.lblBirthday.Style = Sunny.UI.UIStyle.Custom; + this.lblBirthday.TabIndex = 9; + this.lblBirthday.Text = "出生日期"; + this.lblBirthday.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // rdFemale + // + this.rdFemale.Cursor = System.Windows.Forms.Cursors.Hand; + this.rdFemale.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.rdFemale.Location = new System.Drawing.Point(501, 88); + this.rdFemale.MinimumSize = new System.Drawing.Size(1, 1); + this.rdFemale.Name = "rdFemale"; + this.rdFemale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.rdFemale.Size = new System.Drawing.Size(57, 36); + this.rdFemale.Style = Sunny.UI.UIStyle.Custom; + this.rdFemale.TabIndex = 8; + this.rdFemale.Text = "女"; + // + // rdMale + // + this.rdMale.Checked = true; + this.rdMale.Cursor = System.Windows.Forms.Cursors.Hand; + this.rdMale.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.rdMale.Location = new System.Drawing.Point(433, 88); + this.rdMale.MinimumSize = new System.Drawing.Size(1, 1); + this.rdMale.Name = "rdMale"; + this.rdMale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0); + this.rdMale.Size = new System.Drawing.Size(57, 36); + this.rdMale.Style = Sunny.UI.UIStyle.Custom; + this.rdMale.TabIndex = 7; + this.rdMale.Text = "男"; + // + // txtNickName + // + this.txtNickName.ButtonFillColor = System.Drawing.Color.White; + this.txtNickName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtNickName.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtNickName.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtNickName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtNickName.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtNickName.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtNickName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtNickName.ButtonSymbol = 61761; + this.txtNickName.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtNickName.FillColor2 = System.Drawing.Color.White; + this.txtNickName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtNickName.Location = new System.Drawing.Point(429, 32); + this.txtNickName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtNickName.Maximum = 2147483647D; + this.txtNickName.MaxLength = 20; + this.txtNickName.Minimum = -2147483648D; + this.txtNickName.MinimumSize = new System.Drawing.Size(1, 16); + this.txtNickName.Name = "txtNickName"; + this.txtNickName.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtNickName.Size = new System.Drawing.Size(269, 42); + + this.txtNickName.StyleCustomMode = true; + this.txtNickName.TabIndex = 3; + this.txtNickName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblGender + // + this.lblGender.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblGender.Location = new System.Drawing.Point(357, 91); + this.lblGender.Name = "lblGender"; + this.lblGender.Size = new System.Drawing.Size(65, 29); + this.lblGender.Style = Sunny.UI.UIStyle.Custom; + this.lblGender.TabIndex = 6; + this.lblGender.Text = "性别"; + this.lblGender.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // lblNickName + // + this.lblNickName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblNickName.Location = new System.Drawing.Point(357, 39); + this.lblNickName.Name = "lblNickName"; + this.lblNickName.Size = new System.Drawing.Size(65, 29); + this.lblNickName.Style = Sunny.UI.UIStyle.Custom; + this.lblNickName.TabIndex = 2; + this.lblNickName.Text = "昵称"; + this.lblNickName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtName + // + this.txtName.ButtonFillColor = System.Drawing.Color.White; + this.txtName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtName.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtName.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtName.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtName.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtName.ButtonSymbol = 61761; + this.txtName.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtName.FillColor2 = System.Drawing.Color.White; + this.txtName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtName.Location = new System.Drawing.Point(117, 84); + this.txtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtName.Maximum = 2147483647D; + this.txtName.MaxLength = 20; + this.txtName.Minimum = -2147483648D; + this.txtName.MinimumSize = new System.Drawing.Size(1, 16); + this.txtName.Name = "txtName"; + this.txtName.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtName.Size = new System.Drawing.Size(188, 42); + + this.txtName.StyleCustomMode = true; + this.txtName.TabIndex = 5; + this.txtName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblName + // + this.lblName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblName.Location = new System.Drawing.Point(45, 91); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(65, 29); + this.lblName.Style = Sunny.UI.UIStyle.Custom; + this.lblName.TabIndex = 4; + this.lblName.Text = "姓名"; + this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtAccount + // + this.txtAccount.ButtonFillColor = System.Drawing.Color.White; + this.txtAccount.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAccount.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAccount.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtAccount.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtAccount.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtAccount.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAccount.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtAccount.ButtonSymbol = 61761; + this.txtAccount.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtAccount.Enabled = false; + this.txtAccount.FillColor2 = System.Drawing.Color.White; + this.txtAccount.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtAccount.Location = new System.Drawing.Point(117, 32); + this.txtAccount.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtAccount.Maximum = 2147483647D; + this.txtAccount.MaxLength = 20; + this.txtAccount.Minimum = -2147483648D; + this.txtAccount.MinimumSize = new System.Drawing.Size(1, 16); + this.txtAccount.Name = "txtAccount"; + this.txtAccount.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAccount.Size = new System.Drawing.Size(188, 42); + + this.txtAccount.StyleCustomMode = true; + this.txtAccount.TabIndex = 1; + this.txtAccount.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblAccount + // + this.lblAccount.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblAccount.Location = new System.Drawing.Point(45, 39); + this.lblAccount.Name = "lblAccount"; + this.lblAccount.Size = new System.Drawing.Size(65, 29); + this.lblAccount.Style = Sunny.UI.UIStyle.Custom; + this.lblAccount.TabIndex = 0; + this.lblAccount.Text = "账号"; + this.lblAccount.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // tabPage2 + // + this.tabPage2.BackColor = System.Drawing.Color.White; + this.tabPage2.Controls.Add(this.btnSelectAvator); + this.tabPage2.Controls.Add(this.uiLabel10); + this.tabPage2.Location = new System.Drawing.Point(0, 40); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Size = new System.Drawing.Size(200, 60); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "头像"; + // + // btnSelectAvator + // + this.btnSelectAvator.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnSelectAvator.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnSelectAvator.Location = new System.Drawing.Point(258, 127); + this.btnSelectAvator.MinimumSize = new System.Drawing.Size(1, 1); + this.btnSelectAvator.Name = "btnSelectAvator"; + this.btnSelectAvator.Size = new System.Drawing.Size(137, 48); + this.btnSelectAvator.Style = Sunny.UI.UIStyle.Custom; + this.btnSelectAvator.TabIndex = 1; + this.btnSelectAvator.Text = "上传头像"; + this.btnSelectAvator.Click += new System.EventHandler(this.btnSelectAvator_Click); + // + // uiLabel10 + // + this.uiLabel10.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel10.Location = new System.Drawing.Point(111, 47); + this.uiLabel10.Name = "uiLabel10"; + this.uiLabel10.Size = new System.Drawing.Size(538, 29); + this.uiLabel10.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel10.TabIndex = 0; + this.uiLabel10.Text = "建议尺寸168*168,支持jpg,bmp,png,不能超过200kb"; + this.uiLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tabPage3 + // + this.tabPage3.BackColor = System.Drawing.Color.White; + this.tabPage3.Controls.Add(this.btnReset); + this.tabPage3.Controls.Add(this.btnChangePassword); + this.tabPage3.Controls.Add(this.txtComfirmPassword); + this.tabPage3.Controls.Add(this.txtNewPassword); + this.tabPage3.Controls.Add(this.lblComfirmPassword); + this.tabPage3.Controls.Add(this.lblNewPassword); + this.tabPage3.Controls.Add(this.txtOldPassword); + this.tabPage3.Controls.Add(this.lblOldPassword); + this.tabPage3.Controls.Add(this.uiLabel11); + this.tabPage3.Location = new System.Drawing.Point(0, 40); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(200, 60); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "账号"; + // + // btnReset + // + this.btnReset.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnReset.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.btnReset.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.btnReset.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.btnReset.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnReset.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnReset.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnReset.Location = new System.Drawing.Point(268, 261); + this.btnReset.MinimumSize = new System.Drawing.Size(1, 1); + this.btnReset.Name = "btnReset"; + this.btnReset.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40))))); + this.btnReset.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86))))); + this.btnReset.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnReset.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43))))); + this.btnReset.Size = new System.Drawing.Size(125, 44); + this.btnReset.Style = Sunny.UI.UIStyle.Orange; + this.btnReset.StyleCustomMode = true; + this.btnReset.TabIndex = 21; + this.btnReset.Text = "重置"; + this.btnReset.Click += new System.EventHandler(this.btnReset_Click); + // + // btnChangePassword + // + this.btnChangePassword.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnChangePassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnChangePassword.Location = new System.Drawing.Point(114, 261); + this.btnChangePassword.MinimumSize = new System.Drawing.Size(1, 1); + this.btnChangePassword.Name = "btnChangePassword"; + this.btnChangePassword.Size = new System.Drawing.Size(125, 44); + this.btnChangePassword.Style = Sunny.UI.UIStyle.Custom; + this.btnChangePassword.TabIndex = 20; + this.btnChangePassword.Text = "保存"; + this.btnChangePassword.Click += new System.EventHandler(this.btnChangePassword_Click); + // + // txtComfirmPassword + // + this.txtComfirmPassword.ButtonFillColor = System.Drawing.Color.White; + this.txtComfirmPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtComfirmPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtComfirmPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtComfirmPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtComfirmPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtComfirmPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtComfirmPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtComfirmPassword.ButtonSymbol = 61761; + this.txtComfirmPassword.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtComfirmPassword.FillColor2 = System.Drawing.Color.White; + this.txtComfirmPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtComfirmPassword.Location = new System.Drawing.Point(205, 178); + this.txtComfirmPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtComfirmPassword.Maximum = 2147483647D; + this.txtComfirmPassword.Minimum = -2147483648D; + this.txtComfirmPassword.MinimumSize = new System.Drawing.Size(1, 16); + this.txtComfirmPassword.Name = "txtComfirmPassword"; + this.txtComfirmPassword.PasswordChar = '*'; + this.txtComfirmPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtComfirmPassword.Size = new System.Drawing.Size(188, 42); + + this.txtComfirmPassword.StyleCustomMode = true; + this.txtComfirmPassword.TabIndex = 11; + this.txtComfirmPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // txtNewPassword + // + this.txtNewPassword.ButtonFillColor = System.Drawing.Color.White; + this.txtNewPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtNewPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtNewPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtNewPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtNewPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtNewPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtNewPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtNewPassword.ButtonSymbol = 61761; + this.txtNewPassword.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtNewPassword.FillColor2 = System.Drawing.Color.White; + this.txtNewPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtNewPassword.Location = new System.Drawing.Point(205, 123); + this.txtNewPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtNewPassword.Maximum = 2147483647D; + this.txtNewPassword.Minimum = -2147483648D; + this.txtNewPassword.MinimumSize = new System.Drawing.Size(1, 16); + this.txtNewPassword.Name = "txtNewPassword"; + this.txtNewPassword.PasswordChar = '*'; + this.txtNewPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtNewPassword.Size = new System.Drawing.Size(188, 42); + + this.txtNewPassword.StyleCustomMode = true; + this.txtNewPassword.TabIndex = 9; + this.txtNewPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblComfirmPassword + // + this.lblComfirmPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblComfirmPassword.Location = new System.Drawing.Point(88, 185); + this.lblComfirmPassword.Name = "lblComfirmPassword"; + this.lblComfirmPassword.Size = new System.Drawing.Size(110, 29); + this.lblComfirmPassword.Style = Sunny.UI.UIStyle.Custom; + this.lblComfirmPassword.TabIndex = 10; + this.lblComfirmPassword.Text = "确认密码"; + this.lblComfirmPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // lblNewPassword + // + this.lblNewPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblNewPassword.Location = new System.Drawing.Point(114, 130); + this.lblNewPassword.Name = "lblNewPassword"; + this.lblNewPassword.Size = new System.Drawing.Size(84, 29); + this.lblNewPassword.Style = Sunny.UI.UIStyle.Custom; + this.lblNewPassword.TabIndex = 8; + this.lblNewPassword.Text = "新密码"; + this.lblNewPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtOldPassword + // + this.txtOldPassword.ButtonFillColor = System.Drawing.Color.White; + this.txtOldPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtOldPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtOldPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtOldPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtOldPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtOldPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtOldPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtOldPassword.ButtonSymbol = 61761; + this.txtOldPassword.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtOldPassword.FillColor2 = System.Drawing.Color.White; + this.txtOldPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtOldPassword.Location = new System.Drawing.Point(205, 71); + this.txtOldPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtOldPassword.Maximum = 2147483647D; + this.txtOldPassword.Minimum = -2147483648D; + this.txtOldPassword.MinimumSize = new System.Drawing.Size(1, 16); + this.txtOldPassword.Name = "txtOldPassword"; + this.txtOldPassword.PasswordChar = '*'; + this.txtOldPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtOldPassword.Size = new System.Drawing.Size(188, 42); + + this.txtOldPassword.StyleCustomMode = true; + this.txtOldPassword.TabIndex = 7; + this.txtOldPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblOldPassword + // + this.lblOldPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblOldPassword.Location = new System.Drawing.Point(114, 78); + this.lblOldPassword.Name = "lblOldPassword"; + this.lblOldPassword.Size = new System.Drawing.Size(84, 29); + this.lblOldPassword.Style = Sunny.UI.UIStyle.Custom; + this.lblOldPassword.TabIndex = 6; + this.lblOldPassword.Text = "旧密码"; + this.lblOldPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel11 + // + this.uiLabel11.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel11.Location = new System.Drawing.Point(45, 23); + this.uiLabel11.Name = "uiLabel11"; + this.uiLabel11.Size = new System.Drawing.Size(125, 29); + this.uiLabel11.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel11.TabIndex = 0; + this.uiLabel11.Text = "修改密码"; + this.uiLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // AccountForm + // + this.AllowShowTitle = false; + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1031, 558); + this.Controls.Add(this.uiPanel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AccountForm"; + this.Padding = new System.Windows.Forms.Padding(0); + this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.ShowTitle = false; + this.ShowTitleIcon = true; + this.Style = Sunny.UI.UIStyle.Custom; + this.Text = "账户管理"; + this.TitleColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.TitleForeColor = System.Drawing.Color.DimGray; + this.TopMost = true; + this.Load += new System.EventHandler(this.AccountForm_Load); + this.uiPanel1.ResumeLayout(false); + this.titlePanel.ResumeLayout(false); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.imageAvator)).EndInit(); + this.uiTabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private Sunny.UI.UIPanel uiPanel1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label lblCurrentUser; + private System.Windows.Forms.PictureBox imageAvator; + private Sunny.UI.UITabControl uiTabControl1; + private System.Windows.Forms.TabPage tabPage1; + private Sunny.UI.UIButton btnSave; + private Sunny.UI.UITextBox txtSignature; + private Sunny.UI.UILabel lblSignature; + private Sunny.UI.UITextBox txtAddress; + private Sunny.UI.UILabel lblAddress; + private Sunny.UI.UITextBox txtTel; + private Sunny.UI.UILabel lblTel; + private Sunny.UI.UITextBox txtEmail; + private Sunny.UI.UILabel lblEmail; + private Sunny.UI.UILabel lblBirthday; + private Sunny.UI.UIRadioButton rdFemale; + private Sunny.UI.UIRadioButton rdMale; + private Sunny.UI.UILabel lblGender; + private Sunny.UI.UILabel lblNickName; + private Sunny.UI.UITextBox txtName; + private Sunny.UI.UILabel lblName; + private Sunny.UI.UITextBox txtAccount; + private Sunny.UI.UILabel lblAccount; + private System.Windows.Forms.TabPage tabPage2; + private Sunny.UI.UIButton btnSelectAvator; + private Sunny.UI.UILabel uiLabel10; + private System.Windows.Forms.TabPage tabPage3; + private Sunny.UI.UIButton btnReset; + private Sunny.UI.UIButton btnChangePassword; + private Sunny.UI.UITextBox txtComfirmPassword; + private Sunny.UI.UITextBox txtNewPassword; + private Sunny.UI.UILabel lblComfirmPassword; + private Sunny.UI.UILabel lblNewPassword; + private Sunny.UI.UITextBox txtOldPassword; + private Sunny.UI.UILabel lblOldPassword; + private Sunny.UI.UILabel uiLabel11; + private System.Windows.Forms.Panel titlePanel; + private Sunny.UI.UILabel uiLabel15; + private Sunny.UI.UISymbolLabel btnClose; + private Sunny.UI.UITextBox txtNickName; + private Sunny.UI.UIDatePicker txtBirthday; + } +} \ No newline at end of file diff --git a/DH.RBAC/AccountForm.cs b/DH.RBAC/AccountForm.cs new file mode 100644 index 0000000..fff43c3 --- /dev/null +++ b/DH.RBAC/AccountForm.cs @@ -0,0 +1,304 @@ +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using DH.RBAC.Model.Sys; +using DH.RBAC.Common; +using DH.RBAC.Properties; +using DH.RBAC.Logic.Sys; +using DH.RBAC.Utility.Other; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace DH.RBAC +{ + /// + /// 用户账户界面 + /// + public partial class AccountForm : UIForm + { + private SysUserLogic userlogic; + private SysUserLogOnLogic userLogOnLogic; + /// + /// 构造方法 + /// + public AccountForm() + { + InitializeComponent(); + userlogic = new SysUserLogic(); + userLogOnLogic = new SysUserLogOnLogic(); + } + + #region 标题栏 处理 + private void btnClose_Click(object sender, EventArgs e) + { + FormHelper.subForm = null; + this.Close(); + } + private Point mPoint; + private void titlePanel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void titlePanel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + private void btnClose_MouseEnter(object sender, EventArgs e) + { + btnClose.BackColor = Color.FromArgb(231, 231, 231); + } + + private void btnClose_MouseLeave(object sender, EventArgs e) + { + btnClose.BackColor = Color.Transparent; + + } + #endregion + + private string Avatar; + /// + /// 画面加载,读取用户信息,显示在界面上 + /// + /// + /// + private void AccountForm_Load(object sender, EventArgs e) + { + SysUser user = userlogic.Get(GlobalConfig.CurrentUser.Id); + if (user == null) + { + AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); + + return; + } + Avatar = user.Avatar; + txtAccount.Text = user.Account; + txtNickName.Text = user.NickName; + txtName.Text = user.RealName; + if (user.Gender == "1") + rdMale.Checked = true; + else + rdFemale.Checked = true; + txtBirthday.Value = user.Birthday.Value; + txtEmail.Text = user.Email; + txtTel.Text = user.MobilePhone; + txtAddress.Text = user.Address; + txtSignature.Text = user.Signature; + + //头像显示 + if (StringHelper.IsNullOrEmpty(user.AvatarBase64)) + { + imageAvator.Image = Resources.avatar; + } + else + { + try + { + MemoryStream ms = new MemoryStream(Convert.FromBase64String(user.AvatarBase64)); + imageAvator.Image = Image.FromStream(ms); + } + catch + { + imageAvator.Image = Resources.avatar; + } + } + + lblCurrentUser.Text = $"{user.Account}@{user.NickName}"; + } + + /// + /// 保存修改 + /// + /// + /// + private void btnSave_Click(object sender, EventArgs e) + { + //非空检测 + if (StringHelper.IsNullOrEmpty(txtNickName.Text)) + { + AntdUI.Message.warn(this, "昵称不能为空!", autoClose: 3); + + return; + } + if (StringHelper.IsNullOrEmpty(txtName.Text)) + { + AntdUI.Message.warn(this, "姓名不能为空!", autoClose: 3); + + return; + } + if (StringHelper.IsNullOrEmpty(txtBirthday.Text)) + { + AntdUI.Message.warn(this, "请选择生日!", autoClose: 3); + + + return; + } + if (StringHelper.IsNullOrEmpty(txtEmail.Text)) + { + AntdUI.Message.warn(this, "邮箱不能为空!", autoClose: 3); + + return; + } + if (StringHelper.IsNullOrEmpty(txtTel.Text)) + { + AntdUI.Message.warn(this, "手机不能为空!", autoClose: 3); + + return; + } + + //获得目前信息,提交给服务端处理,返回结果 + SysUser model = new SysUser(); + model.Id = GlobalConfig.CurrentUser.Id; + model.Account = txtAccount.Text; + model.NickName = txtNickName.Text; + model.RealName = txtName.Text; + model.Avatar = Avatar; + model.Gender = rdMale.Checked ? "1" : "0"; + model.StrBirthday = txtBirthday.Text; + model.Email = txtEmail.Text; + model.MobilePhone = txtTel.Text; + model.Address = txtAddress.Text; + model.Signature = txtSignature.Text; + + DateTime defaultDt = DateTime.Today; + DateTime.TryParse(model.StrBirthday, out defaultDt); + model.Birthday = defaultDt; + int row = userlogic.AppUpdateBasicInfo(model); + + if (row == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); + + + return; + } + AntdUI.Message.success(this, "恭喜你,操作成功!", autoClose: 3); + + } + + + /// + /// 选择图片上传 + /// + /// + /// + private void btnSelectAvator_Click(object sender, EventArgs e) + { + //OpenFileDialog dialog = new OpenFileDialog(); + //dialog.Filter = "Image Files(*.BMP;*.JPG;*.png)|*.BMP;*.JPG;*.png"; + //if (dialog.ShowDialog() == DialogResult.OK) + //{ + // string fileName = dialog.FileName; + // Image image = Image.FromFile(fileName); + // //上传到服务器 + // AjaxResult result = null; + + // string url = GlobalConfig.Config.Url + "account/uploadImage"; + // string str = HttpUtils.PostFile(url, fileName, 2000); + // try + // { + // result = str.ToObject(); + // } + // catch + // { + // result = null; + // } + + + // if (result == null) + // { + // this.ShowWarningDialog("网络或服务器异常,请稍后重试", UIStyle.White); + // return; + // } + // if (result.state != ResultType.Success) + // { + // this.ShowWarningDialog(result.message, UIStyle.White); + // return; + // } + // //上传成功,修改界面头像,以及服务器头像地址 + // Avatar = result.data.ToString(); + // imageAvator.Image = image; + // this.ShowSuccessDialog("上传成功,点击保存后生效", UIStyle.White); + //} + } + + private void btnReset_Click(object sender, EventArgs e) + { + txtOldPassword.Text = string.Empty; + txtNewPassword.Text = string.Empty; + txtComfirmPassword.Text = string.Empty; + } + + private void btnChangePassword_Click(object sender, EventArgs e) + { + //非空检测 + if (StringHelper.IsNullOrEmpty(txtOldPassword.Text)) + { + AntdUI.Message.warn(this, "旧密码不能为空!", autoClose: 3); + + return; + } + if (StringHelper.IsNullOrEmpty(txtNewPassword.Text)) + { + AntdUI.Message.warn(this, "新密码不能为空!", autoClose: 3); + + + return; + } + if (StringHelper.IsNullOrEmpty(txtComfirmPassword.Text)) + { + AntdUI.Message.warn(this, "确认密码不能为空!", autoClose: 3); + + + return; + } + if (txtNewPassword.Text != txtComfirmPassword.Text) + { + AntdUI.Message.warn(this, "两次密码不一致!", autoClose: 3); + + + return; + } + + Dictionary parm = new Dictionary(); + string userId = GlobalConfig.CurrentUser.Id; + string oldPassword = txtOldPassword.Text; + string newPassword = txtNewPassword.Text; + string confirmPassword = txtComfirmPassword.Text; + + + if (!newPassword.Equals(confirmPassword)) + { + AntdUI.Message.warn(this, "两次密码输入不一致,请重新确认!", autoClose: 3); + + return; + } + oldPassword = oldPassword.MD5Encrypt(); + newPassword = newPassword.MD5Encrypt(); + confirmPassword = confirmPassword.MD5Encrypt(); + + var userLoginEntity = userLogOnLogic.GetByAccount(userId); + if (oldPassword.DESEncrypt(userLoginEntity.SecretKey).MD5Encrypt() != userLoginEntity.Password) + { + AntdUI.Message.warn(this, "旧密码验证失败!", autoClose: 3); + return; + } + userLoginEntity.Password = newPassword.DESEncrypt(userLoginEntity.SecretKey).MD5Encrypt(); + int isSuccess = userLogOnLogic.ModifyPwd(userLoginEntity); + if (isSuccess == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); + + return; + } + AntdUI.Message.success(this, "修改成功!", autoClose: 3); + + } + } +} diff --git a/DH.RBAC/AccountForm.resx b/DH.RBAC/AccountForm.resx new file mode 100644 index 0000000..01360ee --- /dev/null +++ b/DH.RBAC/AccountForm.resx @@ -0,0 +1,1161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAgIAAAAEAIACoAAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AC4AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAsAAABkAAAAagAAAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAQAAAAOAAAADQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAB2AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAADwAAABsAAAAdAAAAHAAAABwAAAAdAAAAFQAAAAsAAAAMAAAAAwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAA2QAAAOUAAAApAAAAAAAAAAAAAAAAAAAAHwAA + AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAANUAAADTAAAAUgAA + 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 + AP0AAAD5AAAAIAAAAF8AAADBAAAAqwAAAJ4AAACqAAAAvAAAAKMAAACcAAAA1wAAAP8AAAD/AAAA/wAA + AN8AAABkAAAAAAAAALIAAAD/AAAA6gAAABkAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAygAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzgAAAKMAAAD/AAAA/wAAAF0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAIwAAAD2AAAA/wAAAP8AAAD/AAAA6QAAAP8AAACLAAAAAAAA + AAAAAAAOAAAAJAAAACQAAAAhAAAAdQAAAP8AAAD/AAAAWwAAAB8AAAAzAAAAMgAAAC4AAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAOAAAAXQAAANEAAAD/AAAA/wAAAP8AAACjAAAAcAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAmwAAAP8AAAD+AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAABFAAAA+QAAAPEAAADtAAAA5wAAAN4AAADUAAAA1QAAAN0AAADeAAAA3gAA + APkAAAD/AAAA/wAAAPAAAADeAAAA3gAAANwAAADSAAAA2QAAAN4AAADnAAAA7AAAAPMAAAD5AAAAOgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTAAAA8gAA + AOYAAADfAAAA4AAAAOwAAADTAAAAPQAAAJoAAACMAAAAeQAAAGkAAADNAAAA/wAAAP8AAACZAAAAdAAA + AJUAAAB1AAAApAAAAP8AAAD/AAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/wAA + AP8AAAD8AAAA9gAAAPgAAAD/AAAA/wAAALgAAACkAAAAqwAAANMAAAD/AAAA/wAAAO4AAACpAAAA/wAA + AP8AAABvAAAAxgAAAOAAAADiAAAAtQAAAGEAAAB8AAAAYAAAAAMAAAAAAAAAAAAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA2AAAAE0AAABYAAAA/wAAAP8AAAB/AAAAQwAAAEQAAABKAAAA6wAAAP8AAAC1AAAA2gAA + AP8AAADcAAAADQAAAAAAAACMAAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2AAAAKQAA + ACAAAAAWAAAAAQAAADQAAAAoAAAAAAAAAAAAAAAEAAAA0AAAAP8AAAD/AAAAjgAAAAQAAAAAAAAAAAAA + ADsAAAAVAAAAAwAAABYAAAAfAAAALAAAADYAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAApAAAAEQAAAAQAAAAIAAAAHwAAAC8AAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAEcAAAAAAAAAAAAAAAAAAACmAAAA/wAAAP8AAABbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAA6AAAAEUAAAAxAAAAMgAAADUAAABLAAAAbAAA + AP8AAAD/AAAA6gAAALsAAAC+AAAArAAAAJkAAAD/AAAA/wAAAGwAAADRAAAA7wAAAO4AAADIAAAA4wAA + AP8AAADaAAAABwAAAAAAAAAAAAAABAAAAK4AAAD/AAAA8AAAAIMAAAAWAAAAAAAAAFkAAAD/AAAA/wAA + AFoAAAAQAAAADwAAABcAAADmAAAA/wAAAIQAAACEAAAA/wAAAP8AAABdAAAAAAAAAHQAAAD/AAAA/wAA + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAA4AAAAOkAAACCAAAAGgAA + AAAAAADOAAAA/wAAAP8AAACJAAAAAAAAADYAAACaAAAA+wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AGcAAAAAAAAAAAAAADoAAABGAAAAKgAAACMAAAAPAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAHAAA + ACgAAABBAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADMAAAA/wAA + AP8AAADuAAAATAAAAAAAAAAVAAAAFgAAAAgAAAADAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAGAAAACAAAABMAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACgAAAA8QAAAOYAAACmAAAAAQAAAAAAAAAAAAAAAAAAAAQAAADKAAAAxwAA + AJ4AAAB+AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAUAAAA6QAAAP8AAAD6AAAA4AAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAACbAAAASgAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAjAAAACwAA + AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABOAAAATQAA + ADkAAABCAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADobtSBOF + 6ygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJfxomxXcBgMZ5CFbChRgVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADBcBQZwnYAf8J1AH7BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3DdgCBwnQAadqRAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABKI8ikEg/b0A4X55g6D8FcAAAAAAAAAAAAAAAAAAAAA358/CMF1 + BsPZgwD/yXkB/8J2A+XCdgOfxH0QPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB4B47chAD/0X4A/9F+ + AP/RfgD/0H4A/9J/AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/92F + AP/AcwDqv38AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVqv8GBoLzwACJ + //8Ahvv/AoT4/waE85gii/MWAAAAAAAAAADAdwuGz3wA/8N1AP/EdgD/yHgA/898AP/CcwL9wnYEqMR8 + EycAAAAAAAAAAAAAAAC9exUjxHUD7sd4AP/CdQD/wnUA/8J1AP/DdQD/xHYA/8JzAPvAcwD9wHMA/cBz + AP3AcwD9wHMA/cFzAP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3BcwD9xXMA+8Vy + APvFcgD7xXIA+8VyAPvFcgD7xHQA/MFzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cBzAP3BcwD9wXMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9yXgA/cN1ANW7dwAPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuC74EBif//AYHy/wGB8P8Bg/X/AIv//wOA79YAov4L2HkAO8Z3 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY31GwuG84cqqtQGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJdzc3P//////39/f/8UFBT/Tk5O/01NTf8+Pj7/Ghoa/6enp///////kpKS/wAA + ALgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf3+/BByG6SQFgvb4DYTxgRmM + 8EUGgu9UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw3YORcZ3BfHMeALxx3cHib9/ + GRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMFAAAAMmIiIj/5ubm/8nJ + yf+5ubn/tra2/729vf/s7Oz//////56env8GBgbgAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAH//AhCF7i5Pn+8QCILwmgmG8JwViPJUC4TwiRWK8CMIhe49F4vvIQyF + 8igAlP8YjX9jEsN4BnDCcwbNyngDh8R7FSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAALhSUlL/wMDA//b29v//////+Pj4/8TExP9dXV3/AAAAygAA + AC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAn/8IVar/BhGI8ToPiO9UEIXyPwuE8W4Ph/BEEInxTgCL/jehgkgxyHoGS8J5GBUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + AFwAAAC2ISEh4CMjI/MfHx/iAQEBugAAAGkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAIAAAABUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/DH.RBAC/Common/GlobalConfig.cs b/DH.RBAC/Common/GlobalConfig.cs new file mode 100644 index 0000000..6f0f397 --- /dev/null +++ b/DH.RBAC/Common/GlobalConfig.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Drawing; +using DH.RBAC.Model.Sys; + +namespace DH.RBAC.Common +{ + /// + /// 全局数据存放 + /// + public class GlobalConfig + { + public static MyConfig Config { get; set; } + /// + /// 当前登录的用户 + /// + public static SysUser CurrentUser; + + /// + /// 当前用户头像 + /// + public static Image Avatar; + + /// + /// 当前选的哪个菜单 + /// + public static string CurrentMenuText; + + /// + /// 当前用户权限 + /// + public static List PermissionList; + + + } +} diff --git a/DH.RBAC/Common/IconDict.cs b/DH.RBAC/Common/IconDict.cs new file mode 100644 index 0000000..a801ef0 --- /dev/null +++ b/DH.RBAC/Common/IconDict.cs @@ -0,0 +1,719 @@ +using System.Collections.Generic; + +namespace DH.RBAC.Common +{ + /// + /// 图标字典 + /// + public class IconDict + { + /// + /// 全局存放图标字典 + /// + public static Dictionary MyIconDict = Init(); + + + /// + /// 初始化字典 + /// + /// + private static Dictionary Init() + { + Dictionary dict = new Dictionary(); + dict.Add("fa fa-bluetooth", 62099); + dict.Add("fa fa-bluetooth-b", 62100); + dict.Add("fa fa-codiepie", 62084); + dict.Add("fa fa-credit-card-alt", 62083); + dict.Add("fa fa-edge", 62082); + dict.Add("fa fa-fort-awesome", 62086); + dict.Add("fa fa-hashtag", 62098); + dict.Add("fa fa-mixcloud", 62089); + dict.Add("fa fa-modx", 62085); + dict.Add("fa fa-pause-circle", 62091); + dict.Add("fa fa-pause-circle-o", 62092); + dict.Add("fa fa-percent", 62101); + dict.Add("fa fa-product-hunt", 62088); + dict.Add("fa fa-reddit-alien", 62081); + dict.Add("fa fa-scribd", 62090); + dict.Add("fa fa-shopping-bag", 62096); + dict.Add("fa fa-shopping-basket", 62097); + dict.Add("fa fa-stop-circle", 62093); + dict.Add("fa fa-stop-circle-o", 62094); + dict.Add("fa fa-usb", 62087); + dict.Add("fa fa-adjust", 61506); + dict.Add("fa fa-anchor", 61757); + dict.Add("fa fa-archive", 61831); + dict.Add("fa fa-area-chart", 61950); + dict.Add("fa fa-arrows", 61511); + dict.Add("fa fa-arrows-h", 61566); + dict.Add("fa fa-arrows-v", 61565); + dict.Add("fa fa-asterisk", 61545); + dict.Add("fa fa-at", 61946); + dict.Add("fa fa-automobile", 61881); + dict.Add("fa fa-balance-scale", 62030); + dict.Add("fa fa-ban", 61534); + dict.Add("fa fa-bank", 61852); + dict.Add("fa fa-bar-chart", 61568); + dict.Add("fa fa-bar-chart-o", 61568); + dict.Add("fa fa-barcode", 61482); + dict.Add("fa fa-bars", 61641); + dict.Add("fa fa-battery-0", 62020); + dict.Add("fa fa-battery-1", 62019); + dict.Add("fa fa-battery-2", 62018); + dict.Add("fa fa-battery-3", 62017); + dict.Add("fa fa-battery-4", 62016); + dict.Add("fa fa-battery-empty", 62020); + dict.Add("fa fa-battery-full", 62016); + dict.Add("fa fa-battery-half", 62018); + dict.Add("fa fa-battery-quarter", 62019); + dict.Add("fa fa-battery-three-quarters", 62017); + dict.Add("fa fa-bed", 62006); + dict.Add("fa fa-beer", 61692); + dict.Add("fa fa-bell", 61683); + dict.Add("fa fa-bell-o", 61602); + dict.Add("fa fa-bell-slash", 61942); + dict.Add("fa fa-bell-slash-o", 61943); + dict.Add("fa fa-bicycle", 61958); + dict.Add("fa fa-binoculars", 61925); + dict.Add("fa fa-birthday-cake", 61949); + dict.Add("fa fa-bolt", 61671); + dict.Add("fa fa-bomb", 61922); + dict.Add("fa fa-book", 61485); + dict.Add("fa fa-bookmark", 61486); + dict.Add("fa fa-bookmark-o", 61591); + dict.Add("fa fa-briefcase", 61617); + dict.Add("fa fa-bug", 61832); + dict.Add("fa fa-building", 61869); + dict.Add("fa fa-building-o", 61687); + dict.Add("fa fa-bullhorn", 61601); + dict.Add("fa fa-bullseye", 61760); + dict.Add("fa fa-bus", 61959); + dict.Add("fa fa-cab", 61882); + dict.Add("fa fa-calculator", 61932); + dict.Add("fa fa-calendar", 61555); + dict.Add("fa fa-calendar-check-o", 62068); + dict.Add("fa fa-calendar-minus-o", 62066); + dict.Add("fa fa-calendar-o", 61747); + dict.Add("fa fa-calendar-plus-o", 62065); + dict.Add("fa fa-calendar-times-o", 62067); + dict.Add("fa fa-camera", 61488); + dict.Add("fa fa-camera-retro", 61571); + dict.Add("fa fa-car", 61881); + dict.Add("fa fa-caret-square-o-down", 61776); + dict.Add("fa fa-caret-square-o-left", 61841); + dict.Add("fa fa-caret-square-o-right", 61778); + dict.Add("fa fa-caret-square-o-up", 61777); + dict.Add("fa fa-cart-arrow-down", 61976); + dict.Add("fa fa-cart-plus", 61975); + dict.Add("fa fa-cc", 61962); + dict.Add("fa fa-certificate", 61603); + dict.Add("fa fa-check", 61452); + dict.Add("fa fa-check-circle", 61528); + dict.Add("fa fa-check-circle-o", 61533); + dict.Add("fa fa-check-square", 61770); + dict.Add("fa fa-check-square-o", 61510); + dict.Add("fa fa-child", 61870); + dict.Add("fa fa-circle", 61713); + dict.Add("fa fa-circle-o", 61708); + dict.Add("fa fa-circle-o-notch", 61902); + dict.Add("fa fa-circle-thin", 61915); + dict.Add("fa fa-clock-o", 61463); + dict.Add("fa fa-clone", 62029); + dict.Add("fa fa-close", 61453); + dict.Add("fa fa-cloud", 61634); + dict.Add("fa fa-cloud-download", 61677); + dict.Add("fa fa-cloud-upload", 61678); + dict.Add("fa fa-code", 61729); + dict.Add("fa fa-code-fork", 61734); + dict.Add("fa fa-coffee", 61684); + dict.Add("fa fa-cog", 61459); + dict.Add("fa fa-cogs", 61573); + dict.Add("fa fa-comment", 61557); + dict.Add("fa fa-comment-o", 61669); + dict.Add("fa fa-commenting", 62074); + dict.Add("fa fa-commenting-o", 62075); + dict.Add("fa fa-comments", 61574); + dict.Add("fa fa-comments-o", 61670); + dict.Add("fa fa-compass", 61774); + dict.Add("fa fa-copyright", 61945); + dict.Add("fa fa-creative-commons", 62046); + dict.Add("fa fa-credit-card", 61597); + dict.Add("fa fa-crop", 61733); + dict.Add("fa fa-crosshairs", 61531); + dict.Add("fa fa-cube", 61874); + dict.Add("fa fa-cubes", 61875); + dict.Add("fa fa-cutlery", 61685); + dict.Add("fa fa-dashboard", 61668); + dict.Add("fa fa-database", 61888); + dict.Add("fa fa-desktop", 61704); + dict.Add("fa fa-diamond", 61977); + dict.Add("fa fa-dot-circle-o", 61842); + dict.Add("fa fa-download", 61465); + dict.Add("fa fa-edit", 61508); + dict.Add("fa fa-ellipsis-h", 61761); + dict.Add("fa fa-ellipsis-v", 61762); + dict.Add("fa fa-envelope", 61664); + dict.Add("fa fa-envelope-o", 61443); + dict.Add("fa fa-envelope-square", 61849); + dict.Add("fa fa-eraser", 61741); + dict.Add("fa fa-exchange", 61676); + dict.Add("fa fa-exclamation", 61738); + dict.Add("fa fa-exclamation-circle", 61546); + dict.Add("fa fa-exclamation-triangle", 61553); + dict.Add("fa fa-external-link", 61582); + dict.Add("fa fa-external-link-square", 61772); + dict.Add("fa fa-eye", 61550); + dict.Add("fa fa-eye-slash", 61552); + dict.Add("fa fa-eyedropper", 61947); + dict.Add("fa fa-fax", 61868); + dict.Add("fa fa-feed", 61598); + dict.Add("fa fa-female", 61826); + dict.Add("fa fa-fighter-jet", 61691); + dict.Add("fa fa-file-archive-o", 61894); + dict.Add("fa fa-file-audio-o", 61895); + dict.Add("fa fa-file-code-o", 61897); + dict.Add("fa fa-file-excel-o", 61891); + dict.Add("fa fa-file-image-o", 61893); + dict.Add("fa fa-file-movie-o", 61896); + dict.Add("fa fa-file-pdf-o", 61889); + dict.Add("fa fa-file-photo-o", 61893); + dict.Add("fa fa-file-picture-o", 61893); + dict.Add("fa fa-file-powerpoint-o", 61892); + dict.Add("fa fa-file-sound-o", 61895); + dict.Add("fa fa-file-video-o", 61896); + dict.Add("fa fa-file-word-o", 61890); + dict.Add("fa fa-file-zip-o", 61894); + dict.Add("fa fa-film", 61448); + dict.Add("fa fa-filter", 61616); + dict.Add("fa fa-fire", 61549); + dict.Add("fa fa-fire-extinguisher", 61748); + dict.Add("fa fa-flag", 61476); + dict.Add("fa fa-flag-checkered", 61726); + dict.Add("fa fa-flag-o", 61725); + dict.Add("fa fa-flash", 61671); + dict.Add("fa fa-flask", 61635); + dict.Add("fa fa-folder", 61563); + dict.Add("fa fa-folder-o", 61716); + dict.Add("fa fa-folder-open", 61564); + dict.Add("fa fa-folder-open-o", 61717); + dict.Add("fa fa-frown-o", 61721); + dict.Add("fa fa-futbol-o", 61923); + dict.Add("fa fa-gamepad", 61723); + dict.Add("fa fa-gavel", 61667); + dict.Add("fa fa-gear", 61459); + dict.Add("fa fa-gears", 61573); + dict.Add("fa fa-gift", 61547); + dict.Add("fa fa-glass", 61440); + dict.Add("fa fa-globe", 61612); + dict.Add("fa fa-graduation-cap", 61853); + dict.Add("fa fa-group", 61632); + dict.Add("fa fa-hand-grab-o", 62037); + dict.Add("fa fa-hand-lizard-o", 62040); + dict.Add("fa fa-hand-paper-o", 62038); + dict.Add("fa fa-hand-peace-o", 62043); + dict.Add("fa fa-hand-pointer-o", 62042); + dict.Add("fa fa-hand-rock-o", 62037); + dict.Add("fa fa-hand-scissors-o", 62039); + dict.Add("fa fa-hand-spock-o", 62041); + dict.Add("fa fa-hand-stop-o", 62038); + dict.Add("fa fa-hdd-o", 61600); + dict.Add("fa fa-headphones", 61477); + dict.Add("fa fa-heart", 61444); + dict.Add("fa fa-heart-o", 61578); + dict.Add("fa fa-heartbeat", 61982); + dict.Add("fa fa-history", 61914); + dict.Add("fa fa-home", 61461); + dict.Add("fa fa-hotel", 62006); + dict.Add("fa fa-hourglass", 62036); + dict.Add("fa fa-hourglass-1", 62033); + dict.Add("fa fa-hourglass-2", 62034); + dict.Add("fa fa-hourglass-3", 62035); + dict.Add("fa fa-hourglass-end", 62035); + dict.Add("fa fa-hourglass-half", 62034); + dict.Add("fa fa-hourglass-o", 62032); + dict.Add("fa fa-hourglass-start", 62033); + dict.Add("fa fa-i-cursor", 62022); + dict.Add("fa fa-image", 61502); + dict.Add("fa fa-inbox", 61468); + dict.Add("fa fa-industry", 62069); + dict.Add("fa fa-info", 61737); + dict.Add("fa fa-info-circle", 61530); + dict.Add("fa fa-institution", 61852); + dict.Add("fa fa-key", 61572); + dict.Add("fa fa-keyboard-o", 61724); + dict.Add("fa fa-language", 61867); + dict.Add("fa fa-laptop", 61705); + dict.Add("fa fa-leaf", 61548); + dict.Add("fa fa-legal", 61667); + dict.Add("fa fa-lemon-o", 61588); + dict.Add("fa fa-level-down", 61769); + dict.Add("fa fa-level-up", 61768); + dict.Add("fa fa-life-bouy", 61901); + dict.Add("fa fa-life-buoy", 61901); + dict.Add("fa fa-life-ring", 61901); + dict.Add("fa fa-life-saver", 61901); + dict.Add("fa fa-lightbulb-o", 61675); + dict.Add("fa fa-line-chart", 61953); + dict.Add("fa fa-location-arrow", 61732); + dict.Add("fa fa-lock", 61475); + dict.Add("fa fa-magic", 61648); + dict.Add("fa fa-magnet", 61558); + dict.Add("fa fa-mail-forward", 61540); + dict.Add("fa fa-mail-reply", 61714); + dict.Add("fa fa-mail-reply-all", 61730); + dict.Add("fa fa-male", 61827); + dict.Add("fa fa-map", 62073); + dict.Add("fa fa-map-marker", 61505); + dict.Add("fa fa-map-o", 62072); + dict.Add("fa fa-map-pin", 62070); + dict.Add("fa fa-map-signs", 62071); + dict.Add("fa fa-meh-o", 61722); + dict.Add("fa fa-microphone", 61744); + dict.Add("fa fa-microphone-slash", 61745); + dict.Add("fa fa-minus", 61544); + dict.Add("fa fa-minus-circle", 61526); + dict.Add("fa fa-minus-square", 61766); + dict.Add("fa fa-minus-square-o", 61767); + dict.Add("fa fa-mobile", 61707); + dict.Add("fa fa-mobile-phone", 61707); + dict.Add("fa fa-money", 61654); + dict.Add("fa fa-moon-o", 61830); + dict.Add("fa fa-mortar-board", 61853); + dict.Add("fa fa-motorcycle", 61980); + dict.Add("fa fa-mouse-pointer", 62021); + dict.Add("fa fa-music", 61441); + dict.Add("fa fa-navicon", 61641); + dict.Add("fa fa-newspaper-o", 61930); + dict.Add("fa fa-object-group", 62023); + dict.Add("fa fa-object-ungroup", 62024); + dict.Add("fa fa-paint-brush", 61948); + dict.Add("fa fa-paper-plane", 61912); + dict.Add("fa fa-paper-plane-o", 61913); + dict.Add("fa fa-paw", 61872); + dict.Add("fa fa-pencil", 61504); + dict.Add("fa fa-pencil-square", 61771); + dict.Add("fa fa-pencil-square-o", 61508); + dict.Add("fa fa-phone", 61589); + dict.Add("fa fa-phone-square", 61592); + dict.Add("fa fa-photo", 61502); + dict.Add("fa fa-picture-o", 61502); + dict.Add("fa fa-pie-chart", 61952); + dict.Add("fa fa-plane", 61554); + dict.Add("fa fa-plug", 61926); + dict.Add("fa fa-plus", 61543); + dict.Add("fa fa-plus-circle", 61525); + dict.Add("fa fa-plus-square", 61694); + dict.Add("fa fa-plus-square-o", 61846); + dict.Add("fa fa-power-off", 61457); + dict.Add("fa fa-print", 61487); + dict.Add("fa fa-puzzle-piece", 61742); + dict.Add("fa fa-qrcode", 61481); + dict.Add("fa fa-question", 61736); + dict.Add("fa fa-question-circle", 61529); + dict.Add("fa fa-quote-left", 61709); + dict.Add("fa fa-quote-right", 61710); + dict.Add("fa fa-random", 61556); + dict.Add("fa fa-recycle", 61880); + dict.Add("fa fa-refresh", 61473); + dict.Add("fa fa-registered", 62045); + dict.Add("fa fa-remove", 61453); + dict.Add("fa fa-reorder", 61641); + dict.Add("fa fa-reply", 61714); + dict.Add("fa fa-reply-all", 61730); + dict.Add("fa fa-retweet", 61561); + dict.Add("fa fa-road", 61464); + dict.Add("fa fa-rocket", 61749); + dict.Add("fa fa-rss", 61598); + dict.Add("fa fa-rss-square", 61763); + dict.Add("fa fa-search", 61442); + dict.Add("fa fa-search-minus", 61456); + dict.Add("fa fa-search-plus", 61454); + dict.Add("fa fa-send", 61912); + dict.Add("fa fa-send-o", 61913); + dict.Add("fa fa-server", 62003); + dict.Add("fa fa-share", 61540); + dict.Add("fa fa-share-alt", 61920); + dict.Add("fa fa-share-alt-square", 61921); + dict.Add("fa fa-share-square", 61773); + dict.Add("fa fa-share-square-o", 61509); + dict.Add("fa fa-shield", 61746); + dict.Add("fa fa-ship", 61978); + dict.Add("fa fa-shopping-cart", 61562); + dict.Add("fa fa-sign-in", 61584); + dict.Add("fa fa-sign-out", 61579); + dict.Add("fa fa-signal", 61458); + dict.Add("fa fa-sitemap", 61672); + dict.Add("fa fa-sliders", 61918); + dict.Add("fa fa-smile-o", 61720); + dict.Add("fa fa-soccer-ball-o", 61923); + dict.Add("fa fa-sort", 61660); + dict.Add("fa fa-sort-alpha-asc", 61789); + dict.Add("fa fa-sort-alpha-desc", 61790); + dict.Add("fa fa-sort-amount-asc", 61792); + dict.Add("fa fa-sort-amount-desc", 61793); + dict.Add("fa fa-sort-asc", 61662); + dict.Add("fa fa-sort-desc", 61661); + dict.Add("fa fa-sort-down", 61661); + dict.Add("fa fa-sort-numeric-asc", 61794); + dict.Add("fa fa-sort-numeric-desc", 61795); + dict.Add("fa fa-sort-up", 61662); + dict.Add("fa fa-space-shuttle", 61847); + dict.Add("fa fa-spoon", 61873); + dict.Add("fa fa-square", 61640); + dict.Add("fa fa-square-o", 61590); + dict.Add("fa fa-star", 61445); + dict.Add("fa fa-star-half", 61577); + dict.Add("fa fa-star-half-empty", 61731); + dict.Add("fa fa-star-half-full", 61731); + dict.Add("fa fa-star-half-o", 61731); + dict.Add("fa fa-star-o", 61446); + dict.Add("fa fa-sticky-note", 62025); + dict.Add("fa fa-sticky-note-o", 62026); + dict.Add("fa fa-street-view", 61981); + dict.Add("fa fa-suitcase", 61682); + dict.Add("fa fa-sun-o", 61829); + dict.Add("fa fa-support", 61901); + dict.Add("fa fa-tablet", 61706); + dict.Add("fa fa-tachometer", 61668); + dict.Add("fa fa-tag", 61483); + dict.Add("fa fa-tags", 61484); + dict.Add("fa fa-tasks", 61614); + dict.Add("fa fa-taxi", 61882); + dict.Add("fa fa-television", 62060); + dict.Add("fa fa-terminal", 61728); + dict.Add("fa fa-thumb-tack", 61581); + dict.Add("fa fa-thumbs-down", 61797); + dict.Add("fa fa-thumbs-o-down", 61576); + dict.Add("fa fa-thumbs-o-up", 61575); + dict.Add("fa fa-thumbs-up", 61796); + dict.Add("fa fa-ticket", 61765); + dict.Add("fa fa-times", 61453); + dict.Add("fa fa-times-circle", 61527); + dict.Add("fa fa-times-circle-o", 61532); + dict.Add("fa fa-tint", 61507); + dict.Add("fa fa-toggle-down", 61776); + dict.Add("fa fa-toggle-left", 61841); + dict.Add("fa fa-toggle-off", 61956); + dict.Add("fa fa-toggle-on", 61957); + dict.Add("fa fa-toggle-right", 61778); + dict.Add("fa fa-toggle-up", 61777); + dict.Add("fa fa-trademark", 62044); + dict.Add("fa fa-trash", 61944); + dict.Add("fa fa-trash-o", 61460); + dict.Add("fa fa-tree", 61883); + dict.Add("fa fa-trophy", 61585); + dict.Add("fa fa-truck", 61649); + dict.Add("fa fa-tty", 61924); + dict.Add("fa fa-tv", 62060); + dict.Add("fa fa-umbrella", 61673); + dict.Add("fa fa-university", 61852); + dict.Add("fa fa-unlock", 61596); + dict.Add("fa fa-unlock-alt", 61758); + dict.Add("fa fa-unsorted", 61660); + dict.Add("fa fa-upload", 61587); + dict.Add("fa fa-user", 61447); + dict.Add("fa fa-user-plus", 62004); + dict.Add("fa fa-user-secret", 61979); + dict.Add("fa fa-user-times", 62005); + dict.Add("fa fa-users", 61632); + dict.Add("fa fa-video-camera", 61501); + dict.Add("fa fa-volume-down", 61479); + dict.Add("fa fa-volume-off", 61478); + dict.Add("fa fa-volume-up", 61480); + dict.Add("fa fa-warning", 61553); + dict.Add("fa fa-wheelchair", 61843); + dict.Add("fa fa-wifi", 61931); + dict.Add("fa fa-wrench", 61613); + dict.Add("fa fa-hand-o-down", 61607); + dict.Add("fa fa-hand-o-left", 61605); + dict.Add("fa fa-hand-o-right", 61604); + dict.Add("fa fa-hand-o-up", 61606); + dict.Add("fa fa-ambulance", 61689); + dict.Add("fa fa-subway", 62009); + dict.Add("fa fa-train", 62008); + dict.Add("fa fa-genderless", 61997); + dict.Add("fa fa-intersex", 61988); + dict.Add("fa fa-mars", 61986); + dict.Add("fa fa-mars-double", 61991); + dict.Add("fa fa-mars-stroke", 61993); + dict.Add("fa fa-mars-stroke-h", 61995); + dict.Add("fa fa-mars-stroke-v", 61994); + dict.Add("fa fa-mercury", 61987); + dict.Add("fa fa-neuter", 61996); + dict.Add("fa fa-transgender", 61988); + dict.Add("fa fa-transgender-alt", 61989); + dict.Add("fa fa-venus", 61985); + dict.Add("fa fa-venus-double", 61990); + dict.Add("fa fa-venus-mars", 61992); + dict.Add("fa fa-file", 61787); + dict.Add("fa fa-file-o", 61462); + dict.Add("fa fa-file-text", 61788); + dict.Add("fa fa-file-text-o", 61686); + dict.Add("fa fa-cc-amex", 61939); + dict.Add("fa fa-cc-diners-club", 62028); + dict.Add("fa fa-cc-discover", 61938); + dict.Add("fa fa-cc-jcb", 62027); + dict.Add("fa fa-cc-mastercard", 61937); + dict.Add("fa fa-cc-paypal", 61940); + dict.Add("fa fa-cc-stripe", 61941); + dict.Add("fa fa-cc-visa", 61936); + dict.Add("fa fa-google-wallet", 61934); + dict.Add("fa fa-paypal", 61933); + dict.Add("fa fa-bitcoin", 61786); + dict.Add("fa fa-btc", 61786); + dict.Add("fa fa-cny", 61783); + dict.Add("fa fa-dollar", 61781); + dict.Add("fa fa-eur", 61779); + dict.Add("fa fa-euro", 61779); + dict.Add("fa fa-gbp", 61780); + dict.Add("fa fa-gg", 62048); + dict.Add("fa fa-gg-circle", 62049); + dict.Add("fa fa-ils", 61963); + dict.Add("fa fa-inr", 61782); + dict.Add("fa fa-jpy", 61783); + dict.Add("fa fa-krw", 61785); + dict.Add("fa fa-rmb", 61783); + dict.Add("fa fa-rouble", 61784); + dict.Add("fa fa-rub", 61784); + dict.Add("fa fa-ruble", 61784); + dict.Add("fa fa-rupee", 61782); + dict.Add("fa fa-shekel", 61963); + dict.Add("fa fa-sheqel", 61963); + dict.Add("fa fa-try", 61845); + dict.Add("fa fa-turkish-lira", 61845); + dict.Add("fa fa-usd", 61781); + dict.Add("fa fa-won", 61785); + dict.Add("fa fa-yen", 61783); + dict.Add("fa fa-align-center", 61495); + dict.Add("fa fa-align-justify", 61497); + dict.Add("fa fa-align-left", 61494); + dict.Add("fa fa-align-right", 61496); + dict.Add("fa fa-bold", 61490); + dict.Add("fa fa-chain", 61633); + dict.Add("fa fa-chain-broken", 61735); + dict.Add("fa fa-clipboard", 61674); + dict.Add("fa fa-columns", 61659); + dict.Add("fa fa-copy", 61637); + dict.Add("fa fa-cut", 61636); + dict.Add("fa fa-dedent", 61499); + dict.Add("fa fa-files-o", 61637); + dict.Add("fa fa-floppy-o", 61639); + dict.Add("fa fa-font", 61489); + dict.Add("fa fa-header", 61916); + dict.Add("fa fa-indent", 61500); + dict.Add("fa fa-italic", 61491); + dict.Add("fa fa-link", 61633); + dict.Add("fa fa-list", 61498); + dict.Add("fa fa-list-alt", 61474); + dict.Add("fa fa-list-ol", 61643); + dict.Add("fa fa-list-ul", 61642); + dict.Add("fa fa-outdent", 61499); + dict.Add("fa fa-paperclip", 61638); + dict.Add("fa fa-paragraph", 61917); + dict.Add("fa fa-paste", 61674); + dict.Add("fa fa-repeat", 61470); + dict.Add("fa fa-rotate-left", 61666); + dict.Add("fa fa-rotate-right", 61470); + dict.Add("fa fa-save", 61639); + dict.Add("fa fa-scissors", 61636); + dict.Add("fa fa-strikethrough", 61644); + dict.Add("fa fa-subscript", 61740); + dict.Add("fa fa-superscript", 61739); + dict.Add("fa fa-table", 61646); + dict.Add("fa fa-text-height", 61492); + dict.Add("fa fa-text-width", 61493); + dict.Add("fa fa-th", 61450); + dict.Add("fa fa-th-large", 61449); + dict.Add("fa fa-th-list", 61451); + dict.Add("fa fa-underline", 61645); + dict.Add("fa fa-undo", 61666); + dict.Add("fa fa-unlink", 61735); + dict.Add("fa fa-angle-double-down", 61699); + dict.Add("fa fa-angle-double-left", 61696); + dict.Add("fa fa-angle-double-right", 61697); + dict.Add("fa fa-angle-double-up", 61698); + dict.Add("fa fa-angle-down", 61703); + dict.Add("fa fa-angle-left", 61700); + dict.Add("fa fa-angle-right", 61701); + dict.Add("fa fa-angle-up", 61702); + dict.Add("fa fa-arrow-circle-down", 61611); + dict.Add("fa fa-arrow-circle-left", 61608); + dict.Add("fa fa-arrow-circle-o-down", 61466); + dict.Add("fa fa-arrow-circle-o-left", 61840); + dict.Add("fa fa-arrow-circle-o-right", 61838); + dict.Add("fa fa-arrow-circle-o-up", 61467); + dict.Add("fa fa-arrow-circle-right", 61609); + dict.Add("fa fa-arrow-circle-up", 61610); + dict.Add("fa fa-arrow-down", 61539); + dict.Add("fa fa-arrow-left", 61536); + dict.Add("fa fa-arrow-right", 61537); + dict.Add("fa fa-arrow-up", 61538); + dict.Add("fa fa-arrows-alt", 61618); + dict.Add("fa fa-caret-down", 61655); + dict.Add("fa fa-caret-left", 61657); + dict.Add("fa fa-caret-right", 61658); + dict.Add("fa fa-caret-up", 61656); + dict.Add("fa fa-chevron-circle-down", 61754); + dict.Add("fa fa-chevron-circle-left", 61751); + dict.Add("fa fa-chevron-circle-right", 61752); + dict.Add("fa fa-chevron-circle-up", 61753); + dict.Add("fa fa-chevron-down", 61560); + dict.Add("fa fa-chevron-left", 61523); + dict.Add("fa fa-chevron-right", 61524); + dict.Add("fa fa-chevron-up", 61559); + dict.Add("fa fa-long-arrow-down", 61813); + dict.Add("fa fa-long-arrow-left", 61815); + dict.Add("fa fa-long-arrow-right", 61816); + dict.Add("fa fa-long-arrow-up", 61814); + dict.Add("fa fa-backward", 61514); + dict.Add("fa fa-compress", 61542); + dict.Add("fa fa-eject", 61522); + dict.Add("fa fa-expand", 61541); + dict.Add("fa fa-fast-backward", 61513); + dict.Add("fa fa-fast-forward", 61520); + dict.Add("fa fa-forward", 61518); + dict.Add("fa fa-pause", 61516); + dict.Add("fa fa-play", 61515); + dict.Add("fa fa-play-circle", 61764); + dict.Add("fa fa-play-circle-o", 61469); + dict.Add("fa fa-step-backward", 61512); + dict.Add("fa fa-step-forward", 61521); + dict.Add("fa fa-stop", 61517); + dict.Add("fa fa-youtube-play", 61802); + dict.Add("fa fa-500px", 62062); + dict.Add("fa fa-adn", 61808); + dict.Add("fa fa-amazon", 62064); + dict.Add("fa fa-android", 61819); + dict.Add("fa fa-angellist", 61961); + dict.Add("fa fa-apple", 61817); + dict.Add("fa fa-behance", 61876); + dict.Add("fa fa-behance-square", 61877); + dict.Add("fa fa-bitbucket", 61809); + dict.Add("fa fa-bitbucket-square", 61810); + dict.Add("fa fa-black-tie", 62078); + dict.Add("fa fa-buysellads", 61965); + dict.Add("fa fa-chrome", 62056); + dict.Add("fa fa-codepen", 61899); + dict.Add("fa fa-connectdevelop", 61966); + dict.Add("fa fa-contao", 62061); + dict.Add("fa fa-css3", 61756); + dict.Add("fa fa-dashcube", 61968); + dict.Add("fa fa-delicious", 61861); + dict.Add("fa fa-deviantart", 61885); + dict.Add("fa fa-digg", 61862); + dict.Add("fa fa-dribbble", 61821); + dict.Add("fa fa-dropbox", 61803); + dict.Add("fa fa-drupal", 61865); + dict.Add("fa fa-empire", 61905); + dict.Add("fa fa-expeditedssl", 62014); + dict.Add("fa fa-facebook", 61594); + dict.Add("fa fa-facebook-f", 61594); + dict.Add("fa fa-facebook-official", 62000); + dict.Add("fa fa-facebook-square", 61570); + dict.Add("fa fa-firefox", 62057); + dict.Add("fa fa-flickr", 61806); + dict.Add("fa fa-fonticons", 62080); + dict.Add("fa fa-forumbee", 61969); + dict.Add("fa fa-foursquare", 61824); + dict.Add("fa fa-ge", 61905); + dict.Add("fa fa-get-pocket", 62053); + dict.Add("fa fa-git", 61907); + dict.Add("fa fa-git-square", 61906); + dict.Add("fa fa-github", 61595); + dict.Add("fa fa-github-alt", 61715); + dict.Add("fa fa-github-square", 61586); + dict.Add("fa fa-gittip", 61828); + dict.Add("fa fa-google", 61856); + dict.Add("fa fa-google-plus", 61653); + dict.Add("fa fa-google-plus-square", 61652); + dict.Add("fa fa-gratipay", 61828); + dict.Add("fa fa-hacker-news", 61908); + dict.Add("fa fa-houzz", 62076); + dict.Add("fa fa-html5", 61755); + dict.Add("fa fa-instagram", 61805); + dict.Add("fa fa-internet-explorer", 62059); + dict.Add("fa fa-ioxhost", 61960); + dict.Add("fa fa-joomla", 61866); + dict.Add("fa fa-jsfiddle", 61900); + dict.Add("fa fa-lastfm", 61954); + dict.Add("fa fa-lastfm-square", 61955); + dict.Add("fa fa-leanpub", 61970); + dict.Add("fa fa-linkedin", 61665); + dict.Add("fa fa-linkedin-square", 61580); + dict.Add("fa fa-linux", 61820); + dict.Add("fa fa-maxcdn", 61750); + dict.Add("fa fa-meanpath", 61964); + dict.Add("fa fa-medium", 62010); + dict.Add("fa fa-odnoklassniki", 62051); + dict.Add("fa fa-odnoklassniki-square", 62052); + dict.Add("fa fa-opencart", 62013); + dict.Add("fa fa-openid", 61851); + dict.Add("fa fa-opera", 62058); + dict.Add("fa fa-optin-monster", 62012); + dict.Add("fa fa-pagelines", 61836); + dict.Add("fa fa-pied-piper", 62126); + dict.Add("fa fa-pied-piper-alt", 61864); + dict.Add("fa fa-pinterest", 61650); + dict.Add("fa fa-pinterest-p", 62001); + dict.Add("fa fa-pinterest-square", 61651); + dict.Add("fa fa-qq", 61910); + dict.Add("fa fa-ra", 61904); + dict.Add("fa fa-rebel", 61904); + dict.Add("fa fa-reddit", 61857); + dict.Add("fa fa-reddit-square", 61858); + dict.Add("fa fa-renren", 61835); + dict.Add("fa fa-safari", 62055); + dict.Add("fa fa-sellsy", 61971); + dict.Add("fa fa-shirtsinbulk", 61972); + dict.Add("fa fa-simplybuilt", 61973); + dict.Add("fa fa-skyatlas", 61974); + dict.Add("fa fa-skype", 61822); + dict.Add("fa fa-slack", 61848); + dict.Add("fa fa-slideshare", 61927); + dict.Add("fa fa-soundcloud", 61886); + dict.Add("fa fa-spotify", 61884); + dict.Add("fa fa-stack-exchange", 61837); + dict.Add("fa fa-stack-overflow", 61804); + dict.Add("fa fa-steam", 61878); + dict.Add("fa fa-steam-square", 61879); + dict.Add("fa fa-stumbleupon", 61860); + dict.Add("fa fa-stumbleupon-circle", 61859); + dict.Add("fa fa-tencent-weibo", 61909); + dict.Add("fa fa-trello", 61825); + dict.Add("fa fa-tripadvisor", 62050); + dict.Add("fa fa-tumblr", 61811); + dict.Add("fa fa-tumblr-square", 61812); + dict.Add("fa fa-twitch", 61928); + dict.Add("fa fa-twitter", 61593); + dict.Add("fa fa-twitter-square", 61569); + dict.Add("fa fa-viacoin", 62007); + dict.Add("fa fa-vimeo", 62077); + dict.Add("fa fa-vimeo-square", 61844); + dict.Add("fa fa-vine", 61898); + dict.Add("fa fa-vk", 61833); + dict.Add("fa fa-wechat", 61911); + dict.Add("fa fa-weibo", 61834); + dict.Add("fa fa-weixin", 61911); + dict.Add("fa fa-whatsapp", 62002); + dict.Add("fa fa-wikipedia-w", 62054); + dict.Add("fa fa-windows", 61818); + dict.Add("fa fa-wordpress", 61850); + dict.Add("fa fa-xing", 61800); + dict.Add("fa fa-xing-square", 61801); + dict.Add("fa fa-y-combinator", 62011); + dict.Add("fa fa-y-combinator-square", 61908); + dict.Add("fa fa-yahoo", 61854); + dict.Add("fa fa-yc", 62011); + dict.Add("fa fa-yc-square", 61908); + dict.Add("fa fa-yelp", 61929); + dict.Add("fa fa-youtube", 61799); + dict.Add("fa fa-youtube-square", 61798); + dict.Add("fa fa-h-square", 61693); + dict.Add("fa fa-hospital-o", 61688); + dict.Add("fa fa-medkit", 61690); + dict.Add("fa fa-stethoscope", 61681); + dict.Add("fa fa-user-md", 61680); + return dict; + } + } +} diff --git a/DH.RBAC/Common/MyConfig.cs b/DH.RBAC/Common/MyConfig.cs new file mode 100644 index 0000000..8b5cac4 --- /dev/null +++ b/DH.RBAC/Common/MyConfig.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Common +{ + public class MyConfig + { + public int EveryPageDataCount { get; set; } + /// + /// 数据库类型 + /// + public string DbType { get; set; } + /// + /// 数据库主机IP + /// + public string DbHost { get; set; } + + /// + /// 数据库名 + /// + public string DbName { get; set; } + + /// + /// 数据库用户名 + /// + public string DbUserName { get; set; } + + /// + /// 数据库密码 + /// + public string DbPassword { get; set; } + + + private bool _debug = false; + /// + /// 是否调试模式,调试模式将会输出日志 + /// + public bool Debug { get { return _debug; } set { _debug = value; } } + + + } +} diff --git a/DH.RBAC/DH.RBAC.csproj b/DH.RBAC/DH.RBAC.csproj new file mode 100644 index 0000000..a2c108f --- /dev/null +++ b/DH.RBAC/DH.RBAC.csproj @@ -0,0 +1,145 @@ + + + + net8.0-windows + false + enable + enable + ..\ + output + true + true + AnyCPU;x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/DH.RBAC/Logic/BaseLogic.cs b/DH.RBAC/Logic/BaseLogic.cs new file mode 100644 index 0000000..0df6556 --- /dev/null +++ b/DH.RBAC/Logic/BaseLogic.cs @@ -0,0 +1,303 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using System.Data; + +using DH.RBAC.Model.Base; +using JinianNet.JNTemplate; +using DH.RBAC.Utility.Other; +using DH.RBAC.Utility.Extension; + + + +namespace DH.RBAC.Logic.Base +{ + public class BaseLogic + { + private static string ConnectionString; + private static SqlSugar.DbType DbType; + private static string DbName; + private static bool DebugMode; + + public static bool InitDB(string dbType, string host, string dbName, string userName, string pasword, ref string message, bool debug = false) + { + DebugMode = debug; + DbName = dbName; + if (dbType.ToLower() == "SqlServer".ToLower()) + { + DbType = SqlSugar.DbType.SqlServer; + ConnectionString = $"Data Source={host};Initial Catalog={dbName};User ID={userName};Password={pasword};"; + return true; + } + else if (dbType.ToLower() == "MySql".ToLower()) + { + DbType = SqlSugar.DbType.MySql; + ConnectionString = $"server={host};Database={dbName};Uid={userName};Pwd={pasword};"; + return true; + } + else if (dbType.ToLower() == "Oracle".ToLower()) + { + DbType = SqlSugar.DbType.Oracle; + ConnectionString = $"Data Source={host}/{dbName};User ID={userName};Password={pasword};"; + return true; + } + else if (dbType.ToLower() == "PostgreSql".ToLower()) + { + DbType = SqlSugar.DbType.PostgreSQL; + ConnectionString = $"Server={host};Port=5432;Database={dbName};User Id={userName};Password={pasword};"; + return true; + } + else if (dbType.ToLower() == "Sqlite".ToLower()) + { + DbType = SqlSugar.DbType.Sqlite; + + var template = Engine.CreateTemplate(dbName); + template.Set("BaseDirectory", MyEnvironment.RootPath("")); + var result = template.Render(); + + ConnectionString = $"DataSource={result};"; + return true; + } + else + { + message = "不支持的数据库"; + return false; + } + } + + public static SqlSugarClient GetInstance() + { +#if !NETFRAMEWORK && !WINDOWS + SqlSugarScope client = (SqlSugar.SqlSugarScope)Utility.MiddleWare.AutofacContainerModule.GetService(); + if (client != null) + return client.ScopedContext; +#endif + + SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() + { + ConnectionString = ConnectionString, + DbType = DbType, + IsAutoCloseConnection = true, + ConfigureExternalServices = new ConfigureExternalServices() + { + SqlFuncServices = ExtMethods.GetExpMethods + + } + }); + //用来打印Sql方便你调式 + db.Aop.OnLogExecuting = (sql, pars) => + { + if (DebugMode) + { + Console.WriteLine(sql + "\r\n" + + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); + Console.WriteLine(); + } + }; + return db; + } + + public DataTable GetTableColumnInfo(string tableName) + { + if (DbType == SqlSugar.DbType.SqlServer) + { + using (var db = GetInstance()) + { + StringBuilder strSql = new StringBuilder(); + strSql.Append(" SELECT ").AppendLine(); + strSql.Append(" A.Name AS TableName, ").AppendLine(); + strSql.Append(" B.Name AS ColumnName, ").AppendLine(); + strSql.Append(" D.Name AS TypeName, ").AppendLine(); + strSql.Append(" B.Max_Length AS TypeLength, ").AppendLine(); + strSql.Append(" CASE WHEN ").AppendLine(); + strSql.Append(" ( ").AppendLine(); + strSql.Append(" SELECT ").AppendLine(); + strSql.Append(" F.Name ").AppendLine(); + strSql.Append(" FROM ").AppendLine(); + strSql.Append(" information_schema.key_column_usage E,sys.indexes F ").AppendLine(); + strSql.Append(" WHERE ").AppendLine(); + strSql.Append(" F.object_id=B.object_id ").AppendLine(); + strSql.Append(" AND F.name=E.constraint_name ").AppendLine(); + strSql.Append(" AND F.is_primary_key=1 ").AppendLine(); + strSql.Append(" AND E.table_name=A.Name ").AppendLine(); + strSql.Append(" AND E.column_name =B.Name ").AppendLine(); + strSql.Append(" ) IS NULL THEN 0 ELSE 1 END AS IsPrimaryKey, ").AppendLine(); + strSql.Append(" '' AS ClassName, ").AppendLine(); + strSql.Append(" '' AS PropertyName, ").AppendLine(); + strSql.Append(" '' AS CSType, ").AppendLine(); + strSql.Append(" C.VALUE AS Other ").AppendLine(); + strSql.Append(" FROM sys.tables A ").AppendLine(); + strSql.Append(" LEFT JOIN sys.columns B ").AppendLine(); + strSql.Append(" ON B.object_id = A.object_id ").AppendLine(); + strSql.Append(" LEFT JOIN sys.extended_properties C ").AppendLine(); + strSql.Append(" ON C.major_id = B.object_id AND C.minor_id = B.column_id ").AppendLine(); + strSql.Append(" LEFT JOIN sys.types D ON D.system_type_id=B.system_type_id ").AppendLine(); + strSql.Append(" WHERE A.Name = '" + tableName + "' ").AppendLine(); + DataTable dt = db.Ado.GetDataTable(strSql.ToString()); + return dt; + } + } + else if (DbType == SqlSugar.DbType.MySql) + { + using (var db = GetInstance()) + { + StringBuilder strSql = new StringBuilder(); + strSql.Append(" SELECT ").AppendLine(); + strSql.Append(" '" + tableName + "' AS TableName, ").AppendLine(); + strSql.Append(" COLUMN_NAME AS ColumnName, ").AppendLine(); + strSql.Append(" DATA_TYPE AS TypeName, ").AppendLine(); + strSql.Append(" CHARACTER_MAXIMUM_LENGTH AS TypeLength, ").AppendLine(); + strSql.Append(" case when COLUMN_KEY = 'PRI' THEN 1 ELSE 0 END AS IsPrimaryKey, ").AppendLine(); + strSql.Append(" '' AS ClassName, ").AppendLine(); + strSql.Append(" '' PropertyName, ").AppendLine(); + strSql.Append(" '' CSType , ").AppendLine(); + strSql.Append(" COLUMN_COMMENT AS Other ").AppendLine(); + strSql.Append(" FROM ").AppendLine(); + strSql.Append(" INFORMATION_SCHEMA.COLUMNS ").AppendLine(); + strSql.Append(" WHERE ").AppendLine(); + strSql.Append(" table_schema ='" + DbName + "' AND table_name = '" + tableName + "' ").AppendLine(); + strSql.Append(" ORDER BY ORDINAL_POSITION ").AppendLine(); + DataTable dt = db.Ado.GetDataTable(strSql.ToString()); + return dt; + } + } + else if (DbType == SqlSugar.DbType.Sqlite) + { + using (var db = GetInstance()) + { + + string sql = "SELECT * from sqlite_master where type = 'table' AND tbl_name='" + tableName + "'"; + DataTable dt = db.Ado.GetDataTable(sql); + //创建个新的DataTable,把dt中的数据放进去 + DataTable newDt = new DataTable(); + newDt.Columns.Add("TableName"); + newDt.Columns.Add("ColumnName"); + newDt.Columns.Add("TypeName"); + newDt.Columns.Add("TypeLength"); + newDt.Columns.Add("IsPrimaryKey"); + newDt.Columns.Add("ClassName"); + newDt.Columns.Add("PropertyName"); + newDt.Columns.Add("CSType"); + newDt.Columns.Add("Other"); + if (dt == null || dt.Rows.Count == 0) + return newDt; + string sql1 = dt.Rows[0]["sql"].ToString().Replace("\"", ""); + + List list = new List(); + //第一个( + int index1 = sql1.IndexOf("("); + int index2 = sql1.LastIndexOf(")"); + string content = sql1.Substring(index1 + 1, index2 - index1 - 1); + List array = content.Split('\n').Select(it => it.Trim()).ToList(); + List primaryKey = new List(); + foreach (string item in array) + { + if (item.Trim() == "") + continue; + if (item.ToUpper().StartsWith("PRIMARY KEY")) + { + int index3 = item.IndexOf("("); + int index4 = item.IndexOf(")"); + string[] keyArray = item.Substring(index3 + 1, index4 - index3 - 1).Split(','); + foreach (string key in keyArray) + primaryKey.Add(key.Trim()); + continue; + } + string[] itemText = item.Trim().Split(' '); + CodeGenerator codeGenerator = new CodeGenerator(); + codeGenerator.TableName = tableName; + codeGenerator.ColumnName = itemText[0]; + string type = itemText[1]; + int index5 = type.IndexOf("("); + int index6 = type.IndexOf(")"); + codeGenerator.TypeName = index5 == -1 ? type : type.Substring(0, index5); + codeGenerator.TypeLength = index5 == -1 ? "0" : type.Substring(index5 + 1, index6 - index5 - 1); + codeGenerator.IsPrimaryKey = "0"; + codeGenerator.ClassName = ""; + codeGenerator.PropertyName = ""; + codeGenerator.CSType = ""; + codeGenerator.Other = ""; + list.Add(codeGenerator); + } + foreach (CodeGenerator code in list) + { + if (primaryKey.Contains(code.ColumnName)) + code.IsPrimaryKey = "1"; + } + return list.ToJson().ToDataTable(); + } + } + + + return null; + } + + public List GetTableList() + { + if (DbType == SqlSugar.DbType.SqlServer) + { + using (var db = GetInstance()) + { + StringBuilder strSql = new StringBuilder(); + strSql.Append(" SELECT ").AppendLine(); + strSql.Append(" A.Name ").AppendLine(); + strSql.Append(" FROM ").AppendLine(); + strSql.Append(" sysobjects A ").AppendLine(); + strSql.Append(" WHERE ").AppendLine(); + strSql.Append(" A.xtype = 'U' ").AppendLine(); + DataTable dt = db.Ado.GetDataTable(strSql.ToString()); + if (dt == null) + return new List(); + List list = new List(); + foreach (DataRow row in dt.Rows) + { + list.Add(row["Name"].ToString()); + } + return list; + } + } + else if (DbType == SqlSugar.DbType.MySql) + { + using (var db = GetInstance()) + { + StringBuilder strSql = new StringBuilder(); + strSql.Append(" SELECT ").AppendLine(); + strSql.Append(" TABLE_NAME AS Name ").AppendLine(); + strSql.Append(" FROM ").AppendLine(); + strSql.Append(" information_schema.TABLES ").AppendLine(); + strSql.Append(" WHERE ").AppendLine(); + strSql.Append(" TABLE_SCHEMA = '" + DbName + "' ").AppendLine(); + DataTable dt = db.Ado.GetDataTable(strSql.ToString()); + if (dt == null) + return new List(); + List list = new List(); + foreach (DataRow row in dt.Rows) + { + list.Add(row["Name"].ToString()); + } + return list; + } + } + else if (DbType == SqlSugar.DbType.Sqlite) + { + using (var db = GetInstance()) + { + string sql = "SELECT name from sqlite_master where type='table'"; + DataTable dt = db.Ado.GetDataTable(sql); + if (dt == null) + return new List(); + List list = new List(); + foreach (DataRow row in dt.Rows) + { + list.Add(row["name"].ToString()); + } + return list; + } + } + return new List(); + } + } +} diff --git a/DH.RBAC/Logic/Logger.cs b/DH.RBAC/Logic/Logger.cs new file mode 100644 index 0000000..b0e1862 --- /dev/null +++ b/DH.RBAC/Logic/Logger.cs @@ -0,0 +1,80 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + +namespace DH.RBAC.Logic +{ + /// + /// 日志 + /// + public class Logger + { + private static object _lock = new object(); + private static void Log(string type, string message) + { + lock (_lock) + { + SimpleClient client = new SimpleClient(BaseLogic.GetInstance()); + + + + SysLog log = new SysLog(); + log.Id = UUID.SnowId; + log.Type = type; +#if !NETFRAMEWORK + log.ThreadId = Thread.GetCurrentProcessorId(); +#else + log.ThreadId = Thread.CurrentThread.ManagedThreadId; +#endif + log.Message = message; + log.EnableFlag = "Y"; + log.DeleteFlag = "N"; + log.CreateTime = DateTime.Now; + log.CreateUserId = "1"; + log.ModifyUserId = "1"; + log.ModifyTime = log.CreateTime; + client.Insert(log); + } + } + + + + /// + /// 操作日志写入 + /// + /// + public static void OperateInfo(string message) + { + Log("Operate", message); + + } + + /// + /// 运行日志写入 + /// + /// + public static void RunningInfo(string message) + { + Log("Running", message); + + } + + + /// + /// 错误日志写入 + /// + /// + public static void ErrorInfo(string message) + { + Log("Error", message); + + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysItemLogic.cs b/DH.RBAC/Logic/Sys/SysItemLogic.cs new file mode 100644 index 0000000..2ce6730 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysItemLogic.cs @@ -0,0 +1,167 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SqlSugar; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysItemLogic : BaseLogic + { + + public List GetList() + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N") + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToList(); + } + } + + public List GetAppList(int pageIndex, int pageSize, ref int totalCount) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.ParentId != "0" && it.DeleteFlag == "N") + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToPageList(pageIndex, pageSize, ref totalCount); + } + } + public List GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + ISugarQueryable queryable = db.Queryable().Where(it => it.DeleteFlag == "N"); + + if (!string.IsNullOrWhiteSpace(keyWord)) + { + queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord))); + } + return queryable + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + + public int GetChildCount(string parentId) + { + using (var db = GetInstance()) + { + return db.Queryable() + .Where(it => it.ParentId == parentId && it.DeleteFlag == "N") + .ToList().Count(); + } + } + + + public SysItem Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N") + .Where(it => it.Id == primaryKey) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .First(); + } + } + + + public int AppInsert(SysItem model, string operateUser) + { + using (var db = GetInstance()) + { + SysItem s = db.Queryable().Where(it => it.ParentId == "0").First(); + model.Id = UUID.StrSnowId; + model.Layer = s.Layer + 1; + model.ParentId = s.Id; + model.DeleteFlag = "N"; + model.CreateUserId = operateUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUser.Id; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int Insert(SysItem model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.Layer = Get(model.ParentId).Layer += 1; + model.DeleteFlag = "N"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int Delete(string primaryKey) + { + using (var db = GetInstance()) + { + SysItem item = db.Queryable().Where(it => it.Id == primaryKey).First(); + if (item == null) + return 0; + item.DeleteFlag = "Y"; + return db.Updateable(item).ExecuteCommand(); + } + } + public int Update(SysItem model, string account) + { + using (var db = GetInstance()) + { + model.Layer = Get(model.ParentId).Layer += 1; + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.ParentId, + it.Layer, + it.EnCode, + it.Name, + it.SortCode, + it.EnableFlag, + it.Remark, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + + public int AppUpdate(SysItem model, string operateUser) + { + using (var db = GetInstance()) + { + model.ModifyUserId = operateUser; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.EnCode, + it.Name, + it.SortCode, + it.Remark, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysItemsDetailLogic.cs b/DH.RBAC/Logic/Sys/SysItemsDetailLogic.cs new file mode 100644 index 0000000..d9be401 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysItemsDetailLogic.cs @@ -0,0 +1,182 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysItemsDetailLogic : BaseLogic + { + public List GetItemDetailList(string strItemCode) + { + using (var db = GetInstance()) + { + + SysItem item = db.Queryable().Where(it => it.EnCode == strItemCode && it.DeleteFlag == "N").First(); + if (null == item) + return null; + return db.Queryable().Where(it => it.ItemId == item.Id && it.DeleteFlag == "N") + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToList(); + } + } + + public List GetList(int pageIndex, int pageSize, string itemId, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + ISugarQueryable queryable = db.Queryable().Where(it => it.DeleteFlag == "N" && it.ItemId == itemId); + if (!keyWord.IsNullOrEmpty()) + { + queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord))); + } + return queryable + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + public List GetListByItemId(string itemId) + { + using (var db = GetInstance()) + { + return db.Queryable() + .Where(it => it.ItemId == itemId && it.DeleteFlag == "N") + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .ToList(); + } + } + + public void InsertItemDetail(string itemId, List list) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + List list2 = db.Queryable().Where(it => it.ItemId == itemId && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + db.Insertable(list).ExecuteCommand(); + db.CommitTran(); + } + catch + { + db.RollbackTran(); + } + } + } + + public SysItemDetail Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable() + .Where(it => it.DeleteFlag == "N" && it.Id == primaryKey) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .First(); + } + } + + public int Insert(SysItemDetail model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.IsDefault = model.IsDefault == null ? "0" : "1"; + model.DeleteFlag = "N"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int AppInsert(SysItemDetail model, string operateUser) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.IsDefault = "0"; + model.DeleteFlag = "N"; + model.CreateUserId = operateUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + + public int AppUpdate(SysItemDetail model, string operateUser) + { + using (var db = GetInstance()) + { + model.ModifyUserId = operateUser; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.EnCode, + it.Name, + it.SortCode, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int Delete(string itemId) + { + using (var db = GetInstance()) + { + SysItemDetail itemDetail = db.Queryable().Where(it => it.Id == itemId).First(); + if (itemDetail == null) + return 0; + itemDetail.DeleteFlag = "Y"; + return db.Updateable(itemDetail).ExecuteCommand(); + } + } + + public int Update(SysItemDetail model, string account) + { + using (var db = GetInstance()) + { + model.IsDefault = model.IsDefault == null ? "0" : "1"; + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.ItemId, + it.EnCode, + it.Name, + it.IsDefault, + it.SortCode, + it.EnableFlag, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public SysItemDetail GetSoftwareName() + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.EnCode == "SoftwareName").First(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysLogLogic.cs b/DH.RBAC/Logic/Sys/SysLogLogic.cs new file mode 100644 index 0000000..5790d96 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysLogLogic.cs @@ -0,0 +1,123 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + /// + /// 系统日志表数据访问 + /// + public class SysLogLogic : BaseLogic + { + + /// + /// 根据日志类型获得日志 + /// + /// + /// + /// + /// + /// + /// + /// + public List GetList(int pageIndex, int pageSize, string type, string index, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + ISugarQueryable query = db.Queryable().Where(it => it.Type == type); + if (!keyWord.IsNullOrEmpty()) + { + query = query.Where(it => it.Message.Contains(keyWord)); + } + //查询当日 + if (index == "1") + { + DateTime today = DateTime.Today; + DateTime startTime = today; + DateTime endTime = today.AddDays(1); + query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime); + } + //近7天 + else if (index == "2") + { + DateTime today = DateTime.Today; + DateTime startTime = today.AddDays(-6); + DateTime endTime = today.AddDays(1); + query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime); + } + //近1月 + else if (index == "3") + { + DateTime today = DateTime.Today; + DateTime startTime = today.AddDays(-29); + DateTime endTime = today.AddDays(1); + query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime); + } + //近3月 + else if (index == "4") + { + DateTime today = DateTime.Today; + DateTime startTime = today.AddDays(-91); + DateTime endTime = today.AddDays(1); + query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime); + } + return query.OrderBy(it => it.Id, OrderByType.Desc).ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + + + /// + /// 删除日志 + /// + /// + /// + /// + public int Delete(string type, string index) + { + using (var db = GetInstance()) + { + IDeleteable query = db.Deleteable().Where(it => it.Type == type); + //保留一个月 + if (index == "1") + { + DateTime today = DateTime.Today; + DateTime startTime = today; + DateTime endTime = today.AddDays(-29); + query = query.Where(it => it.CreateTime < endTime); + return query.ExecuteCommand(); + } + //保留7天 + else if (index == "2") + { + DateTime today = DateTime.Today; + DateTime startTime = today.AddDays(-6); + query = query.Where(it => it.CreateTime < startTime); + return query.ExecuteCommand(); + } + //保留近3个月 + else if (index == "3") + { + DateTime today = DateTime.Today; + DateTime startTime = today.AddDays(-92); + query = query.Where(it => it.CreateTime < startTime); + return query.ExecuteCommand(); + } + //全部 + else if (index == "4") + { + return query.ExecuteCommand(); + } + else + { + return 0; + } + + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysOrganizeLogic.cs b/DH.RBAC/Logic/Sys/SysOrganizeLogic.cs new file mode 100644 index 0000000..fa9a018 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysOrganizeLogic.cs @@ -0,0 +1,157 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysOrganizeLogic : BaseLogic + { + public List GetList() + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N").ToList(); + } + } + + public List GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + ISugarQueryable queryable = db.Queryable().Where(it => it.ParentId != "0" && it.DeleteFlag == "N"); + + if (!keyWord.IsNullOrEmpty()) + { + queryable = queryable.Where(it => (it.FullName.Contains(keyWord) || it.EnCode.Contains(keyWord))); + } + return queryable + .OrderBy(it => it.SortCode) + .ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + + + public int GetChildCount(string parentId) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").Count(); + } + } + + + public int AppUpdate(SysOrganize model, string opreaterUser) + { + using (var db = GetInstance()) + { + model.ModifyUserId = opreaterUser; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.EnCode, + it.FullName, + it.Type, + it.ManagerId, + it.TelePhone, + it.WeChat, + it.Fax, + it.Email, + it.Address, + it.SortCode, + it.Remark, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int AppInsert(SysOrganize model, string opreaterUser) + { + using (var db = GetInstance()) + { + SysOrganize s = db.Queryable().Where(it => it.ParentId == "0").First(); + model.Id = UUID.StrSnowId; + model.Layer = s.Layer + 1; + model.ParentId = s.Id; + + model.EnableFlag = "Y"; + model.DeleteFlag = "N"; + model.CreateUserId = opreaterUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + public int Insert(SysOrganize model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.Layer = Get(model.ParentId).Layer += 1; + model.EnableFlag = "Y"; + model.DeleteFlag = "N"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int Delete(string primaryKey) + { + using (var db = GetInstance()) + { + SysOrganize organize = db.Queryable().Where(it => it.Id == primaryKey).First(); + if (organize == null) + return 0; + organize.DeleteFlag = "Y"; + return db.Updateable(organize).ExecuteCommand(); + } + } + public SysOrganize Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.Id == primaryKey).Includes(it => it.CreateUser).Includes(it => it.ModifyUser).First(); + } + } + public int Update(SysOrganize model, string account) + { + using (var db = GetInstance()) + { + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.ParentId, + it.Layer, + it.EnCode, + it.FullName, + it.Type, + it.ManagerId, + it.TelePhone, + it.WeChat, + it.Fax, + it.Email, + it.Address, + it.SortCode, + it.EnableFlag, + it.Remark, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysPermissionLogic.cs b/DH.RBAC/Logic/Sys/SysPermissionLogic.cs new file mode 100644 index 0000000..6c9fb78 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysPermissionLogic.cs @@ -0,0 +1,238 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysPermissionLogic : BaseLogic + { + public bool ActionValidate(string userId, string action) + { + List authorizeModules; + if (new SysUserLogic().ContainsUser("admin", userId)) + { + authorizeModules = GetList(); + } + else + { + authorizeModules = GetList(userId); + } + foreach (var item in authorizeModules) + { + if (!string.IsNullOrEmpty(item.Url)) + { + string[] url = item.Url.Split('?'); + if (url[0].ToLower() == action.ToLower()) + { + return true; + } + } + } + return false; + } + + + public List GetList(string userId) + { + using (var db = GetInstance()) + { + List permissionIdList = db.Queryable((A, B, C) => new object[] { + JoinType.Left,A.RoleId == B.RoleId, + JoinType.Left,C.Id == B.ModuleId, + }) + .Where((A, B, C) => A.UserId == userId && C.EnableFlag == "Y" && B.DeleteFlag == "N") + .Select((A, B, C) => C.Id).ToList(); + return db.Queryable().Where(it => permissionIdList.Contains(it.Id)).OrderBy(it => it.SortCode).ToList(); + } + } + + + public List GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + if (keyWord.IsNullOrEmpty()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N").OrderBy(it => it.SortCode).ToPageList(pageIndex, pageSize, ref totalCount); + } + return db.Queryable().Where(it => it.DeleteFlag == "N" && (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord))).OrderBy(it => it.SortCode).ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + public int Delete(params string[] primaryKeys) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + //删除权限与角色的对应关系。 + List list = db.Queryable().Where(it => primaryKeys.Contains(it.Id) && it.DeleteFlag == "N").ToList(); + List ids = list.Select(it => it.Id).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list).ExecuteCommand(); + List list2 = db.Queryable().Where(it => ids.Contains(it.ModuleId) && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + db.CommitTran(); + return 1; + } + catch (Exception ex) + { + db.RollbackTran(); + return 0; + } + } + + } + public int GetMaxChildMenuOrderCode(string parentId) + { + using (var db = GetInstance()) + { + //得到当前节点 + SysPermission permission = db.Queryable().Where(it => it.Id == parentId && it.DeleteFlag == "N").First(); + if (permission == null) + return 0; + //得到子的 + SysPermission child = db.Queryable().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").OrderBy(it => it.SortCode, OrderByType.Desc).First(); + if (child == null) + return permission.SortCode.Value + 100; + else + return child.SortCode.Value + 100; + } + } + public int GetChildCount(string parentId) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").ToList().Count(); + } + } + + public List GetList() + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N").OrderBy(it => it.SortCode).ToList(); + } + } + + public SysPermission Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.Id == primaryKey).Includes(it => it.CreateUser).Includes(it => it.ModifyUser).First(); + } + } + + + public int Insert(SysPermission model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2; + model.IsEdit = model.IsEdit == null ? "0" : "1"; + model.IsPublic = model.IsPublic == null ? "0" : "1"; + + model.DeleteFlag = "N"; + model.EnableFlag = "Y"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + public int AppInsert(SysPermission model, string operateUser) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2; + model.IsEdit = "1"; + model.IsPublic = "0"; + + model.DeleteFlag = "N"; + model.EnableFlag = "Y"; + model.CreateUserId = operateUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int AppUpdate(SysPermission model, string operateUser) + { + using (var db = GetInstance()) + { + model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2; + model.ModifyUserId = operateUser; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.ParentId, + it.Layer, + it.EnCode, + it.Name, + it.JsEvent, + it.Icon, + it.SymbolIndex, + it.Url, + it.Remark, + it.Type, + it.SortCode, + it.ModifyUserId, + it.ModifyTime, + }).ExecuteCommand(); + } + } + + + public int Update(SysPermission model, string account) + { + using (var db = GetInstance()) + { + model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2; + model.IsEdit = model.IsEdit == null ? "0" : "1"; + model.IsPublic = model.IsPublic == null ? "0" : "1"; + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.ParentId, + it.Layer, + it.EnCode, + it.Name, + it.JsEvent, + it.Icon, + it.SymbolIndex, + it.Url, + it.Remark, + it.Type, + it.SortCode, + it.IsPublic, + it.EnableFlag, + it.IsEdit, + it.ModifyUserId, + it.ModifyTime, + }).ExecuteCommand(); + } + } + public int InsertList(List permissionList) + { + using (var db = GetInstance()) + { + return db.Insertable(permissionList).ExecuteCommand(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysRoleAuthorizeLogic.cs b/DH.RBAC/Logic/Sys/SysRoleAuthorizeLogic.cs new file mode 100644 index 0000000..a1c689d --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysRoleAuthorizeLogic.cs @@ -0,0 +1,170 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysRoleAuthorizeLogic : BaseLogic + { + /// + /// 获得角色权限关系 + /// + /// + public List GetList() + { + using (var db = GetInstance()) + { + return db.Queryable().ToList(); + } + } + + /// + /// 根据角色ID获得角色权限关系 + /// + /// + /// + public List GetList(string roleId) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList(); + } + } + + + /// + /// 给某个角色授权 + /// + /// + /// + public void AppAuthorize(string operate, string roleId, params string[] perIds) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + //获得所有权限 + List permissionList = db.Queryable().Where(it => it.DeleteFlag == "N").ToList(); + List perList = new List(); + foreach (string perId in perIds) + { + string id = perId; + while (!id.IsNullOrEmpty() && id != "0") + { + if (!perList.Contains(id)) + { + perList.Add(id); + } + id = permissionList.Where(it => it.Id == id).Select(it => it.ParentId).FirstOrDefault(); + } + } + //删除旧的 + List list2 = db.Queryable().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + + + List newRoleAuthorizeList = perList.Select(it => new SysRoleAuthorize + { + Id = UUID.StrSnowId, + RoleId = roleId, + ModuleId = it, + DeleteFlag = "N", + EnableFlag = "Y", + CreateUserId = operate, + CreateTime = DateTime.Now, + ModifyUserId = operate, + ModifyTime = DateTime.Now + + }).ToList(); + db.Insertable(newRoleAuthorizeList).ExecuteCommand(); + db.CommitTran(); + } + catch + { + db.RollbackTran(); + } + } + } + + + /// + /// 给某个角色授权 + /// + /// + /// + public void Authorize(string roleId, string account, params string[] perIds) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + //获得所有权限 + List permissionList = db.Queryable().ToList(); + List perList = new List(); + foreach (string perId in perIds) + { + string id = perId; + while (!id.IsNullOrEmpty() && id != "0") + { + if (!perList.Contains(id)) + { + perList.Add(id); + } + id = permissionList.Where(it => it.Id == id).Select(it => it.ParentId).FirstOrDefault(); + } + } + //删除旧的 + List list2 = db.Queryable().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + + + List newRoleAuthorizeList = perList.Select(it => new SysRoleAuthorize + { + Id = UUID.StrSnowId, + RoleId = roleId, + ModuleId = it, + DeleteFlag = "N", + EnableFlag = "Y", + CreateUserId = account, + CreateTime = DateTime.Now, + ModifyUserId = account, + ModifyTime = DateTime.Now + }).ToList(); + db.Insertable(newRoleAuthorizeList).ExecuteCommand(); + db.CommitTran(); + } + catch + { + db.RollbackTran(); + } + } + } + + /// + /// 从角色权限关系中删除某个模块 + /// + /// + /// + public int Delete(params string[] moduleIds) + { + using (var db = GetInstance()) + { + List list = db.Queryable().Where(it => moduleIds.Contains(it.ModuleId)).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + return db.Updateable(list).ExecuteCommand(); + } + } + + } +} diff --git a/DH.RBAC/Logic/Sys/SysRoleLogic.cs b/DH.RBAC/Logic/Sys/SysRoleLogic.cs new file mode 100644 index 0000000..fd1122d --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysRoleLogic.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysRoleLogic : BaseLogic + { + /// + /// 得到角色列表 + /// + /// + public List GetList() + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.DeleteFlag == "N") + .Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .ToList(); + } + } + + /// + /// 获得角色列表分页 + /// + /// + /// + /// + /// + /// + public List GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + + ISugarQueryable queryable = db.Queryable().Where(it => it.DeleteFlag == "N"); + + if (!keyWord.IsNullOrEmpty()) + { + queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord))); + } + + return queryable.Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .OrderBy(it => it.SortCode) + .ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + /// + /// 新增角色 + /// + /// + /// + public int Insert(SysRole model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.AllowEdit = model.AllowEdit == null ? "0" : "1"; + model.DeleteFlag = "N"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int AppInsert(SysRole model, string operateUser) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.AllowEdit = "1"; + model.DeleteFlag = "N"; + model.CreateUserId = operateUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + return db.Insertable(model).ExecuteCommand(); + } + } + + public int AppUpdate(SysRole model, string operateUser) + { + using (var db = GetInstance()) + { + model.AllowEdit = model.AllowEdit == null ? "0" : "1"; + model.ModifyUserId = operateUser; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.OrganizeId, + it.EnCode, + it.Type, + it.Name, + it.Remark, + it.SortCode, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + + /// + /// 更新角色信息 + /// + /// + /// + public int Update(SysRole model, string account) + { + using (var db = GetInstance()) + { + model.AllowEdit = model.AllowEdit == null ? "0" : "1"; + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.OrganizeId, + it.EnCode, + it.Type, + it.Name, + it.AllowEdit, + it.EnableFlag, + it.Remark, + it.SortCode, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + /// + /// 根据主键得到角色信息 + /// + /// + /// + public SysRole Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.Id == primaryKey) + .Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .First(); + } + } + /// + /// 删除角色信息 + /// + /// + /// + public int Delete(List primaryKeys) + { + using (var db = GetInstance()) + { + List list = db.Queryable().Where(it => primaryKeys.Contains(it.Id)).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + return db.Updateable(list).ExecuteCommand(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysUserLogOnLogic.cs b/DH.RBAC/Logic/Sys/SysUserLogOnLogic.cs new file mode 100644 index 0000000..6f74af1 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysUserLogOnLogic.cs @@ -0,0 +1,175 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DH.RBAC.Utility.Other; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysUserLogOnLogic : BaseLogic + { + + /// + /// 根据用户Id得到登录账号信息 + /// + /// + /// + public SysUserLogOn GetByAccount(string userId) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.UserId == userId).First(); + } + } + + /// + /// 更新用户登录账号信息 + /// + /// + /// + public int UpdateLogin(SysUserLogOn model) + { + using (var db = GetInstance()) + { + model.IsOnLine = "1"; + model.LastVisitTime = DateTime.Now; + model.PrevVisitTime = model.LastVisitTime; + model.LoginCount += 1; + model.ModifyTime = DateTime.Now; + model.ModifyUserId = model.UserId; + return db.Updateable(model).UpdateColumns(it => new + { + it.IsOnLine, + it.PrevVisitTime, + it.LastVisitTime, + it.LoginCount, + it.ModifyTime, + it.ModifyUserId + }).ExecuteCommand(); + } + } + + /// + /// 修改密码 + /// + /// + /// + public int ModifyPwd(SysUserLogOn userLoginEntity) + { + using (var db = GetInstance()) + { + userLoginEntity.ChangePwdTime = DateTime.Now; + userLoginEntity.ModifyUserId = userLoginEntity.UserId; + userLoginEntity.ModifyTime = DateTime.Now; + + return db.Updateable(userLoginEntity).UpdateColumns(it => new + { + it.Password, + it.ChangePwdTime, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + /// + /// 删除用户登录信息 + /// + /// + /// + public int Delete(List userIds) + { + using (var db = GetInstance()) + { + List list = db.Queryable().Where(it => userIds.Contains(it.UserId)).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + return db.Updateable(list).ExecuteCommand(); + } + } + + /// + /// 新增用户登录账号 + /// + /// + /// + public int Insert(SysUserLogOn model) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.SecretKey = model.Id.DESEncrypt().Substring(0, 8); + model.Password = model.Password.MD5Encrypt().DESEncrypt(model.SecretKey).MD5Encrypt(); + model.LoginCount = 0; + model.IsOnLine = "0"; + model.EnableFlag = "Y"; + model.DeleteFlag = "N"; + model.CreateTime = DateTime.Now; + model.ModifyTime = DateTime.Now; + model.ModifyUserId = model.UserId; + model.CreateUserId = model.UserId; + return db.Insertable(model).ExecuteCommand(); + } + } + + /// + /// 更新用户登录账号信息 + /// + /// + /// + public int UpdateInfo(SysUserLogOn model) + { + using (var db = GetInstance()) + { + model.ModifyTime = DateTime.Now; + model.ModifyUserId = model.UserId; + + return db.Updateable(model).UpdateColumns(it => new + { + it.AllowMultiUserOnline, + it.Question, + it.AnswerQuestion, + it.CheckIPAddress, + it.Language, + it.Theme, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int UpdateTheme(SysUserLogOn model) + { + using (var db = GetInstance()) + { + model.ModifyTime = DateTime.Now; + model.ModifyUserId = model.UserId; + return db.Updateable(model).UpdateColumns(it => new + { + it.Theme, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int UpdatePassword(SysUserLogOn model) + { + using (var db = GetInstance()) + { + model.ModifyTime = DateTime.Now; + model.ModifyUserId = model.UserId; + return db.Updateable(model).UpdateColumns(it => new + { + it.Password, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysUserLogic.cs b/DH.RBAC/Logic/Sys/SysUserLogic.cs new file mode 100644 index 0000000..c96cddd --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysUserLogic.cs @@ -0,0 +1,509 @@ + +using DH.RBAC.Logic.Base; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Security.Principal; +using DH.RBAC.Model.Sys; + +using DH.RBAC.Utility.Other; +using SqlSugar; +using System.ComponentModel; + +namespace DH.RBAC.Logic.Sys +{ + public class SysUserLogic : BaseLogic + { + /// + /// 根据账号得到用户信息 + /// + /// + /// + public SysUser GetByUserName(string account) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.Account == account && it.DeleteFlag == "N") + .Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser) + .First(); + } + } + + /// + /// 修改用户基础信息 + /// + /// + /// + public int UpdateBasicInfo(SysUser model, string account) + { + using (var db = GetInstance()) + { + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.RealName, + it.NickName, + it.Gender, + it.Birthday, + it.MobilePhone, + it.Avatar, + it.Email, + it.Signature, + it.Address, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int AppUpdateBasicInfo(SysUser model) + { + using (var db = GetInstance()) + { + model.ModifyUserId = model.Id; + model.ModifyTime = DateTime.Now; + return db.Updateable(model).UpdateColumns(it => new + { + it.RealName, + it.NickName, + it.Gender, + it.Birthday, + it.MobilePhone, + it.Avatar, + it.Email, + it.Signature, + it.Address, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + public int Insert(SysUser model, string password, string account, string[] roleIds) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + ////新增用户基本信息。 + model.Id = UUID.StrSnowId; + model.EnableFlag = "Y"; + model.DeleteFlag = "N"; + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + model.Avatar = "/Content/framework/images/avatar.png"; + int row = db.Insertable(model).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + + //新增新的角色 + List list = new List(); + foreach (string roleId in roleIds) + { + SysUserRoleRelation roleRelation = new SysUserRoleRelation + { + Id = UUID.StrSnowId, + UserId = model.Id, + RoleId = roleId, + EnableFlag = "Y", + DeleteFlag = "N", + CreateUserId = account, + CreateTime = DateTime.Now, + ModifyUserId = account, + ModifyTime = DateTime.Now + }; + list.Add(roleRelation); + } + row = db.Insertable(list).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + //新增用户登陆信息。 + SysUserLogOn userLogOnEntity = new SysUserLogOn(); + userLogOnEntity.Id = UUID.StrSnowId; + userLogOnEntity.UserId = model.Id; + userLogOnEntity.SecretKey = userLogOnEntity.Id.DESEncrypt().Substring(0, 8); + userLogOnEntity.Password = password.MD5Encrypt().DESEncrypt(userLogOnEntity.SecretKey).MD5Encrypt(); + userLogOnEntity.LoginCount = 0; + userLogOnEntity.IsOnLine = "0"; + userLogOnEntity.EnableFlag = "Y"; + userLogOnEntity.DeleteFlag = "N"; + userLogOnEntity.CreateUserId = account; + userLogOnEntity.CreateTime = DateTime.Now; + userLogOnEntity.ModifyUserId = account; + userLogOnEntity.ModifyTime = DateTime.Now; + row = db.Insertable(userLogOnEntity).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + db.CommitTran(); + return row; + } + catch + { + db.RollbackTran(); + return 0; + } + } + } + + public bool ContainsUser(string userAccount, params string[] userIdList) + { + using (var db = GetInstance()) + { + List accountList = db.Queryable().Where(it => userIdList.Contains(it.Id)).Select(it => it.Account).ToList(); + if (accountList.IsNullOrEmpty()) + return false; + if (accountList.Contains(userAccount)) + return true; + return false; + } + } + public int AppInsert(SysUser model, string password, string[] roleIds, string opearateUser) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + ////新增用户基本信息。 + model.Id = UUID.StrSnowId; + model.EnableFlag = "Y"; + model.DeleteFlag = "N"; + model.CreateUserId = opearateUser; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + model.Avatar = "/Content/framework/images/avatar.png"; + int row = db.Insertable(model).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + + //新增新的角色 + List list = new List(); + foreach (string roleId in roleIds) + { + SysUserRoleRelation roleRelation = new SysUserRoleRelation + { + Id = UUID.StrSnowId, + UserId = model.Id, + RoleId = roleId, + EnableFlag = "Y", + DeleteFlag = "N", + CreateUserId = opearateUser, + CreateTime = DateTime.Now, + ModifyUserId = opearateUser, + ModifyTime = DateTime.Now + }; + list.Add(roleRelation); + } + row = db.Insertable(list).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + //新增用户登陆信息。 + SysUserLogOn userLogOnEntity = new SysUserLogOn(); + userLogOnEntity.Id = UUID.StrSnowId; + userLogOnEntity.UserId = model.Id; + userLogOnEntity.SecretKey = userLogOnEntity.Id.DESEncrypt().Substring(0, 8); + userLogOnEntity.Password = password.DESEncrypt(userLogOnEntity.SecretKey).MD5Encrypt(); + userLogOnEntity.LoginCount = 0; + userLogOnEntity.IsOnLine = "0"; + userLogOnEntity.EnableFlag = "Y"; + userLogOnEntity.DeleteFlag = "N"; + userLogOnEntity.CreateUserId = opearateUser; + userLogOnEntity.CreateTime = DateTime.Now; + userLogOnEntity.ModifyUserId = userLogOnEntity.CreateUserId; + userLogOnEntity.ModifyTime = userLogOnEntity.CreateTime; + row = db.Insertable(userLogOnEntity).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + db.CommitTran(); + return row; + } + catch + { + db.RollbackTran(); + return 0; + } + } + } + + + /// + /// 根据主键得到用户信息 + /// + /// + /// + public SysUser Get(string primaryKey) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.Id == primaryKey) + .Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser).First(); + } + } + + /// + /// 获得用户列表分页 + /// + /// + /// + /// + /// + /// + public List GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount) + { + using (var db = GetInstance()) + { + ISugarQueryable queryable = db.Queryable().Where(it => it.DeleteFlag == "N"); + if (!keyWord.IsNullOrEmpty()) + { + queryable = queryable.Where(it => it.Account.Contains(keyWord) || it.RealName.Contains(keyWord)); + } + return queryable.OrderBy(it => it.SortCode) + .Includes(it => it.Organize) + .Includes(it => it.CreateUser) + .Includes(it => it.ModifyUser).ToPageList(pageIndex, pageSize, ref totalCount); + } + } + + + + /// + /// 删除用户信息 + /// + /// + /// + public int Delete(List primaryKeys) + { + using (var db = GetInstance()) + { + List list = db.Queryable().Where(it => primaryKeys.Contains(it.Id)).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + return db.Updateable(list).ExecuteCommand(); + } + } + + /// + /// 新增用户基础信息 + /// + /// + /// + public int Insert(SysUser model, string account) + { + using (var db = GetInstance()) + { + model.Id = UUID.StrSnowId; + model.DeleteFlag = "N"; + model.EnableFlag = "Y"; + + + model.CreateUserId = account; + model.CreateTime = DateTime.Now; + model.ModifyUserId = model.CreateUserId; + model.ModifyTime = model.CreateTime; + model.Avatar = "/Content/framework/images/avatar.png"; + return db.Insertable(model).ExecuteCommand(); + } + } + /// + /// 更新用户基础信息 + /// + /// + /// + public int Update(SysUser model, string account) + { + using (var db = GetInstance()) + { + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + + return db.Updateable(model).UpdateColumns(it => new + { + it.NickName, + it.RealName, + it.Birthday, + it.Gender, + it.Email, + it.DepartmentId, + it.RoleId, + it.MobilePhone, + it.Address, + it.Signature, + it.SortCode, + it.IsEnabled, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + } + } + + + + public int AppUpdateAndSetRole(SysUser model, string[] roleIds, string opereateUser) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + model.ModifyUserId = opereateUser; + model.ModifyTime = DateTime.Now; + int row = db.Updateable(model).UpdateColumns(it => new + { + it.NickName, + it.RealName, + it.Birthday, + it.Gender, + it.Email, + it.DepartmentId, + it.RoleId, + it.MobilePhone, + it.Address, + it.Signature, + it.SortCode, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + //删除原来的角色 + List list2 = db.Queryable().Where(it => it.UserId == model.Id && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + //新增新的角色 + List list = new List(); + foreach (string roleId in roleIds) + { + SysUserRoleRelation roleRelation = new SysUserRoleRelation + { + Id = UUID.StrSnowId, + UserId = model.Id, + RoleId = roleId, + DeleteFlag = "N", + EnableFlag = "Y", + CreateUserId = opereateUser, + CreateTime = DateTime.Now, + ModifyUserId = opereateUser, + ModifyTime = DateTime.Now + }; + list.Add(roleRelation); + } + row = db.Insertable(list).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + db.CommitTran(); + return row; + } + catch + { + db.RollbackTran(); + return 0; + } + } + } + + + public int UpdateAndSetRole(SysUser model, string account, string[] roleIds) + { + using (var db = GetInstance()) + { + try + { + db.BeginTran(); + model.ModifyUserId = account; + model.ModifyTime = DateTime.Now; + int row = db.Updateable(model).UpdateColumns(it => new + { + it.NickName, + it.RealName, + it.Birthday, + it.Gender, + it.Email, + it.DepartmentId, + it.RoleId, + it.MobilePhone, + it.Address, + it.Signature, + it.SortCode, + it.EnableFlag, + it.ModifyUserId, + it.ModifyTime + }).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + //删除原来的角色 + List list2 = db.Queryable().Where(it => it.UserId == model.Id && it.DeleteFlag == "N").ToList(); + list2.ForEach(it => { it.DeleteFlag = "Y"; }); + db.Updateable(list2).ExecuteCommand(); + //新增新的角色 + List list = new List(); + foreach (string roleId in roleIds) + { + SysUserRoleRelation roleRelation = new SysUserRoleRelation + { + Id = UUID.StrSnowId, + UserId = model.Id, + RoleId = roleId, + EnableFlag = "Y", + DeleteFlag = "N", + CreateUserId = account, + CreateTime = DateTime.Now, + ModifyTime = DateTime.Now, + ModifyUserId = account + }; + list.Add(roleRelation); + } + row = db.Insertable(list).ExecuteCommand(); + if (row == 0) + { + db.RollbackTran(); + return row; + } + db.CommitTran(); + return row; + } + catch + { + db.RollbackTran(); + return 0; + } + } + } + } +} diff --git a/DH.RBAC/Logic/Sys/SysUserRoleRelationLogic.cs b/DH.RBAC/Logic/Sys/SysUserRoleRelationLogic.cs new file mode 100644 index 0000000..d796984 --- /dev/null +++ b/DH.RBAC/Logic/Sys/SysUserRoleRelationLogic.cs @@ -0,0 +1,57 @@ +using DH.RBAC.Model.Sys; +using DH.RBAC.Logic.Base; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace DH.RBAC.Logic.Sys +{ + public class SysUserRoleRelationLogic : BaseLogic + { + /// + /// 删除用户角色关系 + /// + /// + /// + public int Delete(List userIds) + { + using (var db = GetInstance()) + { + List list = db.Queryable().Where(it => userIds.Contains(it.UserId)).ToList(); + list.ForEach(it => { it.DeleteFlag = "Y"; }); + return db.Updateable(list).ExecuteCommand(); + } + } + + /// + /// 根据ID得到用户角色关系 + /// + /// + /// + public List GetList(string userId) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => it.UserId == userId && it.DeleteFlag=="N").ToList(); + } + } + + /// + /// 从用户角色关系表中得到所有角色绑定信息 + /// + /// + /// + public List GetByRoles(List ids) + { + using (var db = GetInstance()) + { + return db.Queryable().Where(it => ids.Contains(it.RoleId) && it.DeleteFlag == "N").ToList(); + } + } + + } +} diff --git a/DH.RBAC/Models/Base/BaseModelEntity.cs b/DH.RBAC/Models/Base/BaseModelEntity.cs new file mode 100644 index 0000000..057c417 --- /dev/null +++ b/DH.RBAC/Models/Base/BaseModelEntity.cs @@ -0,0 +1,91 @@ +using AntdUI; +using DH.RBAC.Model.Sys; +using SqlSugar; +using System; +using System.Text.Json.Serialization; + +namespace DH.RBAC.Model +{ + public class BaseModelEntity: NotifyProperty + { + /// + /// 是否启用 + /// + [SugarColumn(ColumnName = "EnableFlag", ColumnDescription = "是否启用", IsNullable = true, Length = 1)] + public virtual string EnableFlag { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName = "DeleteFlag", ColumnDescription = "是否删除", IsNullable = true, Length = 1)] + public virtual string DeleteFlag { get; set; } + /// + /// 创建人 + /// + [SugarColumn(ColumnName = "CreateUserId", ColumnDescription = "创建人", IsNullable = true, Length = 255)] + public virtual string CreateUserId { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "CreateTime", ColumnDescription = "创建时间", IsNullable = true, Length = 3)] + public virtual DateTime? CreateTime { get; set; } + /// + /// 更新人 + /// + [SugarColumn(ColumnName = "ModifyUserId", ColumnDescription = "更新人", IsNullable = true, Length = 255)] + public virtual string ModifyUserId { get; set; } + /// + /// 更新时间 + /// + [SugarColumn(ColumnName = "ModifyTime", ColumnDescription = "更新时间", IsNullable = true, Length = 3)] + public virtual DateTime? ModifyTime { get; set; } + + /// + /// 创建人 + /// + [JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(CreateUserId), nameof(SysUser.Id))]//一对一 SchoolId是StudentA类里面的 + public SysUser CreateUser { get; set; } //不能赋值只能是null + /// + /// 更新人 + /// + [JsonIgnore] + [Navigate(NavigateType.OneToOne, nameof(ModifyUserId), nameof(SysUser.Id))]//一对一 SchoolId是StudentA类里面的 + public SysUser ModifyUser { get; set; } //不能赋值只能是null + + + [SugarColumn(IsIgnore = true)] + public string CreateUserName + { + get + { + return CreateUser == null ? "" : CreateUser.RealName; + } + } + [SugarColumn(IsIgnore = true)] + public string ModifyUserName + { + get + { + return ModifyUser == null ? "" : ModifyUser.RealName; + } + } + + [SugarColumn(IsIgnore = true)] + public bool IsDeleted + { + get + { + return DeleteFlag == "Y" ? true : false; + } + } + + [SugarColumn(IsIgnore = true)] + public bool IsEnabled + { + get + { + return EnableFlag == "Y" ? true : false; + } + } + } +} diff --git a/DH.RBAC/Models/Base/CodeGenerator.cs b/DH.RBAC/Models/Base/CodeGenerator.cs new file mode 100644 index 0000000..bb08898 --- /dev/null +++ b/DH.RBAC/Models/Base/CodeGenerator.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Base +{ + public class CodeGenerator + { + public string TableName { get; set; } + public string ColumnName { get; set; } + public string TypeName { get; set; } + public string TypeLength { get; set; } + public string IsPrimaryKey { get; set; } + public string ClassName { get; set; } + public string PropertyName { get; set; } + public string CSType { get; set; } + + public string Other { get; set; } + } +} diff --git a/DH.RBAC/Models/Base/MenuControlAttribute.cs b/DH.RBAC/Models/Base/MenuControlAttribute.cs new file mode 100644 index 0000000..ae2c16b --- /dev/null +++ b/DH.RBAC/Models/Base/MenuControlAttribute.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Models.Base +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class MenuControlAttribute : Attribute + { + public string ParentMenu { get; } // 父菜单名称(如 "相机设置") + public Type ConfigType { get; } // 配置类型(如 CameraBase) + + public MenuControlAttribute(string parentMenu) + { + ParentMenu = parentMenu; + } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/AuthorParms.cs b/DH.RBAC/Models/DTO/Parms/AuthorParms.cs new file mode 100644 index 0000000..ce213a2 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/AuthorParms.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class AuthorParms + { + public string roleId { get; set; } + public List perIds { get; set; } + + public string operater { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/FileUploadParms.cs b/DH.RBAC/Models/DTO/Parms/FileUploadParms.cs new file mode 100644 index 0000000..068518a --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/FileUploadParms.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class FileUploadParms + { + public byte[] file { get; set; } + public string fileName { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/ItemDetailIndexParms.cs b/DH.RBAC/Models/DTO/Parms/ItemDetailIndexParms.cs new file mode 100644 index 0000000..e160571 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/ItemDetailIndexParms.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class ItemDetailIndexParms + { + public int pageIndex { get; set; } + public int pageSize { get; set; } + + public string keyWord { get; set; } + public string itemId { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/KeyValue.cs b/DH.RBAC/Models/DTO/Parms/KeyValue.cs new file mode 100644 index 0000000..eead2c8 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/KeyValue.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class KeyValue + { + public string Name { get; set; } + public string Value { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/LogDeleteParms.cs b/DH.RBAC/Models/DTO/Parms/LogDeleteParms.cs new file mode 100644 index 0000000..87fe420 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/LogDeleteParms.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class LogDeleteParms + { + public string type { get; set; } + public string index { get; set; } + public string operateUser { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/LogIndexParms.cs b/DH.RBAC/Models/DTO/Parms/LogIndexParms.cs new file mode 100644 index 0000000..d5dcce6 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/LogIndexParms.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class LogIndexParms + { + public int pageIndex { get; set; } + public int pageSize { get; set; } + public string type { get; set; } + public string index { get; set; } + public string keyWord { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/LongPrimaryKeyParms.cs b/DH.RBAC/Models/DTO/Parms/LongPrimaryKeyParms.cs new file mode 100644 index 0000000..a9916dd --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/LongPrimaryKeyParms.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class LongPrimaryKeyParms + { + public string operaterId { get; set; } + public long primaryKey { get; set; } + + public string operateUser { get; set; } + public string userIds { get; set; } + public string roleId { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/ModifyPasswordParms.cs b/DH.RBAC/Models/DTO/Parms/ModifyPasswordParms.cs new file mode 100644 index 0000000..4e19f90 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/ModifyPasswordParms.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class ModifyPasswordParms + { + public string userId { get; set; } + public string oldPassword { get; set; } + public string newPassword { get; set; } + public string confirmPassword { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/RoleDeleteParms.cs b/DH.RBAC/Models/DTO/Parms/RoleDeleteParms.cs new file mode 100644 index 0000000..ec68f42 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/RoleDeleteParms.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class RoleDeleteParms + { + public List roleIdList { get; set; } + public string operateUser { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/SearchParms.cs b/DH.RBAC/Models/DTO/Parms/SearchParms.cs new file mode 100644 index 0000000..030af0b --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/SearchParms.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class SearchParms + { + public int pageIndex { get; set; } + public int pageSize { get; set; } + public string keyWord { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/StrPrimaryKeyParms.cs b/DH.RBAC/Models/DTO/Parms/StrPrimaryKeyParms.cs new file mode 100644 index 0000000..247fc10 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/StrPrimaryKeyParms.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class StrPrimaryKeyParms + { + public string operaterId { get; set; } + public string primaryKey { get; set; } + + public string operateUser { get; set; } + public string userIds { get; set; } + public string roleId { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/UserDeleteParms.cs b/DH.RBAC/Models/DTO/Parms/UserDeleteParms.cs new file mode 100644 index 0000000..210562d --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/UserDeleteParms.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class UserDeleteParms + { + public List userIdList { get; set; } + + public string currentUserId { get; set; } + public string operateUser { get; set; } + } +} diff --git a/DH.RBAC/Models/DTO/Parms/UserLoginParms.cs b/DH.RBAC/Models/DTO/Parms/UserLoginParms.cs new file mode 100644 index 0000000..05ad817 --- /dev/null +++ b/DH.RBAC/Models/DTO/Parms/UserLoginParms.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.DTO.Parms +{ + public class UserLoginParms + { + public string verifyCode { get; set; } + public string userName { get; set; } + public string password { get; set; } + } +} diff --git a/DH.RBAC/Models/Enum/ModuleType.cs b/DH.RBAC/Models/Enum/ModuleType.cs new file mode 100644 index 0000000..a8e065b --- /dev/null +++ b/DH.RBAC/Models/Enum/ModuleType.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +namespace DH.RBAC.Model.Enum +{ + /// + /// 权限类型。 + /// + public class ModuleType + { + /// + /// 主菜单。 + /// + public const int Menu = 2; + /// + /// 子菜单 + /// + public const int SubMenu = 0; + /// + /// 按钮。 + /// + public const int Button = 1; + + } +} diff --git a/DH.RBAC/Models/Sys/SysItem.cs b/DH.RBAC/Models/Sys/SysItem.cs new file mode 100644 index 0000000..a37625f --- /dev/null +++ b/DH.RBAC/Models/Sys/SysItem.cs @@ -0,0 +1,37 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_Item")] + public partial class SysItem : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "EnCode")] + public string EnCode { get; set; } + + [SugarColumn(ColumnName = "ParentId")] + public string ParentId { get; set; } + + [SugarColumn(ColumnName = "Name")] + public string Name { get; set; } + + [SugarColumn(ColumnName = "Layer")] + public int? Layer { get; set; } + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + [SugarColumn(ColumnName = "IsTree")] + public string IsTree { get; set; } + + [SugarColumn(ColumnName = "Remark")] + public string Remark { get; set; } + } +} diff --git a/DH.RBAC/Models/Sys/SysItemDetail.cs b/DH.RBAC/Models/Sys/SysItemDetail.cs new file mode 100644 index 0000000..4198932 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysItemDetail.cs @@ -0,0 +1,35 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_ItemsDetail")] + public partial class SysItemDetail : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "ItemId")] + public string ItemId { get; set; } + + [SugarColumn(ColumnName = "EnCode")] + public string EnCode { get; set; } + + [SugarColumn(ColumnName = "Name")] + public string Name { get; set; } + + + [SugarColumn(ColumnName = "IsDefault")] + public string IsDefault { get; set; } + + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + } + +} diff --git a/DH.RBAC/Models/Sys/SysLog.cs b/DH.RBAC/Models/Sys/SysLog.cs new file mode 100644 index 0000000..8ea9007 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysLog.cs @@ -0,0 +1,29 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + + [SugarTable("Sys_Log")] + public class SysLog : BaseModelEntity + { + [SugarColumn(IsPrimaryKey = true)] + public long Id { get; set; } + + [SugarColumn] + public string Type { get; set; } + + [SugarColumn] + public int ThreadId { get; set; } + + [SugarColumn] + public string Message { get; set; } + + [SugarColumn] + public DateTime CreateTime { get; set; } + } +} diff --git a/DH.RBAC/Models/Sys/SysOrganize.cs b/DH.RBAC/Models/Sys/SysOrganize.cs new file mode 100644 index 0000000..4a69d82 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysOrganize.cs @@ -0,0 +1,58 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_Organize")] + public partial class SysOrganize : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + + [SugarColumn(ColumnName = "ParentId")] + public string ParentId { get; set; } + + [SugarColumn(ColumnName = "Layer")] + public int? Layer { get; set; } + + [SugarColumn(ColumnName = "EnCode")] + public string EnCode { get; set; } + + [SugarColumn(ColumnName = "FullName")] + public string FullName { get; set; } + + [SugarColumn(ColumnName = "Type")] + public int? Type { get; set; } + + [SugarColumn(ColumnName = "ManagerId")] + public string ManagerId { get; set; } + + [SugarColumn(ColumnName = "TelePhone")] + public string TelePhone { get; set; } + + [SugarColumn(ColumnName = "WeChat")] + public string WeChat { get; set; } + + [SugarColumn(ColumnName = "Fax")] + public string Fax { get; set; } + + [SugarColumn(ColumnName = "Email")] + public string Email { get; set; } + + [SugarColumn(ColumnName = "Address")] + public string Address { get; set; } + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + + [SugarColumn(ColumnName = "Remark")] + public string Remark { get; set; } + + } +} diff --git a/DH.RBAC/Models/Sys/SysPermission.cs b/DH.RBAC/Models/Sys/SysPermission.cs new file mode 100644 index 0000000..421334c --- /dev/null +++ b/DH.RBAC/Models/Sys/SysPermission.cs @@ -0,0 +1,61 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + + [SugarTable("Sys_Permission")] + public partial class SysPermission : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + + [SugarColumn(ColumnName = "ParentId")] + public string ParentId { get; set; } + + [SugarColumn(ColumnName = "Layer")] + public int? Layer { get; set; } + + [SugarColumn(ColumnName = "EnCode")] + public string EnCode { get; set; } + + [SugarColumn(ColumnName = "Name")] + public string Name { get; set; } + + + [SugarColumn(ColumnName = "JsEvent")] + public string JsEvent { get; set; } + + [SugarColumn(ColumnName = "Icon")] + public string Icon { get; set; } + + [SugarColumn(ColumnName = "SymbolIndex")] + public int SymbolIndex { get; set; } + + + [SugarColumn(ColumnName = "Url")] + public string Url { get; set; } + + + [SugarColumn(ColumnName = "Remark")] + public string Remark { get; set; } + + [SugarColumn(ColumnName = "Type")] + public int? Type { get; set; } + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + [SugarColumn(ColumnName = "IsPublic")] + public string IsPublic { get; set; } + + [SugarColumn(ColumnName = "IsEdit")] + public string IsEdit { get; set; } + + } +} diff --git a/DH.RBAC/Models/Sys/SysRole.cs b/DH.RBAC/Models/Sys/SysRole.cs new file mode 100644 index 0000000..2d00341 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysRole.cs @@ -0,0 +1,55 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_Role")] + public partial class SysRole : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "OrganizeId")] + public string OrganizeId { get; set; } + + [SugarColumn(ColumnName = "EnCode")] + public string EnCode { get; set; } + + [SugarColumn(ColumnName = "Type")] + public int? Type { get; set; } + + [SugarColumn(ColumnName = "Name")] + public string Name { get; set; } + + + [SugarColumn(ColumnName = "AllowEdit")] + public string AllowEdit { get; set; } + + + [SugarColumn(ColumnName = "Remark")] + public string Remark { get; set; } + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + + [Navigate(NavigateType.OneToOne, nameof(OrganizeId), nameof(SysOrganize.Id))] + public SysOrganize Organize { get; set; } + + + [SugarColumn(IsIgnore = true)] + public string DeptName + { + get + { + if (Organize == null) + return ""; + return Organize.FullName; + } + } + } +} diff --git a/DH.RBAC/Models/Sys/SysRoleAuthorize.cs b/DH.RBAC/Models/Sys/SysRoleAuthorize.cs new file mode 100644 index 0000000..a04b31d --- /dev/null +++ b/DH.RBAC/Models/Sys/SysRoleAuthorize.cs @@ -0,0 +1,29 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_RoleAuthorize")] + public partial class SysRoleAuthorize : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + + public string Id { get; set; } + + + [SugarColumn(ColumnName = "RoleId")] + public string RoleId { get; set; } + + + [SugarColumn(ColumnName = "ModuleId")] + public string ModuleId { get; set; } + + + + } + +} diff --git a/DH.RBAC/Models/Sys/SysUser.cs b/DH.RBAC/Models/Sys/SysUser.cs new file mode 100644 index 0000000..4ef36cf --- /dev/null +++ b/DH.RBAC/Models/Sys/SysUser.cs @@ -0,0 +1,115 @@ + +using DH.RBAC.Utility.Extension; +using DH.RBAC.Utility.Other; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.IO; +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_User")] + public partial class SysUser : BaseModelEntity + { + private SysOrganize organize; + + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "Account")] + public string Account { get; set; } + + [SugarColumn(ColumnName = "RealName")] + public string RealName { get; set; } + + [SugarColumn(ColumnName = "NickName")] + public string NickName { get; set; } + + [SugarColumn(ColumnName = "Avatar")] + public string Avatar { get; set; } + + [SugarColumn(IsIgnore = true)] + public string AvatarBase64 + { + get + { + if (Avatar.IsNullOrEmpty()) + return ""; + string filePath = MyEnvironment.RootPath("wwwroot" + Avatar); + if (!File.Exists(filePath)) + { + return ""; + } + return filePath; + } + } + + + [SugarColumn(ColumnName = "Gender")] + public string Gender { get; set; } + + [SugarColumn(IsIgnore = true)] + public string GenderStr + { + get + { + return Gender == "1" ? "男" : "女"; + } + } + + [SugarColumn(ColumnName = "Birthday")] + public DateTime? Birthday { get; set; } + + [SugarColumn(ColumnName = "MobilePhone")] + public string MobilePhone { get; set; } + + + [SugarColumn(ColumnName = "Email")] + public string Email { get; set; } + + [SugarColumn(ColumnName = "Signature")] + public string Signature { get; set; } + + + [SugarColumn(ColumnName = "Address")] + public string Address { get; set; } + + + [SugarColumn(ColumnName = "CompanyId")] + public string CompanyId { get; set; } + + + [SugarColumn(ColumnName = "SortCode")] + public int? SortCode { get; set; } + + [SugarColumn(ColumnName = "DepartmentId")] + public string DepartmentId { get; set; } + + + [Navigate(NavigateType.OneToOne, nameof(DepartmentId), nameof(SysOrganize.Id))] + public SysOrganize Organize { get; set; } + + [SugarColumn(IsIgnore = true)] + public string DeptName + { + get + { + if (Organize == null) + return ""; + return Organize.FullName; + } + } + + [SugarColumn(IsIgnore = true)] + public string StrBirthday { get; set; } + + [SugarColumn(IsIgnore = true)] + public List RoleId { set; get; } + + + [SugarColumn(IsIgnore = true)] + public string password { set; get; } + [SugarColumn(IsIgnore = true)] + public string roleIds { set; get; } + + } +} diff --git a/DH.RBAC/Models/Sys/SysUserLogOn.cs b/DH.RBAC/Models/Sys/SysUserLogOn.cs new file mode 100644 index 0000000..92a9eb9 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysUserLogOn.cs @@ -0,0 +1,60 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + [SugarTable("Sys_UserLogOn")] + public partial class SysUserLogOn : BaseModelEntity + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "UserId")] + public string UserId { get; set; } + + [SugarColumn(ColumnName = "Password")] + public string Password { get; set; } + + [SugarColumn(ColumnName = "SecretKey")] + public string SecretKey { get; set; } + + [SugarColumn(ColumnName = "PrevVisitTime")] + public DateTime? PrevVisitTime { get; set; } + + [SugarColumn(ColumnName = "LastVisitTime")] + public DateTime? LastVisitTime { get; set; } + + [SugarColumn(ColumnName = "ChangePwdTime")] + public DateTime? ChangePwdTime { get; set; } + + [SugarColumn(ColumnName = "LoginCount")] + public int LoginCount { get; set; } + + [SugarColumn(ColumnName = "AllowMultiUserOnline")] + public string AllowMultiUserOnline { get; set; } + + + [SugarColumn(ColumnName = "IsOnLine")] + public string IsOnLine { get; set; } + + [SugarColumn(ColumnName = "Question")] + public string Question { get; set; } + + [SugarColumn(ColumnName = "AnswerQuestion")] + public string AnswerQuestion { get; set; } + + [SugarColumn(ColumnName = "CheckIPAddress")] + public string CheckIPAddress { get; set; } + + [SugarColumn(ColumnName = "Language")] + public string Language { get; set; } + + [SugarColumn(ColumnName = "Theme")] + public string Theme { get; set; } + + } +} diff --git a/DH.RBAC/Models/Sys/SysUserRoleRelation.cs b/DH.RBAC/Models/Sys/SysUserRoleRelation.cs new file mode 100644 index 0000000..de19a77 --- /dev/null +++ b/DH.RBAC/Models/Sys/SysUserRoleRelation.cs @@ -0,0 +1,26 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Model.Sys +{ + + [SugarTable("Sys_UserRoleRelation")] + public partial class SysUserRoleRelation : BaseModelEntity + { + + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public string Id { get; set; } + + [SugarColumn(ColumnName = "UserId")] + public string UserId { get; set; } + + + [SugarColumn(ColumnName = "RoleId")] + public string RoleId { get; set; } + + } +} diff --git a/DH.RBAC/Properties/Resources.Designer.cs b/DH.RBAC/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1dd8dfc --- /dev/null +++ b/DH.RBAC/Properties/Resources.Designer.cs @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace DH.RBAC.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(" DH.RBAC.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap avatar { + get { + object obj = ResourceManager.GetObject("avatar", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap back { + get { + object obj = ResourceManager.GetObject("back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap background { + get { + object obj = ResourceManager.GetObject("background", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap login_back { + get { + object obj = ResourceManager.GetObject("login_back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap logo { + get { + object obj = ResourceManager.GetObject("logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap logo2 { + get { + object obj = ResourceManager.GetObject("logo2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap menu01 { + get { + object obj = ResourceManager.GetObject("menu01", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap menu02 { + get { + object obj = ResourceManager.GetObject("menu02", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap menu03 { + get { + object obj = ResourceManager.GetObject("menu03", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/DH.RBAC/Properties/Resources.resx b/DH.RBAC/Properties/Resources.resx new file mode 100644 index 0000000..8bd1b69 --- /dev/null +++ b/DH.RBAC/Properties/Resources.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 + + + + ..\Resources\login_back.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\back.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\logo2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\background.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\menu02.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\avatar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\menu01.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\menu03.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/DH.RBAC/RBACWindow.Designer.cs b/DH.RBAC/RBACWindow.Designer.cs new file mode 100644 index 0000000..f628285 --- /dev/null +++ b/DH.RBAC/RBACWindow.Designer.cs @@ -0,0 +1,114 @@ +namespace DH.RBAC +{ + partial class RBACWindow + { + /// + /// 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() + { + AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard(); + titlebar = new AntdUI.PageHeader(); + lbName = new AntdUI.Label(); + menu1 = new AntdUI.Menu(); + tabs1 = new AntdUI.Tabs(); + titlebar.SuspendLayout(); + SuspendLayout(); + // + // titlebar + // + titlebar.BackColor = System.Drawing.Color.FromArgb(46, 108, 227); + titlebar.Controls.Add(lbName); + titlebar.DividerShow = true; + titlebar.DividerThickness = 0F; + titlebar.Dock = System.Windows.Forms.DockStyle.Top; + titlebar.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + titlebar.ForeColor = System.Drawing.Color.White; + titlebar.Location = new System.Drawing.Point(0, 0); + titlebar.Mode = AntdUI.TAMode.Dark; + titlebar.Name = "titlebar"; + titlebar.ShowButton = true; + titlebar.ShowIcon = true; + titlebar.Size = new System.Drawing.Size(923, 40); + titlebar.SubText = "CCD光学筛选系统后台"; + titlebar.TabIndex = 1; + titlebar.Text = "山东迭慧智能科技有限公司"; + // + // lbName + // + lbName.Dock = System.Windows.Forms.DockStyle.Right; + lbName.ForeColor = System.Drawing.SystemColors.Window; + lbName.Location = new System.Drawing.Point(645, 0); + lbName.Name = "lbName"; + lbName.Size = new System.Drawing.Size(134, 40); + lbName.TabIndex = 0; + lbName.Text = ""; + lbName.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // menu1 + // + menu1.Dock = System.Windows.Forms.DockStyle.Left; + menu1.Location = new System.Drawing.Point(0, 40); + menu1.Name = "menu1"; + menu1.Size = new System.Drawing.Size(169, 504); + menu1.TabIndex = 2; + menu1.Text = "menu1"; + // + // tabs1 + // + tabs1.BackColor = System.Drawing.SystemColors.Window; + tabs1.Dock = System.Windows.Forms.DockStyle.Fill; + tabs1.Location = new System.Drawing.Point(169, 40); + tabs1.Name = "tabs1"; + tabs1.Size = new System.Drawing.Size(754, 504); + styleCard1.Closable = true; + tabs1.Style = styleCard1; + tabs1.TabIndex = 6; + tabs1.Text = "tabs1"; + tabs1.Type = AntdUI.TabType.Card; + // + // RBACWindow + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(923, 544); + Controls.Add(tabs1); + Controls.Add(menu1); + Controls.Add(titlebar); + Name = "RBACWindow"; + StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + Text = "RBACWindow"; + WindowState = System.Windows.Forms.FormWindowState.Maximized; + titlebar.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.PageHeader titlebar; + private AntdUI.Label lbName; + private AntdUI.Menu menu1; + private AntdUI.Tabs tabs1; + } +} \ No newline at end of file diff --git a/DH.RBAC/RBACWindow.cs b/DH.RBAC/RBACWindow.cs new file mode 100644 index 0000000..3aeaa33 --- /dev/null +++ b/DH.RBAC/RBACWindow.cs @@ -0,0 +1,204 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using AntdUI; +using DH.RBAC.Common; +using DH.RBAC.Logic.Sys; +using DH.RBAC.Model.Sys; +using DH.RBAC.Models.Base; +using DH.RBAC.Page; +using Sunny.UI; + + + +namespace DH.RBAC +{ + public partial class RBACWindow : Window + { + private SysUserLogic userLogic; + private SysPermissionLogic permissionLogic; + private List pageList = new List(); + public RBACWindow() + { + InitializeComponent(); + userLogic = new SysUserLogic(); + permissionLogic = new SysPermissionLogic(); + Load += RBACWindow_Load; + menu1.SelectChanged += Menu1_SelectChanged; + } + + /// + /// 窗体对象实例 + /// + private static RBACWindow _instance; + + public static RBACWindow Instance + { + get + { + if (_instance == null || _instance.IsDisposed) + _instance = new RBACWindow(); + return _instance; + } + } + + private void RBACWindow_Load(object sender, EventArgs e) + { + lbName.Text = GlobalConfig.CurrentUser.Account; + //设置关联 + //Aside.TabControl = MainTabControl; + //获得用户权限 + List list; + if (userLogic.ContainsUser("admin", GlobalConfig.CurrentUser.Id)) + { + list = permissionLogic.GetList(); + } + else + { + list = permissionLogic.GetList(GlobalConfig.CurrentUser.Id); + } + if (list.IsNullOrEmpty()) + { + AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); + + return; + } + GlobalConfig.PermissionList = list; + + //取出一级菜单 + List root = list.Where(it => it.ParentId == "0").ToList(); + foreach (SysPermission permission in root) + { + MenuItem menuItem=new MenuItem(); + menuItem.Text = permission.Name; + menu1.Items.Add(menuItem); + + List childList = list.Where(it => it.ParentId == permission.Id).ToList(); + + foreach (SysPermission child in childList) + { + MenuItem childmenuItem = new MenuItem(); + childmenuItem.Text = child.Name; + childmenuItem.ID = child.EnCode; + childmenuItem.Tag=child.Id.ToString(); + menuItem.Sub.Add(childmenuItem); + + } + } + } + + + + private void Menu1_SelectChanged(object sender, MenuSelectEventArgs e) + { + var clickedItem = e.Value as MenuItem; + + + + + if (clickedItem?.ID == null) return; + + string pageCode = clickedItem.ID; // 获取PageCode(如"sys-user") + string menuText = clickedItem.Text; + string permissionId= clickedItem.Tag.ToString(); + // 查找是否已存在对应的TabPage + var existingTab = FindTabByPageCode(pageCode); + if (existingTab != null) + { + tabs1.SelectedTab = existingTab; + return; + } + + // 动态创建控件并添加TabPage + MyPage control = CreateControlByPageCode(pageCode); + try + { + + + control.ButtonPermissionList = GlobalConfig.PermissionList.Where(it => it.ParentId == permissionId).ToList(); + } + catch + { + + } + if (control == null) + { + AntdUI.Message.warn(this, "该菜单仅权限配置,无显示页面!", autoClose: 3); + + return; + } + + AddNewTab(control, menuText, pageCode); + + } + private MyPage CreateControlByPageCode(string pageCode) + { + Type controlType = FindControlTypeByPageCode(pageCode); + if (controlType == null) return null; + + try + { + // 获取接受 Form 参数的构造函数 + var constructor = controlType.GetConstructor(new[] { typeof(Window) }); + if (constructor != null) + { + return constructor.Invoke(new object[] { this }) as MyPage; // 传递当前窗体实例 + } + else + { + // 如果未找到带 Form 参数的构造函数,尝试无参构造 + return Activator.CreateInstance(controlType) as MyPage; + } + } + catch (Exception ex) + { + MessageBox.Show($"创建页面失败: {ex.Message}"); + return null; + } + } + private Type FindControlTypeByPageCode(string pageCode) + { + // 反射查找所有带有PageCodeAttribute的UserControl类型 + var controlTypes = Assembly.GetExecutingAssembly().GetTypes() + .Where(t => t.IsSubclassOf(typeof(UserControl)) && !t.IsAbstract); + + foreach (var type in controlTypes) + { + var attr = type.GetCustomAttribute(); + if (attr != null && attr.Encode == pageCode) + { + return type; + } + } + return null; + } + private void AddNewTab(UserControl control, string menuText, string pageCode) + { + AntdUI.TabPage tabPage = new AntdUI.TabPage + { + Text = menuText, + Tag = pageCode, // 可选:存储PageCode用于后续查找 + ReadOnly = false + }; + control.Dock = DockStyle.Fill; + AutoDpi(control); // DPI适配(如果有) + tabPage.Controls.Add(control); + tabs1.Pages.Add(tabPage); + tabs1.SelectedTab = tabPage; + } + + private AntdUI.TabPage FindTabByPageCode(string pageCode) + { + return tabs1.Pages.OfType() + .FirstOrDefault(t => t.Tag?.ToString() == pageCode); + } + + } +} diff --git a/DHSoftware/Views/PreTreatUserControl.resx b/DH.RBAC/RBACWindow.resx similarity index 100% rename from DHSoftware/Views/PreTreatUserControl.resx rename to DH.RBAC/RBACWindow.resx diff --git a/DH.RBAC/Resources/avatar.png b/DH.RBAC/Resources/avatar.png new file mode 100644 index 0000000..ff44688 Binary files /dev/null and b/DH.RBAC/Resources/avatar.png differ diff --git a/DH.RBAC/Resources/back.png b/DH.RBAC/Resources/back.png new file mode 100644 index 0000000..7ee52a2 Binary files /dev/null and b/DH.RBAC/Resources/back.png differ diff --git a/DH.RBAC/Resources/background.png b/DH.RBAC/Resources/background.png new file mode 100644 index 0000000..97cc213 Binary files /dev/null and b/DH.RBAC/Resources/background.png differ diff --git a/DH.RBAC/Resources/login_back.jpg b/DH.RBAC/Resources/login_back.jpg new file mode 100644 index 0000000..818a724 Binary files /dev/null and b/DH.RBAC/Resources/login_back.jpg differ diff --git a/DH.RBAC/Resources/logo.png b/DH.RBAC/Resources/logo.png new file mode 100644 index 0000000..afb8504 Binary files /dev/null and b/DH.RBAC/Resources/logo.png differ diff --git a/DH.RBAC/Resources/logo2.png b/DH.RBAC/Resources/logo2.png new file mode 100644 index 0000000..458247d Binary files /dev/null and b/DH.RBAC/Resources/logo2.png differ diff --git a/DH.RBAC/Resources/menu01.png b/DH.RBAC/Resources/menu01.png new file mode 100644 index 0000000..8753ae9 Binary files /dev/null and b/DH.RBAC/Resources/menu01.png differ diff --git a/DH.RBAC/Resources/menu02.png b/DH.RBAC/Resources/menu02.png new file mode 100644 index 0000000..8ff3225 Binary files /dev/null and b/DH.RBAC/Resources/menu02.png differ diff --git a/DH.RBAC/Resources/menu03.png b/DH.RBAC/Resources/menu03.png new file mode 100644 index 0000000..031a2fc Binary files /dev/null and b/DH.RBAC/Resources/menu03.png differ diff --git a/DH.RBAC/UserControls/AccountControl.Designer.cs b/DH.RBAC/UserControls/AccountControl.Designer.cs new file mode 100644 index 0000000..741e0f2 --- /dev/null +++ b/DH.RBAC/UserControls/AccountControl.Designer.cs @@ -0,0 +1,87 @@ +namespace DH.RBAC.UserControls +{ + partial class AccountControl + { + /// + /// 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() + { + this.userAvatar = new Sunny.UI.UIAvatar(); + this.lblUserName = new Sunny.UI.UILabel(); + this.SuspendLayout(); + // + // userAvatar + // + this.userAvatar.Dock = System.Windows.Forms.DockStyle.Left; + this.userAvatar.FillColor = System.Drawing.Color.Transparent; + this.userAvatar.Font = new System.Drawing.Font("微软雅黑", 12F); + this.userAvatar.ForeColor = System.Drawing.Color.White; + this.userAvatar.Location = new System.Drawing.Point(0, 0); + this.userAvatar.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.userAvatar.MinimumSize = new System.Drawing.Size(1, 1); + this.userAvatar.Name = "userAvatar"; + this.userAvatar.Size = new System.Drawing.Size(55, 60); + this.userAvatar.Style = Sunny.UI.UIStyle.Custom; + this.userAvatar.TabIndex = 2; + this.userAvatar.Click += new System.EventHandler(this.userAvatar_Click); + this.userAvatar.MouseEnter += new System.EventHandler(this.lblUserName_MouseEnter); + this.userAvatar.MouseLeave += new System.EventHandler(this.userAvatar_Leave); + // + // lblUserName + // + this.lblUserName.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblUserName.Font = new System.Drawing.Font("微软雅黑", 12F); + this.lblUserName.ForeColor = System.Drawing.Color.White; + this.lblUserName.Location = new System.Drawing.Point(55, 0); + this.lblUserName.Name = "lblUserName"; + this.lblUserName.Size = new System.Drawing.Size(122, 60); + this.lblUserName.Style = Sunny.UI.UIStyle.Custom; + this.lblUserName.TabIndex = 4; + this.lblUserName.Text = "Admin"; + this.lblUserName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblUserName.Click += new System.EventHandler(this.userAvatar_Click); + this.lblUserName.MouseEnter += new System.EventHandler(this.lblUserName_MouseEnter); + this.lblUserName.MouseLeave += new System.EventHandler(this.userAvatar_Leave); + // + // AccountControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Gray; + this.Controls.Add(this.lblUserName); + this.Controls.Add(this.userAvatar); + this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.Name = "AccountControl"; + this.Size = new System.Drawing.Size(177, 60); + this.Load += new System.EventHandler(this.AccountControl_Load); + this.ResumeLayout(false); + + } + + #endregion + private Sunny.UI.UIAvatar userAvatar; + private Sunny.UI.UILabel lblUserName; + } +} \ No newline at end of file diff --git a/DH.RBAC/UserControls/AccountControl.cs b/DH.RBAC/UserControls/AccountControl.cs new file mode 100644 index 0000000..c17d560 --- /dev/null +++ b/DH.RBAC/UserControls/AccountControl.cs @@ -0,0 +1,75 @@ +using DH.RBAC.Common; +using DH.RBAC.UserControls.Menus; +using PopupTool; +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 DH.RBAC.UserControls +{ + /// + /// 用户自定义控件,弹出层显示 + /// + public partial class AccountControl : UserControl + { + public AccountControl() + { + InitializeComponent(); + } + + /// + /// 界面加载时,显示信息 + /// + /// + /// + private void AccountControl_Load(object sender, EventArgs e) + { + lblUserName.Text = GlobalConfig.CurrentUser.NickName; + if (GlobalConfig.Avatar != null) + { + userAvatar.Icon = Sunny.UI.UIAvatar.UIIcon.Image; + userAvatar.Image = GlobalConfig.Avatar; + } + } + /// + /// 鼠标放上去改变颜色 + /// + /// + /// + private void lblUserName_MouseEnter(object sender, EventArgs e) + { + userAvatar.BackColor = Color.FromArgb(176, 176, 176); + lblUserName.BackColor = Color.FromArgb(176, 176, 176); + } + /// + /// 鼠标离开时,颜色改回来 + /// + /// + /// + private void userAvatar_Leave(object sender, EventArgs e) + { + userAvatar.BackColor = Color.Gray; + lblUserName.BackColor = Color.Gray; + } + + /// + /// 点下去后显示弹出层 + /// + /// + /// + private void userAvatar_Click(object sender, EventArgs e) + { + UserMenuPanel uc = new UserMenuPanel(); + Popup pop = new Popup(uc); + pop.Show(this); + } + + + } +} diff --git a/DH.RBAC/UserControls/AccountControl.resx b/DH.RBAC/UserControls/AccountControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DH.RBAC/UserControls/AccountControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DH.RBAC/UserControls/Menus/UserMenuPanel.cs b/DH.RBAC/UserControls/Menus/UserMenuPanel.cs new file mode 100644 index 0000000..65c6682 --- /dev/null +++ b/DH.RBAC/UserControls/Menus/UserMenuPanel.cs @@ -0,0 +1,121 @@ + +using DH.RBAC; +using DH.RBAC.Utility.Other; +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DH.RBAC.UserControls.Menus +{ + public class UserMenuPanel : UIPanel + { + public UserMenuPanel() + { + UISymbolLabel lblAccountManage = new UISymbolLabel(); + lblAccountManage.ForeColor = Color.FromArgb(153, 153, 153); + + lblAccountManage.Location = new Point(7, 7); + lblAccountManage.MinimumSize = new Size(1, 1); + lblAccountManage.Padding = new System.Windows.Forms.Padding(32, 0, 0, 0); + lblAccountManage.Size = new Size(122, 44); + lblAccountManage.Style = UIStyle.Custom; + lblAccountManage.StyleCustomMode = true; + lblAccountManage.Symbol = 61508; + lblAccountManage.SymbolColor = Color.FromArgb(153, 153, 153); + lblAccountManage.SymbolSize = 28; + lblAccountManage.Text = "账户管理"; + lblAccountManage.Click += new EventHandler(this.lblAccountManage_Click); + lblAccountManage.MouseEnter += new EventHandler(this.uiSymbolLabel1_MouseEnter); + lblAccountManage.MouseLeave += new EventHandler(this.uiSymbolLabel1_MouseLeave); + + + UISymbolLabel lblExit = new UISymbolLabel(); + lblExit.ForeColor = Color.FromArgb(153, 153, 153); + + lblExit.Location = new Point(6, 62); + lblExit.Padding = new System.Windows.Forms.Padding(32, 0, 0, 0); + lblExit.Size = new Size(122, 44); + lblExit.Style = UIStyle.Custom; + lblExit.StyleCustomMode = true; + lblExit.Symbol = 61584; + lblExit.SymbolColor = Color.FromArgb(153, 153, 153); + lblExit.SymbolSize = 28; + lblExit.TabIndex = 15; + lblExit.Text = "安全退出"; + lblExit.Click += new EventHandler(this.lblExit_Click); + lblExit.MouseEnter += new EventHandler(this.uiSymbolLabel1_MouseEnter); + lblExit.MouseLeave += new EventHandler(this.uiSymbolLabel1_MouseLeave); + + this.Style = UIStyle.Custom; + this.StyleCustomMode = true; + this.Size = new Size(134, 114); + this.BackColor = Color.White; + this.FillColor = Color.White; + this.RectColor = Color.Silver; + this.Controls.Add(lblExit); + this.Controls.Add(lblAccountManage); + } + + /// + /// 账户管理点击事件处理 + /// + /// + /// + private void lblAccountManage_Click(object sender, EventArgs e) + { + FormHelper.ShowSubForm(new AccountForm()); + } + + + /// + /// 鼠标进入按钮后,改变颜色 + /// + /// + /// + private void uiSymbolLabel1_MouseEnter(object sender, EventArgs e) + { + UISymbolLabel label = sender as UISymbolLabel; + label.BackColor = Color.FromArgb(244, 244, 244); + label.ForeColor = Color.FromArgb(181, 181, 181); + label.SymbolColor = Color.FromArgb(181, 181, 181); + } + + /// + /// 鼠标离开按钮后,颜色改回来 + /// + /// + /// + private void uiSymbolLabel1_MouseLeave(object sender, EventArgs e) + { + UISymbolLabel label = sender as UISymbolLabel; + label.BackColor = Color.Transparent; + label.ForeColor = Color.FromArgb(153, 153, 153); + label.SymbolColor = Color.FromArgb(153, 153, 153); + } + + + /// + /// 安全退出 + /// + /// + /// + private void lblExit_Click(object sender, EventArgs e) + { + //自己关闭,重新打开自己 + new Thread(() => + { + string fileName = Process.GetCurrentProcess().MainModule.FileName; + ProcessStartInfo processStartInfo = new ProcessStartInfo(fileName); + new Process { StartInfo = processStartInfo }.Start(); + }).Start(); + Thread.Sleep(100); + Environment.Exit(0); + } + } +} diff --git a/DH.RBAC/UserControls/Menus/UserMenuPanel.resx b/DH.RBAC/UserControls/Menus/UserMenuPanel.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DH.RBAC/UserControls/Menus/UserMenuPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DH.RBAC/UserControls/ProgressForm.Designer.cs b/DH.RBAC/UserControls/ProgressForm.Designer.cs new file mode 100644 index 0000000..da0c0e5 --- /dev/null +++ b/DH.RBAC/UserControls/ProgressForm.Designer.cs @@ -0,0 +1,69 @@ +namespace DH.RBAC.UserControls +{ + partial class ProgressForm + { + /// + /// 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() + { + this.uiProcessBar1 = new Sunny.UI.UIProcessBar(); + this.SuspendLayout(); + // + // uiProcessBar1 + // + this.uiProcessBar1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiProcessBar1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiProcessBar1.Location = new System.Drawing.Point(0, 0); + this.uiProcessBar1.MinimumSize = new System.Drawing.Size(70, 3); + this.uiProcessBar1.Name = "uiProcessBar1"; + this.uiProcessBar1.Size = new System.Drawing.Size(704, 41); + this.uiProcessBar1.TabIndex = 0; + this.uiProcessBar1.Text = "uiProcessBar1"; + // + // ProgressForm + // + this.AllowShowTitle = false; + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(704, 41); + this.ControlBox = false; + this.Controls.Add(this.uiProcessBar1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Movable = false; + this.Name = "ProgressForm"; + this.Padding = new System.Windows.Forms.Padding(0); + this.ShowTitle = false; + this.Text = "下载进度"; + this.TopMost = true; + this.ResumeLayout(false); + + } + + #endregion + + private Sunny.UI.UIProcessBar uiProcessBar1; + } +} \ No newline at end of file diff --git a/DH.RBAC/UserControls/ProgressForm.cs b/DH.RBAC/UserControls/ProgressForm.cs new file mode 100644 index 0000000..4582a6f --- /dev/null +++ b/DH.RBAC/UserControls/ProgressForm.cs @@ -0,0 +1,132 @@ +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Security; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using DH.RBAC.Utility.Other; +namespace DH.RBAC.UserControls +{ + public partial class ProgressForm : UIForm + { + public delegate void EndEventHandler(object sender); + public event EndEventHandler EndHandler; + + + public delegate void ErrorEventHandler(object sender, Exception ex); + public event ErrorEventHandler ErrorHandler; + public ProgressForm() + { + InitializeComponent(); + CloseForm = new CloseFormDelegate(() => + { + this.Close(); + }); + } + + public void SetValue(int value) + { + uiProcessBar1.InvokeProgressValue(value); + } + + public delegate void CloseFormDelegate(); + public CloseFormDelegate CloseForm; + + public string FileName { get; internal set; } + + public void Download(string method, string url, Dictionary parms) + { + Thread thread = new Thread(() => + { + try + { + if (string.IsNullOrEmpty(url)) + { + throw new ArgumentNullException("url"); + } + HttpWebRequest request = null; + //如果是发送HTTPS请求 + if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + { + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; }); + request = WebRequest.Create(url) as HttpWebRequest; + request.ProtocolVersion = HttpVersion.Version10; + } + else + { + request = WebRequest.Create(url) as HttpWebRequest; + } + + //request.CookieContainer = m_Cookie; + request.Method = method; + request.ContentType = "application/x-www-form-urlencoded"; + + request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; + // 设置参数 + + //如果需要POST数据 + if (!(parms == null || parms.Count == 0)) + { + StringBuilder buffer = new StringBuilder(); + int i = 0; + foreach (string key in parms.Keys) + { + if (i > 0) + { + buffer.AppendFormat("&{0}={1}", key, parms[key]); + } + else + { + buffer.AppendFormat("{0}={1}", key, parms[key]); + } + i++; + } + byte[] data = Encoding.UTF8.GetBytes(buffer.ToString()); + using (Stream stream1 = request.GetRequestStream()) + { + stream1.Write(data, 0, data.Length); + } + } + //发送请求并获取相应回应数据 + HttpWebResponse response = request.GetResponse() as HttpWebResponse; + //直到request.GetResponse()程序才开始向目标网页发送Post请求 + Stream responseStream = response.GetResponseStream(); + + long totalLenght = response.ContentLength; + //StartHandler?.Invoke(this, totalLenght); + + long current = 0; + //创建写入流 + FileStream pFileStream = new FileStream(FileName, FileMode.OpenOrCreate); + byte[] bArr = new byte[10240]; + int size = responseStream.Read(bArr, 0, (int)bArr.Length); + while (size > 0) + { + current += size; + uiProcessBar1.InvokeProgressValue((int)((current * 1.0 / totalLenght) * 100)); + pFileStream.Write(bArr, 0, size); + size = responseStream.Read(bArr, 0, (int)bArr.Length); + } + responseStream.Close(); + pFileStream.Close(); + this.Invoke(CloseForm, null); + EndHandler?.Invoke(this); + } + catch (Exception ex) + { + this.Invoke(CloseForm, null); + ErrorHandler?.Invoke(this, ex); + } + }); + thread.Start(); + } + } +} diff --git a/DH.RBAC/UserControls/ProgressForm.resx b/DH.RBAC/UserControls/ProgressForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DH.RBAC/UserControls/ProgressForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DH.RBAC/Utility/Extension/ExtMethods.cs b/DH.RBAC/Utility/Extension/ExtMethods.cs new file mode 100644 index 0000000..b028016 --- /dev/null +++ b/DH.RBAC/Utility/Extension/ExtMethods.cs @@ -0,0 +1,322 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SqlSugar; + +namespace DH.RBAC.Utility.Extension +{ + public class ExtMethods + { + public static List GetExpMethods + { + get + { + var expMethods = new List(); + //abs + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Abs", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("ABS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("ABS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("abs({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("ABS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("ABS({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //sin + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Sin", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("SIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("SIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("sin({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("SIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("SIN({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //cos + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Cos", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("COS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("COS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("cos({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("COS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("COS({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //asin + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Asin", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("ASIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("ASIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("asin({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("ASIN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("ASIN({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //acos + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Acos", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("ACOS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("ACOS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("acos({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("ACOS({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("ACOS({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //tan + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Tan", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("TAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("TAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("tan({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("TAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("TAN({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //atan + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Atan", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("ATAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("ATAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("atan({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("ATAN({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("ATAN({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //atan2 + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Atan2", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("ATAN2({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("ATAN({0}/{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("atan2({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("ATAN2({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("ATAN2({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + //pow + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Pow", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("POW({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("POWER({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("power({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("POWER({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("POWER({0},{1})", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + //sqrt + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Sqrt", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("SQRT({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("SQRT({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("sqrt({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("SQRT({0})", expInfo.Args[0].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("SQRT({0})", expInfo.Args[0].MemberName); + else + throw new Exception("未实现"); + } + }); + //GetDistance + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "GetDistance", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("((6378.138 * 2 * ASIN(POW(SIN(({0} * PI() / 180 - {2} * PI() / 180) / 2), 2) + COS({0} * PI() / 180) * COS({2} * PI() / 180) * POW(SIN(({1} * PI() / 180 - {3} * PI() / 180) / 2), 2))) * 1000)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName, expInfo.Args[2].MemberName, expInfo.Args[3].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("((6378.138 * 2 * ASIN(POWER(SIN(({0} * PI() / 180 - {2} * PI() / 180) / 2), 2) + COS({0} * PI() / 180) * COS({2} * PI() / 180) * POWER(SIN(({1} * PI() / 180 - {3} * PI() / 180) / 2), 2))) * 1000)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName, expInfo.Args[2].MemberName, expInfo.Args[3].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("((6378.138 * 2 * ASIN(POWER(SIN(({0} * PI() / 180 - {2} * PI() / 180) / 2), 2) + COS({0} * PI() / 180) * COS({2} * PI() / 180) * POWER(SIN(({1} * PI() / 180 - {3} * PI() / 180) / 2), 2))) * 1000)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName, expInfo.Args[2].MemberName, expInfo.Args[3].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("((6378.138 * 2 * ASIN(POWER(SIN(({0} * PI() / 180 - {2} * PI() / 180) / 2), 2) + COS({0} * PI() / 180) * COS({2} * PI() / 180) * POWER(SIN(({1} * PI() / 180 - {3} * PI() / 180) / 2), 2))) * 1000)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName, expInfo.Args[2].MemberName, expInfo.Args[3].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("((6378.138 * 2 * ASIN(POWER(SIN(({0} * PI() / 180 - {2} * PI() / 180) / 2), 2) + COS({0} * PI() / 180) * COS({2} * PI() / 180) * POWER(SIN(({1} * PI() / 180 - {3} * PI() / 180) / 2), 2))) * 1000)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName, expInfo.Args[2].MemberName, expInfo.Args[3].MemberName); + else + throw new Exception("未实现"); + } + }); + //Bd09ToGcj02Lat + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Bd09ToGcj02Lat", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("((SQRT( ({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * SIN(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS( ({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0))))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("((SQRT( ({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * SIN(ATAN(({1} - 0.006)/({0} - 0.0065)) - 0.000003 * COS( ({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0))))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("((SQRT( ({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * SIN(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS( ({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0))))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("((SQRT( ({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * SIN(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS( ({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0))))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("((SQRT( ({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * SIN(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS( ({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0))))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + //Bd09ToGcj02Lon + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Bd09ToGcj02Lon", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("(SQRT(({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS(({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0)))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("(SQRT(({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN(({1} - 0.006)/({0} - 0.0065)) - 0.000003 * COS(({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0)))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("(SQRT(({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS(({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0)))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("(SQRT(({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS(({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0)))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("(SQRT(({0} - 0.0065) * ({0} - 0.0065) + ({1} - 0.006) * ({1} - 0.006)) - 0.00002 * SIN(({1} - 0.006) * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2(({1} - 0.006), ({0} - 0.0065)) - 0.000003 * COS(({0} - 0.0065) * (3.14159265358979324 * 3000.0 / 180.0)))", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + //Gcj02ToBd09Lat + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Gcj02ToBd09Lat", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * SIN( ATAN2({1},{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.006)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * SIN( ATAN({1}/{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.006)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * SIN( ATAN2({1},{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.006)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * SIN( ATAN2({1},{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.006)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * SIN( ATAN2({1},{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.006)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + //Gcj02ToBd09Lon + expMethods.Add(new SqlFuncExternal() + { + UniqueMethodName = "Gcj02ToBd09Lon", + MethodValue = (expInfo, dbType, expContext) => + { + if (dbType == DbType.MySql) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2({1}, {0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.0065)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.SqlServer) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN({1}/{0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.0065)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.PostgreSQL) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2({1}, {0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.0065)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Oracle) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2({1}, {0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.0065)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else if (dbType == DbType.Sqlite) + return string.Format("((SQRT({0} * {0} + {1} * {1}) - 0.00002 * SIN({1} * (3.14159265358979324 * 3000.0 / 180.0))) * COS(ATAN2({1}, {0}) - 0.000003 * COS({0} * (3.14159265358979324 * 3000.0 / 180.0)))+0.0065)", expInfo.Args[0].MemberName, expInfo.Args[1].MemberName); + else + throw new Exception("未实现"); + } + }); + return expMethods; + } + + } + } +} diff --git a/DH.RBAC/Utility/Extension/MyEnvironment.cs b/DH.RBAC/Utility/Extension/MyEnvironment.cs new file mode 100644 index 0000000..aa638e5 --- /dev/null +++ b/DH.RBAC/Utility/Extension/MyEnvironment.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Utility.Extension +{ + public class MyEnvironment + { + private static string _currentPath; + public static void Init(string currentPath) + { + _currentPath = currentPath; + } + + public static string WebRootPath(string path) + { + return RootPath("/wwwroot" + path); + } + + public static string RootPath(string path) + { + string basePath = ""; +#if NETFRAMEWORK + basePath = AppDomain.CurrentDomain.BaseDirectory.Replace("/", "\\"); + if (!basePath.EndsWith("\\")) + { + basePath += "\\"; + } + path = path.Replace("/", "\\"); + if (path.StartsWith("\\")) + { + path = path.Substring(1, path.Length - 1); + } + return basePath + path; +#else + if (OperatingSystem.IsWindows()) + { + basePath = AppDomain.CurrentDomain.BaseDirectory.Replace("/", "\\"); + if (!basePath.EndsWith("\\")) + { + basePath += "\\"; + } + path = path.Replace("/", "\\"); + if (path.StartsWith("\\")) + { + path = path.Substring(1, path.Length - 1); + } + return basePath + path; + } + else + { + basePath = AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/"); + if (!basePath.EndsWith("/")) + { + basePath += "/"; + } + path = path.Replace("\\", "/"); + if (path.StartsWith("/")) + { + path = path.Substring(1, path.Length - 1); + } + return basePath + path; + } +#endif + + } + } +} diff --git a/DH.RBAC/Utility/Other/DESHelper.cs b/DH.RBAC/Utility/Other/DESHelper.cs new file mode 100644 index 0000000..b996b10 --- /dev/null +++ b/DH.RBAC/Utility/Other/DESHelper.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Utility.Other +{ + public static class DESHelper + { + #region DES加密解密 + + /// + /// 默认密钥。 + /// + private const string DESENCRYPT_KEY = "hsdjxlzf"; + + /// + /// DES加密,使用自定义密钥。 + /// + /// 待加密的明文 + /// 8位字符的密钥字符串 + /// + public static string DESEncrypt(this string text, string key) + { + if (key.Length != 8) + { + key = DESENCRYPT_KEY; + } + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(text); + + byte[] a = ASCIIEncoding.ASCII.GetBytes(key); + des.Key = ASCIIEncoding.ASCII.GetBytes(key); + des.IV = ASCIIEncoding.ASCII.GetBytes(key); + MemoryStream ms = new MemoryStream(); + CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); + + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + + StringBuilder ret = new StringBuilder(); + foreach (byte b in ms.ToArray()) + { + ret.AppendFormat("{0:X2}", b);//将第一个参数转换为十六进制数,长度为2,不足前面补0 + } + return ret.ToString(); + } + + /// + /// DES解密,使用自定义密钥。 + /// + /// 待解密的秘文 + /// 必须是8位字符的密钥字符串(不能有特殊字符) + /// + public static string DESDecrypt(this string cyphertext, string key) + { + if (key.Length != 8) + { + key = DESENCRYPT_KEY; + } + if (string.IsNullOrEmpty(cyphertext)) + return string.Empty; + DESCryptoServiceProvider des = new DESCryptoServiceProvider(); + + byte[] inputByteArray = new byte[cyphertext.Length / 2]; + for (int x = 0; x < cyphertext.Length / 2; x++) + { + int i = (Convert.ToInt32(cyphertext.Substring(x * 2, 2), 16)); + inputByteArray[x] = (byte)i; + } + + des.Key = ASCIIEncoding.ASCII.GetBytes(key); + des.IV = ASCIIEncoding.ASCII.GetBytes(key); + MemoryStream ms = new MemoryStream(); + CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); + cs.Write(inputByteArray, 0, inputByteArray.Length); + cs.FlushFinalBlock(); + + StringBuilder ret = new StringBuilder(); + + return System.Text.Encoding.GetEncoding("UTF-8").GetString(ms.ToArray()); + } + + /// + /// DES加密,使用默认密钥。 + /// + /// 待加密的明文 + /// + public static string DESEncrypt(this string text) + { + return DESEncrypt(text, DESENCRYPT_KEY); + } + + /// + /// DES解密,使用默认密钥。 + /// + /// 待解密的秘文 + /// + public static string DESDecrypt(this string cyphertext) + { + return DESDecrypt(cyphertext, DESENCRYPT_KEY); + } + #endregion + } +} diff --git a/DH.RBAC/Utility/Other/FormHelper.cs b/DH.RBAC/Utility/Other/FormHelper.cs new file mode 100644 index 0000000..7c1a4ba --- /dev/null +++ b/DH.RBAC/Utility/Other/FormHelper.cs @@ -0,0 +1,40 @@ +#if NETFRAMEWORK || WINDOWS +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Utility.Other +{ + public class FormHelper + { + public static Form subForm; + + /// + /// 显示子Form + /// + /// + public static void ShowSubForm(Form form,UserControl userControl) + { + //关闭之前的 + try { if (subForm != null) subForm.Close(); } catch { } + //打开现在的 + subForm = form; + form.Show(userControl); + + } + + public static void ShowSubForm(Form form) + { + //关闭之前的 + try { if (subForm != null) subForm.Close(); } catch { } + //打开现在的 + subForm = form; + form.Show(); + + } + } +} +#endif diff --git a/DH.RBAC/Utility/Other/JsonHelper.cs b/DH.RBAC/Utility/Other/JsonHelper.cs new file mode 100644 index 0000000..8edadcc --- /dev/null +++ b/DH.RBAC/Utility/Other/JsonHelper.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json; + +namespace DH.RBAC.Utility.Other +{ + public static class JsonHelper + { + /// + /// 对象序列化成JSON字符串。 + /// + /// 序列化对象 + /// 设置需要忽略的属性 + /// + public static string ToJson(this object obj) + { + if (obj == null) + return string.Empty; + IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); + timeConverter.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + return JsonConvert.SerializeObject(obj, timeConverter); + } + + /// + /// JSON字符串序列化成对象。 + /// + /// 对象类型 + /// JSON字符串 + /// + public static T ToObject(this string json) + { + //var setting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + return json == null ? default(T) : JsonConvert.DeserializeObject(json);//, setting); + } + + + /// + /// JSON字符串序列化成集合。 + /// + /// 集合类型 + /// JSON字符串 + /// + public static List ToList(this string json) + { + //var setting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; + return json == null ? null : JsonConvert.DeserializeObject>(json);//, setting); + } + + + /// + /// JSON字符串序列化成DataTable。 + /// + /// JSON字符串 + /// + public static DataTable ToTable(this string json) + { + return json == null ? null : JsonConvert.DeserializeObject(json); + } + + /// + /// 将JSON字符串反序列化成对象 + /// + /// + /// + /// + /// + public static T Json2Obj(T baseEntity, string strJson) + { + return JsonConvert.DeserializeAnonymousType(strJson, baseEntity); + } + + /// + /// 将对象转换层JSON字符串 + /// + /// + /// + /// + public static string Obj2Json(T data) + { + return JsonConvert.SerializeObject(data); + } + + + public static List JsonToList(string strJson) + { + T[] list = JsonConvert.DeserializeObject(strJson); + return list.ToList(); + } + + public static T Json2Obj(string strJson) + { + return JsonConvert.DeserializeObject(strJson); + } + + public static DataTable ToDataTable(this string json) + { + return json.ToTable(); + } + + public static string FormatJson(this string json) + { + //格式化json字符串 + JsonSerializer serializer = new JsonSerializer(); + TextReader tr = new StringReader(json); + JsonTextReader jtr = new JsonTextReader(tr); + object obj = serializer.Deserialize(jtr); + if (obj != null) + { + StringWriter textWriter = new StringWriter(); + JsonTextWriter jsonWriter = new JsonTextWriter(textWriter) + { + Formatting = Formatting.Indented, + Indentation = 4, + IndentChar = ' ' + }; + serializer.Serialize(jsonWriter, obj); + return textWriter.ToString(); + } + else + { + return json; + } + } + } +} diff --git a/DH.RBAC/Utility/Other/MD5Helper.cs b/DH.RBAC/Utility/Other/MD5Helper.cs new file mode 100644 index 0000000..416f0b7 --- /dev/null +++ b/DH.RBAC/Utility/Other/MD5Helper.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Utility.Other +{ + public static class MD5Helper + { + /// + /// 字符串MD5加密。 + /// + /// 需要加密的字符串 + /// + public static string md5(this string text) + { + return md5(text, Encoding.Default); + } + public static string MD5(this string text) + { + return MD5(text, Encoding.Default); + } + /// + /// 字符串MD5加密。 + /// + /// 需要加密的字符串 + /// + public static string md5(this string text, Encoding encoder) + { + // Create a new instance of the MD5CryptoServiceProvider object. + System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create(); + // Convert the input string to a byte array and compute the hash. + byte[] data = md5Hasher.ComputeHash(encoder.GetBytes(text)); + // Create a new Stringbuilder to collect the bytes + // and create a string. + StringBuilder sBuilder = new StringBuilder(); + // Loop through each byte of the hashed data + // and format each one as a hexadecimal string. + for (int i = 0; i < data.Length; i++) + { + sBuilder.Append(data[i].ToString("x2")); + } + // Return the hexadecimal string. + return sBuilder.ToString().ToLower(); + } + public static string MD5(this string text, Encoding encoder) + { + return md5(text, encoder).ToUpper(); + } + /// + /// 文件流MD5加密。 + /// + /// 需要加密的文件流 + /// + public static string md5(this Stream stream) + { + MD5 md5serv = MD5CryptoServiceProvider.Create(); + byte[] buffer = md5serv.ComputeHash(stream); + StringBuilder sb = new StringBuilder(); + foreach (byte var in buffer) + { + sb.Append(var.ToString("x2")); + } + return sb.ToString().ToLower(); + } + public static string MD5(this Stream stream) + { + return md5(stream).ToUpper(); + } + + #region MD5加密 + /// + /// 字符串MD5加密。 + /// + /// 需要加密的字符串 + /// + public static string MD5Encrypt(this string text) + { + // Create a new instance of the MD5CryptoServiceProvider object. + System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create(); + // Convert the input string to a byte array and compute the hash. + byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(text)); + // Create a new Stringbuilder to collect the bytes + // and create a string. + StringBuilder sBuilder = new StringBuilder(); + // Loop through each byte of the hashed data + // and format each one as a hexadecimal string. + for (int i = 0; i < data.Length; i++) + { + sBuilder.Append(data[i].ToString("x2")); + } + // Return the hexadecimal string. + return sBuilder.ToString(); + } + + /// + /// 文件流MD5加密。 + /// + /// 需要加密的文件流 + /// + public static string MD5Encrypt(this Stream stream) + { + MD5 md5serv = MD5CryptoServiceProvider.Create(); + byte[] buffer = md5serv.ComputeHash(stream); + StringBuilder sb = new StringBuilder(); + foreach (byte var in buffer) + { + sb.Append(var.ToString("x2")); + } + return sb.ToString(); + } + #endregion + } +} diff --git a/DH.RBAC/Utility/Other/PanelScrollHelper.cs b/DH.RBAC/Utility/Other/PanelScrollHelper.cs new file mode 100644 index 0000000..9f46409 --- /dev/null +++ b/DH.RBAC/Utility/Other/PanelScrollHelper.cs @@ -0,0 +1,45 @@ +#if NETFRAMEWORK || WINDOWS +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Utility.Other +{ + public class PanelScrollHelper + { + /// + /// 初始化panel + /// + /// + public static void InitializePanelScroll(Panel panel) + { + panel.Click += (obj, arg) => { panel.Select(); }; + InitializePanelScroll(panel, panel); + } + + /// + /// 递归初始化panel的内部个容器和控件 + /// + /// + /// + private static void InitializePanelScroll(Control container, Control panelRoot) + { + foreach (Control control in container.Controls) + { + if (control is Panel || control is GroupBox || control is SplitContainer || control is TabControl || control is UserControl) + { + control.Click += (obj, arg) => { panelRoot.Select(); }; + InitializePanelScroll(control, panelRoot); + } + else if (control is Label) + { + control.Click += (obj, arg) => { panelRoot.Select(); }; + } + } + } + } +} +#endif \ No newline at end of file diff --git a/DH.RBAC/Utility/Other/ScreenUtils.cs b/DH.RBAC/Utility/Other/ScreenUtils.cs new file mode 100644 index 0000000..12f50e0 --- /dev/null +++ b/DH.RBAC/Utility/Other/ScreenUtils.cs @@ -0,0 +1,113 @@ +#if NETFRAMEWORK || WINDOWS +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace DH.RBAC.Utility.Other +{ + public class ScreenUtils + { +#region Dll引用 + [DllImport("User32.dll", EntryPoint = "GetDC")] + private extern static IntPtr GetDC(IntPtr hWnd); + + [DllImport("User32.dll", EntryPoint = "ReleaseDC")] + private extern static int ReleaseDC(IntPtr hWnd, IntPtr hDC); + + [DllImport("gdi32.dll")] + public static extern int GetDeviceCaps(IntPtr hdc, int nIndex); + + [DllImport("User32.dll")] + public static extern int GetSystemMetrics(int hWnd); + + + [DllImport("User32.dll")] + private static extern IntPtr MonitorFromPoint([In] System.Drawing.Point pt, [In] uint dwFlags); + + [DllImport("Shcore.dll")] + private static extern IntPtr GetDpiForMonitor([In] IntPtr hmonitor, [In] DpiType dpiType, [Out] out uint dpiX, [Out] out uint dpiY); +#endregion + + const int DESKTOPVERTRES = 117; + const int DESKTOPHORZRES = 118; + + const int SM_CXSCREEN = 0; + const int SM_CYSCREEN = 1; + + /// + /// 获取DPI缩放比例 + /// + /// + /// + public static void GetDPIScale(ref float dpiscalex, ref float dpiscaley) + { + int x = GetSystemMetrics(SM_CXSCREEN); + int y = GetSystemMetrics(SM_CYSCREEN); + IntPtr hdc = GetDC(IntPtr.Zero); + int w = GetDeviceCaps(hdc, DESKTOPHORZRES); + int h = GetDeviceCaps(hdc, DESKTOPVERTRES); + ReleaseDC(IntPtr.Zero, hdc); + dpiscalex = (float)w / x; + dpiscaley = (float)h / y; + } + + /// + /// 获取分辨率 + /// + /// 宽 + /// 高 + private static void GetResolving(ref int width, ref int height) + { + IntPtr hdc = GetDC(IntPtr.Zero); + width = GetDeviceCaps(hdc, DESKTOPHORZRES); + height = GetDeviceCaps(hdc, DESKTOPVERTRES); + ReleaseDC(IntPtr.Zero, hdc); + } + + public static int ScreenCount + { + get + { + return Screen.AllScreens.Length; + } + } + + public static ScreenSize GetScreenSize(int index) + { + if (index > (ScreenCount - 1)) + throw new Exception("索引异常"); + Screen screen = Screen.AllScreens[index]; + uint width = 0; + uint height = 0; + GetDpi(screen, DpiType.Effective, out width, out height); + double scale = width / 96.0; + return new ScreenSize { Left = (int)(screen.Bounds.X / scale), Top = screen.Bounds.Y, Width = (int)(screen.Bounds.Width / scale), Height = (int)(screen.Bounds.Height / scale), Scale = scale }; + } + + public static void GetDpi(Screen screen, DpiType dpiType, out uint dpiX, out uint dpiY) + { + var pnt = new System.Drawing.Point(screen.Bounds.Left + 800, screen.Bounds.Top + 600); + var mon = MonitorFromPoint(pnt, 2); + GetDpiForMonitor(mon, dpiType, out dpiX, out dpiY); + } + + } + public enum DpiType + { + Effective = 0, + Angular = 1, + Raw = 2, + } + + + + public class ScreenSize + { + public int Left { get; set; } + public int Top { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public double Scale { get; set; } + } +} +#endif \ No newline at end of file diff --git a/DH.RBAC/Utility/Other/SnowFlakeHelper.cs b/DH.RBAC/Utility/Other/SnowFlakeHelper.cs new file mode 100644 index 0000000..ab53de6 --- /dev/null +++ b/DH.RBAC/Utility/Other/SnowFlakeHelper.cs @@ -0,0 +1,203 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DH.RBAC.Utility.Other +{ + public class SnowFlakeHelper + { + + private static readonly object _obj = new object(); + private static SnowFlakeHelper Instance; + private SnowFlakeHelper() + { + + } + + /// + /// 获取雪花帮助类对象 + /// + /// 数据中心ID + /// 工作机器Id + /// + public static SnowFlakeHelper GetSnowInstance(long datacenterId = 1, long workerId = 1) + { + //双if 加锁 + if (Instance == null) + { + lock (_obj) + { + if (Instance == null) + { + Instance = new SnowFlakeHelper(datacenterId, workerId); + } + } + } + + return Instance; + } + + // 开始时间截((new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc)-Jan1st1970).TotalMilliseconds) + private const long twepoch = 1577836800000L; + + // 机器id所占的位数 + private const int workerIdBits = 5; + + // 数据标识id所占的位数 + private const int datacenterIdBits = 5; + + // 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) + private const long maxWorkerId = -1L ^ (-1L << workerIdBits); + + // 支持的最大数据标识id,结果是31 + private const long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + + // 序列在id中占的位数 + private const int sequenceBits = 12; + + // 数据标识id向左移17位(12+5) + private const int datacenterIdShift = sequenceBits + workerIdBits; + + // 机器ID向左移12位 + private const int workerIdShift = sequenceBits; + + + // 时间截向左移22位(5+5+12) + private const int timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + // 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) + private const long sequenceMask = -1L ^ (-1L << sequenceBits); + + // 数据中心ID(0~31) + public long datacenterId { get; private set; } + + // 工作机器ID(0~31) + public long workerId { get; private set; } + + // 毫秒内序列(0~4095) + public long sequence { get; private set; } + + // 上次生成ID的时间截 + public long lastTimestamp { get; private set; } + + + /// + /// 雪花ID + /// + /// 数据中心ID + /// 工作机器ID + private SnowFlakeHelper(long datacenterId, long workerId) + { + if (datacenterId > maxDatacenterId || datacenterId < 0) + { + throw new Exception(string.Format("datacenter Id can't be greater than {0} or less than 0", maxDatacenterId)); + } + if (workerId > maxWorkerId || workerId < 0) + { + throw new Exception(string.Format("worker Id can't be greater than {0} or less than 0", maxWorkerId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + this.sequence = 0L; + this.lastTimestamp = -1L; + } + + /// + /// 获得下一个ID + /// + /// + public long NextId() + { + lock (this) + { + long timestamp = GetCurrentTimestamp(); + if (timestamp > lastTimestamp) //时间戳改变,毫秒内序列重置 + { + sequence = 0L; + } + else if (timestamp == lastTimestamp) //如果是同一时间生成的,则进行毫秒内序列 + { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) //毫秒内序列溢出 + { + timestamp = GetNextTimestamp(lastTimestamp); //阻塞到下一个毫秒,获得新的时间戳 + } + } + else //当前时间小于上一次ID生成的时间戳,证明系统时钟被回拨,此时需要做回拨处理 + { + sequence = (sequence + 1) & sequenceMask; + if (sequence > 0) + { + timestamp = lastTimestamp; //停留在最后一次时间戳上,等待系统时间追上后即完全度过了时钟回拨问题。 + } + else //毫秒内序列溢出 + { + timestamp = lastTimestamp + 1; //直接进位到下一个毫秒 + } + //throw new Exception(string.Format("Clock moved backwards. Refusing to generate id for {0} milliseconds", lastTimestamp - timestamp)); + } + + lastTimestamp = timestamp; //上次生成ID的时间截 + + //移位并通过或运算拼到一起组成64位的ID + var id = ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) + | sequence; + return id; + } + } + + /// + /// 解析雪花ID + /// + /// + public static string AnalyzeId(long Id) + { + StringBuilder sb = new StringBuilder(); + + var timestamp = (Id >> timestampLeftShift); + var time = Jan1st1970.AddMilliseconds(timestamp + twepoch); + sb.Append(time.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss:fff")); + + var datacenterId = (Id ^ (timestamp << timestampLeftShift)) >> datacenterIdShift; + sb.Append("_" + datacenterId); + + var workerId = (Id ^ ((timestamp << timestampLeftShift) | (datacenterId << datacenterIdShift))) >> workerIdShift; + sb.Append("_" + workerId); + + var sequence = Id & sequenceMask; + sb.Append("_" + sequence); + + return sb.ToString(); + } + + /// + /// 阻塞到下一个毫秒,直到获得新的时间戳 + /// + /// 上次生成ID的时间截 + /// 当前时间戳 + private static long GetNextTimestamp(long lastTimestamp) + { + long timestamp = GetCurrentTimestamp(); + while (timestamp <= lastTimestamp) + { + timestamp = GetCurrentTimestamp(); + } + return timestamp; + } + + /// + /// 获取当前时间戳 + /// + /// + private static long GetCurrentTimestamp() + { + return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; + } + + private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + } +} diff --git a/DH.RBAC/Utility/Other/StringHelper.cs b/DH.RBAC/Utility/Other/StringHelper.cs new file mode 100644 index 0000000..374f189 --- /dev/null +++ b/DH.RBAC/Utility/Other/StringHelper.cs @@ -0,0 +1,316 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace DH.RBAC.Utility.Other +{ + /// + /// 字符串操作类 + /// + public static class StringHelper + { + /// + /// 把字符串按照分隔符转换成 List + /// + /// 源字符串 + /// 分隔符 + /// 是否转换为小写 + /// + public static List SplitToList(this string str, char speater = ',', bool toLower = false) + { + List list = new List(); + string[] ss = str.Split(speater); + foreach (string s in ss) + { + if (!string.IsNullOrEmpty(s) && s != speater.ToString()) + { + string strVal = s; + if (toLower) + { + strVal = s.ToLower(); + } + list.Add(strVal); + } + } + return list; + } + + /// + /// 把 List 按照分隔符组装成 string + /// + /// + /// + /// + public static string GetStrArray(this List list, string speater = ",") + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < list.Count; i++) + { + if (i == list.Count - 1) + { + sb.Append(list[i]); + } + else + { + sb.Append(list[i]); + sb.Append(speater); + } + } + return sb.ToString(); + } + + + /// + /// 删除最后结尾的指定字符后的字符 + /// + public static string DelLastChar(this string str, string strChar = ",") + { + return str.Substring(0, str.LastIndexOf(strChar)); + } + + + /// + /// 转全角的函数(SBC case) + /// + /// + /// + public static string ToSBC(string input) + { + //半角转全角: + char[] c = input.ToCharArray(); + for (int i = 0; i < c.Length; i++) + { + if (c[i] == 32) + { + c[i] = (char)12288; + continue; + } + if (c[i] < 127) + c[i] = (char)(c[i] + 65248); + } + return new string(c); + } + + /// + /// 转半角的函数(SBC case) + /// + /// 输入 + /// + public static string ToDBC(string input) + { + char[] c = input.ToCharArray(); + for (int i = 0; i < c.Length; i++) + { + if (c[i] == 12288) + { + c[i] = (char)32; + continue; + } + if (c[i] > 65280 && c[i] < 65375) + c[i] = (char)(c[i] - 65248); + } + return new string(c); + } + + + /// + /// 获取正确的Id,如果不是正整数,返回0 + /// + /// + /// 返回正确的整数ID,失败返回0 + public static int ToInt32(this string value) + { + if (IsNumberId(value)) + return int.Parse(value); + else + return 0; + } + + /// + /// 检查一个字符串是否是纯数字构成的,一般用于查询字符串参数的有效性验证。(0除外) + /// + /// 需验证的字符串。。 + /// 是否合法的bool值。 + public static bool IsNumberId(string _value) + { + return QuickValidate("^[1-9]*[0-9]*$", _value); + } + + /// + /// 快速验证一个字符串是否符合指定的正则表达式。 + /// + /// 正则表达式的内容。 + /// 需验证的字符串。 + /// 是否合法的bool值。 + public static bool QuickValidate(string _express, string _value) + { + if (_value == null) return false; + Regex myRegex = new Regex(_express); + if (_value.Length == 0) + { + return false; + } + return myRegex.IsMatch(_value); + } + /// + /// 得到字符串长度,一个汉字长度为2 + /// + /// 参数字符串 + /// + public static int StrLength(this string inputString) + { + System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); + int tempLen = 0; + byte[] s = ascii.GetBytes(inputString); + for (int i = 0; i < s.Length; i++) + { + if ((int)s[i] == 63) + tempLen += 2; + else + tempLen += 1; + } + return tempLen; + } + + + /// + /// 截取指定长度字符串 + /// + /// 要处理的字符串 + /// 指定长度 + /// 返回处理后的字符串 + public static string splitString(this string inputString, int len) + { + bool isShowFix = false; + if (len % 2 == 1) + { + isShowFix = true; + len--; + } + System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); + int tempLen = 0; + string tempString = ""; + byte[] s = ascii.GetBytes(inputString); + for (int i = 0; i < s.Length; i++) + { + if ((int)s[i] == 63) + tempLen += 2; + else + tempLen += 1; + + try + { + tempString += inputString.Substring(i, 1); + } + catch + { + break; + } + + if (tempLen > len) + break; + } + + byte[] mybyte = System.Text.Encoding.Default.GetBytes(inputString); + if (isShowFix && mybyte.Length > len) + tempString += "…"; + return tempString; + } + + + /// + /// HTML转行成TEXT + /// + /// + /// + public static string HtmlToTxt(this string strHtml) + { + string[] aryReg ={ + @"]*?>.*?", + @"<(\/\s*)?!?((\w+:)?\w+)(\w+(\s*=?\s*(([""'])(\\[""'tbnr]|[^\7])*?\7|\w+)|.{0})|\s)*?(\/\s*)?>", + @"([\r\n])[\s]+", + @"&(quot|#34);", + @"&(amp|#38);", + @"&(lt|#60);", + @"&(gt|#62);", + @"&(nbsp|#160);", + @"&(iexcl|#161);", + @"&(cent|#162);", + @"&(pound|#163);", + @"&(copy|#169);", + @"&#(\d+);", + @"-->", + @" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DH.RBAC/Views/MyPage.cs b/DH.RBAC/Views/MyPage.cs new file mode 100644 index 0000000..dbf284c --- /dev/null +++ b/DH.RBAC/Views/MyPage.cs @@ -0,0 +1,91 @@ +using AntdUI; +using DH.RBAC.Model.Sys; +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Page +{ + public class MyPage : UserControl + { + public virtual void Stop() { } + + public List ButtonPermissionList + { + set + { + List list = value; + SetPermission(list, this.Controls); + } + } + + private void SetPermission(List list, Control.ControlCollection controls) + { + foreach (Control control in controls) + { + if (control.HasChildren) + { + SetPermission(list, control.Controls); + continue; + } + if (control is AntdUI.Button) + { + AntdUI.Button button = (AntdUI.Button)control; + object tag = button.Tag; + if (tag == null) + continue; + string strTag = tag as string; + if (strTag == null) + continue; + SysPermission permission = list.Where(it => it.EnCode == strTag).FirstOrDefault(); + if (permission == null) + continue; + button.Visible = true; + continue; + } + if (control is UISymbolButton) + { + UISymbolButton button = (UISymbolButton)control; + object tag = button.Tag; + if (tag == null) + continue; + string strTag = tag as string; + if (strTag == null) + continue; + SysPermission permission = list.Where(it => it.EnCode == strTag).FirstOrDefault(); + if (permission == null) + continue; + button.Visible = true; + continue; + } + + } + } + + private void InitializeComponent() + { + this.SuspendLayout(); + // + // MyPage + // + this.Size = new System.Drawing.Size(1150, 637); + this.Name = "MyPage"; + this.ResumeLayout(false); + + } + } + + public class PageCodeAttribute : Attribute + { + public string Encode { get; set; } + public PageCodeAttribute() { } + public PageCodeAttribute(string encode) + { + this.Encode = encode; + } + } +} diff --git a/DH.RBAC/Views/MyPage.resx b/DH.RBAC/Views/MyPage.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/DH.RBAC/Views/MyPage.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/BaseSubForm.Designer.cs b/DH.RBAC/Views/Sys/BaseSubForm.Designer.cs new file mode 100644 index 0000000..420e1d3 --- /dev/null +++ b/DH.RBAC/Views/Sys/BaseSubForm.Designer.cs @@ -0,0 +1,146 @@ +namespace DH.RBAC.Page.Sys +{ + partial class BaseSubForm + { + /// + /// 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(BaseSubForm)); + this.uiPanel1 = new Sunny.UI.UIPanel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.uiLabel15 = new Sunny.UI.UILabel(); + this.uiSymbolLabel1 = new Sunny.UI.UISymbolLabel(); + this.uiPanel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // uiPanel1 + // + this.uiPanel1.Controls.Add(this.panel1); + this.uiPanel1.Controls.Add(this.panel2); + this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiPanel1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(241)))), ((int)(((byte)(243))))); + this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiPanel1.Location = new System.Drawing.Point(0, 0); + this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1); + this.uiPanel1.Name = "uiPanel1"; + this.uiPanel1.RectColor = System.Drawing.Color.Silver; + this.uiPanel1.Size = new System.Drawing.Size(686, 530); + this.uiPanel1.Style = Sunny.UI.UIStyle.Custom; + this.uiPanel1.StyleCustomMode = true; + this.uiPanel1.TabIndex = 6; + this.uiPanel1.Text = null; + this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 43); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(686, 487); + this.panel1.TabIndex = 8; + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.panel2.Controls.Add(this.uiLabel15); + this.panel2.Controls.Add(this.uiSymbolLabel1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(686, 43); + this.panel2.TabIndex = 7; + this.panel2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown); + this.panel2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove); + // + // uiLabel15 + // + this.uiLabel15.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiLabel15.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel15.Location = new System.Drawing.Point(0, 0); + this.uiLabel15.Name = "uiLabel15"; + this.uiLabel15.Size = new System.Drawing.Size(641, 43); + this.uiLabel15.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel15.TabIndex = 1; + this.uiLabel15.Text = "标题"; + this.uiLabel15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.uiLabel15.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown); + this.uiLabel15.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove); + // + // uiSymbolLabel1 + // + this.uiSymbolLabel1.Dock = System.Windows.Forms.DockStyle.Right; + this.uiSymbolLabel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiSymbolLabel1.Location = new System.Drawing.Point(641, 0); + this.uiSymbolLabel1.MinimumSize = new System.Drawing.Size(1, 1); + this.uiSymbolLabel1.Name = "uiSymbolLabel1"; + this.uiSymbolLabel1.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0); + this.uiSymbolLabel1.Size = new System.Drawing.Size(45, 43); + this.uiSymbolLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiSymbolLabel1.Symbol = 77; + this.uiSymbolLabel1.SymbolSize = 60; + this.uiSymbolLabel1.TabIndex = 0; + this.uiSymbolLabel1.Click += new System.EventHandler(this.uiSymbolLabel1_Click); + this.uiSymbolLabel1.MouseEnter += new System.EventHandler(this.uiSymbolLabel1_MouseEnter); + this.uiSymbolLabel1.MouseLeave += new System.EventHandler(this.uiSymbolLabel1_MouseLeave); + // + // BaseSubForm + // + this.AllowShowTitle = false; + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(686, 530); + this.Controls.Add(this.uiPanel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "BaseSubForm"; + this.Padding = new System.Windows.Forms.Padding(0); + this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.ShowTitle = false; + this.ShowTitleIcon = true; + this.Style = Sunny.UI.UIStyle.Custom; + this.Text = "新增用户"; + this.TitleColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.TitleForeColor = System.Drawing.Color.DimGray; + this.TopMost = true; + this.uiPanel1.ResumeLayout(false); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private Sunny.UI.UIPanel uiPanel1; + private System.Windows.Forms.Panel panel2; + private Sunny.UI.UILabel uiLabel15; + private Sunny.UI.UISymbolLabel uiSymbolLabel1; + private System.Windows.Forms.Panel panel1; + } +} \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/BaseSubForm.cs b/DH.RBAC/Views/Sys/BaseSubForm.cs new file mode 100644 index 0000000..92b560b --- /dev/null +++ b/DH.RBAC/Views/Sys/BaseSubForm.cs @@ -0,0 +1,71 @@ + +using DH.RBAC.Utility.Other; +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Page.Sys +{ + public partial class BaseSubForm : UIForm + { + public BaseSubForm() + { + InitializeComponent(); + } + + public event EventHandler OnFormClose; + + /// + /// 标题 + /// + public string Title + { + get + { + return uiLabel15.Text; + } + set + { + uiLabel15.Text = value; + } + } + + private void uiSymbolLabel1_Click(object sender, EventArgs e) + { + OnFormClose?.Invoke(this, EventArgs.Empty); + FormHelper.subForm = null; + this.Close(); + } + private Point mPoint; + private void panel2_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void panel2_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + private void uiSymbolLabel1_MouseEnter(object sender, EventArgs e) + { + uiSymbolLabel1.BackColor = Color.FromArgb(231, 231, 231); + } + + private void uiSymbolLabel1_MouseLeave(object sender, EventArgs e) + { + uiSymbolLabel1.BackColor = Color.Transparent; + } + } +} diff --git a/DH.RBAC/Views/Sys/BaseSubForm.resx b/DH.RBAC/Views/Sys/BaseSubForm.resx new file mode 100644 index 0000000..01360ee --- /dev/null +++ b/DH.RBAC/Views/Sys/BaseSubForm.resx @@ -0,0 +1,1161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAgIAAAAEAIACoAAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AC4AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAsAAABkAAAAagAAAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAQAAAAOAAAADQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAB2AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAADwAAABsAAAAdAAAAHAAAABwAAAAdAAAAFQAAAAsAAAAMAAAAAwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAA2QAAAOUAAAApAAAAAAAAAAAAAAAAAAAAHwAA + AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAANUAAADTAAAAUgAA + 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 + AP0AAAD5AAAAIAAAAF8AAADBAAAAqwAAAJ4AAACqAAAAvAAAAKMAAACcAAAA1wAAAP8AAAD/AAAA/wAA + AN8AAABkAAAAAAAAALIAAAD/AAAA6gAAABkAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAygAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzgAAAKMAAAD/AAAA/wAAAF0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAIwAAAD2AAAA/wAAAP8AAAD/AAAA6QAAAP8AAACLAAAAAAAA + AAAAAAAOAAAAJAAAACQAAAAhAAAAdQAAAP8AAAD/AAAAWwAAAB8AAAAzAAAAMgAAAC4AAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAOAAAAXQAAANEAAAD/AAAA/wAAAP8AAACjAAAAcAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAmwAAAP8AAAD+AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAABFAAAA+QAAAPEAAADtAAAA5wAAAN4AAADUAAAA1QAAAN0AAADeAAAA3gAA + APkAAAD/AAAA/wAAAPAAAADeAAAA3gAAANwAAADSAAAA2QAAAN4AAADnAAAA7AAAAPMAAAD5AAAAOgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTAAAA8gAA + AOYAAADfAAAA4AAAAOwAAADTAAAAPQAAAJoAAACMAAAAeQAAAGkAAADNAAAA/wAAAP8AAACZAAAAdAAA + AJUAAAB1AAAApAAAAP8AAAD/AAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/wAA + AP8AAAD8AAAA9gAAAPgAAAD/AAAA/wAAALgAAACkAAAAqwAAANMAAAD/AAAA/wAAAO4AAACpAAAA/wAA + AP8AAABvAAAAxgAAAOAAAADiAAAAtQAAAGEAAAB8AAAAYAAAAAMAAAAAAAAAAAAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA2AAAAE0AAABYAAAA/wAAAP8AAAB/AAAAQwAAAEQAAABKAAAA6wAAAP8AAAC1AAAA2gAA + AP8AAADcAAAADQAAAAAAAACMAAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2AAAAKQAA + ACAAAAAWAAAAAQAAADQAAAAoAAAAAAAAAAAAAAAEAAAA0AAAAP8AAAD/AAAAjgAAAAQAAAAAAAAAAAAA + ADsAAAAVAAAAAwAAABYAAAAfAAAALAAAADYAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAApAAAAEQAAAAQAAAAIAAAAHwAAAC8AAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAEcAAAAAAAAAAAAAAAAAAACmAAAA/wAAAP8AAABbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAA6AAAAEUAAAAxAAAAMgAAADUAAABLAAAAbAAA + AP8AAAD/AAAA6gAAALsAAAC+AAAArAAAAJkAAAD/AAAA/wAAAGwAAADRAAAA7wAAAO4AAADIAAAA4wAA + AP8AAADaAAAABwAAAAAAAAAAAAAABAAAAK4AAAD/AAAA8AAAAIMAAAAWAAAAAAAAAFkAAAD/AAAA/wAA + AFoAAAAQAAAADwAAABcAAADmAAAA/wAAAIQAAACEAAAA/wAAAP8AAABdAAAAAAAAAHQAAAD/AAAA/wAA + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAA4AAAAOkAAACCAAAAGgAA + AAAAAADOAAAA/wAAAP8AAACJAAAAAAAAADYAAACaAAAA+wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AGcAAAAAAAAAAAAAADoAAABGAAAAKgAAACMAAAAPAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAHAAA + ACgAAABBAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADMAAAA/wAA + AP8AAADuAAAATAAAAAAAAAAVAAAAFgAAAAgAAAADAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAGAAAACAAAABMAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACgAAAA8QAAAOYAAACmAAAAAQAAAAAAAAAAAAAAAAAAAAQAAADKAAAAxwAA + AJ4AAAB+AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAUAAAA6QAAAP8AAAD6AAAA4AAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAACbAAAASgAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAjAAAACwAA + AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABOAAAATQAA + ADkAAABCAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADobtSBOF + 6ygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJfxomxXcBgMZ5CFbChRgVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADBcBQZwnYAf8J1AH7BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3DdgCBwnQAadqRAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABKI8ikEg/b0A4X55g6D8FcAAAAAAAAAAAAAAAAAAAAA358/CMF1 + BsPZgwD/yXkB/8J2A+XCdgOfxH0QPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB4B47chAD/0X4A/9F+ + AP/RfgD/0H4A/9J/AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/92F + AP/AcwDqv38AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVqv8GBoLzwACJ + //8Ahvv/AoT4/waE85gii/MWAAAAAAAAAADAdwuGz3wA/8N1AP/EdgD/yHgA/898AP/CcwL9wnYEqMR8 + EycAAAAAAAAAAAAAAAC9exUjxHUD7sd4AP/CdQD/wnUA/8J1AP/DdQD/xHYA/8JzAPvAcwD9wHMA/cBz + AP3AcwD9wHMA/cFzAP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3BcwD9xXMA+8Vy + APvFcgD7xXIA+8VyAPvFcgD7xHQA/MFzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cBzAP3BcwD9wXMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9yXgA/cN1ANW7dwAPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuC74EBif//AYHy/wGB8P8Bg/X/AIv//wOA79YAov4L2HkAO8Z3 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY31GwuG84cqqtQGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJdzc3P//////39/f/8UFBT/Tk5O/01NTf8+Pj7/Ghoa/6enp///////kpKS/wAA + ALgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf3+/BByG6SQFgvb4DYTxgRmM + 8EUGgu9UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw3YORcZ3BfHMeALxx3cHib9/ + GRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMFAAAAMmIiIj/5ubm/8nJ + yf+5ubn/tra2/729vf/s7Oz//////56env8GBgbgAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAH//AhCF7i5Pn+8QCILwmgmG8JwViPJUC4TwiRWK8CMIhe49F4vvIQyF + 8igAlP8YjX9jEsN4BnDCcwbNyngDh8R7FSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAALhSUlL/wMDA//b29v//////+Pj4/8TExP9dXV3/AAAAygAA + AC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAn/8IVar/BhGI8ToPiO9UEIXyPwuE8W4Ph/BEEInxTgCL/jehgkgxyHoGS8J5GBUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + AFwAAAC2ISEh4CMjI/MfHx/iAQEBugAAAGkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAIAAAABUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.Designer.cs b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.Designer.cs new file mode 100644 index 0000000..cd37308 --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.Designer.cs @@ -0,0 +1,706 @@ +namespace DH.RBAC.Page.Sys.Organize +{ + partial class AddOrganizeForm + { + /// + /// 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(AddOrganizeForm)); + this.uiPanel1 = new Sunny.UI.UIPanel(); + this.titlePanel = new System.Windows.Forms.Panel(); + this.lblTitle = new Sunny.UI.UILabel(); + this.btnClose = new Sunny.UI.UISymbolLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.uiLabel14 = new Sunny.UI.UILabel(); + this.uiLabel13 = new Sunny.UI.UILabel(); + this.uiLabel11 = new Sunny.UI.UILabel(); + this.txtAddress = new Sunny.UI.UITextBox(); + this.uiLabel10 = new Sunny.UI.UILabel(); + this.txtFax = new Sunny.UI.UITextBox(); + this.uiLabel9 = new Sunny.UI.UILabel(); + this.txtEmail = new Sunny.UI.UITextBox(); + this.uiLabel8 = new Sunny.UI.UILabel(); + this.txtWeChat = new Sunny.UI.UITextBox(); + this.uiLabel6 = new Sunny.UI.UILabel(); + this.txtTelePhone = new Sunny.UI.UITextBox(); + this.uiLabel5 = new Sunny.UI.UILabel(); + this.txtManagerId = new Sunny.UI.UITextBox(); + this.uiLabel3 = new Sunny.UI.UILabel(); + this.comboType = new Sunny.UI.UIComboBox(); + this.txtSortCode = new Sunny.UI.UIIntegerUpDown(); + this.btnConfirm = new Sunny.UI.UIButton(); + this.uiLabel12 = new Sunny.UI.UILabel(); + this.txtRemark = new Sunny.UI.UITextBox(); + this.uiLabel7 = new Sunny.UI.UILabel(); + this.txtName = new Sunny.UI.UITextBox(); + this.uiLabel2 = new Sunny.UI.UILabel(); + this.uiLabel4 = new Sunny.UI.UILabel(); + this.txtEnCode = new Sunny.UI.UITextBox(); + this.uiLabel1 = new Sunny.UI.UILabel(); + this.uiPanel1.SuspendLayout(); + this.titlePanel.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // uiPanel1 + // + this.uiPanel1.Controls.Add(this.titlePanel); + this.uiPanel1.Controls.Add(this.panel1); + this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiPanel1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(241)))), ((int)(((byte)(243))))); + this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiPanel1.Location = new System.Drawing.Point(0, 0); + this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1); + this.uiPanel1.Name = "uiPanel1"; + this.uiPanel1.RectColor = System.Drawing.Color.Silver; + this.uiPanel1.Size = new System.Drawing.Size(686, 530); + this.uiPanel1.Style = Sunny.UI.UIStyle.Custom; + this.uiPanel1.StyleCustomMode = true; + this.uiPanel1.TabIndex = 6; + this.uiPanel1.Text = null; + this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // titlePanel + // + this.titlePanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.titlePanel.Controls.Add(this.lblTitle); + this.titlePanel.Controls.Add(this.btnClose); + this.titlePanel.Dock = System.Windows.Forms.DockStyle.Top; + this.titlePanel.Location = new System.Drawing.Point(0, 0); + this.titlePanel.Name = "titlePanel"; + this.titlePanel.Size = new System.Drawing.Size(686, 43); + this.titlePanel.TabIndex = 7; + this.titlePanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.titlePanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // lblTitle + // + this.lblTitle.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblTitle.Location = new System.Drawing.Point(0, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(641, 43); + this.lblTitle.Style = Sunny.UI.UIStyle.Custom; + this.lblTitle.TabIndex = 1; + this.lblTitle.Text = "新增角色"; + this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblTitle.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.lblTitle.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // btnClose + // + this.btnClose.Dock = System.Windows.Forms.DockStyle.Right; + this.btnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnClose.Location = new System.Drawing.Point(641, 0); + this.btnClose.MinimumSize = new System.Drawing.Size(1, 1); + this.btnClose.Name = "btnClose"; + this.btnClose.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0); + this.btnClose.Size = new System.Drawing.Size(45, 43); + this.btnClose.Style = Sunny.UI.UIStyle.Custom; + this.btnClose.Symbol = 77; + this.btnClose.SymbolSize = 60; + this.btnClose.TabIndex = 0; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + this.btnClose.MouseEnter += new System.EventHandler(this.btnClose_MouseEnter); + this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.uiLabel14); + this.panel1.Controls.Add(this.uiLabel13); + this.panel1.Controls.Add(this.uiLabel11); + this.panel1.Controls.Add(this.txtAddress); + this.panel1.Controls.Add(this.uiLabel10); + this.panel1.Controls.Add(this.txtFax); + this.panel1.Controls.Add(this.uiLabel9); + this.panel1.Controls.Add(this.txtEmail); + this.panel1.Controls.Add(this.uiLabel8); + this.panel1.Controls.Add(this.txtWeChat); + this.panel1.Controls.Add(this.uiLabel6); + this.panel1.Controls.Add(this.txtTelePhone); + this.panel1.Controls.Add(this.uiLabel5); + this.panel1.Controls.Add(this.txtManagerId); + this.panel1.Controls.Add(this.uiLabel3); + this.panel1.Controls.Add(this.comboType); + this.panel1.Controls.Add(this.txtSortCode); + this.panel1.Controls.Add(this.btnConfirm); + this.panel1.Controls.Add(this.uiLabel12); + this.panel1.Controls.Add(this.txtRemark); + this.panel1.Controls.Add(this.uiLabel7); + this.panel1.Controls.Add(this.txtName); + this.panel1.Controls.Add(this.uiLabel2); + this.panel1.Controls.Add(this.uiLabel4); + this.panel1.Controls.Add(this.txtEnCode); + this.panel1.Controls.Add(this.uiLabel1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(686, 530); + this.panel1.TabIndex = 6; + // + // uiLabel14 + // + this.uiLabel14.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel14.ForeColor = System.Drawing.Color.Red; + this.uiLabel14.Location = new System.Drawing.Point(53, 135); + this.uiLabel14.Name = "uiLabel14"; + this.uiLabel14.Size = new System.Drawing.Size(21, 29); + this.uiLabel14.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel14.StyleCustomMode = true; + this.uiLabel14.TabIndex = 59; + this.uiLabel14.Text = "*"; + this.uiLabel14.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel13 + // + this.uiLabel13.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel13.ForeColor = System.Drawing.Color.Red; + this.uiLabel13.Location = new System.Drawing.Point(372, 73); + this.uiLabel13.Name = "uiLabel13"; + this.uiLabel13.Size = new System.Drawing.Size(21, 29); + this.uiLabel13.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel13.StyleCustomMode = true; + this.uiLabel13.TabIndex = 58; + this.uiLabel13.Text = "*"; + this.uiLabel13.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel11 + // + this.uiLabel11.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel11.ForeColor = System.Drawing.Color.Red; + this.uiLabel11.Location = new System.Drawing.Point(53, 73); + this.uiLabel11.Name = "uiLabel11"; + this.uiLabel11.Size = new System.Drawing.Size(21, 29); + this.uiLabel11.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel11.StyleCustomMode = true; + this.uiLabel11.TabIndex = 57; + this.uiLabel11.Text = "*"; + this.uiLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtAddress + // + this.txtAddress.ButtonFillColor = System.Drawing.Color.White; + this.txtAddress.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtAddress.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtAddress.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAddress.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtAddress.ButtonSymbol = 61761; + this.txtAddress.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtAddress.FillColor2 = System.Drawing.Color.White; + this.txtAddress.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtAddress.Location = new System.Drawing.Point(129, 302); + this.txtAddress.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtAddress.Maximum = 2147483647D; + this.txtAddress.MaxLength = 20; + this.txtAddress.Minimum = -2147483648D; + this.txtAddress.MinimumSize = new System.Drawing.Size(1, 16); + this.txtAddress.Name = "txtAddress"; + this.txtAddress.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtAddress.Size = new System.Drawing.Size(188, 42); + + this.txtAddress.StyleCustomMode = true; + this.txtAddress.TabIndex = 9; + this.txtAddress.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel10 + // + this.uiLabel10.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel10.Location = new System.Drawing.Point(57, 309); + this.uiLabel10.Name = "uiLabel10"; + this.uiLabel10.Size = new System.Drawing.Size(65, 29); + this.uiLabel10.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel10.TabIndex = 56; + this.uiLabel10.Text = "地址"; + this.uiLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtFax + // + this.txtFax.ButtonFillColor = System.Drawing.Color.White; + this.txtFax.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtFax.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtFax.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtFax.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtFax.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtFax.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtFax.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtFax.ButtonSymbol = 61761; + this.txtFax.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtFax.FillColor2 = System.Drawing.Color.White; + this.txtFax.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtFax.Location = new System.Drawing.Point(444, 239); + this.txtFax.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtFax.Maximum = 2147483647D; + this.txtFax.MaxLength = 20; + this.txtFax.Minimum = -2147483648D; + this.txtFax.MinimumSize = new System.Drawing.Size(1, 16); + this.txtFax.Name = "txtFax"; + this.txtFax.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtFax.Size = new System.Drawing.Size(188, 42); + + this.txtFax.StyleCustomMode = true; + this.txtFax.TabIndex = 8; + this.txtFax.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel9 + // + this.uiLabel9.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel9.Location = new System.Drawing.Point(372, 246); + this.uiLabel9.Name = "uiLabel9"; + this.uiLabel9.Size = new System.Drawing.Size(65, 29); + this.uiLabel9.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel9.TabIndex = 56; + this.uiLabel9.Text = "传真"; + this.uiLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtEmail + // + this.txtEmail.ButtonFillColor = System.Drawing.Color.White; + this.txtEmail.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtEmail.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtEmail.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEmail.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtEmail.ButtonSymbol = 61761; + this.txtEmail.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtEmail.FillColor2 = System.Drawing.Color.White; + this.txtEmail.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtEmail.Location = new System.Drawing.Point(129, 245); + this.txtEmail.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtEmail.Maximum = 2147483647D; + this.txtEmail.MaxLength = 20; + this.txtEmail.Minimum = -2147483648D; + this.txtEmail.MinimumSize = new System.Drawing.Size(1, 16); + this.txtEmail.Name = "txtEmail"; + this.txtEmail.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEmail.Size = new System.Drawing.Size(188, 42); + + this.txtEmail.StyleCustomMode = true; + this.txtEmail.TabIndex = 7; + this.txtEmail.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel8 + // + this.uiLabel8.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel8.Location = new System.Drawing.Point(57, 252); + this.uiLabel8.Name = "uiLabel8"; + this.uiLabel8.Size = new System.Drawing.Size(65, 29); + this.uiLabel8.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel8.TabIndex = 54; + this.uiLabel8.Text = "邮箱"; + this.uiLabel8.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtWeChat + // + this.txtWeChat.ButtonFillColor = System.Drawing.Color.White; + this.txtWeChat.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtWeChat.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtWeChat.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtWeChat.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtWeChat.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtWeChat.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtWeChat.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtWeChat.ButtonSymbol = 61761; + this.txtWeChat.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtWeChat.FillColor2 = System.Drawing.Color.White; + this.txtWeChat.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtWeChat.Location = new System.Drawing.Point(444, 184); + this.txtWeChat.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtWeChat.Maximum = 2147483647D; + this.txtWeChat.MaxLength = 20; + this.txtWeChat.Minimum = -2147483648D; + this.txtWeChat.MinimumSize = new System.Drawing.Size(1, 16); + this.txtWeChat.Name = "txtWeChat"; + this.txtWeChat.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtWeChat.Size = new System.Drawing.Size(188, 42); + + this.txtWeChat.StyleCustomMode = true; + this.txtWeChat.TabIndex = 6; + this.txtWeChat.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel6 + // + this.uiLabel6.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel6.Location = new System.Drawing.Point(372, 191); + this.uiLabel6.Name = "uiLabel6"; + this.uiLabel6.Size = new System.Drawing.Size(65, 29); + this.uiLabel6.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel6.TabIndex = 52; + this.uiLabel6.Text = "微信"; + this.uiLabel6.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtTelePhone + // + this.txtTelePhone.ButtonFillColor = System.Drawing.Color.White; + this.txtTelePhone.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtTelePhone.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtTelePhone.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtTelePhone.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtTelePhone.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtTelePhone.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtTelePhone.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtTelePhone.ButtonSymbol = 61761; + this.txtTelePhone.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtTelePhone.FillColor2 = System.Drawing.Color.White; + this.txtTelePhone.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtTelePhone.Location = new System.Drawing.Point(129, 184); + this.txtTelePhone.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtTelePhone.Maximum = 2147483647D; + this.txtTelePhone.MaxLength = 20; + this.txtTelePhone.Minimum = -2147483648D; + this.txtTelePhone.MinimumSize = new System.Drawing.Size(1, 16); + this.txtTelePhone.Name = "txtTelePhone"; + this.txtTelePhone.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtTelePhone.Size = new System.Drawing.Size(188, 42); + + this.txtTelePhone.StyleCustomMode = true; + this.txtTelePhone.TabIndex = 5; + this.txtTelePhone.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel5 + // + this.uiLabel5.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel5.Location = new System.Drawing.Point(12, 191); + this.uiLabel5.Name = "uiLabel5"; + this.uiLabel5.Size = new System.Drawing.Size(110, 29); + this.uiLabel5.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel5.TabIndex = 50; + this.uiLabel5.Text = "联系电话"; + this.uiLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtManagerId + // + this.txtManagerId.ButtonFillColor = System.Drawing.Color.White; + this.txtManagerId.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtManagerId.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtManagerId.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtManagerId.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtManagerId.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtManagerId.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtManagerId.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtManagerId.ButtonSymbol = 61761; + this.txtManagerId.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtManagerId.FillColor2 = System.Drawing.Color.White; + this.txtManagerId.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtManagerId.Location = new System.Drawing.Point(444, 124); + this.txtManagerId.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtManagerId.Maximum = 2147483647D; + this.txtManagerId.MaxLength = 20; + this.txtManagerId.Minimum = -2147483648D; + this.txtManagerId.MinimumSize = new System.Drawing.Size(1, 16); + this.txtManagerId.Name = "txtManagerId"; + this.txtManagerId.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtManagerId.Size = new System.Drawing.Size(188, 42); + + this.txtManagerId.StyleCustomMode = true; + this.txtManagerId.TabIndex = 4; + this.txtManagerId.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel3 + // + this.uiLabel3.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel3.Location = new System.Drawing.Point(372, 131); + this.uiLabel3.Name = "uiLabel3"; + this.uiLabel3.Size = new System.Drawing.Size(65, 29); + this.uiLabel3.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel3.TabIndex = 48; + this.uiLabel3.Text = "主管"; + this.uiLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // comboType + // + this.comboType.DataSource = null; + this.comboType.FillColor = System.Drawing.Color.White; + this.comboType.FillColor2 = System.Drawing.Color.White; + this.comboType.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.comboType.ItemHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(155)))), ((int)(((byte)(200)))), ((int)(((byte)(255))))); + this.comboType.ItemSelectBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.comboType.ItemSelectForeColor = System.Drawing.Color.White; + this.comboType.Location = new System.Drawing.Point(129, 128); + this.comboType.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.comboType.MinimumSize = new System.Drawing.Size(63, 0); + this.comboType.Name = "comboType"; + this.comboType.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2); + this.comboType.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.comboType.Size = new System.Drawing.Size(188, 36); + + this.comboType.StyleCustomMode = true; + this.comboType.TabIndex = 3; + this.comboType.Text = "uiComboBox1"; + this.comboType.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // txtSortCode + // + this.txtSortCode.FillColor = System.Drawing.Color.White; + this.txtSortCode.FillColor2 = System.Drawing.Color.White; + this.txtSortCode.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtSortCode.Location = new System.Drawing.Point(444, 302); + this.txtSortCode.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtSortCode.MinimumSize = new System.Drawing.Size(100, 0); + this.txtSortCode.Name = "txtSortCode"; + this.txtSortCode.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtSortCode.Size = new System.Drawing.Size(188, 36); + + this.txtSortCode.StyleCustomMode = true; + this.txtSortCode.TabIndex = 10; + this.txtSortCode.Text = "txtSortCode"; + this.txtSortCode.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnConfirm + // + this.btnConfirm.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnConfirm.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnConfirm.FillColor = System.Drawing.Color.White; + this.btnConfirm.FillColor2 = System.Drawing.Color.White; + this.btnConfirm.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnConfirm.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.btnConfirm.ForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.btnConfirm.ForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnConfirm.ForeSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnConfirm.Location = new System.Drawing.Point(549, 474); + this.btnConfirm.MinimumSize = new System.Drawing.Size(1, 1); + this.btnConfirm.Name = "btnConfirm"; + this.btnConfirm.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.btnConfirm.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.btnConfirm.Size = new System.Drawing.Size(125, 44); + + this.btnConfirm.StyleCustomMode = true; + this.btnConfirm.TabIndex = 12; + this.btnConfirm.Text = "确定"; + this.btnConfirm.Click += new System.EventHandler(this.btnConfirm_Click); + // + // uiLabel12 + // + this.uiLabel12.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel12.Location = new System.Drawing.Point(330, 308); + this.uiLabel12.Name = "uiLabel12"; + this.uiLabel12.Size = new System.Drawing.Size(107, 29); + this.uiLabel12.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel12.TabIndex = 45; + this.uiLabel12.Text = "排序号"; + this.uiLabel12.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtRemark + // + this.txtRemark.ButtonFillColor = System.Drawing.Color.White; + this.txtRemark.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtRemark.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtRemark.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtRemark.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtRemark.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtRemark.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtRemark.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtRemark.ButtonSymbol = 61761; + this.txtRemark.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtRemark.FillColor2 = System.Drawing.Color.White; + this.txtRemark.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtRemark.Location = new System.Drawing.Point(129, 373); + this.txtRemark.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtRemark.Maximum = 2147483647D; + this.txtRemark.MaxLength = 128; + this.txtRemark.Minimum = -2147483648D; + this.txtRemark.MinimumSize = new System.Drawing.Size(1, 16); + this.txtRemark.Multiline = true; + this.txtRemark.Name = "txtRemark"; + this.txtRemark.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtRemark.Size = new System.Drawing.Size(414, 90); + + this.txtRemark.StyleCustomMode = true; + this.txtRemark.TabIndex = 11; + this.txtRemark.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + this.txtRemark.Watermark = "请输入内容 "; + // + // uiLabel7 + // + this.uiLabel7.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel7.Location = new System.Drawing.Point(12, 373); + this.uiLabel7.Name = "uiLabel7"; + this.uiLabel7.Size = new System.Drawing.Size(110, 29); + this.uiLabel7.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel7.TabIndex = 35; + this.uiLabel7.Text = "备注"; + this.uiLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtName + // + this.txtName.ButtonFillColor = System.Drawing.Color.White; + this.txtName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtName.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtName.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtName.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtName.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtName.ButtonSymbol = 61761; + this.txtName.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtName.FillColor2 = System.Drawing.Color.White; + this.txtName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtName.Location = new System.Drawing.Point(444, 66); + this.txtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtName.Maximum = 2147483647D; + this.txtName.MaxLength = 20; + this.txtName.Minimum = -2147483648D; + this.txtName.MinimumSize = new System.Drawing.Size(1, 16); + this.txtName.Name = "txtName"; + this.txtName.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtName.Size = new System.Drawing.Size(188, 42); + + this.txtName.StyleCustomMode = true; + this.txtName.TabIndex = 2; + this.txtName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel2 + // + this.uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel2.Location = new System.Drawing.Point(373, 73); + this.uiLabel2.Name = "uiLabel2"; + this.uiLabel2.Size = new System.Drawing.Size(65, 29); + this.uiLabel2.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel2.TabIndex = 23; + this.uiLabel2.Text = "名称"; + this.uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel4 + // + this.uiLabel4.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel4.Location = new System.Drawing.Point(56, 131); + this.uiLabel4.Name = "uiLabel4"; + this.uiLabel4.Size = new System.Drawing.Size(65, 29); + this.uiLabel4.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel4.TabIndex = 25; + this.uiLabel4.Text = "类型"; + this.uiLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtEnCode + // + this.txtEnCode.ButtonFillColor = System.Drawing.Color.White; + this.txtEnCode.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEnCode.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.txtEnCode.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.txtEnCode.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.txtEnCode.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.txtEnCode.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEnCode.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.txtEnCode.ButtonSymbol = 61761; + this.txtEnCode.Cursor = System.Windows.Forms.Cursors.IBeam; + this.txtEnCode.FillColor2 = System.Drawing.Color.White; + this.txtEnCode.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.txtEnCode.Location = new System.Drawing.Point(129, 66); + this.txtEnCode.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.txtEnCode.Maximum = 2147483647D; + this.txtEnCode.MaxLength = 20; + this.txtEnCode.Minimum = -2147483648D; + this.txtEnCode.MinimumSize = new System.Drawing.Size(1, 16); + this.txtEnCode.Name = "txtEnCode"; + this.txtEnCode.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.txtEnCode.Size = new System.Drawing.Size(188, 42); + + this.txtEnCode.StyleCustomMode = true; + this.txtEnCode.TabIndex = 1; + this.txtEnCode.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel1 + // + this.uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiLabel1.Location = new System.Drawing.Point(57, 73); + this.uiLabel1.Name = "uiLabel1"; + this.uiLabel1.Size = new System.Drawing.Size(65, 29); + this.uiLabel1.Style = Sunny.UI.UIStyle.Custom; + this.uiLabel1.TabIndex = 21; + this.uiLabel1.Text = "编码"; + this.uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // AddOrganizeForm + // + this.AllowShowTitle = false; + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(686, 530); + this.Controls.Add(this.uiPanel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AddOrganizeForm"; + this.Padding = new System.Windows.Forms.Padding(0); + this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.ShowTitle = false; + this.ShowTitleIcon = true; + this.Style = Sunny.UI.UIStyle.Custom; + this.Text = "新增用户"; + this.TitleColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.TitleForeColor = System.Drawing.Color.DimGray; + this.TopMost = true; + this.Load += new System.EventHandler(this.AddOrganizeForm_Load); + this.uiPanel1.ResumeLayout(false); + this.titlePanel.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private Sunny.UI.UIPanel uiPanel1; + private System.Windows.Forms.Panel titlePanel; + private Sunny.UI.UILabel lblTitle; + private Sunny.UI.UISymbolLabel btnClose; + private System.Windows.Forms.Panel panel1; + private Sunny.UI.UITextBox txtRemark; + private Sunny.UI.UILabel uiLabel7; + private Sunny.UI.UITextBox txtName; + private Sunny.UI.UILabel uiLabel2; + private Sunny.UI.UITextBox txtEnCode; + private Sunny.UI.UILabel uiLabel1; + private Sunny.UI.UILabel uiLabel12; + private Sunny.UI.UIButton btnConfirm; + private Sunny.UI.UIIntegerUpDown txtSortCode; + private Sunny.UI.UIComboBox comboType; + private Sunny.UI.UILabel uiLabel4; + private Sunny.UI.UITextBox txtManagerId; + private Sunny.UI.UILabel uiLabel3; + private Sunny.UI.UITextBox txtTelePhone; + private Sunny.UI.UILabel uiLabel5; + private Sunny.UI.UITextBox txtWeChat; + private Sunny.UI.UILabel uiLabel6; + private Sunny.UI.UITextBox txtEmail; + private Sunny.UI.UILabel uiLabel8; + private Sunny.UI.UITextBox txtFax; + private Sunny.UI.UILabel uiLabel9; + private Sunny.UI.UITextBox txtAddress; + private Sunny.UI.UILabel uiLabel10; + private Sunny.UI.UILabel uiLabel11; + private Sunny.UI.UILabel uiLabel14; + private Sunny.UI.UILabel uiLabel13; + } +} \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.cs b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.cs new file mode 100644 index 0000000..6fd7389 --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.cs @@ -0,0 +1,226 @@ + +using DH.RBAC.Common; +using DH.RBAC.Logic.Sys; +using DH.RBAC.Model.Sys; +using DH.RBAC.Utility.Other; +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace DH.RBAC.Page.Sys.Organize +{ + public partial class AddOrganizeForm : UIForm + { + private SysOrganizeLogic organizeLogic; + public AddOrganizeForm() + { + InitializeComponent(); + organizeLogic = new SysOrganizeLogic(); + } + + #region 标题栏 + private void btnClose_Click(object sender, EventArgs e) + { + FormHelper.subForm = null; + ParentPage.btnQuery_Click(null, null); + this.Close(); + } + private Point mPoint; + private void titlePanel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void titlePanel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + private void btnClose_MouseEnter(object sender, EventArgs e) + { + btnClose.BackColor = Color.FromArgb(231, 231, 231); + } + + private void btnClose_MouseLeave(object sender, EventArgs e) + { + btnClose.BackColor = Color.Transparent; + + } + #endregion + + + public OrganizePage ParentPage { get; set; } + public string Id { get; set; } + + /// + /// 画面加载,读取用户信息,显示在界面上 + /// + /// + /// + private void AddOrganizeForm_Load(object sender, EventArgs e) + { + comboType.Items.Add("公司"); + comboType.Items.Add("部门"); + comboType.Items.Add("小组"); + comboType.SelectedIndex = 1; + + if (StringHelper.IsNullOrEmpty(Id)) + { + lblTitle.Text = "新增机构"; + txtEnCode.Enabled = true; + } + else + { + lblTitle.Text = "修改机构"; + txtEnCode.Enabled = false; + } + //获取部门下拉列表的值 + if (StringHelper.IsNullOrEmpty(Id)) + { + return; + } + SysOrganize entity = organizeLogic.Get(Id); + if (entity == null) + { + AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); + + btnClose_Click(null, null); + return; + } + //给文本框赋值 + txtEnCode.Text = entity.EnCode; + txtName.Text = entity.FullName; + comboType.SelectedIndex = entity.Type.Value; + txtManagerId.Text = entity.ManagerId; + txtTelePhone.Text = entity.TelePhone; + txtWeChat.Text = entity.WeChat; + txtEmail.Text = entity.Email; + txtFax.Text = entity.Fax; + txtAddress.Text = entity.Address; + txtSortCode.Value = entity.SortCode.Value; + txtRemark.Text = entity.Remark; + } + + + /// + /// 确定按钮点击事件 + /// + /// + /// + private void btnConfirm_Click(object sender, EventArgs e) + { + if (StringHelper.IsNullOrEmpty(Id)) + { + DoAdd(); + } + else + { + DoUpdate(); + } + } + + /// + /// 执行更新操作 + /// + private void DoUpdate() + { + bool flag = ChechEmpty(); + if (!flag) + { + return; + } + SysOrganize model = new SysOrganize(); + model.Id = Id; + model.EnCode = txtEnCode.Text; + model.FullName = txtName.Text; + model.Type = comboType.SelectedIndex; + model.ManagerId = txtManagerId.Text; + model.TelePhone = txtTelePhone.Text; + model.WeChat = txtWeChat.Text; + model.Email = txtEmail.Text; + model.Fax = txtFax.Text; + model.Address = txtAddress.Text; + model.SortCode = txtSortCode.Value; + model.Remark = txtRemark.Text; + model.ModifyUserId = GlobalConfig.CurrentUser.Id; + int row = organizeLogic.AppUpdate(model, model.ModifyUserId); + if (row == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); + + + return; + } + + + btnClose_Click(null, null); + + } + + /// + /// 数据校验 + /// + /// + /// + private bool ChechEmpty() + { + if (StringHelper.IsNullOrEmpty(txtEnCode.Text)) + { + AntdUI.Message.warn(this, "编码不能为空!", autoClose: 3); + + return false; + } + if (StringHelper.IsNullOrEmpty(txtName.Text)) + { + AntdUI.Message.warn(this, "名称不能为空!", autoClose: 3); + + return false; + } + if (StringHelper.IsNullOrEmpty(comboType.SelectedItem.ToString())) + { + AntdUI.Message.warn(this, "类型不能为空!", autoClose: 3); + + return false; + } + return true; + } + + + /// + /// 执行新增操作 + /// + private void DoAdd() + { + bool flag = ChechEmpty(); + if (!flag) + return; + SysOrganize model = new SysOrganize(); + model.EnCode = txtEnCode.Text; + model.FullName = txtName.Text; + model.Type = comboType.SelectedIndex; + model.ManagerId = txtManagerId.Text; + model.TelePhone = txtTelePhone.Text; + model.WeChat = txtWeChat.Text; + model.Email = txtEmail.Text; + model.Fax = txtFax.Text; + model.Address = txtAddress.Text; + model.SortCode = txtSortCode.Value; + model.Remark = txtRemark.Text; + model.CreateUserId = GlobalConfig.CurrentUser.Id; + int row = organizeLogic.AppInsert(model, model.CreateUserId); + if (row == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); + + return; + } + + btnClose_Click(null, null); + } + } +} diff --git a/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.resx b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.resx new file mode 100644 index 0000000..01360ee --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/AddOrganizeForm.resx @@ -0,0 +1,1161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAgIAAAAEAIACoAAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AC4AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAsAAABkAAAAagAAAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAQAAAAOAAAADQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAB2AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAADwAAABsAAAAdAAAAHAAAABwAAAAdAAAAFQAAAAsAAAAMAAAAAwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAA2QAAAOUAAAApAAAAAAAAAAAAAAAAAAAAHwAA + AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAANUAAADTAAAAUgAA + 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 + AP0AAAD5AAAAIAAAAF8AAADBAAAAqwAAAJ4AAACqAAAAvAAAAKMAAACcAAAA1wAAAP8AAAD/AAAA/wAA + AN8AAABkAAAAAAAAALIAAAD/AAAA6gAAABkAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAygAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzgAAAKMAAAD/AAAA/wAAAF0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAIwAAAD2AAAA/wAAAP8AAAD/AAAA6QAAAP8AAACLAAAAAAAA + AAAAAAAOAAAAJAAAACQAAAAhAAAAdQAAAP8AAAD/AAAAWwAAAB8AAAAzAAAAMgAAAC4AAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAOAAAAXQAAANEAAAD/AAAA/wAAAP8AAACjAAAAcAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAmwAAAP8AAAD+AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAABFAAAA+QAAAPEAAADtAAAA5wAAAN4AAADUAAAA1QAAAN0AAADeAAAA3gAA + APkAAAD/AAAA/wAAAPAAAADeAAAA3gAAANwAAADSAAAA2QAAAN4AAADnAAAA7AAAAPMAAAD5AAAAOgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTAAAA8gAA + AOYAAADfAAAA4AAAAOwAAADTAAAAPQAAAJoAAACMAAAAeQAAAGkAAADNAAAA/wAAAP8AAACZAAAAdAAA + AJUAAAB1AAAApAAAAP8AAAD/AAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/wAA + AP8AAAD8AAAA9gAAAPgAAAD/AAAA/wAAALgAAACkAAAAqwAAANMAAAD/AAAA/wAAAO4AAACpAAAA/wAA + AP8AAABvAAAAxgAAAOAAAADiAAAAtQAAAGEAAAB8AAAAYAAAAAMAAAAAAAAAAAAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA2AAAAE0AAABYAAAA/wAAAP8AAAB/AAAAQwAAAEQAAABKAAAA6wAAAP8AAAC1AAAA2gAA + AP8AAADcAAAADQAAAAAAAACMAAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2AAAAKQAA + ACAAAAAWAAAAAQAAADQAAAAoAAAAAAAAAAAAAAAEAAAA0AAAAP8AAAD/AAAAjgAAAAQAAAAAAAAAAAAA + ADsAAAAVAAAAAwAAABYAAAAfAAAALAAAADYAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAApAAAAEQAAAAQAAAAIAAAAHwAAAC8AAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAEcAAAAAAAAAAAAAAAAAAACmAAAA/wAAAP8AAABbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAA6AAAAEUAAAAxAAAAMgAAADUAAABLAAAAbAAA + AP8AAAD/AAAA6gAAALsAAAC+AAAArAAAAJkAAAD/AAAA/wAAAGwAAADRAAAA7wAAAO4AAADIAAAA4wAA + AP8AAADaAAAABwAAAAAAAAAAAAAABAAAAK4AAAD/AAAA8AAAAIMAAAAWAAAAAAAAAFkAAAD/AAAA/wAA + AFoAAAAQAAAADwAAABcAAADmAAAA/wAAAIQAAACEAAAA/wAAAP8AAABdAAAAAAAAAHQAAAD/AAAA/wAA + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAA4AAAAOkAAACCAAAAGgAA + AAAAAADOAAAA/wAAAP8AAACJAAAAAAAAADYAAACaAAAA+wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AGcAAAAAAAAAAAAAADoAAABGAAAAKgAAACMAAAAPAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAHAAA + ACgAAABBAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADMAAAA/wAA + AP8AAADuAAAATAAAAAAAAAAVAAAAFgAAAAgAAAADAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAGAAAACAAAABMAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACgAAAA8QAAAOYAAACmAAAAAQAAAAAAAAAAAAAAAAAAAAQAAADKAAAAxwAA + AJ4AAAB+AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAUAAAA6QAAAP8AAAD6AAAA4AAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAACbAAAASgAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAjAAAACwAA + AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABOAAAATQAA + ADkAAABCAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADobtSBOF + 6ygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJfxomxXcBgMZ5CFbChRgVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADBcBQZwnYAf8J1AH7BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3DdgCBwnQAadqRAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABKI8ikEg/b0A4X55g6D8FcAAAAAAAAAAAAAAAAAAAAA358/CMF1 + BsPZgwD/yXkB/8J2A+XCdgOfxH0QPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB4B47chAD/0X4A/9F+ + AP/RfgD/0H4A/9J/AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/92F + AP/AcwDqv38AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVqv8GBoLzwACJ + //8Ahvv/AoT4/waE85gii/MWAAAAAAAAAADAdwuGz3wA/8N1AP/EdgD/yHgA/898AP/CcwL9wnYEqMR8 + EycAAAAAAAAAAAAAAAC9exUjxHUD7sd4AP/CdQD/wnUA/8J1AP/DdQD/xHYA/8JzAPvAcwD9wHMA/cBz + AP3AcwD9wHMA/cFzAP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3BcwD9xXMA+8Vy + APvFcgD7xXIA+8VyAPvFcgD7xHQA/MFzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cBzAP3BcwD9wXMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9yXgA/cN1ANW7dwAPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuC74EBif//AYHy/wGB8P8Bg/X/AIv//wOA79YAov4L2HkAO8Z3 + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY31GwuG84cqqtQGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJdzc3P//////39/f/8UFBT/Tk5O/01NTf8+Pj7/Ghoa/6enp///////kpKS/wAA + ALgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf3+/BByG6SQFgvb4DYTxgRmM + 8EUGgu9UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw3YORcZ3BfHMeALxx3cHib9/ + GRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMFAAAAMmIiIj/5ubm/8nJ + yf+5ubn/tra2/729vf/s7Oz//////56env8GBgbgAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAH//AhCF7i5Pn+8QCILwmgmG8JwViPJUC4TwiRWK8CMIhe49F4vvIQyF + 8igAlP8YjX9jEsN4BnDCcwbNyngDh8R7FSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAALhSUlL/wMDA//b29v//////+Pj4/8TExP9dXV3/AAAAygAA + AC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAn/8IVar/BhGI8ToPiO9UEIXyPwuE8W4Ph/BEEInxTgCL/jehgkgxyHoGS8J5GBUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + AFwAAAC2ISEh4CMjI/MfHx/iAQEBugAAAGkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAIAAAABUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Organize/OrganizePage.Designer.cs b/DH.RBAC/Views/Sys/Organize/OrganizePage.Designer.cs new file mode 100644 index 0000000..ac6e25e --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/OrganizePage.Designer.cs @@ -0,0 +1,424 @@ +namespace DH.RBAC.Page.Sys.Organize +{ + partial class OrganizePage + { + /// + /// 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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle11 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle12 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle19 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle20 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle(); + pagination = new Sunny.UI.UIPagination(); + panel5 = new System.Windows.Forms.Panel(); + panel1 = new System.Windows.Forms.Panel(); + dataGridView = new Sunny.UI.UIDataGridView(); + OrganizeId = new System.Windows.Forms.DataGridViewTextBoxColumn(); + OrganizeEncode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + OrganizeName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + OrganizeType = new System.Windows.Forms.DataGridViewTextBoxColumn(); + OrganizeRemark = new System.Windows.Forms.DataGridViewTextBoxColumn(); + RoleSortCode = new System.Windows.Forms.DataGridViewTextBoxColumn(); + panel6 = new System.Windows.Forms.Panel(); + btnDelete = new AntdUI.Button(); + btnUpdate = new AntdUI.Button(); + btnAdd = new AntdUI.Button(); + panel7 = new System.Windows.Forms.Panel(); + btnQuery = new Sunny.UI.UISymbolButton(); + txtKeywords = new Sunny.UI.UITextBox(); + panel4 = new System.Windows.Forms.Panel(); + panel3 = new System.Windows.Forms.Panel(); + panel2 = new System.Windows.Forms.Panel(); + panel5.SuspendLayout(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel6.SuspendLayout(); + panel7.SuspendLayout(); + panel2.SuspendLayout(); + SuspendLayout(); + // + // pagination + // + pagination.ButtonFillSelectedColor = System.Drawing.Color.FromArgb(64, 128, 204); + pagination.ButtonStyleInherited = false; + pagination.Dock = System.Windows.Forms.DockStyle.Bottom; + pagination.FillColor = System.Drawing.Color.White; + pagination.FillColor2 = System.Drawing.Color.White; + pagination.Font = new System.Drawing.Font("微软雅黑", 12F); + pagination.Location = new System.Drawing.Point(0, 492); + pagination.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); + pagination.MinimumSize = new System.Drawing.Size(1, 1); + pagination.Name = "pagination"; + pagination.PagerCount = 5; + pagination.PageSize = 10; + pagination.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + pagination.RectSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.None; + pagination.ShowText = false; + pagination.Size = new System.Drawing.Size(887, 26); + pagination.StyleCustomMode = true; + pagination.TabIndex = 11; + pagination.Text = "uiPagination1"; + pagination.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + pagination.PageChanged += pagination_PageChanged; + // + // panel5 + // + panel5.Controls.Add(panel1); + panel5.Controls.Add(panel6); + panel5.Controls.Add(panel4); + panel5.Controls.Add(panel3); + panel5.Dock = System.Windows.Forms.DockStyle.Fill; + panel5.Location = new System.Drawing.Point(0, 0); + panel5.Margin = new System.Windows.Forms.Padding(2); + panel5.Name = "panel5"; + panel5.Size = new System.Drawing.Size(923, 568); + panel5.TabIndex = 7; + // + // panel1 + // + panel1.Controls.Add(dataGridView); + panel1.Controls.Add(pagination); + panel1.Dock = System.Windows.Forms.DockStyle.Fill; + panel1.Location = new System.Drawing.Point(18, 50); + panel1.Margin = new System.Windows.Forms.Padding(2); + panel1.Name = "panel1"; + panel1.Size = new System.Drawing.Size(887, 518); + panel1.TabIndex = 12; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeRows = false; + dataGridViewCellStyle11.BackColor = System.Drawing.Color.White; + dataGridView.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle11; + dataGridView.BackgroundColor = System.Drawing.Color.White; + dataGridView.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle12.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle12.BackColor = System.Drawing.Color.FromArgb(216, 219, 227); + dataGridViewCellStyle12.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle12.ForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + dataGridViewCellStyle12.SelectionBackColor = System.Drawing.Color.FromArgb(216, 219, 227); + dataGridViewCellStyle12.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle12.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + dataGridView.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle12; + dataGridView.ColumnHeadersHeight = 32; + dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { OrganizeId, OrganizeEncode, OrganizeName, OrganizeType, OrganizeRemark, RoleSortCode }); + dataGridViewCellStyle18.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle18.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle18.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle18.ForeColor = System.Drawing.Color.FromArgb(48, 48, 48); + dataGridViewCellStyle18.SelectionBackColor = System.Drawing.Color.FromArgb(155, 200, 255); + dataGridViewCellStyle18.SelectionForeColor = System.Drawing.Color.FromArgb(48, 48, 48); + dataGridViewCellStyle18.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + dataGridView.DefaultCellStyle = dataGridViewCellStyle18; + dataGridView.Dock = System.Windows.Forms.DockStyle.Fill; + dataGridView.EnableHeadersVisualStyles = false; + dataGridView.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridView.GridColor = System.Drawing.Color.FromArgb(216, 219, 227); + dataGridView.Location = new System.Drawing.Point(0, 0); + dataGridView.Margin = new System.Windows.Forms.Padding(2); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + dataGridViewCellStyle19.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle19.BackColor = System.Drawing.Color.White; + dataGridViewCellStyle19.Font = new System.Drawing.Font("微软雅黑", 12F); + dataGridViewCellStyle19.ForeColor = System.Drawing.Color.FromArgb(48, 48, 48); + dataGridViewCellStyle19.SelectionBackColor = System.Drawing.Color.FromArgb(216, 219, 227); + dataGridViewCellStyle19.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle19.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + dataGridView.RowHeadersDefaultCellStyle = dataGridViewCellStyle19; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridViewCellStyle20.BackColor = System.Drawing.Color.White; + dataGridView.RowsDefaultCellStyle = dataGridViewCellStyle20; + dataGridView.RowTemplate.Height = 29; + dataGridView.SelectedIndex = -1; + dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new System.Drawing.Size(887, 492); + dataGridView.StripeOddColor = System.Drawing.Color.White; + dataGridView.StyleCustomMode = true; + dataGridView.TabIndex = 12; + // + // OrganizeId + // + OrganizeId.DataPropertyName = "Id"; + OrganizeId.HeaderText = "Id"; + OrganizeId.MinimumWidth = 6; + OrganizeId.Name = "OrganizeId"; + OrganizeId.ReadOnly = true; + OrganizeId.Visible = false; + OrganizeId.Width = 125; + // + // OrganizeEncode + // + OrganizeEncode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + OrganizeEncode.DataPropertyName = "Encode"; + dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle13.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + OrganizeEncode.DefaultCellStyle = dataGridViewCellStyle13; + OrganizeEncode.HeaderText = "编码"; + OrganizeEncode.MinimumWidth = 6; + OrganizeEncode.Name = "OrganizeEncode"; + OrganizeEncode.ReadOnly = true; + OrganizeEncode.Resizable = System.Windows.Forms.DataGridViewTriState.True; + OrganizeEncode.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // OrganizeName + // + OrganizeName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + OrganizeName.DataPropertyName = "FullName"; + dataGridViewCellStyle14.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle14.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + OrganizeName.DefaultCellStyle = dataGridViewCellStyle14; + OrganizeName.HeaderText = "名称"; + OrganizeName.MinimumWidth = 6; + OrganizeName.Name = "OrganizeName"; + OrganizeName.ReadOnly = true; + OrganizeName.Resizable = System.Windows.Forms.DataGridViewTriState.True; + OrganizeName.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // OrganizeType + // + OrganizeType.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + OrganizeType.DataPropertyName = "TypeStr"; + dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle15.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + OrganizeType.DefaultCellStyle = dataGridViewCellStyle15; + OrganizeType.HeaderText = "类型"; + OrganizeType.MinimumWidth = 6; + OrganizeType.Name = "OrganizeType"; + OrganizeType.ReadOnly = true; + OrganizeType.Resizable = System.Windows.Forms.DataGridViewTriState.True; + OrganizeType.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // OrganizeRemark + // + OrganizeRemark.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + OrganizeRemark.DataPropertyName = "Remark"; + dataGridViewCellStyle16.Alignment = System.Windows.Forms.DataGridViewContentAlignment.BottomCenter; + dataGridViewCellStyle16.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + OrganizeRemark.DefaultCellStyle = dataGridViewCellStyle16; + OrganizeRemark.HeaderText = "备注"; + OrganizeRemark.MinimumWidth = 6; + OrganizeRemark.Name = "OrganizeRemark"; + OrganizeRemark.ReadOnly = true; + OrganizeRemark.Resizable = System.Windows.Forms.DataGridViewTriState.True; + OrganizeRemark.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // RoleSortCode + // + RoleSortCode.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + RoleSortCode.DataPropertyName = "SortCode"; + dataGridViewCellStyle17.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle17.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + RoleSortCode.DefaultCellStyle = dataGridViewCellStyle17; + RoleSortCode.HeaderText = "排序码"; + RoleSortCode.MinimumWidth = 6; + RoleSortCode.Name = "RoleSortCode"; + RoleSortCode.ReadOnly = true; + RoleSortCode.Resizable = System.Windows.Forms.DataGridViewTriState.True; + RoleSortCode.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + // + // panel6 + // + panel6.Controls.Add(btnDelete); + panel6.Controls.Add(btnUpdate); + panel6.Controls.Add(btnAdd); + panel6.Controls.Add(panel7); + panel6.Dock = System.Windows.Forms.DockStyle.Top; + panel6.Location = new System.Drawing.Point(18, 0); + panel6.Margin = new System.Windows.Forms.Padding(2); + panel6.Name = "panel6"; + panel6.Size = new System.Drawing.Size(887, 50); + panel6.TabIndex = 9; + // + // btnDelete + // + btnDelete.Location = new System.Drawing.Point(235, 7); + btnDelete.Name = "btnDelete"; + btnDelete.Size = new System.Drawing.Size(98, 38); + btnDelete.TabIndex = 13; + btnDelete.Tag = "org-delete"; + btnDelete.Text = "删除机构"; + btnDelete.Visible = false; + // + // btnUpdate + // + btnUpdate.Location = new System.Drawing.Point(118, 7); + btnUpdate.Name = "btnUpdate"; + btnUpdate.Size = new System.Drawing.Size(98, 38); + btnUpdate.TabIndex = 12; + btnUpdate.Tag = "org-edit"; + btnUpdate.Text = "修改机构"; + btnUpdate.Visible = false; + // + // btnAdd + // + btnAdd.Location = new System.Drawing.Point(5, 7); + btnAdd.Name = "btnAdd"; + btnAdd.Size = new System.Drawing.Size(98, 38); + btnAdd.TabIndex = 11; + btnAdd.Tag = "org-add"; + btnAdd.Text = "新增机构"; + btnAdd.Visible = false; + // + // panel7 + // + panel7.Controls.Add(btnQuery); + panel7.Controls.Add(txtKeywords); + panel7.Dock = System.Windows.Forms.DockStyle.Right; + panel7.Location = new System.Drawing.Point(644, 0); + panel7.Margin = new System.Windows.Forms.Padding(2); + panel7.Name = "panel7"; + panel7.Size = new System.Drawing.Size(243, 50); + panel7.TabIndex = 3; + // + // btnQuery + // + btnQuery.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + btnQuery.Cursor = System.Windows.Forms.Cursors.Hand; + btnQuery.Font = new System.Drawing.Font("微软雅黑", 12F); + btnQuery.Location = new System.Drawing.Point(214, 9); + btnQuery.Margin = new System.Windows.Forms.Padding(2); + btnQuery.MinimumSize = new System.Drawing.Size(1, 1); + btnQuery.Name = "btnQuery"; + btnQuery.Size = new System.Drawing.Size(25, 36); + btnQuery.StyleCustomMode = true; + btnQuery.Symbol = 61442; + btnQuery.SymbolSize = 30; + btnQuery.TabIndex = 3; + btnQuery.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + // + // txtKeywords + // + txtKeywords.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + txtKeywords.ButtonFillColor = System.Drawing.Color.White; + txtKeywords.ButtonFillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtKeywords.ButtonFillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtKeywords.ButtonForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + txtKeywords.ButtonForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + txtKeywords.ButtonForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + txtKeywords.ButtonRectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtKeywords.ButtonRectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + txtKeywords.ButtonStyleInherited = false; + txtKeywords.ButtonSymbol = 61761; + txtKeywords.Cursor = System.Windows.Forms.Cursors.IBeam; + txtKeywords.FillColor2 = System.Drawing.Color.White; + txtKeywords.Font = new System.Drawing.Font("微软雅黑", 12F); + txtKeywords.Location = new System.Drawing.Point(4, 9); + txtKeywords.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3); + txtKeywords.MinimumSize = new System.Drawing.Size(1, 10); + txtKeywords.Name = "txtKeywords"; + txtKeywords.Padding = new System.Windows.Forms.Padding(3); + txtKeywords.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtKeywords.ShowText = false; + txtKeywords.Size = new System.Drawing.Size(206, 36); + txtKeywords.StyleCustomMode = true; + txtKeywords.TabIndex = 0; + txtKeywords.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + txtKeywords.Watermark = "机构名称或编码"; + txtKeywords.KeyDown += txtKeywords_KeyDown; + // + // panel4 + // + panel4.Dock = System.Windows.Forms.DockStyle.Right; + panel4.Location = new System.Drawing.Point(905, 0); + panel4.Margin = new System.Windows.Forms.Padding(2); + panel4.Name = "panel4"; + panel4.Size = new System.Drawing.Size(18, 568); + panel4.TabIndex = 5; + // + // panel3 + // + panel3.Dock = System.Windows.Forms.DockStyle.Left; + panel3.Location = new System.Drawing.Point(0, 0); + panel3.Margin = new System.Windows.Forms.Padding(2); + panel3.Name = "panel3"; + panel3.Size = new System.Drawing.Size(18, 568); + panel3.TabIndex = 4; + // + // panel2 + // + panel2.Controls.Add(panel5); + panel2.Dock = System.Windows.Forms.DockStyle.Fill; + panel2.Location = new System.Drawing.Point(0, 0); + panel2.Margin = new System.Windows.Forms.Padding(2); + panel2.Name = "panel2"; + panel2.Size = new System.Drawing.Size(923, 568); + panel2.TabIndex = 5; + // + // OrganizePage + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + BackColor = System.Drawing.Color.FromArgb(235, 241, 243); + Controls.Add(panel2); + Margin = new System.Windows.Forms.Padding(2); + Name = "OrganizePage"; + Size = new System.Drawing.Size(923, 568); + panel5.ResumeLayout(false); + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel6.ResumeLayout(false); + panel7.ResumeLayout(false); + panel2.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private Sunny.UI.UIPagination pagination; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.Panel panel7; + private Sunny.UI.UITextBox txtKeywords; + private System.Windows.Forms.Panel panel2; + private Sunny.UI.UISymbolButton btnQuery; + private System.Windows.Forms.Panel panel1; + private Sunny.UI.UIDataGridView dataGridView; + private System.Windows.Forms.DataGridViewTextBoxColumn OrganizeId; + private System.Windows.Forms.DataGridViewTextBoxColumn OrganizeEncode; + private System.Windows.Forms.DataGridViewTextBoxColumn OrganizeName; + private System.Windows.Forms.DataGridViewTextBoxColumn OrganizeType; + private System.Windows.Forms.DataGridViewTextBoxColumn OrganizeRemark; + private System.Windows.Forms.DataGridViewTextBoxColumn RoleSortCode; + private AntdUI.Button btnDelete; + private AntdUI.Button btnUpdate; + private AntdUI.Button btnAdd; + } +} \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Organize/OrganizePage.cs b/DH.RBAC/Views/Sys/Organize/OrganizePage.cs new file mode 100644 index 0000000..afeaab8 --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/OrganizePage.cs @@ -0,0 +1,187 @@ + +using DH.RBAC.Common; +using Sunny.UI; +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 DH.RBAC.Logic.Sys; +using DH.RBAC.Model.Sys; +using DH.RBAC.Utility.Other; +using AntdUI; + + +namespace DH.RBAC.Page.Sys.Organize +{ + [PageCode("sys-organize")] + public partial class OrganizePage : MyPage + { + private SysOrganizeLogic organizeLogic; + Window window; + public OrganizePage(Window _window) + { + window= _window; + InitializeComponent(); + organizeLogic = new SysOrganizeLogic(); + dataGridView.AutoGenerateColumns = false; + Load += OrganizePage_Initialize; + btnQuery.Click += btnQuery_Click; + btnAdd.Click += btnAdd_Click; + btnDelete.Click += btnDelete_Click; + btnUpdate.Click += btnModify_Click; + } + /// + /// 界面初始化 + /// + /// + /// + private void OrganizePage_Initialize(object sender, EventArgs e) + { + btnQuery_Click(null, null); + } + + /// + /// 查询按钮 + /// + /// + /// + public void btnQuery_Click(object sender, EventArgs e) + { + //调用服务器获得数据 + int totalCount = 0; + List list = organizeLogic.GetList(pagination.ActivePage, pagination.PageSize, txtKeywords.Text, ref totalCount); + pagination.TotalCount = totalCount; + dataGridView.DataSource = list; + } + + /// + /// 关键字Enter键处理 + /// + /// + /// + private void txtKeywords_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + btnQuery_Click(sender, null); + } + + /// + /// 新增组织机构 + /// + /// + /// + private void btnAdd_Click(object sender, EventArgs e) + { + AddOrganizeForm form = new AddOrganizeForm(); + form.ParentPage = this; + form.Id = string.Empty; + FormHelper.ShowSubForm(form); + } + + + /// + /// 修改组织机构 + /// + /// + /// + private void btnModify_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 0) + { + AntdUI.Message.warn(window, "请选择一行数据进行修改!", autoClose: 3); + + return; + } + int index = dataGridView.SelectedIndex; + if (index < 0) + { + AntdUI.Message.warn(window, "请选择一行数据进行修改!", autoClose: 3); + + return; + } + string id = dataGridView.Rows[index].Cells["OrganizeId"].Value.ToString(); + AddOrganizeForm form = new AddOrganizeForm(); + form.ParentPage = this; + form.Id = id; + FormHelper.ShowSubForm(form); + } + + + /// + /// 删除组织机构 + /// + /// + /// + private void btnDelete_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 0) + { + AntdUI.Message.warn(window, "请选择一行数据进行删除!", autoClose: 3); + + + return; + } + int index = dataGridView.SelectedIndex; + if (index < 0) + { + AntdUI.Message.warn(window, "请选择一行数据进行删除!", autoClose: 3); + + return; + } + string id = dataGridView.Rows[index].Cells["OrganizeId"].Value.ToString(); + + var result = AntdUI.Modal.open(window, "删除警告!", "您是否确定要删除该机构?", TType.Warn); + if (result == DialogResult.OK) + { + + try + { + int row = 0; + int count = organizeLogic.GetChildCount(id); + if (count > 0) + { + AntdUI.Message.warn(window, $"操作失败,请先删除该项的{count}个子级机构。", autoClose: 3); + + return; + } + row = organizeLogic.Delete(id); + + if (row == 0) + { + AntdUI.Message.warn(window, "对不起,操作失败", autoClose: 3); + + + return; + } + //重新查询 + btnQuery_Click(null, null); + } + catch + { + AntdUI.Message.warn(window, "网络或服务器异常,请稍后再试", autoClose: 3); + + + } + } + } + + /// + /// 页码发生改变 + /// + /// + /// + /// + /// + private void pagination_PageChanged(object sender, object pagingSource, int pageIndex, int count) + { + btnQuery_Click(null, null); + } + + + } +} diff --git a/DH.RBAC/Views/Sys/Organize/OrganizePage.resx b/DH.RBAC/Views/Sys/Organize/OrganizePage.resx new file mode 100644 index 0000000..bccfb7a --- /dev/null +++ b/DH.RBAC/Views/Sys/Organize/OrganizePage.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Permission/AddPermissionForm.Designer.cs b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.Designer.cs new file mode 100644 index 0000000..8ddf506 --- /dev/null +++ b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.Designer.cs @@ -0,0 +1,553 @@ +namespace DH.RBAC.Page.Sys.Permission +{ + partial class AddPermissionForm + { + /// + /// 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(AddPermissionForm)); + uiPanel1 = new Sunny.UI.UIPanel(); + titlePanel = new System.Windows.Forms.Panel(); + lblTitle = new Sunny.UI.UILabel(); + btnClose = new Sunny.UI.UISymbolLabel(); + panel1 = new System.Windows.Forms.Panel(); + uiComboTreeView1 = new Sunny.UI.UIComboTreeView(); + btnSelectIcon = new Sunny.UI.UISymbolButton(); + uiLabel9 = new Sunny.UI.UILabel(); + txtType = new Sunny.UI.UIComboBox(); + uiLabel14 = new Sunny.UI.UILabel(); + uiLabel13 = new Sunny.UI.UILabel(); + uiLabel11 = new Sunny.UI.UILabel(); + txtIcon = new Sunny.UI.UITextBox(); + uiLabel8 = new Sunny.UI.UILabel(); + uiLabel5 = new Sunny.UI.UILabel(); + txtSortCode = new Sunny.UI.UIIntegerUpDown(); + btnConfirm = new Sunny.UI.UIButton(); + uiLabel12 = new Sunny.UI.UILabel(); + txtRemark = new Sunny.UI.UITextBox(); + uiLabel7 = new Sunny.UI.UILabel(); + txtName = new Sunny.UI.UITextBox(); + uiLabel2 = new Sunny.UI.UILabel(); + uiLabel4 = new Sunny.UI.UILabel(); + txtEnCode = new Sunny.UI.UITextBox(); + uiLabel1 = new Sunny.UI.UILabel(); + uiPanel1.SuspendLayout(); + titlePanel.SuspendLayout(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // uiPanel1 + // + uiPanel1.Controls.Add(titlePanel); + uiPanel1.Controls.Add(panel1); + uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + uiPanel1.FillColor = System.Drawing.Color.FromArgb(235, 241, 243); + uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiPanel1.Location = new System.Drawing.Point(0, 0); + uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + uiPanel1.MinimumSize = new System.Drawing.Size(1, 1); + uiPanel1.Name = "uiPanel1"; + uiPanel1.RectColor = System.Drawing.Color.Silver; + uiPanel1.Size = new System.Drawing.Size(795, 482); + uiPanel1.Style = Sunny.UI.UIStyle.Custom; + uiPanel1.StyleCustomMode = true; + uiPanel1.TabIndex = 6; + uiPanel1.Text = null; + uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // titlePanel + // + titlePanel.BackColor = System.Drawing.Color.FromArgb(216, 219, 227); + titlePanel.Controls.Add(lblTitle); + titlePanel.Controls.Add(btnClose); + titlePanel.Dock = System.Windows.Forms.DockStyle.Top; + titlePanel.Location = new System.Drawing.Point(0, 0); + titlePanel.Name = "titlePanel"; + titlePanel.Size = new System.Drawing.Size(795, 43); + titlePanel.TabIndex = 7; + titlePanel.MouseDown += titlePanel_MouseDown; + titlePanel.MouseMove += titlePanel_MouseMove; + // + // lblTitle + // + lblTitle.Dock = System.Windows.Forms.DockStyle.Fill; + lblTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + lblTitle.Location = new System.Drawing.Point(0, 0); + lblTitle.Name = "lblTitle"; + lblTitle.Size = new System.Drawing.Size(750, 43); + lblTitle.Style = Sunny.UI.UIStyle.Custom; + lblTitle.TabIndex = 1; + lblTitle.Text = "新增权限"; + lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + lblTitle.MouseDown += titlePanel_MouseDown; + lblTitle.MouseMove += titlePanel_MouseMove; + // + // btnClose + // + btnClose.Dock = System.Windows.Forms.DockStyle.Right; + btnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + btnClose.Location = new System.Drawing.Point(750, 0); + btnClose.MinimumSize = new System.Drawing.Size(1, 1); + btnClose.Name = "btnClose"; + btnClose.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0); + btnClose.Size = new System.Drawing.Size(45, 43); + btnClose.Style = Sunny.UI.UIStyle.Custom; + btnClose.Symbol = 77; + btnClose.SymbolSize = 60; + btnClose.TabIndex = 0; + btnClose.Click += btnClose_Click; + btnClose.MouseEnter += btnClose_MouseEnter; + btnClose.MouseLeave += btnClose_MouseLeave; + // + // panel1 + // + panel1.BackColor = System.Drawing.Color.White; + panel1.Controls.Add(uiComboTreeView1); + panel1.Controls.Add(btnSelectIcon); + panel1.Controls.Add(uiLabel9); + panel1.Controls.Add(txtType); + panel1.Controls.Add(uiLabel14); + panel1.Controls.Add(uiLabel13); + panel1.Controls.Add(uiLabel11); + panel1.Controls.Add(txtIcon); + panel1.Controls.Add(uiLabel8); + panel1.Controls.Add(uiLabel5); + panel1.Controls.Add(txtSortCode); + panel1.Controls.Add(btnConfirm); + panel1.Controls.Add(uiLabel12); + panel1.Controls.Add(txtRemark); + panel1.Controls.Add(uiLabel7); + panel1.Controls.Add(txtName); + panel1.Controls.Add(uiLabel2); + panel1.Controls.Add(uiLabel4); + panel1.Controls.Add(txtEnCode); + panel1.Controls.Add(uiLabel1); + panel1.Dock = System.Windows.Forms.DockStyle.Fill; + panel1.Location = new System.Drawing.Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new System.Drawing.Size(795, 482); + panel1.TabIndex = 6; + // + // uiComboTreeView1 + // + uiComboTreeView1.CanSelectRootNode = true; + uiComboTreeView1.DropDownStyle = Sunny.UI.UIDropDownStyle.DropDownList; + uiComboTreeView1.FillColor = System.Drawing.Color.White; + uiComboTreeView1.FillColor2 = System.Drawing.Color.White; + uiComboTreeView1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiComboTreeView1.Location = new System.Drawing.Point(129, 138); + uiComboTreeView1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + uiComboTreeView1.MinimumSize = new System.Drawing.Size(63, 0); + uiComboTreeView1.Name = "uiComboTreeView1"; + uiComboTreeView1.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2); + uiComboTreeView1.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + uiComboTreeView1.ShowLines = true; + uiComboTreeView1.Size = new System.Drawing.Size(265, 36); + + uiComboTreeView1.StyleCustomMode = true; + uiComboTreeView1.TabIndex = 3; + uiComboTreeView1.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // btnSelectIcon + // + btnSelectIcon.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + btnSelectIcon.Cursor = System.Windows.Forms.Cursors.Hand; + btnSelectIcon.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + btnSelectIcon.Location = new System.Drawing.Point(351, 211); + btnSelectIcon.MinimumSize = new System.Drawing.Size(1, 1); + btnSelectIcon.Name = "btnSelectIcon"; + btnSelectIcon.Size = new System.Drawing.Size(43, 43); + btnSelectIcon.StyleCustomMode = true; + btnSelectIcon.Symbol = 61442; + btnSelectIcon.SymbolSize = 30; + btnSelectIcon.TabIndex = 8; + btnSelectIcon.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + btnSelectIcon.Click += btnSelectIcon_Click; + // + // uiLabel9 + // + uiLabel9.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel9.ForeColor = System.Drawing.Color.Red; + uiLabel9.Location = new System.Drawing.Point(442, 142); + uiLabel9.Name = "uiLabel9"; + uiLabel9.Size = new System.Drawing.Size(21, 29); + uiLabel9.Style = Sunny.UI.UIStyle.Custom; + uiLabel9.StyleCustomMode = true; + uiLabel9.TabIndex = 60; + uiLabel9.Text = "*"; + uiLabel9.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtType + // + txtType.DataSource = null; + txtType.FillColor = System.Drawing.Color.White; + txtType.FillColor2 = System.Drawing.Color.White; + txtType.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtType.ItemHoverColor = System.Drawing.Color.FromArgb(155, 200, 255); + txtType.ItemSelectBackColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtType.ItemSelectForeColor = System.Drawing.Color.White; + txtType.Location = new System.Drawing.Point(518, 138); + txtType.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtType.MinimumSize = new System.Drawing.Size(63, 0); + txtType.Name = "txtType"; + txtType.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2); + txtType.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtType.Size = new System.Drawing.Size(227, 36); + + txtType.StyleCustomMode = true; + txtType.TabIndex = 5; + txtType.Text = "uiComboBox1"; + txtType.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel14 + // + uiLabel14.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel14.ForeColor = System.Drawing.Color.Red; + uiLabel14.Location = new System.Drawing.Point(53, 142); + uiLabel14.Name = "uiLabel14"; + uiLabel14.Size = new System.Drawing.Size(21, 29); + uiLabel14.Style = Sunny.UI.UIStyle.Custom; + uiLabel14.StyleCustomMode = true; + uiLabel14.TabIndex = 59; + uiLabel14.Text = "*"; + uiLabel14.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel13 + // + uiLabel13.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel13.ForeColor = System.Drawing.Color.Red; + uiLabel13.Location = new System.Drawing.Point(451, 73); + uiLabel13.Name = "uiLabel13"; + uiLabel13.Size = new System.Drawing.Size(21, 29); + uiLabel13.Style = Sunny.UI.UIStyle.Custom; + uiLabel13.StyleCustomMode = true; + uiLabel13.TabIndex = 58; + uiLabel13.Text = "*"; + uiLabel13.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel11 + // + uiLabel11.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel11.ForeColor = System.Drawing.Color.Red; + uiLabel11.Location = new System.Drawing.Point(53, 73); + uiLabel11.Name = "uiLabel11"; + uiLabel11.Size = new System.Drawing.Size(21, 29); + uiLabel11.Style = Sunny.UI.UIStyle.Custom; + uiLabel11.StyleCustomMode = true; + uiLabel11.TabIndex = 57; + uiLabel11.Text = "*"; + uiLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtIcon + // + txtIcon.ButtonFillColor = System.Drawing.Color.White; + txtIcon.ButtonFillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtIcon.ButtonFillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtIcon.ButtonForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + txtIcon.ButtonForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + txtIcon.ButtonForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + txtIcon.ButtonRectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtIcon.ButtonRectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + txtIcon.ButtonSymbol = 61761; + txtIcon.Cursor = System.Windows.Forms.Cursors.IBeam; + txtIcon.FillColor2 = System.Drawing.Color.White; + txtIcon.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtIcon.Location = new System.Drawing.Point(129, 211); + txtIcon.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtIcon.Maximum = 2147483647D; + txtIcon.MaxLength = 20; + txtIcon.Minimum = -2147483648D; + txtIcon.MinimumSize = new System.Drawing.Size(1, 16); + txtIcon.Name = "txtIcon"; + txtIcon.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtIcon.Size = new System.Drawing.Size(215, 42); + + txtIcon.StyleCustomMode = true; + txtIcon.TabIndex = 7; + txtIcon.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel8 + // + uiLabel8.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel8.Location = new System.Drawing.Point(57, 218); + uiLabel8.Name = "uiLabel8"; + uiLabel8.Size = new System.Drawing.Size(65, 29); + uiLabel8.Style = Sunny.UI.UIStyle.Custom; + uiLabel8.TabIndex = 54; + uiLabel8.Text = "图标"; + uiLabel8.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel5 + // + uiLabel5.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel5.Location = new System.Drawing.Point(401, 142); + uiLabel5.Name = "uiLabel5"; + uiLabel5.Size = new System.Drawing.Size(110, 29); + uiLabel5.Style = Sunny.UI.UIStyle.Custom; + uiLabel5.TabIndex = 50; + uiLabel5.Text = "类型"; + uiLabel5.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtSortCode + // + txtSortCode.FillColor = System.Drawing.Color.White; + txtSortCode.FillColor2 = System.Drawing.Color.White; + txtSortCode.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtSortCode.Location = new System.Drawing.Point(523, 214); + txtSortCode.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtSortCode.MinimumSize = new System.Drawing.Size(100, 0); + txtSortCode.Name = "txtSortCode"; + txtSortCode.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtSortCode.Size = new System.Drawing.Size(222, 36); + + txtSortCode.StyleCustomMode = true; + txtSortCode.TabIndex = 9; + txtSortCode.Text = "txtSortCode"; + txtSortCode.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // btnConfirm + // + btnConfirm.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + btnConfirm.Cursor = System.Windows.Forms.Cursors.Hand; + btnConfirm.FillColor = System.Drawing.Color.White; + btnConfirm.FillColor2 = System.Drawing.Color.White; + btnConfirm.FillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + btnConfirm.FillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + btnConfirm.FillSelectedColor = System.Drawing.Color.FromArgb(235, 243, 255); + btnConfirm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + btnConfirm.ForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + btnConfirm.ForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + btnConfirm.ForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + btnConfirm.ForeSelectedColor = System.Drawing.Color.FromArgb(74, 131, 229); + btnConfirm.Location = new System.Drawing.Point(658, 423); + btnConfirm.MinimumSize = new System.Drawing.Size(1, 1); + btnConfirm.Name = "btnConfirm"; + btnConfirm.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + btnConfirm.RectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + btnConfirm.Size = new System.Drawing.Size(125, 44); + + btnConfirm.StyleCustomMode = true; + btnConfirm.TabIndex = 11; + btnConfirm.Text = "确定"; + btnConfirm.TipsFont = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + btnConfirm.Click += btnConfirm_Click; + // + // uiLabel12 + // + uiLabel12.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel12.Location = new System.Drawing.Point(410, 218); + uiLabel12.Name = "uiLabel12"; + uiLabel12.Size = new System.Drawing.Size(107, 29); + uiLabel12.Style = Sunny.UI.UIStyle.Custom; + uiLabel12.TabIndex = 45; + uiLabel12.Text = "排序号"; + uiLabel12.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtRemark + // + txtRemark.ButtonFillColor = System.Drawing.Color.White; + txtRemark.ButtonFillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtRemark.ButtonFillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtRemark.ButtonForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + txtRemark.ButtonForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + txtRemark.ButtonForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + txtRemark.ButtonRectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtRemark.ButtonRectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + txtRemark.ButtonSymbol = 61761; + txtRemark.Cursor = System.Windows.Forms.Cursors.IBeam; + txtRemark.FillColor2 = System.Drawing.Color.White; + txtRemark.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtRemark.Location = new System.Drawing.Point(129, 294); + txtRemark.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtRemark.Maximum = 2147483647D; + txtRemark.MaxLength = 128; + txtRemark.Minimum = -2147483648D; + txtRemark.MinimumSize = new System.Drawing.Size(1, 16); + txtRemark.Multiline = true; + txtRemark.Name = "txtRemark"; + txtRemark.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtRemark.Size = new System.Drawing.Size(616, 90); + + txtRemark.StyleCustomMode = true; + txtRemark.TabIndex = 10; + txtRemark.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + txtRemark.Watermark = "请输入内容 "; + // + // uiLabel7 + // + uiLabel7.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel7.Location = new System.Drawing.Point(12, 294); + uiLabel7.Name = "uiLabel7"; + uiLabel7.Size = new System.Drawing.Size(110, 29); + uiLabel7.Style = Sunny.UI.UIStyle.Custom; + uiLabel7.TabIndex = 35; + uiLabel7.Text = "备注"; + uiLabel7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtName + // + txtName.ButtonFillColor = System.Drawing.Color.White; + txtName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtName.ButtonFillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtName.ButtonForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + txtName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + txtName.ButtonForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + txtName.ButtonRectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + txtName.ButtonSymbol = 61761; + txtName.Cursor = System.Windows.Forms.Cursors.IBeam; + txtName.FillColor2 = System.Drawing.Color.White; + txtName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtName.Location = new System.Drawing.Point(523, 66); + txtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtName.Maximum = 2147483647D; + txtName.MaxLength = 20; + txtName.Minimum = -2147483648D; + txtName.MinimumSize = new System.Drawing.Size(1, 16); + txtName.Name = "txtName"; + txtName.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtName.Size = new System.Drawing.Size(222, 42); + + txtName.StyleCustomMode = true; + txtName.TabIndex = 2; + txtName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel2 + // + uiLabel2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel2.Location = new System.Drawing.Point(452, 73); + uiLabel2.Name = "uiLabel2"; + uiLabel2.Size = new System.Drawing.Size(65, 29); + uiLabel2.Style = Sunny.UI.UIStyle.Custom; + uiLabel2.TabIndex = 23; + uiLabel2.Text = "名称"; + uiLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // uiLabel4 + // + uiLabel4.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel4.Location = new System.Drawing.Point(56, 142); + uiLabel4.Name = "uiLabel4"; + uiLabel4.Size = new System.Drawing.Size(65, 29); + uiLabel4.Style = Sunny.UI.UIStyle.Custom; + uiLabel4.TabIndex = 25; + uiLabel4.Text = "父级"; + uiLabel4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // txtEnCode + // + txtEnCode.ButtonFillColor = System.Drawing.Color.White; + txtEnCode.ButtonFillHoverColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtEnCode.ButtonFillPressColor = System.Drawing.Color.FromArgb(235, 243, 255); + txtEnCode.ButtonForeColor = System.Drawing.Color.FromArgb(96, 98, 102); + txtEnCode.ButtonForeHoverColor = System.Drawing.Color.FromArgb(80, 160, 255); + txtEnCode.ButtonForePressColor = System.Drawing.Color.FromArgb(74, 131, 229); + txtEnCode.ButtonRectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtEnCode.ButtonRectHoverColor = System.Drawing.Color.FromArgb(197, 222, 255); + txtEnCode.ButtonSymbol = 61761; + txtEnCode.Cursor = System.Windows.Forms.Cursors.IBeam; + txtEnCode.FillColor2 = System.Drawing.Color.White; + txtEnCode.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + txtEnCode.Location = new System.Drawing.Point(129, 66); + txtEnCode.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + txtEnCode.Maximum = 2147483647D; + txtEnCode.MaxLength = 20; + txtEnCode.Minimum = -2147483648D; + txtEnCode.MinimumSize = new System.Drawing.Size(1, 16); + txtEnCode.Name = "txtEnCode"; + txtEnCode.RectColor = System.Drawing.Color.FromArgb(216, 219, 227); + txtEnCode.Size = new System.Drawing.Size(265, 42); + + txtEnCode.StyleCustomMode = true; + txtEnCode.TabIndex = 1; + txtEnCode.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft; + // + // uiLabel1 + // + uiLabel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + uiLabel1.Location = new System.Drawing.Point(57, 73); + uiLabel1.Name = "uiLabel1"; + uiLabel1.Size = new System.Drawing.Size(65, 29); + uiLabel1.Style = Sunny.UI.UIStyle.Custom; + uiLabel1.TabIndex = 21; + uiLabel1.Text = "编码"; + uiLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // AddPermissionForm + // + AllowShowTitle = false; + AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(795, 482); + Controls.Add(uiPanel1); + Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + MaximizeBox = false; + MinimizeBox = false; + Name = "AddPermissionForm"; + Padding = new System.Windows.Forms.Padding(0); + RectColor = System.Drawing.Color.FromArgb(248, 248, 248); + ShowTitle = false; + ShowTitleIcon = true; + Style = Sunny.UI.UIStyle.Custom; + Text = "新增用户"; + TitleColor = System.Drawing.Color.FromArgb(248, 248, 248); + TitleForeColor = System.Drawing.Color.DimGray; + TopMost = true; + Load += AddPermissionForm_Load; + uiPanel1.ResumeLayout(false); + titlePanel.ResumeLayout(false); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + private Sunny.UI.UIPanel uiPanel1; + private System.Windows.Forms.Panel titlePanel; + private Sunny.UI.UILabel lblTitle; + private System.Windows.Forms.Panel panel1; + private Sunny.UI.UITextBox txtRemark; + private Sunny.UI.UILabel uiLabel7; + private Sunny.UI.UITextBox txtName; + private Sunny.UI.UILabel uiLabel2; + private Sunny.UI.UITextBox txtEnCode; + private Sunny.UI.UILabel uiLabel1; + private Sunny.UI.UILabel uiLabel12; + private Sunny.UI.UIButton btnConfirm; + private Sunny.UI.UIIntegerUpDown txtSortCode; + private Sunny.UI.UILabel uiLabel4; + private Sunny.UI.UILabel uiLabel5; + private Sunny.UI.UITextBox txtIcon; + private Sunny.UI.UILabel uiLabel8; + private Sunny.UI.UILabel uiLabel11; + private Sunny.UI.UILabel uiLabel14; + private Sunny.UI.UILabel uiLabel13; + private Sunny.UI.UIComboBox txtType; + private Sunny.UI.UILabel uiLabel9; + private Sunny.UI.UISymbolButton btnSelectIcon; + private Sunny.UI.UIComboTreeView uiComboTreeView1; + private Sunny.UI.UISymbolLabel btnClose; + } +} \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Permission/AddPermissionForm.cs b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.cs new file mode 100644 index 0000000..b874204 --- /dev/null +++ b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.cs @@ -0,0 +1,423 @@ +using DH.RBAC.Common; +using DH.RBAC.Logic.Sys; +using DH.RBAC.Model.Sys; +using DH.RBAC.Utility.Other; +using Sunny.UI; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Page.Sys.Permission +{ + public partial class AddPermissionForm : UIForm + { + private SysPermissionLogic permissionLogic; + + + public AddPermissionForm() + { + InitializeComponent(); + permissionLogic = new SysPermissionLogic(); + } + + #region 标题栏 + private void btnClose_Click(object sender, EventArgs e) + { + FormHelper.subForm = null; + ParentPage.btnQuery_Click(null, null); + this.Close(); + } + private Point mPoint; + private void titlePanel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void titlePanel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + private void btnClose_MouseEnter(object sender, EventArgs e) + { + btnClose.BackColor = Color.FromArgb(231, 231, 231); + } + + private void btnClose_MouseLeave(object sender, EventArgs e) + { + btnClose.BackColor = Color.Transparent; + } + #endregion + public PermissionPage ParentPage { get; set; } + public string Id { get; set; } + + private int symbolIndex; + + Dictionary nodeDict = new Dictionary(); + /// + /// 画面加载,读取用户信息,显示在界面上 + /// + /// + /// + private void AddPermissionForm_Load(object sender, EventArgs e) + { + txtType.Items.Add("请选择"); + txtType.Items.Add("主菜单"); + txtType.Items.Add("子菜单"); + txtType.Items.Add("按钮"); + txtType.SelectedIndex = 0; + //获取部门下拉列表的值 + bool flag = GetPermissionCombox(); + if (!flag) + { + btnClose_Click(null, null); + return; + } + if (StringHelper.IsNullOrEmpty(Id)) + { + lblTitle.Text = "新增权限"; + txtEnCode.Enabled = true; + } + else + { + lblTitle.Text = "修改权限"; + txtEnCode.Enabled = false; + } + //获取部门下拉列表的值 + if (StringHelper.IsNullOrEmpty(Id)) + { + return; + } + //获得用户信息 + SysPermission entity = permissionLogic.Get(Id); + if (entity == null) + { + AntdUI.Message.warn(this, "权限信息不存在!", autoClose: 3); + + btnClose_Click(null, null); + return; + } + //给文本框赋值 + txtEnCode.Text = entity.EnCode; + txtName.Text = entity.Name; + uiComboTreeView1.SelectedNode = GetNode(entity.ParentId); + txtType.SelectedIndex = entity.Type.Value == 2 ? 1 : entity.Type.Value == 0 ? 2 : 3; + txtIcon.Text = entity.Icon; + symbolIndex = entity.SymbolIndex; + txtSortCode.Value = entity.SortCode.Value; + txtRemark.Text = entity.Remark; + } + + /// + /// 获得节点 + /// + /// + /// + private TreeNode GetNode(string parentId) + { + if (nodeDict.ContainsKey(parentId)) + { + return nodeDict[parentId]; + } + return nodeDict.FirstOrDefault().Value; + } + + + /// + /// 获得权限下拉列表 + /// + /// + private bool GetPermissionCombox() + { + + try + { + var data = permissionLogic.GetList(); + var treeList = new List(); + foreach (SysPermission item in data) + { + TreeSelect model = new TreeSelect(); + model.id = item.Id; + model.text = item.Name; + model.parentId = item.ParentId; + treeList.Add(model); + } + BindData(uiComboTreeView1, treeList); + return true; + } + catch (Exception ex) + { + AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); + + return false; + } + } + + + /// + /// 绑定TreeView数据 + /// + /// + /// + private void BindData(UIComboTreeView treeView, List list) + { + bool first = true; + List list2 = list.Where(it => it.parentId == "0").ToList(); + foreach (TreeSelect select in list2) + { + TreeNode rootNode = new TreeNode(); + rootNode.Name = select.id; + rootNode.Tag = select.id; + rootNode.Text = select.text; + treeView.Nodes.Add(rootNode); + nodeDict.Add(select.id, rootNode); + if (first) + { + treeView.SelectedNode = rootNode; + first = false; + } + BindChildAreas(rootNode, list);//调用添加子节点的方法 + } + } + + private void BindChildAreas(TreeNode fNode, List list) + { + string fAreaId = fNode.Name; //父id + List list2 = list.Where(it => it.parentId == fAreaId).ToList(); + if (list2.IsNullOrEmpty()) //递归终止,区域不包含子区域时 + { + return; + } + foreach (TreeSelect select in list2) + { + TreeNode node = new TreeNode(); + node.Name = select.id; + node.Tag = select.id; ; + node.Text = select.text; + //添加子节点 + fNode.Nodes.Add(node); + nodeDict.Add(select.id, node); + BindChildAreas(node, list); + } + } + + /// + /// 确定按钮点击事件 + /// + /// + /// + private void btnConfirm_Click(object sender, EventArgs e) + { + if (StringHelper.IsNullOrEmpty(Id)) + { + DoAdd(); + } + else + { + DoUpdate(); + } + } + + + /// + /// 执行更新操作 + /// + private void DoUpdate() + { + bool flag = ChechEmpty(); + if (!flag) + { + return; + } + SysPermission model = new SysPermission(); + model.Id = Id; + model.ParentId = uiComboTreeView1.SelectedNode.Name; + model.EnCode = txtEnCode.Text; + model.Name = txtName.Text; + model.Icon = txtIcon.Text; + model.SymbolIndex = symbolIndex; + model.Remark = txtRemark.Text; + model.Type = Convert.ToInt32(GetPermissionType()); + model.SortCode = txtSortCode.Value; + model.ModifyUserId = GlobalConfig.CurrentUser.Id; + + SysPermissionLogic pLogic = new SysPermissionLogic(); + //当前类型是啥 + if (model.Type == 2) + { + model.ParentId = "0"; + } + else if (model.Type == 0) + { + SysPermission permission = pLogic.Get(model.ParentId); + if (permission.Type != 2) + { + AntdUI.Message.warn(this, "当前类型的父级必须为主菜单!", autoClose: 3); + return; + } + + } + else + { + SysPermission permission = pLogic.Get(model.ParentId); + if (permission.Type != 0) + { + AntdUI.Message.warn(this, "当前类型的父级必须为子菜单!", autoClose: 3); + + return; + } + } + int row = permissionLogic.AppUpdate(model, model.ModifyUserId); + if (row == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); + + + return; + } + + btnClose_Click(null, null); + + } + + /// + /// 数据校验 + /// + /// + /// + private bool ChechEmpty() + { + if (StringHelper.IsNullOrEmpty(txtEnCode.Text)) + { + AntdUI.Message.warn(this, "编码不能为空!", autoClose: 3); + + + return false; + } + if (StringHelper.IsNullOrEmpty(txtName.Text)) + { + AntdUI.Message.warn(this, "名称不能为空!", autoClose: 3); + + return false; + } + if (uiComboTreeView1.SelectedNode == null) + { + AntdUI.Message.warn(this, "父级不能为空!", autoClose: 3); + + return false; + } + if (txtType.SelectedIndex == 0) + { + AntdUI.Message.warn(this, "类型不能为空!", autoClose: 3); + + return false; + } + return true; + } + + + /// + /// 执行新增操作 + /// + private void DoAdd() + { + bool flag = ChechEmpty(); + if (!flag) + return; + SysPermission model = new SysPermission(); + model.ParentId = uiComboTreeView1.SelectedNode.Name; + model.EnCode = txtEnCode.Text; + model.Name = txtName.Text; + model.Icon = txtIcon.Text; + model.SymbolIndex = symbolIndex; + model.Remark = txtRemark.Text; + model.Type = Convert.ToInt32(GetPermissionType()); + model.SortCode = txtSortCode.Value; + model.CreateUserId = GlobalConfig.CurrentUser.Id; + + SysPermissionLogic pLogic = new SysPermissionLogic(); + //当前类型是啥 + if (model.Type == 2) + { + model.ParentId = "0"; + } + else if (model.Type == 0) + { + SysPermission permission = pLogic.Get(model.ParentId); + if (permission.Type != 2) + { + AntdUI.Message.warn(this, "当前类型的父级必须为主菜单!", autoClose: 3); + + + return; + } + } + else + { + SysPermission permission = pLogic.Get(model.ParentId); + if (permission.Type != 0) + { + AntdUI.Message.warn(this, "当前类型的父级必须为子菜单!", autoClose: 3); + + + + return; + } + + } + int row = permissionLogic.AppInsert(model, model.CreateUserId); + if (row == 0) + { + AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3); +; + return; + } + + btnClose_Click(null, null); + + } + + private string GetPermissionType() + { + if (txtType.SelectedIndex == 1) + { + return "2"; + } + if (txtType.SelectedIndex == 2) + { + return "0"; + } + if (txtType.SelectedIndex == 3) + { + return "1"; + } + return "0"; + } + + + /// + /// 设置图标 + /// + /// + /// + private void btnSelectIcon_Click(object sender, EventArgs e) + { + IconForm form = new IconForm(); + if (form.ShowDialog() == DialogResult.OK) + { + txtIcon.Text = form.IconName; + symbolIndex = form.SymbolIndex; + } + } + } +} diff --git a/DH.RBAC/Views/Sys/Permission/AddPermissionForm.resx b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.resx new file mode 100644 index 0000000..01360ee --- /dev/null +++ b/DH.RBAC/Views/Sys/Permission/AddPermissionForm.resx @@ -0,0 +1,1161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAgIAAAAEAIACoAAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AC4AAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAsAAABkAAAAagAAAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAQAAAAOAAAADQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAB2AAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAHAAAADwAAABsAAAAdAAAAHAAAABwAAAAdAAAAFQAAAAsAAAAMAAAAAwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAA2QAAAOUAAAApAAAAAAAAAAAAAAAAAAAAHwAA + AP8AAAD/AAAAzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAANUAAADTAAAAUgAA + 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 + AP0AAAD5AAAAIAAAAF8AAADBAAAAqwAAAJ4AAACqAAAAvAAAAKMAAACcAAAA1wAAAP8AAAD/AAAA/wAA + AN8AAABkAAAAAAAAALIAAAD/AAAA6gAAABkAAAAAAAAAAAAAAAAAAAAAAAAASgAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAApQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAygAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzgAAAKMAAAD/AAAA/wAAAF0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAIwAAAD2AAAA/wAAAP8AAAD/AAAA6QAAAP8AAACLAAAAAAAA + AAAAAAAOAAAAJAAAACQAAAAhAAAAdQAAAP8AAAD/AAAAWwAAAB8AAAAzAAAAMgAAAC4AAAAHAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAOAAAAXQAAANEAAAD/AAAA/wAAAP8AAACjAAAAcAAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAP8AAAD/AAAAcQAAAAAAAAAAAAAAmwAAAP8AAAD+AAAAJwAA + AAAAAAAAAAAAAAAAAAAAAABFAAAA+QAAAPEAAADtAAAA5wAAAN4AAADUAAAA1QAAAN0AAADeAAAA3gAA + APkAAAD/AAAA/wAAAPAAAADeAAAA3gAAANwAAADSAAAA2QAAAN4AAADnAAAA7AAAAPMAAAD5AAAAOgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTAAAA8gAA + AOYAAADfAAAA4AAAAOwAAADTAAAAPQAAAJoAAACMAAAAeQAAAGkAAADNAAAA/wAAAP8AAACZAAAAdAAA + AJUAAAB1AAAApAAAAP8AAAD/AAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3AAAA/wAA + AP8AAAD8AAAA9gAAAPgAAAD/AAAA/wAAALgAAACkAAAAqwAAANMAAAD/AAAA/wAAAO4AAACpAAAA/wAA + AP8AAABvAAAAxgAAAOAAAADiAAAAtQAAAGEAAAB8AAAAYAAAAAMAAAAAAAAAAAAAAEAAAAD/AAAA/wAA + AP8AAAD/AAAA2AAAAE0AAABYAAAA/wAAAP8AAAB/AAAAQwAAAEQAAABKAAAA6wAAAP8AAAC1AAAA2gAA + AP8AAADcAAAADQAAAAAAAACMAAAA/wAAAP8AAAA+AAAAAAAAAAAAAAAAAAAAAAAAABAAAAA2AAAAKQAA + ACAAAAAWAAAAAQAAADQAAAAoAAAAAAAAAAAAAAAEAAAA0AAAAP8AAAD/AAAAjgAAAAQAAAAAAAAAAAAA + ADsAAAAVAAAAAwAAABYAAAAfAAAALAAAADYAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAApAAAAEQAAAAQAAAAIAAAAHwAAAC8AAAAJAAAAAAAA + AAAAAAAAAAAAAAAAAKQAAAD/AAAA/wAAAEcAAAAAAAAAAAAAAAAAAACmAAAA/wAAAP8AAABbAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAATwAAAP8AAAD/AAAA6AAAAEUAAAAxAAAAMgAAADUAAABLAAAAbAAA + AP8AAAD/AAAA6gAAALsAAAC+AAAArAAAAJkAAAD/AAAA/wAAAGwAAADRAAAA7wAAAO4AAADIAAAA4wAA + AP8AAADaAAAABwAAAAAAAAAAAAAABAAAAK4AAAD/AAAA8AAAAIMAAAAWAAAAAAAAAFkAAAD/AAAA/wAA + AFoAAAAQAAAADwAAABcAAADmAAAA/wAAAIQAAACEAAAA/wAAAP8AAABdAAAAAAAAAHQAAAD/AAAA/wAA + AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAA4AAAAOkAAACCAAAAGgAA + AAAAAADOAAAA/wAAAP8AAACJAAAAAAAAADYAAACaAAAA+wAAAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AGcAAAAAAAAAAAAAADoAAABGAAAAKgAAACMAAAAPAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAHAAA + ACgAAABBAAAARwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADMAAAA/wAA + AP8AAADuAAAATAAAAAAAAAAVAAAAFgAAAAgAAAADAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAGAAAACAAAABMAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAnAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAACgAAAA8QAAAOYAAACmAAAAAQAAAAAAAAAAAAAAAAAAAAQAAADKAAAAxwAA + AJ4AAAB+AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAUAAAA6QAAAP8AAAD6AAAA4AAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAAACbAAAASgAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAjAAAACwAA + AAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAABOAAAATQAA + ADkAAABCAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADobtSBOF + 6ygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJfxomxXcBgMZ5CFbChRgVAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADBcBQZwnYAf8J1AH7BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0 + AH3BdAB9wXQAfcF0AH3BdAB9wXQAfcF0AH3DdgCBwnQAadqRAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABKI8ikEg/b0A4X55g6D8FcAAAAAAAAAAAAAAAAAAAAA358/CMF1 + BsPZgwD/yXkB/8J2A+XCdgOfxH0QPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB4B47chAD/0X4A/9F+ + AP/RfgD/0H4A/9J/AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SA + AP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/9SAAP/UgAD/1IAA/92F + AP/AcwDqv38AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVqv8GBoLzwACJ + //8Ahvv/AoT4/waE85gii/MWAAAAAAAAAADAdwuGz3wA/8N1AP/EdgD/yHgA/898AP/CcwL9wnYEqMR8 + EycAAAAAAAAAAAAAAAC9exUjxHUD7sd4AP/CdQD/wnUA/8J1AP/DdQD/xHYA/8JzAPvAcwD9wHMA/cBz + AP3AcwD9wHMA/cFzAP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3BcwD9xXMA+8Vy + APvFcgD7xXIA+8VyAPvFcgD7xHQA/MFzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BdAD9xHYA/MV1APvFdQD7xXUA+8J0AP3BcwD9wHMA/cBzAP3AcwD9wHMA/cBzAP3AcwD9wHMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9wXMA/cBzAP3BcwD9wXMA/cFz + AP3BcwD9wXMA/cFzAP3BcwD9wXMA/cFzAP3BcwD9yXgA/cN1ANW7dwAPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuC74EBif//AYHy/wGB8P8Bg/X/AIv//wOA79YAov4L2HkAO8Z3 + AfzGdwD/wnUA/8J1AP/CdQD/wnUA/8V3AP/QfQD/xXgC58R6B2DUfwAGAAAAAL51B67PfAD/wnUA/8J1 + AP/CdQD/wnUA/818AP/BdQWRv3EAOMNyADzDcgA8w3IAPMNyADzRegA46o4AMv6oACz+sQAr/qEFMf+b + BTP+qAUv/rAAKv6XAC/ZfwA2v3IAPMdyADzscQA2+nUANP94ADP/eAAz/3gAM/pwADTncwA3w3IAPMNy + ADzDcgA8w3IAPMNyADzDcgA8w3IAPMNyADzRegA46okAMv6oACz+sQAr/qEFMf+bBTP/pAUw/rAAKvmU + ADDRfwA4w3IAPMNyADzDcgA8w3IAPMNyADzDcgA8+ZIAL/6VAC75kgAv+ZIAL/mSAC/5kgAv+ZIAL/mS + AC/5kgAv/pUALv6YAC3RegA4w3IAPN2BADX+mAAt/pUALvmSAC/5kgAv+ZIAL/mSAC/5kgAv+ZIAL/mS + AC//lAAw+JIAKL9/AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSR/gcNiPY6AAAAAAAAAAAXi/NAA4f8/wCF + +P8BgfD/AYHx/wGB8P8Biv//AYL3pLKZfwrGdQLOzXsA/8J1AP/CdQD/wnUA/8J1AP/CdQD/wnUA/8F1 + AP/OfAD/yXkE/8uKJCPAeQxSynoB/8R2AP/CdQD/wnUA/8J1AP/HeAD/w3YE9MqHJSIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAABgfAAATTwAACnsAAAqWAAAJogAAC5kAAAtzAAAVPAAAfwQAAAAAAAAAAACL + /m4Aiv2ZAIX9lwCF/ZcAhf2XAI39mQCK/lMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAACMdAAAXTAAADHwAAAibAAAKqAAAC54AAA10AAAdNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAABiRMAAYkTAAIKzsACCw5AAgsOQAILDkACCw5AAgsOQAIKzsAByNHAAgjVwAAVQ8AAAAAAAApJQAL + IlkABiFLAAgrOgAILDkACCw5AAgsOQAILDkACCw5AAgsOQAGIkkADypCAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAADYPvdAKH+/wFgfSSIojuDyKQ9h4BgvK0AYj//wGE+f8BgfD/AIf9/wOD9dgA//8Ey3UBj898 + Af/CdQD/wnUA/8J1AP/CdQD/wnUA/8J1AP/CdQD/xncA/8x7AP/CeAdqxX8iLMR2A+zJeQD/wnUA/8J1 + AP/CdQD/wnUA/9F9AP/BdgqQAAAAAAAAAAAAAAAAAAAAAAAAAAALCw5ZBAUJvgIDCPcDAwj/AgMH/wME + B/0GBgjRAgIGwgcHCdUDBQfrBAQH5AYEBnP///8CCon4wQCO//8AiP//AIj//wCI//8Akv//BoTwngAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADMZMwoKCgxlBQUJvwMECPgCAwf/AgMH/wcHCdMEBAeuAQEHrAYG + CsMEBQfnBAQI1gkJDmoAAAAAAAAAAAAAAAAAAAAAAAAABAYICnwICAu1BAUI/wQFB/8EBQj/BAUI/wQF + CP8EBQj/BAQH/wYJCsEICAqQGxsiJQAAAAAHBwdGBwcHjgcHCqwEBQf5BAUI/wQFCP8EBQj/BAUI/wQF + CP8DBAf/BgYI0A4QEGr///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+J7zIDgvbyAYf7/wCK//8FgvPLBITxOAAA + AAALh/NvA4L28ACL//8Dhfj5AIz+Ot5yAFXTfgH/znwA/8l4AP/GdwD/w3YA/8J1AP/CdQD/wnUA/8l5 + AP/NewL/wHQEcsKFJBXCdQLXzXsA/8J1AP/CdQD/wnUA/8J1AP/LegD/xHUE4cyMMxQAAAAAAAAAAAAA + AAAkJDYOBgYJpwMDCP8CAwf/AwQI/wMEB/8JCQuIEREaHf9//wIAAAAAf39/BBERGh0GCAtzAgED8QgF + CLgHfePJAIf+/wGB8f8BgfH/AYHx/wGK//8FhPGUAAAAAAAAAAAAAAAAAAAAAAAAAAAMDBA+BQUHywMD + CP8CAwf/AwMH/wYGCagQEBAv////AgAAAAAAAAAAAAAAABERER0ICAx3AwQG5AUFCcYQEBUvAAAAAAAA + AAAAAAAAAAAAAAAAAAAKCg5+BAQJ/wMECP8DBAj/AwQI/wMECP8LCxCdMzMzBQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAMDCN8DBAj/AwQI/wMECP8DBAj/AgMI/wMECNgKCgoYAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAALi/MWA4LxzwCJ//8BgfD/AYHx/wCN//8Gf/DQM5n/BQAAAAAOifA0Aoj7ygGC94n+ogALx3cLnMl4 + CLTCdgLCwnMD2sFzAffMewH/zHsA/8d4AP/QfQD/xXYC7L51C1e7fxYiw3YC0858AP/CdQD/wnUA/8J1 + AP/CdQD/xncA/8t6A//BexRXAAAAAAAAAAAAAAAAAAAAAAgIDpsDBAj/AwQI/wMECP8DBAn/CgoOjgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAA7AwQH/AJmv/8BiP3/AYHx/wGB8f8BgfH/AYr//wWE + 8ZQAAAAAAAAAAAAAAAAAAAAACw4RWAQFB/YCAwf/AwQI/wMECP8KCgyUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAZGRkeBQUJuQUFCPINEBRLAAAAAAAAAAAAAAAAAAAAABwcHCQFBgnzAwQI/wME + CP8DBAj/AwQI/xAQFD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBNpBQYJ/AMECP8DBAj/AwQI/wME + CP8GBgjuJCQkMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSH8j4Eg/T3AIn//wGB8v8Bg/X/AoP2/BaG + 7k4AAAAAAAAAAAAAAAAXi9ALAJn/BduDER3Dew54tIoqGAAAAACqqlUDxHwNJ8J2B2nEdQS/wnQC7MR3 + BZXCeRIqwnkHQ8Z1A+HOfAD/wnUA/8J1AP/CdQD/wnUA/8V3AP/OfAD/v3YFgQAAAAAAAAAAAAAAAAAA + AAASEhI4BAQH/wMECP8DBAj/AwQI/wQFB+8qHyoYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAODhN4A2jB/wCI/f8BgfH/AYHx/wGB8f8Biv//BYTxlAAAAAAAAAAAAAAAABERFTsDBAf2AwQI/wME + CP8DBAj/BgYIzkwzTAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUHjwME + Bv8HBQphAAAAAAAAAAAAAAAAAAAAJAMEB+4DBAj/AwQI/wMECP8DBAj/AAMHQAAAAAAAAAAAAAAAAAAA + AAAAAAAADxMTQwMEB/UDBAj/AwQI/wMECP8DBAj/AgMH/w0NEF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAA6E8DQFg/PEAYr//wGL//8Mgu+RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAcF0 + B4zHdQPhxnkJZ8Z6HBsAAAAAAAAAANSqfwbDfAsrwXoOR8R3BKnIeAH/ynkA/8J1AP/CdQD/wnUA/8J1 + AP/EdgD/xHcA+sFzAYQAAAAAAAAAAAAAAAAAAAAAAAAAAA8PEYYFBQr/AwQI/wMECP8DBAj/BgYKwAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgKR8EbMfzAIj+/wGB8f8BgfH/AYHx/wGK + //8FhPGUAAAAAAAAAAA/Pz8ICAgM0AMECP8DBAj/AwQI/wQFCf4ZGRlPAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQkNggcJDGcAAAAAAAAAAAAAAAAAAAYmAwQH7wME + CP8DBAj/AwQI/wMECP8DAwdCAAAAAAAAAAAAAAAAAAAAABYPFiIEBAfkAwQI/wMECP8DBAj/AwQI/wME + B/8KCgyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOq/w8VjPE6AAAAAFWq/wMFhPSOBoTyxTaR + 7A4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0ItFC8N4BsnbgwH/wXMC8MF2AsbAcwCzwXIEu8Fy + AdzFdgH/zXsA/8R2AP/CdQD/wnUA/8J1AP/CdQD/wnUA/8p6AP+9cwHXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAABwcMqAIECP8DBAj/AwQI/wIDB/8KCgyTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVQAAAwd538oAiP7/AYHx/wGB8f8BgfH/AYr//wWE8ZQAAAAAAAAAAAoKDGUDBAj/AwQI/wME + CP8CAwj/CQkL2UxMTAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiYDBAfvAwQI/wMECP8DBAj/AwQI/wMDB0IAAAAAAAAAAAAA + AAAzMzMKBQUJxAMDCP8DBAj/AwQI/wMECP8DBAj/CAgLtFVVVQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAC4XvhgOK+/sFg/KMP3+/CAAAAAAzmeUKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAvHEJG8J1AsrXgQD/z3wA/818AP/LegD/yHkA/8R2AP/CdQD/wnUA/8J1AP/CdQD/wnUA/8J1 + AP/CdQD/xXcA/8V2AvnCeRA/AAAAAAAAAAAAAAAAAAAAAAAAAAAEBQi1AgQI/wMECP8DBAj/AgMI/wUF + CYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIb0ugCH/f8BgfH/AYHx/wGB + 8f8Biv//BYTxlAAAAABVAAADBgkKwgIDCP8DBAj/AwQI/wIDCP8GBgugAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJgME + B+8DBAj/AwQI/wMECP8DBAj/AwMHQgAAAAAAAAAAAAAAAAoKDZYCAwj/AwQI/wMECP8DBAj/AgMH/wME + B9gqKioYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKG8EYEhfb5AIb6/wGJ//8ChffNBYLvMQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv38ZFMR2CJnDdQL1z30B/898 + AP/LegD/yXkA/8t6AP/PfAD/zHoA/8J1AP/CdQD/wnUA/8J1AP/CdQD/0H0A/8J5CYsAAAAAAAAAAAAA + AAAAAAAAAAAAAAQECLYDBAn/AwQI/wMECP8CAwf/Dw8QiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAMhvG8AIf+/wGB8f8BgfH/AYHx/wGK//8FhPGUAAAAACIZGR4EBQjxAwQI/wME + CP8DBAj/AwQI/wQECH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmAwQH7wMECP8DBAj/AwQI/wMECP8DAwdCAAAAAAAA + AAALCw5sAwQI/wMECP8DBAj/AwQI/wIDB/8EBAfvDw8PMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAPh/ARA3/x3gCM//8BgPD/AIb6/wOD9PcOifU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJ5EC7DeAZ9w3cEq8J1AsrCcwPWwnQFxcF2BKLCdQS0x3gA/8J1 + AP/CdQD/wnUA/8J1AP/LewD/wncGwgAAAAAAAAAAAAAAAAAAAAAAAAAABAQItQMECf8DBAj/AwQI/wID + Bv8UFBaLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyG8bwAh/7/AYHx/wGB + 8f8BgfH/AYr//wWE8ZQAAAAADwwPVQQECf8DBAj/AwQI/wMECP8EBQn/EREUZQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + BiYDBAfvAwQI/wMECP8DBAj/AwQI/wAABDsAAAAAFhYSRQQEB/cCBAj/AwQI/wMECP8DBAj/BAUI/hEO + EVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSR/gcIhfFcA4T13gGK//8Bh/3/EIbuXQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA1KoqBtCLLgu/v38EAAAAAMyMMxTDdATqyHgA/8J1AP/CdQD/wnUA/8l5AP/CdAHixHUnDQAA + AAAAAAAAAAAAAAAAAAAEBAi1AwQJ/wMECP8DBAj/AgMG/xISFIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAADIbxvACH/v8BgfH/AYHx/wGB8f8Biv//BYTxlAAAAAACAgR9AwQJ/wME + CP8DBAj/AwQI/wQFCf8PDxJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJgMEB+8DBAj/AwQI/wMECP8DBAj/DAwPVBEI + ER4DBAXnAgMH/wMECP8DBAj/AwQI/wIDB/8ICgp/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAATiesaBYTytweB76QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMF2 + BpnPfQD/wnUA/8J1AP/CdQD/xncA/8F0A/XIgiAvAAAAAAAAAAAAAAAAAAAAAAQECLUDBAn/AwQI/wME + CP8CAwb/EhIUiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhvG8AIf+/wGB + 8f8BgfH/AYHx/wGK//8FhfGTAAAAAAMDBY4DBAj/AwQI/wMECP8DBAj/BAUJ/xsbHlMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAYmAwQH7wMECP8DBAj/AwQI/wMECP8FBQftBAcJ2QIDCP8DBAj/AwQI/wMECP8CAwf/CQoMqQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+/vwQAAAAA////AQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw3wRVsh5Af/DdgD/wnUA/8J1AP/EdgD/xngC/8N6 + DUkAAAAAAAAAAAAAAAAAAAAABAQItQMECf8DBAj/AwQI/wIDBv8SEhSLAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyG8bwAh/7/AYHx/wGB8f8BgfH/AYr//wWF8ZMAAAAAAQEFiwME + CP8DBAj/AwQI/wMECP8EBQn/CwsOVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiYDBAfvAwQI/wMECP8DBAj/AwQI+QUF + CbsDAwb/AwQI/wMECP8DBAj/AwQI/wYHB8weHh4RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAkkewOAn/vyAWC8Ik/v78EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADGfAstwHUC+sV3AP/CdQD/wnUA/8R2AP/IeAD/wXQATwAAAAAAAAAAAAAAAAAAAAAEBAi1AwQJ/wME + CP8DBAj/AgMG/xISFIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIbxvACH + /v8BgfH/AYHx/wGB8f8Biv//BYTxlAAAAAAEBAR4BAQJ/wMECP8DBAj/AwQI/wQFCf8TExVdAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAGJgMEB+8DBAj/AwQI/wMECP8DBAj+CQkONg0LDXEDBAf/AwQI/wIDCP8FBQfoHx8fKQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//BAiE8ZgBjP//AYn//wKC + 88YHf/AiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMZ6HBvCdwTrx3cA/8J1AP/CdQD/xHYA/8V3 + A//CexFIAAAAAAAAAAAAAAAAAAAAAAQECLUDBAn/AwQI/wMECP8CAwb/EhIUiwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhvG8AIf+/wGB8f8BgfH/AYHx/wGK//8FhPGUAAAAAA0N + DU4DBQj/AwQI/wMECP8DBAj/AwQJ/wgIDXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmAwQH7wMECP8DBAj/AwQI/wME + CP8EBAg9AAAAAAoMDHwDBAf/BAUJ9w8PE0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAOgfA1AoL1/wCI//8BiP//A4Hx3QiD7R0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAw4ctEcN1A9nJeQD/wnUA/8J1AP/GdwD/wnQC88Z8Fi0AAAAAAAAAAAAAAAAAAAAABAQItQME + Cf8DBAj/AwQI/wIDBv8SEhSLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyG + 8bwAh/7/AYHx/wGB8f8BgfH/AYr//wWE8ZQAAAAAHR0dGgUGCO8DBAj/AwQI/wMECP8DBAj/AQEFhQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOTmINSEhIBwAA + AAAAAAAAAAAAAAAABiYDBAfvAwQI/wMECP8DBAj/AwQI/wMDB0IAAAAAAAAAAAoMDH8FBQj/Dw8TQgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSR/gcKhPFLAoT02gOE + 9f0WiPE4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7iCIPwncD1sp5AP/CdQD/wnUA/8l5 + AP/AcwHh0IsuCwAAAAAAAAAAAAAAAAAAAAAEBAi1AwQJ/wMECP8DBAj/AgMG/xISFIsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIbxvACH/v8BgfH/AYHx/wGB8f8Biv//BYTxlAAA + AAD///8BCQkNuwIECP8DBAj/AwQI/wIDCP8JCQ6jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAARUVFCwwMEL8bGxs4AAAAAAAAAAAAAAAAAAAGJgMEB+8DBAj/AwQI/wME + CP8DBAj/AwMHQgAAAAAAAAAAAAAAAAsLDYIEBAb6BwcLRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAwAAAAQAAAADIAAAAQAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARiOUeEobsRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMV/IhbDdgTiyHkA/8J1AP/CdQD/zHsA/8J3Bb4AAAAAAAAAAAAAAAAAAAAAAAAAAAQE + CLUDBAn/AwQI/wMECP8CAwb/EhIUiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAMhvG8AIf+/wGB8f8BgfH/AYHx/wGK//8FhPGUAAAAAAAAAAAICgpeAwQI/wMECP8DBAj/AgMI/wkJ + DdY4ODgJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDhBrBwgL/xwc + ITUAAAAAAAAAAAAAAAAAAAYmAwQH7wMECP8DBAj/AwQI/wMECP8DAwdCAAAAAAAAAAAAAAAAAAAAAAcH + Co4DBAb8AwcLRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ABYAAACCCwsL2T4+PvZPT0/9QUFB9xMTE+EAAACSAAAAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAZkO4eD4foIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxHsVI8J2A/TGdwD/wnUA/8J1 + AP/QfQD/xHQHhgAAAAAAAAAAAAAAAAAAAAAAAAAAAQQItQMECf8DBAj/AwQI/wIDBv8UFBSMAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyG8bwAh/7/AYHx/wGB8f8BgfH/AYr//wWE + 8ZQAAAAAAAAAACoqKgYHBwvOAwQI/wMECP8DBAj/BQUJ+RoaHzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAGRkZHgQEBuwGBwv/JCQkMQAAAAAAAAAAAAAAAAAABiYDBAfvAwQI/wME + CP8DBAj/AwQI/wMDB0IAAAAAAAAAAAAAAAAAAAAAAAAAAAcHDI4EBQf9CgoNTAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAgIC02xsbP/V1dX/+vr6///////8/Pz/3Nzc/4CA + gP8ODg7jAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAGIXyFQSC8tsDhffiCYTvUwB//wIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADEfRA9wnYB/sR3AP/CdQD/xHcA/8Z3AfzIeRA9AAAAAAAAAAAAAAAAAAAAAAAA + AAAEBAixAwQJ/wMECP8DBAj/AgMH/w0ND4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAADIbxvACH/v8BgfH/AYHx/wGB8f8Biv//BYTxlAAAAAAAAAAAAAAAABAUFD4DBAf5AwQI/wME + CP8DBAj/CAgMkQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZmZgUHBwi2AgMI/wYH + C/kkJCQxAAAAAAAAAAAAAAAAAAAAJAMEB+4DBAj/AwQI/wMECP8DBAj/BAQIPwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAkKCo0DAgb/BwcKYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwcHIQsL + C+GlpaX//////////////////////////////////////7e3t/8VFRXvAAAANwAAAAAAAAAAAAAAAAAA + AAAIg/GVAY///wCO//8Gge/HP5//CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMV9EG7MewH/w3UA/8J1 + AP/NewD/wXYFwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUIC7gCAwj/AwQI/wMECP8CBAj/AwUJgQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhvG8AIf+/wGB8f8BgfH/AYHx/wGK + //8FhPGUAAAAAAAAAAAAAAAAAAAAAA0ND2IEBQj9AgMI/wIECP8FBQnzFBQUMwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAABQYIlQMECP8CBAj/BgcL+SQkJDEAAAAAAAAAAAAAAAAaGhomBQYK8wME + CP8DBAj/AwQI/wMECP8PDxJEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUICpQEBAj/BwcLiEhI + SAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsjIyM//////+Li4v/c3Nz/////////////////97e + 3v8uLi7/y8vL/7i4uP8HBwfMAAAACwAAAAAAAAAAAAAAAA2G8TcChPPFBIX19RuN7i8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwXUEss58AP/CdQD/xHYA/8x6Af/DexVVAAAAAAAAAAAAAAAAAAAAAAAA + AAAcHBwsBAQI8AMECP8DBAj/AwQI/wMECP8FBgrIf39/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAyG8bwAh/7/AYHx/wGB8f8BgfH/AYr//wWE8ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAwM + D1EDBAbhAwQI/wIDB/8DBAjWGhoaJwAAAAAAAAAAAAAAAAAAAAAAAAAAFRUcJAQFCLMCAwf/AwQI/wID + B/8GBwv6JCQkMQAAAAAAAAAAAAAAAA0NEnAEBQn/AwQI/wMECP8DBAj/AwQJ/w8PEpUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAFhsbLgQGCv4CAwj/BQUJvw0NDTkAAAAAAAAAAAAAAAAAAAAAAAAAMi8v + L/n19fX//////2pqav9NTU3/////////////////RUVF/zg4OP/6+vr//////0FBQf8AAABLAAAAAAAA + AAAAAAAAAAAAACeJ6w0NhvE3P5/vEBx/4hIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMJ/GCrDdAP3xncA/8J1 + AP/PfAD/v3UFvf///wEAAAAAAAAAAAAAAAAHBwdIBwcJgwUGB+MDBAf/BAQH/wMEB/8DBAf/BAQH/wME + Bv8FBQi9BgYIeQgIC1kAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoXwwQCH/v8BgfH/AYHx/wGB + 8f8Biv//BoPumQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoaGh0HBwuKBAQH5AMECP8EBAf8BQUIkgkJ + DFQHBwtDCAgKXgYIC58FBQfuAwQG6AgIDJMPDxJVCAgMkgcIDP8iIic0AAAAAAQEB2oGBgaiBAUG/wME + Bv8EBAf/AwQH/wMEB/8DBAf/BAUG/wYGBqIGCAh5FxcXIAAAAAAAAAAQBgYJcAcHCYIHBwjPBAQH/wQE + B/8DAwb/BAQH/wgICrEGBgh5DhIVRgAAAAAAAABweHh4////////////b29v/1tbW////////////5qa + mv8TExP/29vb////////////nJyc/wAAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAH///wIJgfG7AoX6zhGK + 8jsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwngKf858AP/CdQD/ynkA/8N2A/TJgh0rAAAAAAAAAAAAAAAAAAAAABAQ + E10PDxKWEBIUehEUFnIRFBZyERQWchEUFnIRFBZyERQWcg8REYEPEBSYEREVdQAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wEKgvCwAIr//wGB8P8BgfH/AYHx/wGL//8Jg/GEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAWFiEXCwsOVwQGCaMCAwfRBQUK3QQHCdkHBwrKBAQGogkJD1EfDx8QAAAAAAAA + AAB/f1UGCgoNrBwcIS0AAAAADxEThRAQEokRExV1ERQWchEUFnIRFBZyERQWchEUFnIRExV0EREThhAS + EpokJCQqAAAAABcXFxYQEBOOEBARjxASFHwRFBZyERQWchEUFnIRExV2ERETghAQE5sSFRheAAAAAAAA + AJ2ioqL///////////92dnb/MDAw/5ycnP94eHj/AwMD/7Gxsf/////////////////CwsL/AAAAsAAA + AAAAAAAAAAAAAAAAAAAAAAAAEYbxOQKE+P8Bj///FYrxYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANaGKBPBdALhyXkA/8d4 + AP/KeQL/wXYKXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+J7zIEgfPyAIb5/wGA + 8P8BiP7/B4Pw1haF6BcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wIOHBwSCwsXFlVVVQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8EAAAAAgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmZ+fn////////////3p6ev8bGxv/W1tb/05O + Tv9QUFD/MjIy/66urv///////////8HBwf8AAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAmcwFBoLuTgiB + 7nozmeUKE4LrJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwXYMks99AP/IeAD/ynkA/79zBnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqC7WQChvv/AYb5/wKE9fcZiu07AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABnbGxs////////////b29v/1tbW/////////////////+FhYX/Jycn//z8/P//////jo6O/wAA + AIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeD74QDhPT8FYr0SAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL53DE/GdwH/0H0A/8h3 + AffBdgdsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeB + 76QBkP//CILvdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYiIiL17u7u//////9ubm7/VFRU//// + /////////////4uLi/8nJyf//f39//39/f80NDT/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAABIPyZwWF88cah/QxC4XzawmE8TgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC8ehI2xXcB8NmCAP/EdwLWvXQHRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACY31GwuG84cqqtQGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAJdzc3P//////39/f/8UFBT/Tk5O/01NTf8+Pj7/Ghoa/6enp///////kpKS/wAA + ALgAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf3+/BByG6SQFgvb4DYTxgRmM + 8EUGgu9UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw3YORcZ3BfHMeALxx3cHib9/ + GRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMFAAAAMmIiIj/5ubm/8nJ + yf+5ubn/tra2/729vf/s7Oz//////56env8GBgbgAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAH//AhCF7i5Pn+8QCILwmgmG8JwViPJUC4TwiRWK8CMIhe49F4vvIQyF + 8igAlP8YjX9jEsN4BnDCcwbNyngDh8R7FSMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAALhSUlL/wMDA//b29v//////+Pj4/8TExP9dXV3/AAAAygAA + AC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAn/8IVar/BhGI8ToPiO9UEIXyPwuE8W4Ph/BEEInxTgCL/jehgkgxyHoGS8J5GBUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA + AFwAAAC2ISEh4CMjI/MfHx/iAQEBugAAAGkAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAIAAAABUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Permission/IconForm.Designer.cs b/DH.RBAC/Views/Sys/Permission/IconForm.Designer.cs new file mode 100644 index 0000000..6802393 --- /dev/null +++ b/DH.RBAC/Views/Sys/Permission/IconForm.Designer.cs @@ -0,0 +1,216 @@ +namespace DH.RBAC.Page.Sys.Permission +{ + partial class IconForm + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IconForm)); + this.uiPanel1 = new Sunny.UI.UIPanel(); + this.titlePanel = new System.Windows.Forms.Panel(); + this.lblTitle = new Sunny.UI.UILabel(); + this.btnClose = new Sunny.UI.UISymbolLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.btnConfirm = new Sunny.UI.UIButton(); + this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.uiPanel1.SuspendLayout(); + this.titlePanel.SuspendLayout(); + this.panel1.SuspendLayout(); + this.panel3.SuspendLayout(); + this.SuspendLayout(); + // + // uiPanel1 + // + this.uiPanel1.Controls.Add(this.titlePanel); + this.uiPanel1.Controls.Add(this.panel1); + this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.uiPanel1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(241)))), ((int)(((byte)(243))))); + this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.uiPanel1.Location = new System.Drawing.Point(0, 0); + this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1); + this.uiPanel1.Name = "uiPanel1"; + this.uiPanel1.RectColor = System.Drawing.Color.Silver; + this.uiPanel1.Size = new System.Drawing.Size(910, 546); + this.uiPanel1.Style = Sunny.UI.UIStyle.Custom; + this.uiPanel1.StyleCustomMode = true; + this.uiPanel1.TabIndex = 6; + this.uiPanel1.Text = null; + this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter; + // + // titlePanel + // + this.titlePanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.titlePanel.Controls.Add(this.lblTitle); + this.titlePanel.Controls.Add(this.btnClose); + this.titlePanel.Dock = System.Windows.Forms.DockStyle.Top; + this.titlePanel.Location = new System.Drawing.Point(0, 0); + this.titlePanel.Name = "titlePanel"; + this.titlePanel.Size = new System.Drawing.Size(910, 43); + this.titlePanel.TabIndex = 7; + this.titlePanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.titlePanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // lblTitle + // + this.lblTitle.Dock = System.Windows.Forms.DockStyle.Fill; + this.lblTitle.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.lblTitle.Location = new System.Drawing.Point(0, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(865, 43); + this.lblTitle.Style = Sunny.UI.UIStyle.Custom; + this.lblTitle.TabIndex = 1; + this.lblTitle.Text = "图标选择"; + this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblTitle.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown); + this.lblTitle.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove); + // + // btnClose + // + this.btnClose.Dock = System.Windows.Forms.DockStyle.Right; + this.btnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnClose.Location = new System.Drawing.Point(865, 0); + this.btnClose.MinimumSize = new System.Drawing.Size(1, 1); + this.btnClose.Name = "btnClose"; + this.btnClose.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0); + this.btnClose.Size = new System.Drawing.Size(45, 43); + this.btnClose.Style = Sunny.UI.UIStyle.Custom; + this.btnClose.Symbol = 77; + this.btnClose.SymbolSize = 60; + this.btnClose.TabIndex = 0; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + this.btnClose.MouseEnter += new System.EventHandler(this.btnClose_MouseEnter); + this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.flowLayoutPanel1); + this.panel1.Controls.Add(this.panel3); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(910, 546); + this.panel1.TabIndex = 6; + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.AutoScroll = true; + this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(910, 475); + this.flowLayoutPanel1.TabIndex = 17; + // + // panel3 + // + this.panel3.Controls.Add(this.btnConfirm); + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.Location = new System.Drawing.Point(0, 475); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(910, 71); + this.panel3.TabIndex = 16; + // + // btnConfirm + // + this.btnConfirm.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnConfirm.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnConfirm.FillColor = System.Drawing.Color.White; + this.btnConfirm.FillColor2 = System.Drawing.Color.White; + this.btnConfirm.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.btnConfirm.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.btnConfirm.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102))))); + this.btnConfirm.ForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + this.btnConfirm.ForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnConfirm.ForeSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229))))); + this.btnConfirm.Location = new System.Drawing.Point(763, 15); + this.btnConfirm.MinimumSize = new System.Drawing.Size(1, 1); + this.btnConfirm.Name = "btnConfirm"; + this.btnConfirm.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227))))); + this.btnConfirm.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255))))); + this.btnConfirm.Size = new System.Drawing.Size(125, 44); + + this.btnConfirm.StyleCustomMode = true; + this.btnConfirm.TabIndex = 14; + this.btnConfirm.Text = "确定"; + this.btnConfirm.Click += new System.EventHandler(this.btnConfirm_Click); + // + // backgroundWorker1 + // + this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // IconForm + // + this.AllowShowTitle = false; + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(910, 546); + this.Controls.Add(this.uiPanel1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "IconForm"; + this.Padding = new System.Windows.Forms.Padding(0); + this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.ShowTitle = false; + this.ShowTitleIcon = true; + this.Style = Sunny.UI.UIStyle.Custom; + this.Text = "新增用户"; + this.TitleColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248))))); + this.TitleForeColor = System.Drawing.Color.DimGray; + this.TopMost = true; + this.Load += new System.EventHandler(this.IconForm_Load); + this.uiPanel1.ResumeLayout(false); + this.titlePanel.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private Sunny.UI.UIPanel uiPanel1; + private System.Windows.Forms.Panel titlePanel; + private Sunny.UI.UILabel lblTitle; + private System.Windows.Forms.Panel panel1; + private Sunny.UI.UIButton btnConfirm; + private Sunny.UI.UISymbolLabel btnClose; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Timer timer1; + protected System.ComponentModel.BackgroundWorker backgroundWorker1; + } +} \ No newline at end of file diff --git a/DH.RBAC/Views/Sys/Permission/IconForm.cs b/DH.RBAC/Views/Sys/Permission/IconForm.cs new file mode 100644 index 0000000..5bdd015 --- /dev/null +++ b/DH.RBAC/Views/Sys/Permission/IconForm.cs @@ -0,0 +1,163 @@ + +using DH.RBAC.Common; +using DH.RBAC.Utility.Other; +using Sunny.UI; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DH.RBAC.Page.Sys.Permission +{ + public partial class IconForm : UIForm + { + public IconForm() + { + InitializeComponent(); + } + + #region 标题栏 + private void btnClose_Click(object sender, EventArgs e) + { + FormHelper.subForm = null; + this.Close(); + } + private Point mPoint; + private void titlePanel_MouseDown(object sender, MouseEventArgs e) + { + mPoint = new Point(e.X, e.Y); + } + + private void titlePanel_MouseMove(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y); + } + } + + private void btnClose_MouseEnter(object sender, EventArgs e) + { + btnClose.BackColor = Color.FromArgb(231, 231, 231); + } + + private void btnClose_MouseLeave(object sender, EventArgs e) + { + btnClose.BackColor = Color.Transparent; + } + #endregion + + /// + /// 画面加载,读取用户信息,显示在界面上 + /// + /// + /// + private void IconForm_Load(object sender, EventArgs e) + { + backgroundWorker1.RunWorkerAsync(); + timer1.Start(); + } + + + + /// + /// 确定按钮 + /// + /// + /// + private void btnConfirm_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.OK; + } + + + private readonly ConcurrentQueue [Browsable(false)] public Rectangle BaseRectangle { get; set; } - EnumHelper.ElementState IShapeElement.State { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public abstract bool IsMouseHover(PointF p); diff --git a/DH.UI.Model.Winform/Element/MLResultDisplay.cs b/DH.UI.Model.Winform/Element/MLResultDisplay.cs index 61dab98..eb21fdc 100644 --- a/DH.UI.Model.Winform/Element/MLResultDisplay.cs +++ b/DH.UI.Model.Winform/Element/MLResultDisplay.cs @@ -1,5 +1,5 @@  -using DH.Commons.Enums; +using DH.Commons.Base; using System; using System.Collections.Generic; using System.Drawing; diff --git a/DHSoftware.sln b/DHSoftware.sln index e4ce813..304e1d7 100644 --- a/DHSoftware.sln +++ b/DHSoftware.sln @@ -25,8 +25,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Motion", "Motion", "{5C8472 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DH.Devices.Motion", "DH.Devices.Motion\DH.Devices.Motion.csproj", "{144E3775-0BD7-4528-9FB0-A0F4ADC74313}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DH.Commons.Devies", "DH.Commons.Devies\DH.Commons.Devies.csproj", "{A33108B6-2740-4D28-AD22-B280372980BE}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{3EAF3D9C-D3F9-4B6E-89DE-58F129CD1F4C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DH.UI.Model.Winform", "DH.UI.Model.Winform\DH.UI.Model.Winform.csproj", "{12CB9041-B1B1-41AE-B308-AABDACAA580E}" @@ -39,9 +37,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XKRS.CanFly", "CanFly\XKRS. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CanFly.Canvas", "CanFly.Canvas\CanFly.Canvas.csproj", "{EA7E228B-DB5C-4BF1-832B-D51B7F7D5F35}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Process", "Process", "{FE1AEA36-9909-4E4F-8A88-37338ECCCE62}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RBAC", "RBAC", "{7453BDD7-2DC0-41B6-B3C8-6EE043A0A0E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DH.Process", "DH.Process\DH.Process.csproj", "{9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DH.RBAC", "DH.RBAC\DH.RBAC.csproj", "{F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -91,14 +89,6 @@ Global {144E3775-0BD7-4528-9FB0-A0F4ADC74313}.Release|Any CPU.Build.0 = Release|Any CPU {144E3775-0BD7-4528-9FB0-A0F4ADC74313}.Release|x64.ActiveCfg = Release|x64 {144E3775-0BD7-4528-9FB0-A0F4ADC74313}.Release|x64.Build.0 = Release|x64 - {A33108B6-2740-4D28-AD22-B280372980BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A33108B6-2740-4D28-AD22-B280372980BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A33108B6-2740-4D28-AD22-B280372980BE}.Debug|x64.ActiveCfg = Debug|X64 - {A33108B6-2740-4D28-AD22-B280372980BE}.Debug|x64.Build.0 = Debug|X64 - {A33108B6-2740-4D28-AD22-B280372980BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A33108B6-2740-4D28-AD22-B280372980BE}.Release|Any CPU.Build.0 = Release|Any CPU - {A33108B6-2740-4D28-AD22-B280372980BE}.Release|x64.ActiveCfg = Release|X64 - {A33108B6-2740-4D28-AD22-B280372980BE}.Release|x64.Build.0 = Release|X64 {12CB9041-B1B1-41AE-B308-AABDACAA580E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12CB9041-B1B1-41AE-B308-AABDACAA580E}.Debug|Any CPU.Build.0 = Debug|Any CPU {12CB9041-B1B1-41AE-B308-AABDACAA580E}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -131,14 +121,14 @@ Global {EA7E228B-DB5C-4BF1-832B-D51B7F7D5F35}.Release|Any CPU.Build.0 = Release|Any CPU {EA7E228B-DB5C-4BF1-832B-D51B7F7D5F35}.Release|x64.ActiveCfg = Release|x64 {EA7E228B-DB5C-4BF1-832B-D51B7F7D5F35}.Release|x64.Build.0 = Release|x64 - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Debug|x64.ActiveCfg = Debug|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Debug|x64.Build.0 = Debug|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Release|Any CPU.Build.0 = Release|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Release|x64.ActiveCfg = Release|Any CPU - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5}.Release|x64.Build.0 = Release|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Debug|x64.ActiveCfg = Debug|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Debug|x64.Build.0 = Debug|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Release|Any CPU.Build.0 = Release|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Release|x64.ActiveCfg = Release|Any CPU + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -152,12 +142,11 @@ Global {458B2CF6-6F1B-4B8B-BB85-C6FD7F453A5D} = {2560C5A5-0CA2-48AD-B606-6C55BEFD8109} {5C8472C6-EB6A-4D89-B519-7073BBF6A5D2} = {8EC33C16-65CE-4C12-9C8D-DB2425F9F7C0} {144E3775-0BD7-4528-9FB0-A0F4ADC74313} = {5C8472C6-EB6A-4D89-B519-7073BBF6A5D2} - {A33108B6-2740-4D28-AD22-B280372980BE} = {0AB4BB9A-A861-4F80-B549-CD331490942B} {12CB9041-B1B1-41AE-B308-AABDACAA580E} = {3EAF3D9C-D3F9-4B6E-89DE-58F129CD1F4C} {5AD3A29E-149A-4C37-9548-7638A36C8175} = {F77AF94C-280D-44C5-B7C0-FC86AA9EC504} {1FB768DB-843E-4C67-96B9-7684CF890D89} = {048B30B5-D075-4CE0-BF9F-CB6152E6D376} {EA7E228B-DB5C-4BF1-832B-D51B7F7D5F35} = {048B30B5-D075-4CE0-BF9F-CB6152E6D376} - {9C6D1290-26D9-4C5B-8BF5-A1F1E35368C5} = {FE1AEA36-9909-4E4F-8A88-37338ECCCE62} + {F6C217FA-66CF-4A46-ABE3-0B37BE50A1B5} = {7453BDD7-2DC0-41B6-B3C8-6EE043A0A0E2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {6FC1A8DF-636E-434C-981E-10F20FAD723B} diff --git a/DHSoftware/App.config b/DHSoftware/App.config new file mode 100644 index 0000000..1ffacd0 --- /dev/null +++ b/DHSoftware/App.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/DHSoftware/DHSoftware.csproj b/DHSoftware/DHSoftware.csproj index 372f82a..91a6931 100644 --- a/DHSoftware/DHSoftware.csproj +++ b/DHSoftware/DHSoftware.csproj @@ -10,11 +10,28 @@ true AnyCPU;x64 WinExe + assets\logo.ico + + + + + + + + + + + PreserveNewest + + + + + @@ -24,7 +41,16 @@ - + + + + + + + + + + @@ -40,7 +66,8 @@ - + + @@ -49,7 +76,7 @@ - + @@ -65,4 +92,15 @@ + + + + + + PreserveNewest + + !Exists('$(OutputPath)\db\db.sqlite') + + + \ No newline at end of file diff --git a/DHSoftware/EnumHelper.cs b/DHSoftware/EnumHelper.cs deleted file mode 100644 index 06d359b..0000000 --- a/DHSoftware/EnumHelper.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace DHSoftware -{ - public static class EnumHelper - { - public enum SelectPicType - { - [Description("训练图片")] - train =0, - [Description("测试图片")] - test - - } - public enum NetModel - { - [Description("目标检测")] - training = 0, - [Description("语义分割")] - train_seg, - [Description("模型导出")] - emport, - [Description("推理预测")] - infernce - - } - public static string GetEnumDescription(this Enum enumObj) - { - Type t = enumObj.GetType(); - FieldInfo f = t.GetField(enumObj.ToString()); - if (f == null) - { - return enumObj.ToString(); - } - DescriptionAttribute attr = f.GetCustomAttribute(); - if (attr != null) - { - return attr.Description; - } - else - { - return enumObj.ToString(); - } - } - - // 根据描述获取枚举值(泛型方法) - public static T GetEnumFromDescription(string description) where T : Enum - { - Type enumType = typeof(T); - foreach (T value in Enum.GetValues(enumType)) - { - string desc = GetEnumDescription(value); - if (desc == description) - { - return value; - } - } - throw new ArgumentException($"在枚举 {enumType.Name} 中未找到描述为 '{description}' 的值"); - } - - } -} diff --git a/DHSoftware/Languages/Localizer_en-US.cs b/DHSoftware/Languages/Localizer_en-US.cs index 1664da8..c30ea43 100644 --- a/DHSoftware/Languages/Localizer_en-US.cs +++ b/DHSoftware/Languages/Localizer_en-US.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace DHSoftware.Languages +namespace DHSoftware.Languages { public class Localizer_enus : AntdUI.ILocalization { @@ -14,126 +8,183 @@ namespace DHSoftware.Languages { case "search": return "Search"; + case "welcome": return "Welcome to the AntdUI Demo"; + case "home": return "Home"; + case "closeall": return "Close all tabs"; + #region systemset + case "systemset": return "System Settings"; + case "baseset": return "Basic Settings"; + case "messageconfig": return "Message configuration"; + case "animationon": return "Turn on animation"; + case "shadowon": return "Enable shadow"; + case "scrollbarhide": return "Hide scrollbar"; + case "showinwindow": return "Show in window"; + case "windowOffsetXY": return "WindowOffsetXY"; + case "tip": return "Tip"; + case "switchsuccess": return "Switch successful."; - #endregion + + #endregion systemset #region Button + case "Button.Text": return "Button"; + case "Button.Description": return "To trigger an operation."; + case "type": return "Type"; + case "wave": return "Wave"; + case "loading": return "Loading"; + case "ghost": return "Ghost"; + case "border": return "Border"; + case "icon": return "Icon"; + case "arrow": return "Arrow"; + case "join": return "Join"; + case "gradient": return "Gradient"; + case "toggle": return "Toggle"; - #endregion + + #endregion Button #region FloatButton + case "FloatButton.Text": return "FloatButton"; + case "FloatButton.Description": return "A button that floats at the top of the page."; + case "FloatButton.Tip": return "FloatButton does not have a toolbox control and is called code."; + case "control_option": return "Control Options"; + case "button_option": return "Button Options"; + case "open": return "Open"; + case "close": return "Close"; + case "reset": return "Reset"; - #endregion + + #endregion FloatButton #region Icon + case "Icon.Text": return "Icon"; + case "Icon.Description": return "Semantic vector graphics."; + case "Icon.Tip": return "Icon does not have a toolbox control and is used for Svg property assignments."; + case "outlined": return "Outlined"; + case "filled": return "Filled"; + case "directionalicon": return "Directional icons"; + case "suggestionicon": return "Suggestion Icon"; + case "editingicon": return "Editing Icons"; + case "dataicon": return "Data icons"; + case "brand": return "Brand and logo"; + case "universal": return "Universal Icons for Websites"; + case "copysuccess": return "Copy successful!"; + case "copyfail": return "Copy failed!"; - #endregion + + #endregion Icon #region Divider + case "Divider.Text": return "Divider"; + case "Divider.Description": return "A divider line separates different content."; + case "basicusage": return "Basic Usage"; + case "vertical": return "Vertical"; + case "horizontal": return "Horizontal"; - #endregion + + #endregion Divider + default: return null; - } } } -} +} \ No newline at end of file diff --git a/DHSoftware/LoginWindow.Designer.cs b/DHSoftware/LoginWindow.Designer.cs new file mode 100644 index 0000000..f255853 --- /dev/null +++ b/DHSoftware/LoginWindow.Designer.cs @@ -0,0 +1,118 @@ +namespace DHSoftware +{ + partial class LoginWindow + { + /// + /// 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(LoginWindow)); + label1 = new AntdUI.Label(); + iptName = new AntdUI.Input(); + iptPwd = new AntdUI.Input(); + button_cancel = new AntdUI.Button(); + button_ok = new AntdUI.Button(); + SuspendLayout(); + // + // label1 + // + label1.BackColor = SystemColors.Window; + label1.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Bold, GraphicsUnit.Point, 134); + label1.Location = new Point(351, 44); + label1.Name = "label1"; + label1.Size = new Size(212, 23); + label1.TabIndex = 0; + label1.Text = "登录CCD光学筛选系统"; + // + // iptName + // + iptName.Location = new Point(351, 95); + iptName.Name = "iptName"; + iptName.PlaceholderText = "请输入用户名"; + iptName.Size = new Size(227, 37); + iptName.TabIndex = 1; + iptName.Text = "user"; + // + // iptPwd + // + iptPwd.Location = new Point(351, 156); + iptPwd.Name = "iptPwd"; + iptPwd.PasswordPaste = false; + iptPwd.PlaceholderText = "请输入密码"; + iptPwd.Size = new Size(227, 37); + iptPwd.TabIndex = 2; + iptPwd.Text = "123"; + iptPwd.UseSystemPasswordChar = true; + // + // button_cancel + // + button_cancel.BorderWidth = 1F; + button_cancel.Font = new Font("Microsoft YaHei UI", 9F); + button_cancel.Ghost = true; + button_cancel.Location = new Point(468, 231); + button_cancel.Name = "button_cancel"; + button_cancel.Size = new Size(95, 38); + button_cancel.TabIndex = 4; + button_cancel.Text = "取消"; + // + // button_ok + // + button_ok.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button_ok.Location = new Point(364, 231); + button_ok.Name = "button_ok"; + button_ok.Size = new Size(95, 38); + button_ok.TabIndex = 3; + button_ok.Text = "登录"; + button_ok.Type = AntdUI.TTypeMini.Primary; + // + // LoginWindow + // + BackgroundImage = (Image)resources.GetObject("$this.BackgroundImage"); + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(590, 340); + ControlBox = false; + Controls.Add(button_cancel); + Controls.Add(button_ok); + Controls.Add(iptPwd); + Controls.Add(iptName); + Controls.Add(label1); + Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + Icon = (Icon)resources.GetObject("$this.Icon"); + Name = "LoginWindow"; + StartPosition = FormStartPosition.CenterScreen; + Text = "登录界面"; + ResumeLayout(false); + } + + #endregion + + + private AntdUI.Label label1; + private AntdUI.Input iptName; + private AntdUI.Input iptPwd; + private AntdUI.Button button_cancel; + private AntdUI.Button button_ok; + } +} \ No newline at end of file diff --git a/DHSoftware/LoginWindow.cs b/DHSoftware/LoginWindow.cs new file mode 100644 index 0000000..997b323 --- /dev/null +++ b/DHSoftware/LoginWindow.cs @@ -0,0 +1,138 @@ +using AntdUI; +using DH.RBAC.Logic.Sys; +using DH.RBAC.Model.Sys; +using DH.RBAC.Utility.Other; +using DHSoftware.Models; + + +namespace DHSoftware +{ + public partial class LoginWindow : AntdUI.Window + { + private SysUserLogic userlogic; + private SysUserLogOnLogic userLogOnLogic; + private SysPermissionLogic permissionLogic; + public LoginWindow() + { + InitializeComponent(); + userlogic = new SysUserLogic(); + userLogOnLogic = new SysUserLogOnLogic(); + permissionLogic = new SysPermissionLogic(); + // 关键设置:允许窗体优先接收按键事件 + this.KeyPreview = true; + + // 绑定按键事件 + this.KeyDown += Login_KeyDown; + button_ok.Click += Button_ok_Click; + button_cancel.Click += Button_cancel_Click; + } + + + private void Login_KeyDown(object? sender, KeyEventArgs e) + { + // 监听回车键 + if (e.KeyCode == Keys.Enter) + { + button_ok.PerformClick(); // 触发确定按钮的点击事件 + e.Handled = true; // 阻止其他控件处理该按键 + } + + // 监听 ESC 键 + if (e.KeyCode == Keys.Escape) + { + button_cancel.PerformClick(); // 触发取消按钮的点击事件 + e.Handled = true; + } + } + + /// + /// 窗体对象实例 + /// + private static LoginWindow _instance; + + public static LoginWindow Instance + { + get + { + if (_instance == null || _instance.IsDisposed) + _instance = new LoginWindow(); + return _instance; + } + } + + public MainWindow parentForm; + private void Button_cancel_Click(object? sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + this.Dispose(); + } + + private void Button_ok_Click(object? sender, EventArgs e) + { + string userName = iptName.Text; + string password = iptPwd.Text; + if (StringHelper.IsNullOrEmpty(userName)) + { + AntdUI.Message.warn(this, "请输入用户名!", autoClose: 3); + + return; + } + if (StringHelper.IsNullOrEmpty(password)) + { + AntdUI.Message.warn(this, "请输入密码!", autoClose: 3); + + + return; + } + password = password.MD5Encrypt(); + var userEntity = userlogic.GetByUserName(userName); + if (userEntity == null) + { + AntdUI.Message.warn(this, "该账户不存在,请重新输入!", autoClose: 3); + + + return; + } + if (!userEntity.IsEnabled) + { + AntdUI.Message.warn(this, "该账户已被禁用,请联系管理员!", autoClose: 3); + + + return; + } + var userLogOnEntity = userLogOnLogic.GetByAccount(userEntity.Id); + string inputPassword = password.DESEncrypt(userLogOnEntity.SecretKey).MD5Encrypt(); + if (inputPassword != userLogOnEntity.Password) + { + AntdUI.Message.warn(this, "密码错误,请重新输入!", autoClose: 3); + + + return; + } + userLogOnLogic.UpdateLogin(userLogOnEntity); + + DH.RBAC.Common.GlobalConfig.CurrentUser = userEntity; + List list; + if (userlogic.ContainsUser("admin", DH.RBAC.Common.GlobalConfig.CurrentUser.Id)) + { + list = permissionLogic.GetList(); + } + else + { + list = permissionLogic.GetList(DH.RBAC.Common.GlobalConfig.CurrentUser.Id); + } + if (list.IsNullOrEmpty()) + { + AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); + + return; + } + DH.RBAC.Common.GlobalConfig.PermissionList = list; + DialogResult = DialogResult.OK; + parentForm.ButtonPermissionList = DH.RBAC.Common.GlobalConfig.PermissionList.ToList(); + this.Dispose(); + } + + + } +} \ No newline at end of file diff --git a/DHSoftware/LoginWindow.resx b/DHSoftware/LoginWindow.resx new file mode 100644 index 0000000..c3cab01 --- /dev/null +++ b/DHSoftware/LoginWindow.resx @@ -0,0 +1,7491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEfGuBI/xLutQMS77EDEu+xAxLvsP8S7zrynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/28ph/su6cfy7unH6W8ph55uqUfSrymFhcAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px77vKcf7bym + H9i7px+WuqogMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE + u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/rumH766px1OuaIjFv//AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ + vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+9px/2vacfvbymIGe1nyAYAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/wvKcexbyn + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA + AAAAAAAAAAAAALymIRe7px/DvKcf/7ynH/+8px//vKcf/7ynH/y7pR+Dv4AABAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF + u08AAAAAAAAAAAAAAAAAAAAAAAAAAMyZMwW7px+LvKcf/rynH/+8px//vKcf/7ynH/+8px6ru6oiDwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn + H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE + u/9AxLv/QMS7/0DEvOdAxLvcQMS73EDEu9xAxLvcQMS73EDEu9x0uHrruKkk/rynH/+8px//vKcf/7yn + H/+lrTz2TcGp30DEu9xAxLvcQMS73EDEu9xAxLvcQMS73EDEut9AxLv2QMS7/0DEu/9AxLv/QMS837yn + H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn + H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E + u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D + uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn + H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE + u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn + H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn + H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAL+/AAS7ph6HvKcf/ryn + H/+8px//vKcf/7ynH/+9px+tu6oiDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE + u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAMKq + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE + u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/DHSoftware/MainWindow.Designer.cs b/DHSoftware/MainWindow.Designer.cs index b6f3a2e..9167ff2 100644 --- a/DHSoftware/MainWindow.Designer.cs +++ b/DHSoftware/MainWindow.Designer.cs @@ -28,62 +28,82 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow)); + AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine(); AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard(); - AntdUI.Tabs.StyleCard styleCard2 = new AntdUI.Tabs.StyleCard(); - AntdUI.Tabs.StyleCard styleCard3 = new AntdUI.Tabs.StyleCard(); AntdUI.SegmentedItem segmentedItem1 = new AntdUI.SegmentedItem(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainWindow)); AntdUI.SegmentedItem segmentedItem2 = new AntdUI.SegmentedItem(); AntdUI.SegmentedItem segmentedItem3 = new AntdUI.SegmentedItem(); AntdUI.SegmentedItem segmentedItem4 = new AntdUI.SegmentedItem(); AntdUI.SegmentedItem segmentedItem5 = new AntdUI.SegmentedItem(); + AntdUI.SegmentedItem segmentedItem6 = new AntdUI.SegmentedItem(); titlebar = new AntdUI.PageHeader(); - button_color = new AntdUI.Button(); - buttonSZ = new AntdUI.Button(); - pageHeader1 = new AntdUI.PageHeader(); - label1 = new Label(); - divider2 = new AntdUI.Divider(); - panelmain = new AntdUI.Panel(); - panel2 = new AntdUI.Panel(); - panel4 = new AntdUI.Panel(); - panel6 = new AntdUI.Panel(); - splitContainer1 = new SplitContainer(); - splitContainer2 = new SplitContainer(); - tabImgDisplay = new AntdUI.Tabs(); - tabMain = new AntdUI.TabPage(); + lbName = new AntdUI.Label(); tabsStas = new AntdUI.Tabs(); tabPage3 = new AntdUI.TabPage(); - richTextBox1 = new RichTextBox(); - tabsConfig = new AntdUI.Tabs(); - tabPage2 = new AntdUI.TabPage(); + panel7 = new Panel(); + tabMain = new AntdUI.TabPage(); + panelmain = new AntdUI.Panel(); + splitter2 = new AntdUI.Splitter(); + tabImgDisplay = new AntdUI.Tabs(); + splitter1 = new AntdUI.Splitter(); + pnlLog = new AntdUI.Panel(); + panel6 = new AntdUI.Panel(); + tableLayoutstatistics = new TableLayoutPanel(); + dgvCamreaNums = new DataGridView(); + panelNums = new AntdUI.Panel(); + tableLayoutNums = new TableLayoutPanel(); + tableLayoutPanel3 = new TableLayoutPanel(); + lblTotalTime = new Label(); + label1 = new Label(); + label12 = new Label(); + lblUPH = new Label(); + lblStartTime = new Label(); + lblOEE_Total = new Label(); + label10 = new Label(); + label7 = new Label(); + tagMachineStatus = new AntdUI.Tag(); + panel2 = new AntdUI.Panel(); panel1 = new AntdUI.Panel(); + segmented2 = new AntdUI.Segmented(); + panel3 = new AntdUI.Panel(); + textBoxBatchNO = new AntdUI.Input(); + btnCreateBatchNO = new AntdUI.Button(); + btnDeleteProject = new AntdUI.Button(); + btnAddProject = new AntdUI.Button(); + btnLoadProject = new AntdUI.Button(); + sltProjects = new AntdUI.Select(); segmented1 = new AntdUI.Segmented(); + pageHeader1 = new AntdUI.PageHeader(); + lbInBackend = new AntdUI.Label(); + divider2 = new AntdUI.Divider(); titlebar.SuspendLayout(); - pageHeader1.SuspendLayout(); - panelmain.SuspendLayout(); - panel2.SuspendLayout(); - panel4.SuspendLayout(); - panel6.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); - splitContainer1.Panel1.SuspendLayout(); - splitContainer1.Panel2.SuspendLayout(); - splitContainer1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)splitContainer2).BeginInit(); - splitContainer2.Panel1.SuspendLayout(); - splitContainer2.Panel2.SuspendLayout(); - splitContainer2.SuspendLayout(); - tabImgDisplay.SuspendLayout(); tabsStas.SuspendLayout(); tabPage3.SuspendLayout(); - tabsConfig.SuspendLayout(); + panelmain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)splitter2).BeginInit(); + splitter2.Panel1.SuspendLayout(); + splitter2.Panel2.SuspendLayout(); + splitter2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)splitter1).BeginInit(); + splitter1.Panel1.SuspendLayout(); + splitter1.Panel2.SuspendLayout(); + splitter1.SuspendLayout(); + panel6.SuspendLayout(); + tableLayoutstatistics.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).BeginInit(); + panelNums.SuspendLayout(); + tableLayoutNums.SuspendLayout(); + tableLayoutPanel3.SuspendLayout(); panel1.SuspendLayout(); + panel3.SuspendLayout(); + pageHeader1.SuspendLayout(); SuspendLayout(); // // titlebar // - titlebar.BackColor = SystemColors.MenuHighlight; - titlebar.Controls.Add(button_color); - titlebar.Controls.Add(buttonSZ); + titlebar.BackColor = Color.FromArgb(46, 108, 227); + titlebar.Controls.Add(lbName); titlebar.DividerShow = true; titlebar.DividerThickness = 0F; titlebar.Dock = DockStyle.Top; @@ -94,162 +114,49 @@ titlebar.Name = "titlebar"; titlebar.ShowButton = true; titlebar.ShowIcon = true; - titlebar.Size = new Size(1024, 40); + titlebar.Size = new Size(1024, 37); titlebar.SubText = "CCD光学筛选系统"; titlebar.TabIndex = 0; titlebar.Text = "山东迭慧智能科技有限公司"; // - // button_color + // lbName // - button_color.Dock = DockStyle.Right; - button_color.Ghost = true; - button_color.IconRatio = 0.6F; - button_color.IconSvg = "SunOutlined"; - button_color.Location = new Point(780, 0); - button_color.Name = "button_color"; - button_color.Radius = 0; - button_color.Size = new Size(50, 40); - button_color.TabIndex = 1; - button_color.ToggleIconSvg = "MoonOutlined"; - button_color.Visible = false; - button_color.WaveSize = 0; + lbName.Dock = DockStyle.Right; + lbName.ForeColor = SystemColors.Window; + lbName.Location = new Point(746, 0); + lbName.Name = "lbName"; + lbName.Size = new Size(134, 37); + lbName.TabIndex = 0; + lbName.Text = ""; + lbName.TextAlign = ContentAlignment.MiddleRight; // - // buttonSZ + // tabsStas // - buttonSZ.Dock = DockStyle.Right; - buttonSZ.Ghost = true; - buttonSZ.IconSvg = resources.GetString("buttonSZ.IconSvg"); - buttonSZ.Location = new Point(830, 0); - buttonSZ.Name = "buttonSZ"; - buttonSZ.Radius = 0; - buttonSZ.Size = new Size(50, 40); - buttonSZ.TabIndex = 0; - buttonSZ.Visible = false; - buttonSZ.WaveSize = 0; + tabsStas.Dock = DockStyle.Fill; + tabsStas.Location = new Point(0, 0); + tabsStas.Name = "tabsStas"; + tabsStas.Pages.Add(tabPage3); + tabsStas.Size = new Size(580, 176); + tabsStas.Style = styleLine1; + tabsStas.TabIndex = 3; + tabsStas.Text = "tabs3"; // - // pageHeader1 + // tabPage3 // - pageHeader1.Controls.Add(label1); - pageHeader1.Controls.Add(divider2); - pageHeader1.DividerShow = true; - pageHeader1.Dock = DockStyle.Bottom; - pageHeader1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - pageHeader1.Location = new Point(0, 608); - pageHeader1.Name = "pageHeader1"; - pageHeader1.Size = new Size(1024, 40); - pageHeader1.TabIndex = 7; - pageHeader1.Text = "UPH"; + tabPage3.Controls.Add(panel7); + tabPage3.Location = new Point(3, 3); + tabPage3.Name = "tabPage3"; + tabPage3.Size = new Size(574, 170); + tabPage3.TabIndex = 0; + tabPage3.Text = "日志"; // - // label1 + // panel7 // - label1.AutoSize = true; - label1.Location = new Point(979, 10); - label1.Name = "label1"; - label1.Size = new Size(64, 21); - label1.TabIndex = 1; - label1.Text = "100000"; - // - // divider2 - // - divider2.Dock = DockStyle.Top; - divider2.Location = new Point(54, 0); - divider2.Name = "divider2"; - divider2.OrientationMargin = 0F; - divider2.Size = new Size(970, 10); - divider2.TabIndex = 0; - divider2.Text = ""; - // - // panelmain - // - panelmain.Controls.Add(panel2); - panelmain.Controls.Add(panel1); - panelmain.Dock = DockStyle.Fill; - panelmain.Location = new Point(0, 40); - panelmain.Margin = new Padding(0); - panelmain.Name = "panelmain"; - panelmain.Size = new Size(1024, 568); - panelmain.TabIndex = 8; - // - // panel2 - // - panel2.Controls.Add(panel4); - panel2.Dock = DockStyle.Fill; - panel2.Location = new Point(0, 68); - panel2.Name = "panel2"; - panel2.Size = new Size(1024, 500); - panel2.TabIndex = 1; - panel2.Text = "panel2"; - // - // panel4 - // - panel4.Controls.Add(panel6); - panel4.Dock = DockStyle.Fill; - panel4.Location = new Point(0, 0); - panel4.Name = "panel4"; - panel4.Size = new Size(1024, 500); - panel4.TabIndex = 1; - panel4.Text = "panel4"; - // - // panel6 - // - panel6.Controls.Add(splitContainer1); - panel6.Dock = DockStyle.Fill; - panel6.Location = new Point(0, 0); - panel6.Name = "panel6"; - panel6.Size = new Size(1024, 500); - panel6.TabIndex = 1; - panel6.Text = "panel6"; - // - // splitContainer1 - // - splitContainer1.BackColor = SystemColors.Control; - splitContainer1.Dock = DockStyle.Fill; - splitContainer1.Location = new Point(0, 0); - splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - splitContainer1.Panel1.Controls.Add(splitContainer2); - // - // splitContainer1.Panel2 - // - splitContainer1.Panel2.BackColor = SystemColors.ButtonFace; - splitContainer1.Panel2.Controls.Add(tabsConfig); - splitContainer1.Size = new Size(1024, 500); - splitContainer1.SplitterDistance = 580; - splitContainer1.SplitterIncrement = 2; - splitContainer1.SplitterWidth = 10; - splitContainer1.TabIndex = 0; - // - // splitContainer2 - // - splitContainer2.Dock = DockStyle.Fill; - splitContainer2.Location = new Point(0, 0); - splitContainer2.Name = "splitContainer2"; - splitContainer2.Orientation = Orientation.Horizontal; - // - // splitContainer2.Panel1 - // - splitContainer2.Panel1.Controls.Add(tabImgDisplay); - // - // splitContainer2.Panel2 - // - splitContainer2.Panel2.Controls.Add(tabsStas); - splitContainer2.Size = new Size(580, 500); - splitContainer2.SplitterDistance = 320; - splitContainer2.TabIndex = 0; - // - // tabImgDisplay - // - tabImgDisplay.Controls.Add(tabMain); - tabImgDisplay.Dock = DockStyle.Fill; - tabImgDisplay.Location = new Point(0, 0); - tabImgDisplay.Name = "tabImgDisplay"; - tabImgDisplay.Pages.Add(tabMain); - tabImgDisplay.Size = new Size(580, 320); - tabImgDisplay.Style = styleCard1; - tabImgDisplay.TabIndex = 1; - tabImgDisplay.Text = "tabs1"; + panel7.Dock = DockStyle.Fill; + panel7.Location = new Point(0, 0); + panel7.Name = "panel7"; + panel7.Size = new Size(574, 170); + panel7.TabIndex = 2; // // tabMain // @@ -259,77 +166,302 @@ tabMain.TabIndex = 0; tabMain.Text = "检测"; // - // tabsStas + // panelmain // - tabsStas.Controls.Add(tabPage3); - tabsStas.Dock = DockStyle.Fill; - tabsStas.Location = new Point(0, 0); - tabsStas.Name = "tabsStas"; - tabsStas.Pages.Add(tabPage3); - tabsStas.Size = new Size(580, 176); - tabsStas.Style = styleCard2; - tabsStas.TabIndex = 3; - tabsStas.Text = "tabs3"; + panelmain.Controls.Add(splitter2); + panelmain.Controls.Add(panel2); + panelmain.Controls.Add(panel1); + panelmain.Dock = DockStyle.Fill; + panelmain.Location = new Point(0, 37); + panelmain.Margin = new Padding(0); + panelmain.Name = "panelmain"; + panelmain.Size = new Size(1024, 594); + panelmain.TabIndex = 8; // - // tabPage3 + // splitter2 // - tabPage3.Controls.Add(richTextBox1); - tabPage3.Location = new Point(3, 28); - tabPage3.Name = "tabPage3"; - tabPage3.Size = new Size(574, 145); - tabPage3.TabIndex = 0; - tabPage3.Text = "日志"; + splitter2.Dock = DockStyle.Fill; + splitter2.Location = new Point(0, 83); + splitter2.Name = "splitter2"; + splitter2.Orientation = Orientation.Horizontal; // - // richTextBox1 + // splitter2.Panel1 // - richTextBox1.Dock = DockStyle.Fill; - richTextBox1.Location = new Point(0, 0); - richTextBox1.Name = "richTextBox1"; - richTextBox1.Size = new Size(574, 145); - richTextBox1.TabIndex = 0; - richTextBox1.Text = ""; + splitter2.Panel1.Controls.Add(tabImgDisplay); // - // tabsConfig + // splitter2.Panel2 // - tabsConfig.Controls.Add(tabPage2); - tabsConfig.Dock = DockStyle.Fill; - tabsConfig.Location = new Point(0, 0); - tabsConfig.Name = "tabsConfig"; - tabsConfig.Pages.Add(tabPage2); - tabsConfig.Size = new Size(434, 500); - tabsConfig.Style = styleCard3; - tabsConfig.TabIndex = 2; - tabsConfig.Text = "tabs2"; + splitter2.Panel2.Controls.Add(splitter1); + splitter2.Size = new Size(1024, 511); + splitter2.SplitterDistance = 400; + splitter2.TabIndex = 4; // - // tabPage2 + // tabImgDisplay // - tabPage2.Location = new Point(3, 28); - tabPage2.Name = "tabPage2"; - tabPage2.Size = new Size(428, 469); - tabPage2.TabIndex = 0; - tabPage2.Text = "配置"; + tabImgDisplay.Dock = DockStyle.Fill; + tabImgDisplay.Location = new Point(0, 0); + tabImgDisplay.Name = "tabImgDisplay"; + tabImgDisplay.Size = new Size(1024, 400); + tabImgDisplay.Style = styleCard1; + tabImgDisplay.TabIndex = 3; + tabImgDisplay.Text = "tabs1"; + // + // splitter1 + // + splitter1.Dock = DockStyle.Fill; + splitter1.Location = new Point(0, 0); + splitter1.Name = "splitter1"; + // + // splitter1.Panel1 + // + splitter1.Panel1.Controls.Add(pnlLog); + // + // splitter1.Panel2 + // + splitter1.Panel2.Controls.Add(panel6); + splitter1.Size = new Size(1024, 107); + splitter1.SplitterDistance = 332; + splitter1.TabIndex = 3; + // + // pnlLog + // + pnlLog.Dock = DockStyle.Fill; + pnlLog.Location = new Point(0, 0); + pnlLog.Name = "pnlLog"; + pnlLog.Size = new Size(332, 107); + pnlLog.TabIndex = 2; + pnlLog.Text = "panel8"; + // + // panel6 + // + panel6.Controls.Add(tableLayoutstatistics); + panel6.Dock = DockStyle.Fill; + panel6.Location = new Point(0, 0); + panel6.Name = "panel6"; + panel6.Size = new Size(688, 107); + panel6.TabIndex = 0; + panel6.Text = "panel6"; + // + // tableLayoutstatistics + // + tableLayoutstatistics.ColumnCount = 2; + tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); + tableLayoutstatistics.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); + tableLayoutstatistics.Controls.Add(dgvCamreaNums, 0, 0); + tableLayoutstatistics.Controls.Add(panelNums, 1, 0); + tableLayoutstatistics.Dock = DockStyle.Fill; + tableLayoutstatistics.Location = new Point(0, 0); + tableLayoutstatistics.Name = "tableLayoutstatistics"; + tableLayoutstatistics.RowCount = 1; + tableLayoutstatistics.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutstatistics.Size = new Size(688, 107); + tableLayoutstatistics.TabIndex = 9; + // + // dgvCamreaNums + // + dgvCamreaNums.AllowUserToAddRows = false; + dgvCamreaNums.AllowUserToDeleteRows = false; + dgvCamreaNums.AllowUserToResizeColumns = false; + dgvCamreaNums.AllowUserToResizeRows = false; + dgvCamreaNums.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dgvCamreaNums.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; + dgvCamreaNums.BackgroundColor = SystemColors.Control; + dgvCamreaNums.BorderStyle = BorderStyle.None; + dgvCamreaNums.CellBorderStyle = DataGridViewCellBorderStyle.SunkenHorizontal; + dgvCamreaNums.ColumnHeadersHeight = 25; + dgvCamreaNums.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + dgvCamreaNums.Dock = DockStyle.Fill; + dgvCamreaNums.Location = new Point(3, 15); + dgvCamreaNums.Margin = new Padding(3, 15, 3, 0); + dgvCamreaNums.MultiSelect = false; + dgvCamreaNums.Name = "dgvCamreaNums"; + dgvCamreaNums.ReadOnly = true; + dgvCamreaNums.RowHeadersVisible = false; + dgvCamreaNums.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dgvCamreaNums.Size = new Size(338, 92); + dgvCamreaNums.TabIndex = 9; + // + // panelNums + // + panelNums.Controls.Add(tableLayoutNums); + panelNums.Dock = DockStyle.Fill; + panelNums.Location = new Point(347, 3); + panelNums.Name = "panelNums"; + panelNums.Size = new Size(338, 101); + panelNums.TabIndex = 8; + panelNums.Text = "panel4"; + // + // tableLayoutNums + // + tableLayoutNums.ColumnCount = 1; + tableLayoutNums.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); + tableLayoutNums.Controls.Add(tableLayoutPanel3, 0, 1); + tableLayoutNums.Controls.Add(tagMachineStatus, 0, 0); + tableLayoutNums.Dock = DockStyle.Fill; + tableLayoutNums.Location = new Point(0, 0); + tableLayoutNums.Name = "tableLayoutNums"; + tableLayoutNums.RowCount = 2; + tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutNums.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F)); + tableLayoutNums.Size = new Size(338, 101); + tableLayoutNums.TabIndex = 8; + // + // tableLayoutPanel3 + // + tableLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink; + tableLayoutPanel3.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; + tableLayoutPanel3.ColumnCount = 4; + tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 21.05263F)); + tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 36.84211F)); + tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 21.05263F)); + tableLayoutPanel3.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 21.0526314F)); + tableLayoutPanel3.Controls.Add(lblTotalTime, 1, 1); + tableLayoutPanel3.Controls.Add(label1, 2, 1); + tableLayoutPanel3.Controls.Add(label12, 0, 1); + tableLayoutPanel3.Controls.Add(lblUPH, 3, 1); + tableLayoutPanel3.Controls.Add(lblStartTime, 1, 0); + tableLayoutPanel3.Controls.Add(lblOEE_Total, 3, 0); + tableLayoutPanel3.Controls.Add(label10, 0, 0); + tableLayoutPanel3.Controls.Add(label7, 2, 0); + tableLayoutPanel3.Dock = DockStyle.Fill; + tableLayoutPanel3.Location = new Point(3, 53); + tableLayoutPanel3.Name = "tableLayoutPanel3"; + tableLayoutPanel3.RowCount = 2; + tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutPanel3.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + tableLayoutPanel3.Size = new Size(332, 45); + tableLayoutPanel3.TabIndex = 11; + // + // lblTotalTime + // + lblTotalTime.AutoSize = true; + lblTotalTime.Dock = DockStyle.Fill; + lblTotalTime.Location = new Point(73, 23); + lblTotalTime.Name = "lblTotalTime"; + lblTotalTime.Size = new Size(114, 21); + lblTotalTime.TabIndex = 15; + lblTotalTime.Text = "0"; + lblTotalTime.TextAlign = ContentAlignment.MiddleCenter; + // + // label1 + // + label1.AutoSize = true; + label1.Dock = DockStyle.Fill; + label1.Location = new Point(194, 23); + label1.Name = "label1"; + label1.Size = new Size(62, 21); + label1.TabIndex = 8; + label1.Text = "速度/分钟"; + label1.TextAlign = ContentAlignment.MiddleCenter; + // + // label12 + // + label12.AutoSize = true; + label12.Dock = DockStyle.Fill; + label12.Location = new Point(4, 23); + label12.Name = "label12"; + label12.Size = new Size(62, 21); + label12.TabIndex = 14; + label12.Text = "运行时间"; + label12.TextAlign = ContentAlignment.MiddleCenter; + // + // lblUPH + // + lblUPH.AutoSize = true; + lblUPH.Dock = DockStyle.Fill; + lblUPH.Location = new Point(263, 23); + lblUPH.Name = "lblUPH"; + lblUPH.Size = new Size(65, 21); + lblUPH.TabIndex = 9; + lblUPH.Text = "0"; + lblUPH.TextAlign = ContentAlignment.MiddleCenter; + // + // lblStartTime + // + lblStartTime.AutoSize = true; + lblStartTime.Dock = DockStyle.Fill; + lblStartTime.Location = new Point(73, 1); + lblStartTime.Name = "lblStartTime"; + lblStartTime.Size = new Size(114, 21); + lblStartTime.TabIndex = 11; + lblStartTime.Text = "0"; + lblStartTime.TextAlign = ContentAlignment.MiddleCenter; + // + // lblOEE_Total + // + lblOEE_Total.AutoSize = true; + lblOEE_Total.Dock = DockStyle.Fill; + lblOEE_Total.Location = new Point(263, 1); + lblOEE_Total.Name = "lblOEE_Total"; + lblOEE_Total.Size = new Size(65, 21); + lblOEE_Total.TabIndex = 13; + lblOEE_Total.Text = "0"; + lblOEE_Total.TextAlign = ContentAlignment.MiddleCenter; + // + // label10 + // + label10.AutoSize = true; + label10.Dock = DockStyle.Fill; + label10.Location = new Point(4, 1); + label10.Name = "label10"; + label10.Size = new Size(62, 21); + label10.TabIndex = 12; + label10.Text = "开始时间"; + label10.TextAlign = ContentAlignment.MiddleCenter; + // + // label7 + // + label7.AutoSize = true; + label7.Dock = DockStyle.Fill; + label7.Location = new Point(194, 1); + label7.Name = "label7"; + label7.Size = new Size(62, 21); + label7.TabIndex = 10; + label7.Text = "总计数"; + label7.TextAlign = ContentAlignment.MiddleCenter; + // + // tagMachineStatus + // + tagMachineStatus.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Regular, GraphicsUnit.Point, 134); + tagMachineStatus.Location = new Point(3, 3); + tagMachineStatus.Name = "tagMachineStatus"; + tagMachineStatus.Size = new Size(141, 44); + tagMachineStatus.TabIndex = 12; + tagMachineStatus.Text = "待机中"; + tagMachineStatus.Type = AntdUI.TTypeMini.Primary; + // + // panel2 + // + panel2.Location = new Point(511, 86); + panel2.Name = "panel2"; + panel2.Size = new Size(814, 364); + panel2.TabIndex = 3; + panel2.Text = "panel2"; // // panel1 // - panel1.Back = SystemColors.MenuHighlight; + panel1.Back = Color.FromArgb(46, 108, 227); + panel1.Controls.Add(segmented2); + panel1.Controls.Add(panel3); panel1.Controls.Add(segmented1); panel1.Dock = DockStyle.Top; panel1.Location = new Point(0, 0); panel1.Margin = new Padding(0); panel1.Name = "panel1"; panel1.Radius = 0; - panel1.Size = new Size(1024, 68); + panel1.Size = new Size(1024, 83); panel1.TabIndex = 0; panel1.Text = "panel1"; // - // segmented1 + // segmented2 // - segmented1.BackActive = Color.FromArgb(100, 255, 87, 34); - segmented1.BackColor = Color.Transparent; - segmented1.Dock = DockStyle.Left; - segmented1.Font = new Font("Microsoft YaHei UI", 9F); - segmented1.ForeColor = Color.White; - segmented1.Full = true; + segmented2.BackActive = Color.FromArgb(100, 255, 87, 34); + segmented2.BackColor = Color.Transparent; + segmented2.Dock = DockStyle.Left; + segmented2.Font = new Font("Microsoft YaHei UI", 9F); + segmented2.ForeColor = Color.White; + segmented2.Full = true; segmentedItem1.Badge = null; segmentedItem1.BadgeAlign = AntdUI.TAlignFrom.TR; segmentedItem1.BadgeBack = null; @@ -340,7 +472,101 @@ segmentedItem1.BadgeSvg = null; segmentedItem1.IconActiveSvg = resources.GetString("segmentedItem1.IconActiveSvg"); segmentedItem1.IconSvg = resources.GetString("segmentedItem1.IconSvg"); - segmentedItem1.Text = "启动"; + segmentedItem1.Text = "定位"; + segmented2.Items.Add(segmentedItem1); + segmented2.Location = new Point(439, 0); + segmented2.Name = "segmented2"; + segmented2.Size = new Size(96, 83); + segmented2.TabIndex = 17; + segmented2.Text = "segmented2"; + segmented2.SelectIndexChanged += segmented2_SelectIndexChanged; + // + // panel3 + // + panel3.Back = Color.FromArgb(46, 108, 227); + panel3.Controls.Add(textBoxBatchNO); + panel3.Controls.Add(btnCreateBatchNO); + panel3.Controls.Add(btnDeleteProject); + panel3.Controls.Add(btnAddProject); + panel3.Controls.Add(btnLoadProject); + panel3.Controls.Add(sltProjects); + panel3.Dock = DockStyle.Right; + panel3.Location = new Point(554, 0); + panel3.Name = "panel3"; + panel3.Padding = new Padding(30); + panel3.Radius = 0; + panel3.ShadowOpacity = 0F; + panel3.ShadowOpacityHover = 0F; + panel3.Size = new Size(470, 83); + panel3.TabIndex = 16; + panel3.Text = "panel3"; + // + // textBoxBatchNO + // + textBoxBatchNO.Location = new Point(19, 0); + textBoxBatchNO.Name = "textBoxBatchNO"; + textBoxBatchNO.Size = new Size(218, 34); + textBoxBatchNO.TabIndex = 22; + // + // btnCreateBatchNO + // + btnCreateBatchNO.Location = new Point(246, 0); + btnCreateBatchNO.Name = "btnCreateBatchNO"; + btnCreateBatchNO.Size = new Size(72, 35); + btnCreateBatchNO.TabIndex = 21; + btnCreateBatchNO.Tag = ""; + btnCreateBatchNO.Text = "生成批次"; + btnCreateBatchNO.Click += btnCreateBatchNO_Click; + // + // btnDeleteProject + // + btnDeleteProject.Location = new Point(394, 40); + btnDeleteProject.Name = "btnDeleteProject"; + btnDeleteProject.Size = new Size(72, 35); + btnDeleteProject.TabIndex = 19; + btnDeleteProject.Tag = "sys-deletescheme"; + btnDeleteProject.Text = "删除"; + btnDeleteProject.Visible = false; + // + // btnAddProject + // + btnAddProject.Location = new Point(320, 40); + btnAddProject.Name = "btnAddProject"; + btnAddProject.Size = new Size(72, 35); + btnAddProject.TabIndex = 18; + btnAddProject.Tag = "sys-addscheme"; + btnAddProject.Text = "新增"; + btnAddProject.Visible = false; + // + // btnLoadProject + // + btnLoadProject.Location = new Point(246, 40); + btnLoadProject.Name = "btnLoadProject"; + btnLoadProject.Size = new Size(72, 35); + btnLoadProject.TabIndex = 17; + btnLoadProject.Tag = "sys-loadscheme"; + btnLoadProject.Text = "载入"; + btnLoadProject.Visible = false; + // + // sltProjects + // + sltProjects.List = true; + sltProjects.Location = new Point(19, 40); + sltProjects.Margin = new Padding(10); + sltProjects.MaxCount = 10; + sltProjects.Name = "sltProjects"; + sltProjects.Size = new Size(218, 35); + sltProjects.TabIndex = 16; + sltProjects.Tag = "sys-schemelist"; + // + // segmented1 + // + segmented1.BackActive = Color.FromArgb(100, 255, 87, 34); + segmented1.BackColor = Color.Transparent; + segmented1.Dock = DockStyle.Left; + segmented1.Font = new Font("Microsoft YaHei UI", 9F); + segmented1.ForeColor = Color.White; + segmented1.Full = true; segmentedItem2.Badge = null; segmentedItem2.BadgeAlign = AntdUI.TAlignFrom.TR; segmentedItem2.BadgeBack = null; @@ -351,7 +577,7 @@ segmentedItem2.BadgeSvg = null; segmentedItem2.IconActiveSvg = resources.GetString("segmentedItem2.IconActiveSvg"); segmentedItem2.IconSvg = resources.GetString("segmentedItem2.IconSvg"); - segmentedItem2.Text = "停止"; + segmentedItem2.Text = "启动"; segmentedItem3.Badge = null; segmentedItem3.BadgeAlign = AntdUI.TAlignFrom.TR; segmentedItem3.BadgeBack = null; @@ -362,7 +588,7 @@ segmentedItem3.BadgeSvg = null; segmentedItem3.IconActiveSvg = resources.GetString("segmentedItem3.IconActiveSvg"); segmentedItem3.IconSvg = resources.GetString("segmentedItem3.IconSvg"); - segmentedItem3.Text = "复位"; + segmentedItem3.Text = "停止"; segmentedItem4.Badge = null; segmentedItem4.BadgeAlign = AntdUI.TAlignFrom.TR; segmentedItem4.BadgeBack = null; @@ -373,7 +599,7 @@ segmentedItem4.BadgeSvg = null; segmentedItem4.IconActiveSvg = resources.GetString("segmentedItem4.IconActiveSvg"); segmentedItem4.IconSvg = resources.GetString("segmentedItem4.IconSvg"); - segmentedItem4.Text = "设置"; + segmentedItem4.Text = "复位"; segmentedItem5.Badge = null; segmentedItem5.BadgeAlign = AntdUI.TAlignFrom.TR; segmentedItem5.BadgeBack = null; @@ -385,21 +611,69 @@ segmentedItem5.IconActiveSvg = resources.GetString("segmentedItem5.IconActiveSvg"); segmentedItem5.IconSvg = resources.GetString("segmentedItem5.IconSvg"); segmentedItem5.Text = "登录"; - segmented1.Items.Add(segmentedItem1); + 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.ID = "sys-setbutton"; + segmentedItem6.Text = "设置"; segmented1.Items.Add(segmentedItem2); segmented1.Items.Add(segmentedItem3); segmented1.Items.Add(segmentedItem4); segmented1.Items.Add(segmentedItem5); + segmented1.Items.Add(segmentedItem6); segmented1.Location = new Point(0, 0); segmented1.Name = "segmented1"; - segmented1.Size = new Size(491, 68); + segmented1.Size = new Size(439, 83); segmented1.TabIndex = 1; segmented1.Text = "segmented1"; segmented1.SelectIndexChanged += segmented1_SelectIndexChanged; // + // pageHeader1 + // + pageHeader1.Controls.Add(lbInBackend); + pageHeader1.Controls.Add(divider2); + pageHeader1.DividerShow = true; + pageHeader1.Dock = DockStyle.Bottom; + pageHeader1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + pageHeader1.Location = new Point(0, 631); + pageHeader1.Name = "pageHeader1"; + pageHeader1.Size = new Size(1024, 40); + pageHeader1.TabIndex = 7; + pageHeader1.Text = ""; + // + // lbInBackend + // + lbInBackend.BackColor = Color.Transparent; + lbInBackend.Dock = DockStyle.Right; + lbInBackend.ForeColor = Color.FromArgb(46, 108, 227); + lbInBackend.Location = new Point(949, 10); + lbInBackend.Name = "lbInBackend"; + lbInBackend.Size = new Size(75, 30); + lbInBackend.TabIndex = 3; + lbInBackend.Tag = "sys-back"; + lbInBackend.Text = "系统后台"; + lbInBackend.Visible = false; + // + // divider2 + // + divider2.Dock = DockStyle.Top; + divider2.Location = new Point(0, 0); + divider2.Name = "divider2"; + divider2.OrientationMargin = 0F; + divider2.Size = new Size(1024, 10); + divider2.TabIndex = 0; + divider2.Text = ""; + // // MainWindow // - ClientSize = new Size(1024, 648); + ClientSize = new Size(1024, 671); ControlBox = false; Controls.Add(panelmain); Controls.Add(pageHeader1); @@ -408,56 +682,89 @@ Icon = (Icon)resources.GetObject("$this.Icon"); Name = "MainWindow"; StartPosition = FormStartPosition.CenterScreen; - Text = "AntdUI Demo"; + Text = "CCD光学筛选系统"; WindowState = FormWindowState.Maximized; - FormClosed += MainWindow_FormClosed; + FormClosing += MainWindow_FormClosing; Load += MainWindow_Load; titlebar.ResumeLayout(false); - pageHeader1.ResumeLayout(false); - pageHeader1.PerformLayout(); - panelmain.ResumeLayout(false); - panel2.ResumeLayout(false); - panel4.ResumeLayout(false); - panel6.ResumeLayout(false); - splitContainer1.Panel1.ResumeLayout(false); - splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)splitContainer1).EndInit(); - splitContainer1.ResumeLayout(false); - splitContainer2.Panel1.ResumeLayout(false); - splitContainer2.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)splitContainer2).EndInit(); - splitContainer2.ResumeLayout(false); - tabImgDisplay.ResumeLayout(false); tabsStas.ResumeLayout(false); tabPage3.ResumeLayout(false); - tabsConfig.ResumeLayout(false); + panelmain.ResumeLayout(false); + splitter2.Panel1.ResumeLayout(false); + splitter2.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)splitter2).EndInit(); + splitter2.ResumeLayout(false); + splitter1.Panel1.ResumeLayout(false); + splitter1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)splitter1).EndInit(); + splitter1.ResumeLayout(false); + panel6.ResumeLayout(false); + tableLayoutstatistics.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dgvCamreaNums).EndInit(); + panelNums.ResumeLayout(false); + tableLayoutNums.ResumeLayout(false); + tableLayoutPanel3.ResumeLayout(false); + tableLayoutPanel3.PerformLayout(); panel1.ResumeLayout(false); + panel3.ResumeLayout(false); + pageHeader1.ResumeLayout(false); ResumeLayout(false); } #endregion private AntdUI.PageHeader titlebar; - private AntdUI.Button buttonSZ; - private AntdUI.Button button_color; private AntdUI.PageHeader pageHeader1; private AntdUI.Divider divider2; private AntdUI.Panel panelmain; private AntdUI.Panel panel1; private AntdUI.Segmented segmented1; - private AntdUI.Panel panel2; - private AntdUI.Panel panel4; - private AntdUI.Panel panel6; - private Label label1; private AntdUI.Splitter splitter1; - private SplitContainer splitContainer1; - private SplitContainer splitContainer2; - private AntdUI.Tabs tabImgDisplay; + + private AntdUI.Label lbName; + private AntdUI.Panel panel3; + private AntdUI.Button btnDeleteProject; + private AntdUI.Button btnAddProject; + private AntdUI.Button btnLoadProject; + public AntdUI.Select sltProjects; + private Panel panel7; + // private Panel panel5; + // private Label lblNum; + // private Label label2; + // private Label lblNowtime; + // private Label label8; + // private Label lblstarttime; + // private Label label6; + // private Label lblUPH; + private Label label4; + private AntdUI.TabPage tabPage3; private AntdUI.TabPage tabMain; private AntdUI.Tabs tabsStas; - private AntdUI.TabPage tabPage3; - private RichTextBox richTextBox1; - private AntdUI.Tabs tabsConfig; - private AntdUI.TabPage tabPage2; + private AntdUI.Panel panel2; + private AntdUI.Tabs tabImgDisplay; + private AntdUI.Panel panel6; + private AntdUI.Panel pnlLog; + private AntdUI.Splitter splitter2; + private TableLayoutPanel tableLayoutstatistics; + private AntdUI.Panel panelNums; + private DataGridView dgvCamreaNums; + private TableLayoutPanel tableLayoutNums; + private Label label1; + private Label lblTotalTime; + private Label lblUPH; + private Label label12; + private Label label7; + private Label lblOEE_Total; + private Label lblStartTime; + private Label label10; + private Label lblstarttime2; + // private Label label7; + // private AntdUI.Panel pnlLog; + private AntdUI.Label lbInBackend; + private TableLayoutPanel tableLayoutPanel3; + private AntdUI.Button btnCreateBatchNO; + private AntdUI.Input textBoxBatchNO; + private AntdUI.Segmented segmented2; + public AntdUI.Tag tagMachineStatus; } } \ No newline at end of file diff --git a/DHSoftware/MainWindow.cs b/DHSoftware/MainWindow.cs index 22b87cc..c6dcb61 100644 --- a/DHSoftware/MainWindow.cs +++ b/DHSoftware/MainWindow.cs @@ -1,28 +1,33 @@ using AntdUI; using AntdUI.Svg; +using DH.Commons.Base; using DH.Commons.Enums; +using DH.Commons.Helper; +using DH.Commons.Models; using DH.Devices.Camera; -using DH.Devices.Devices; using DH.Devices.Motion; using DH.Devices.PLC; using DH.Devices.Vision; -using DH.Process; +using DH.RBAC.Model.Sys; using DHSoftware.Languages; using DHSoftware.Models; using DHSoftware.Utils; using DHSoftware.Views; using DVPCameraType; using HalconDotNet; +using Microsoft.VisualBasic.Logging; using Microsoft.Win32; using OpenCvSharp; +using SqlSugar; using System; using System.CodeDom; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Collections.ObjectModel; +using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Text.Json; @@ -32,224 +37,1052 @@ 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 IOType = DH.Commons.Enums.IOType; +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; namespace DHSoftware { - - - public partial class MainWindow : AntdUI.Window { - private UserControl currControl; - private bool isUpdatingTabs = false;//用于阻止Tabs更新 - private bool isLight = true; - // 定义一个语言切换事件 - public event EventHandler LanguageChanged; + private Dictionary> _cameraRelatedDetectionDict = null; + public event Action OnLog; + + public List CameraSummaries { get; set; } = new List(); + public List ProductSummaries = new List(); + static object _productSummaryLock = new object(); + public event Action OnUpdateResult; + public event Action OnUpdateCamResult; + + - private System.Windows.Forms.Timer refreshTimer; - private int testCounter = 1; + public List ButtonPermissionList + { + set + { + lbName.Text = DH.RBAC.Common.GlobalConfig.CurrentUser.Account; + List list = value; + 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) + { + if (control.HasChildren) + { + SetPermission(list, control.Controls); + continue; + } - Dictionary> _cameraRelatedDetectionDict = null; + if (control is AntdUI.Button button) + { + HandleButtonVisibility(button, list); + continue; + } + if (control is AntdUI.Label label) + { + HandleLabelVisibility(label, list); + continue; + } + + if (control is AntdUI.Segmented segmented && control.Name == "segmented1") + { + HandleSegmentedItems(segmented, list); + } + } + } + + /// + /// 处理 Segmented 控件的权限逻辑 + /// + private void HandleSegmentedItems(Segmented segmented, List permissions) + { + + SysPermission permission = permissions.FirstOrDefault(p => p.EnCode == itemToHide.ID); + + bool itemExists = segmented.Items.Contains(itemToHide); + + if (permission != null) + { + + if (!itemExists) + { + segmented.Items.Insert(4, itemToHide); + } + } + else + { + if (itemExists) + { + segmented.Items.Remove(itemToHide); + } + } + } + + /// + /// 处理 Button 可见性 + /// + private void HandleButtonVisibility(AntdUI.Button button, List permissions) + { + if (button.Tag is string tag && !string.IsNullOrEmpty(tag)) + { + bool hasPermission = permissions.Any(p => p.EnCode == tag); + button.Visible = hasPermission; + } + } + + /// + /// 处理 Label 可见性 + /// + private void HandleLabelVisibility(AntdUI.Label label, List permissions) + { + if (label.Tag is string tag && !string.IsNullOrEmpty(tag)) + { + bool hasPermission = permissions.Any(p => p.EnCode == tag); + label.Visible = hasPermission; + } + } public MainWindow() { InitializeComponent(); - refreshTimer = new System.Windows.Forms.Timer(); - refreshTimer.Interval = 1000; // 1秒间隔 - refreshTimer.Tick += RefreshTimer_Tick; //refreshTimer.Start(); //初始化数据 InitData(); //绑定事件 BindEventHandler(); - UserConfigFrm userControlFrm = new UserConfigFrm(); - - userControlFrm.Window = this; - userControlFrm.Dock = DockStyle.Fill; - tabPage2.Controls.Add(userControlFrm); - - // List Cameras = new List - //{ - // new Camera - // { - // DeviceName = "Cam1", - // Alias = "相机1", - // ImagePath = @"D:\1.jpeg" - // }, - // new Camera - // { - // DeviceName = "Cam2", - // Alias = "相机2", - // ImagePath = @"D:\2.jpeg" - // }, - // new Camera - // { - // DeviceName = "Cam3", - // Alias = "相机3", - // ImagePath = @"D:\3.jpeg" - // }, - // new Camera - // { - // DeviceName = "Cam4", - // Alias = "相机4", - // ImagePath = @"D:\4.jpeg" - // }, - // new Camera - // { - // DeviceName = "Cam5", - // Alias = "相机5", - // ImagePath = @"D:\5.jpeg" - // } - //}; + //UserConfigFrm userControlFrm = new UserConfigFrm(); - // if (Cameras.Count > 0) - // { - // tabImgDisplay.Controls.Clear(); - // foreach (var cam in Cameras) - // { - // AntdUI.TabPage tabPage = new AntdUI.TabPage(); - // tabPage.Name = $"tab{cam.DeviceName}"; - // tabPage.Text = cam.Alias; - // //ImgDisplayControl imgDisplayControl = new ImgDisplayControl(); - // //imgDisplayControl.Name = $"img{cam.DeviceName}"; - // //imgDisplayControl.Dock = DockStyle.Fill; - // //tabPage.Controls.Add(imgDisplayControl); - // PictureBox pictureBox = new PictureBox(); - // pictureBox.Name = $"pic{cam.DeviceName}"; - // pictureBox.Dock = DockStyle.Fill; - // pictureBox.SizeMode = PictureBoxSizeMode.Zoom; - // tabPage.Controls.Add(pictureBox); - // tabImgDisplay.Pages.Add(tabPage); - - // } - - // } + //userControlFrm.Window = this; + //userControlFrm.Dock = DockStyle.Fill; + //tabPage2.Controls.Add(userControlFrm); } - - private void RefreshTimer_Tick(object sender, EventArgs e) + //#region OEE + // public event Action OnProcessRunStateChanged; + #region INotifyPropertyChanged + public event PropertyChangedEventHandler PropertyChanged; + public virtual void Set(ref T field, T newValue, [CallerMemberName] string propName = null) { - //// 获取相机1的控件(通过控件名称查找) - //var targetControl = FindControlRecursive(tabImgDisplay, "picCam1") as PictureBox; - - //if (targetControl != null) - //{ - // // 生成测试路径(示例路径) - // string testPath = $@"D:\{testCounter}.png"; // 循环1-5的图片 - // testCounter++; - - // // 加载并显示图片 - // targetControl.Image = Image.FromFile(testPath); - // if (testCounter == 5) - // { - // testCounter = 1; - // } - // targetControl.Parent.Invalidate(); - //} - } - // 递归查找控件的方法 - private Control FindControlRecursive(Control parent, string name) - { - if (parent.Name == name) return parent; - - foreach (Control child in parent.Controls) + if (!field.Equals(newValue)) { - var found = FindControlRecursive(child, name); - if (found != null) return found; + field = newValue; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } - return null; } - // 触发事件 - protected virtual void OnLanguageChanged(EventArgs e) + #endregion + #region Properties + private int uph = 0; + private int upm = 0; + + private DateTime? startTime = null; + private TimeSpan runTime = new TimeSpan(); + private TimeSpan idleTime = new TimeSpan(); + private TimeSpan downTime = new TimeSpan(); + private TimeSpan totalTime = new TimeSpan(); + private int qty_OEE = 0; + private int qty_OEE_OK = 0; + private float oee = 0; + + public int UPH { - LanguageChanged?.Invoke(this, e); + get => uph; + set => Set(ref uph, value); } + public int UPM + { + get => upm; + set => Set(ref upm, value); + } + public DateTime? StartTime + { + get => startTime; + set => Set(ref startTime, value); + } + + /// + /// 有效运行时间 + /// + public TimeSpan RunTime + { + get => runTime; + set => Set(ref runTime, value); + } + + /// + /// 空闲待机时间 + /// + public TimeSpan IdleTime + { + get => idleTime; + set => Set(ref idleTime, value); + } + + /// + /// 故障宕机时间 + /// + public TimeSpan DownTime + { + get => downTime; + set => Set(ref downTime, value); + } + + /// + /// 总开机时间 + /// + public TimeSpan TotalTime + { + get => totalTime; + set => Set(ref totalTime, value); + } + + public float OEE + { + get => oee; + set => Set(ref oee, value); + } + #endregion + #region Timer + System.Threading.Timer _runTimer = null; + System.Threading.Timer _idleTimer = null; + System.Threading.Timer _downTimer = null; + System.Threading.Timer _checkIdleTimer = null; + //System.Threading.Timer _calculateTimer = null; + + private RunState? currentState = null; + public RunState? CurrentState + { + get => currentState; + set + { + if (value != null) + { + if (value.Value == RunState.Running) + { + _checkIdleTimer?.Change(10 * 1000, -1); + } + + if (currentState != value.Value) + { + switch (currentState) + { + case RunState.Idle: + //AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, false); + break; + case RunState.Down: + //AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, false); + break; + } + + switch (value.Value) + { + case RunState.Stop: + _runTimer?.Change(-1, -1); + _idleTimer?.Change(-1, -1); + _downTimer?.Change(-1, -1); + break; + case RunState.Running: + _idleTimer?.Change(-1, -1); + _downTimer?.Change(-1, -1); + _runTimer?.Change(0, 1000); + break; + case RunState.Idle: + _runTimer?.Change(-1, -1); + _downTimer?.Change(-1, -1); + _idleTimer?.Change(0, 1000); + + //AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Idle, true); + break; + case RunState.Down: + _idleTimer?.Change(-1, -1); + _runTimer?.Change(-1, -1); + _downTimer?.Change(0, 1000); + + //AddRunEventInBuffer(DateTime.Now, RunEvent_EventType.Down, true); + break; + } + + currentState = value; + + + } + } + } + } + + private void CheckIdleTimeStart(object state) + { + if (CurrentState == RunState.Running) + { + RunTime = RunTime.Add(new TimeSpan(0, 0, 0 - 10)); + IdleTime = IdleTime.Add(new TimeSpan(0, 0, 10)); + + CurrentState = RunState.Idle; + } + } + + public void InitialOEEStatistic() + { + InitialStatisticTimers(); + ResetOEETimeDistribute(); + ResetProductSummaries(); + } + + public void ResetProductSummaries() + { + ProductSummaries = new List(); + } + private void InitialStatisticTimers() + { + if (_checkIdleTimer == null) + { + _checkIdleTimer = new Timer(new TimerCallback(CheckIdleTimeStart), null, -1, -1); + } + + if (_runTimer == null) + { + _runTimer = new System.Threading.Timer(RunTimerCallBack, null, -1, -1); + } + + if (_idleTimer == null) + { + _idleTimer = new System.Threading.Timer(IdleTimerCallBack, null, -1, -1); + } + + if (_downTimer == null) + { + _downTimer = new System.Threading.Timer(DownTimerCallBack, null, -1, -1); + } + + StartTime = DateTime.Now; + DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0); + CurrentState = RunState.Running; + } + + private void DownTimerCallBack(object state) + { + DownTime = DownTime.Add(new TimeSpan(0, 0, 1)); + GetTotalTime(); + } + + private void IdleTimerCallBack(object state) + { + IdleTime = IdleTime.Add(new TimeSpan(0, 0, 1)); + GetTotalTime(); + } + + private void RunTimerCallBack(object state) + { + RunTime = RunTime.Add(new TimeSpan(0, 0, 1)); + GetTotalTime(); + } + + private void GetTotalTime() + { + TotalTime = RunTime + IdleTime + DownTime; + } + + public void ResetOEETimeDistribute() + { + StartTime = DateTime.Now; + DownTime = IdleTime = RunTime = new TimeSpan(0, 0, 0); + + ProductNum_Total = ProductNum_OK = 0; + } + + public void CloseStatisticTimers() + { + CloseTimer(ref _checkIdleTimer); + CloseTimer(ref _runTimer); + CloseTimer(ref _idleTimer); + CloseTimer(ref _downTimer); + + CurrentState = RunState.Stop; + } + + private void CloseTimer(ref System.Threading.Timer timer) + { + timer?.Change(-1, -1); + timer?.Dispose(); + timer = null; + } + #endregion + + #region CameraSum + private void InitialCameraSumsView() + { + + this.BeginInvoke(new MethodInvoker(delegate () + { + + dgvCamreaNums.Columns.Clear(); + + // 添加 CCD 列 + dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "CCD", + DataPropertyName = "CameraName" + }); + // 添加 触发数 列 + var TiggerCountColumn = new DataGridViewTextBoxColumn + { + HeaderText = "触发数", + DataPropertyName = "TiggerCount" + }; + + dgvCamreaNums.Columns.Add(TiggerCountColumn); + + // 添加 合格 列 + var okColumn = new DataGridViewTextBoxColumn + { + HeaderText = "合格", + DataPropertyName = "OKCount" + }; + okColumn.DefaultCellStyle.ForeColor = Color.Green; // 设置背景为绿色 + dgvCamreaNums.Columns.Add(okColumn); + + // 添加 不合格 列 + var ngColumn = new DataGridViewTextBoxColumn + { + HeaderText = "不合格", + DataPropertyName = "NGCount" + }; + ngColumn.DefaultCellStyle.ForeColor = Color.LightCoral; // 设置背景为红色 + dgvCamreaNums.Columns.Add(ngColumn); + + // 添加 总数 列 + dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "总数", + DataPropertyName = "TotalCount" + + }); + + // 添加 良率 列 + dgvCamreaNums.Columns.Add(new DataGridViewTextBoxColumn + { + HeaderText = "良率", + DataPropertyName = "YieldStr" + }); + dgvCamreaNums.AutoGenerateColumns = false; + dgvCamreaNums.DataSource = new BindingList(CameraSummaries); + })); } + #endregion + + /// + /// 窗体对象实例 + /// + private static MainWindow _instance; + + internal static MainWindow Instance + { + get + { + if (_instance == null) + _instance = new MainWindow(); + return _instance; + } + } + + private SegmentedItem itemToHide; private void InitData() { + itemToHide = segmented1.Items[4]; + segmented1.Items.Remove(itemToHide); + } - //根据系统亮暗初始化一次 - isLight = ThemeHelper.IsLightMode(); - button_color.Toggle = !isLight; - ThemeHelper.SetColorMode(this, isLight); - //初始化消息弹出位置 - Config.ShowInWindow = true; + + + public void ConnectCamera() + { + Cameras.Clear(); + HKCameras.Clear(); + if (ConfigModel.CameraBaseList.Count > 0) + { + for (int i = 0; i < ConfigModel.CameraBaseList.Count; i++) + { + var cameraBase = ConfigModel.CameraBaseList[i]; + if (cameraBase.CamType == EnumCamType.度申Do3think) + { + Do3ThinkCamera cam = new Do3ThinkCamera(); + cam.IsSavePicEnabled = cameraBase.IsSavePicEnabled; + cam.CameraName = cameraBase.CameraName; + cam.CameraIP = cameraBase.CameraIP; + cam.IsEnabled = cameraBase.IsEnabled; + cam.IsZoomCamera = cameraBase.IsZoomCamera; + cam.DvpImageFormat = cameraBase.DvpImageFormat; + cam.Exposure = cameraBase.Exposure; + cam.Gain = cameraBase.Gain; + cam.RotateImage = cameraBase.RotateImage; + cam.IsAllPicEnabled=cameraBase.IsAllPicEnabled; + cam.ROIX= cameraBase.ROIX; + cam.ROIH= cameraBase.ROIH; + cam.ROIW= cameraBase.ROIW; + cam.ROIY=cameraBase.ROIY; + cam.ImageSaveDirectory = Path.Combine("D://Projects//Images", cameraBase.CameraName); + Cameras.Add(cam); + if (cameraBase.IsEnabled) + { + cam.OnLog -= _visionEngine_OnLog; + cam.OnLog += _visionEngine_OnLog; + 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); + } + } + + } + else if (cameraBase.CamType == EnumCamType.海康hik) + { + HikVisionCamera cam = new HikVisionCamera(); + cam.CameraName = cameraBase.CameraName; + cam.CameraIP = cameraBase.CameraIP; + cam.IsEnabled = cameraBase.IsEnabled; + HKCameras.Add(cam); + // cam.CameraConnect(); + //cam.OnHImageOutput += OnCameraHImageOutput; + } + } + } + } + + public void ConnectPLC() + { + try + { + if (ConfigModel.PLCBaseList.Count > 0) + { + for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++) + { + var plcBase = ConfigModel.PLCBaseList[i]; + if (plcBase.PLCType == EnumPLCType.信捷XC网口 || plcBase.PLCType == EnumPLCType.信捷XD网口) + { + PLC.IP = plcBase.IP; + PLC.PLCType = plcBase.PLCType; + PLC.Enable = plcBase.Enable; + PLC.PLCName = plcBase.PLCName; + PLC.PLCItemList = plcBase.PLCItemList; + PLC.Port = plcBase.Port; + PLC.OnLog -= _visionEngine_OnLog; + PLC.OnLog += _visionEngine_OnLog; + 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); + } + + } + + } + } + + } + } + catch (Exception ex) + { + + } + } + FrmLog frmLog; + public void InitModel() + { + try + { + Dectection.Clear(); + _cameraRelatedDetectionDict = new(); + + if (ConfigModel.DetectionList.Count > 0) + { + for (int i = 0; i < ConfigModel.DetectionList.Count; i++) + { + DetectionConfig detectionConfig = ConfigModel.DetectionList[i]; + var detection = ConfigModel.DetectionList[i]; + detectionConfig.CameraCollects = detection.CameraCollects; + detectionConfig.ModelconfThreshold = detection.ModelconfThreshold; + detectionConfig.ModelWidth = detection.ModelWidth; + detectionConfig.ModelHeight = detection.ModelHeight; + detectionConfig.In_lable_path = detection.In_lable_path; + detectionConfig.IsEnabled = detection.IsEnabled; + detectionConfig.ImageSaveDirectory = "D://Projects//Images"; + + // 优化后代码 + detectionConfig.ShowLocation.X = (i % 5) + 1; // X坐标从1开始,每行1-5 + detectionConfig.ShowLocation.Y = (i / 5) + 1; // Y坐标从1开始,每5个换行 + // detectionConfig.ShowLocation.Y = detection.ShowLocation.Y; + DetectionConfigs.Add(detectionConfig); + } + } + DetectionConfigs.ForEach(detection => + { + detection.CameraCollects.ForEach(cam => + { + List Dets = new List + { + detection.Id + }; + if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) + { + _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); + } + else + { + _cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); + } + } + ); + }); + string inferenceDevice = "CPU"; + + frmLog = new FrmLog(); + frmLog.Dock = DockStyle.Fill; + pnlLog.Controls.Add(frmLog); + // + _visionEngine = new SimboVisionDriver(); + _visionEngine.DetectionConfigs = DetectionConfigs; + _visionEngine.LoggerHelper.LogPath = "D://PROJECTS//Logs//"; + _visionEngine.LoggerHelper.LogPrefix = "Vision"; + _visionEngine.OnLog += _visionEngine_OnLog; + //初始化模型 加载模型 + _visionEngine.Init(); + + CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); + ctrlVisionRun.Dock = DockStyle.Fill; + tabImgDisplay.Controls.Add(ctrlVisionRun); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } + private void _visionEngine_OnLog(LogMsg msg) + { + //OnLog?.Invoke(msg); + LogDisplay(msg); + } + private void LogDisplay(LogMsg msg) + { + + //frmLog?.LogDisplay(msg); + frmLog?.AddLog(msg); + } + public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper(); + public virtual void LogAsync(LogMsg msg) + { + //if (IConfig != null) + //{ + // LoggerHelper.SetLogLevel(IConfig.DefaultLogLevel); + //} + //else + //{ + // LoggerHelper.SetLogLevel(LogLevel.Assist); + //} + + msg.ThreadId = Thread.CurrentThread.ManagedThreadId; + + OnLog?.Invoke(msg); + //if (IConfig?.IsLogEnabled ?? true) + //{ + LoggerHelper.LogAsync(msg); + //} + } + public virtual void LogAsync(DateTime dt, LogLevel logLevel, string msg) + { + LogAsync(new LogMsg(dt, logLevel, msg)); + + } + System.Windows.Forms.Timer _refreshUITimer = new System.Windows.Forms.Timer(); private void BindEventHandler() { - buttonSZ.Click += ButtonSZ_Click; - button_color.Click += Button_color_Click; + btnAddProject.Click += BtnAddProject_Click; + btnDeleteProject.Click += BtnDeleteProject_Click; + btnLoadProject.Click += BtnLoadProject_Click; + LoggerHelper.LogPath = "D://PROJECTS//Logs//"; + LoggerHelper.LogPrefix = "Process"; + OnLog -= LogDisplay; + OnLog += LogDisplay; + OnUpdateCamResult -= UpdateCamResult; - - - - //监听系统深浅色变化 - SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged; + OnUpdateCamResult += UpdateCamResult; + OnUpdateResult -= UpdateResult; + OnUpdateResult += UpdateResult; + Load += (s, e) => + { + _refreshUITimer.Interval = 1000; + _refreshUITimer.Tick += _refreshUITimer_Tick; + _refreshUITimer.Enabled = true; + }; + lbInBackend.Click += LbInBackend_Click; } - - - - - - - - private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) + private void LbInBackend_Click(object? sender, EventArgs e) { - if (e.Category == UserPreferenceCategory.General) + DH.RBAC.RBACWindow.Instance.Show(); + + + } + private void _refreshUITimer_Tick(object sender, EventArgs e) + { + _refreshUITimer.Enabled = false; + + if (this != null) { - isLight = ThemeHelper.IsLightMode(); - button_color.Toggle = !isLight; - ThemeHelper.SetColorMode(this, isLight); + lblStartTime.Text = StartTime == null ? "" : StartTime.Value.ToString("yyyy/MM/dd HH:mm:ss"); + lblTotalTime.Text = TotalTime.ToString(); // 运行时间 + // lblRunTime.Text = RunTime.ToString(); // 有效时间 + // lblIdleTime.Text = ProcessControl.IdleTime.ToString(); // 空闲时间 + // lblDownTime.Text = ProcessControl.DownTime.ToString(); // 宕机时间 + + lblOEE_Total.Text = ProductNum_Total.ToString(); + // lblOEE_OK.Text = ProcessControl.ProductNum_OK.ToString(); + } + + _refreshUITimer.Enabled = true; + } + private void UpdateCamResult(DateTime updateTime, object objData, string customMessage) + { + this.Invoke(new Action(() => + { + + BindingList cameraSummaries = new BindingList(CameraSummaries); + dgvCamreaNums.DataSource = cameraSummaries; + + })); + + } + private void UpdateResult(DateTime updateTime, object objData, string result) + { + this.Invoke(new Action(() => + { + + + + //if (dgvProductNums.Rows.Count > 0) + //{ + // dgvProductNums.Height = dgvProductNums.Rows[0].Height * dgvProductNums.Rows.Count + 15; + //} + //else + //{ + // dgvProductNums.Height = 35; + //} + + //lblOEE_Rate.Text = ProcessControl.OEE.ToString("f2") + " %"; + lblUPH.Text = UPM.ToString(); + })); + } + public void LoadScheme() + { + try + { + // 初始化方案配置(会自动创建默认方案) + SchemeHelper.Initialize(); + + // 读取方案列表 + var schemes = SchemeHelper.GetAllSchemes(); + sltProjects.Items.Clear(); + + // 绑定方案到下拉列表 + foreach (var scheme in schemes) + { + sltProjects.Items.Add(scheme); + } + + // 设置当前选中的方案 + string currentScheme = SchemeHelper.GetCurrentScheme(); + sltProjects.SelectedValue = currentScheme; + SystemModel.CurrentScheme = currentScheme; + + // 加载当前方案配置 + ConfigHelper.LoadConfig(); + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + private void BtnDeleteProject_Click(object? sender, EventArgs e) + { + try + { + if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return; + + var result = AntdUI.Modal.open(this, "删除警告!", "确认要删除该方案吗?", TType.Warn); + if (result == DialogResult.OK) + { + string schemeToDelete = sltProjects.Text; + int selectedIndex = sltProjects.SelectedIndex; + + // 删除方案(SchemeHelper会自动处理当前方案的切换) + SchemeHelper.DeleteScheme(schemeToDelete); + ConfigHelper.DeleteSchemeConfig(schemeToDelete); + + // 刷新UI + LoadScheme(); + + AntdUI.Message.success(this, $"删除方案{schemeToDelete}成功!", autoClose: 3); + + // 如果没有方案了,提示用户 + if (sltProjects.Items.Count == 0) + { + AntdUI.Modal.open(this, "空方案警告!", "当前方案全部删除,需重启程序!", TType.Warn); + } + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); } } - private void Button_color_Click(object sender, EventArgs e) + private void BtnLoadProject_Click(object? sender, EventArgs e) { - isLight = !isLight; - //这里使用了Toggle属性切换图标 - button_color.Toggle = !isLight; - ThemeHelper.SetColorMode(this, isLight); + try + { + if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return; + + string selectedScheme = sltProjects.Text; + + if (SystemModel.CurrentScheme == selectedScheme) + { + AntdUI.Message.warn(this, "当前已是该方案,无需重复载入!", autoClose: 3); + return; + } + + // 设置当前方案 + SchemeHelper.SetCurrentScheme(selectedScheme); + SystemModel.CurrentScheme = selectedScheme; + + // 加载配置 + ConfigHelper.LoadConfig(); + + AntdUI.Message.success(this, $"载入方案{selectedScheme}成功!", autoClose: 3); + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } } - private void ButtonSZ_Click(object sender, EventArgs e) + private void BtnAddProject_Click(object? sender, EventArgs e) { + try + { + var form = new AddSchemeControl(this, "新增方案操作") { Size = new System.Drawing.Size(400, 300) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + string schemeName = form.SchemeName; + + // 保存到方案配置 + SchemeHelper.AddScheme(schemeName); + + // 根据选择初始化配置 + if (form.NullScheme) + { + ConfigHelper.InitializeScheme(schemeName); + } + else + { + ConfigHelper.DeriveScheme(schemeName); + } + + // 刷新UI + LoadScheme(); + AntdUI.Message.success(this, $"新增方案{schemeName}成功!", autoClose: 3); + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } } - - - - public List HKCameras { get; } = new List(); + public List HKCameras { get; } = new List(); public List Cameras { get; } = new List(); public Dictionary Dectection { get; } = new Dictionary(); - public XinJEPLCTcpNet PLC { get; } = new XinJEPLCTcpNet(); - SLDMotion sLDMotion = new SLDMotion(); + public XinJEPLCTcpNet PLC { get; } = XinJEPLCTcpNet.Instance; + private SLDMotion sLDMotion = new SLDMotion(); + // 线程控制标志 + private volatile bool _isRunning = false; + private Thread _monitorThread; private void MainWindow_Load(object sender, EventArgs e) { - Json(); + + //开启按钮监听 + // 启动所有监控线程 + StartAllMonitors(); } - private void MainWindow_FormClosed(object sender, FormClosedEventArgs e) + private void StartAllMonitors() { - foreach (var camera in Cameras) + if (PLC.Connected) { - camera.CameraDisConnect(); + if (_monitorThread == null || !_monitorThread.IsAlive) + { + //关闭按钮自身功能(比如按按钮转盘自己启动等) + PLC.WriteBool("M40", true); + _isRunning = true; + _monitorThread = new Thread(MonitorPlcButtons); + _monitorThread.IsBackground = true; // 后台线程 + _monitorThread.Start(); + } } - foreach (var camera in HKCameras) + + } + + private void MonitorPlcButtons(object? obj) + { + while (_isRunning) { - //var hk as HikVisionCamera; - //camera.CameraDisConnect(); + try + { + // 读取 PLC 输入点状态 + bool startPressed = PLC.ReadBool("X3"); + bool resetPressed = PLC.ReadBool("X4"); + bool stopPressed = PLC.ReadBool("X5"); + bool eStopPressed = PLC.ReadBool("X6"); + + // 处理按钮状态变化 + if (startPressed) + { + + HandleStartButton(); + } + if (resetPressed) + { + //ResetProcess(); + } + if (stopPressed) + { + HandleStopButton(); + } + if (eStopPressed) + { + //EmergencyStop(null, null, null); + } + + Thread.Sleep(150); + } + catch (Exception ex) + { + _isRunning = false; + // 记录错误并停止线程 + // throw new ProcessException($"按钮监听线程:{ex.Message}"); + + } + } + } + + // 停止监听线程 + private void StopMonitoring() + { + _isRunning = false; + if (_monitorThread != null && _monitorThread.IsAlive) + { + _monitorThread.Join(1000); // 等待线程退出 + } + PLC.WriteBool("M40", false); + } + private bool _isClosing = false; // 状态标志 + + private void MainWindow_FormClosing(object sender, FormClosingEventArgs e) + { + if (_isClosing) return; + _isClosing = true; + // 取消默认关闭行为 + e.Cancel = true; + + // 立即隐藏主窗口 + this.Hide(); + + // 显示关闭界面 + CloseWindow.Instance.Show(); + Thread.Sleep(200); + try + { + // 执行关闭操作 + foreach (var camera in Cameras) + { + camera.CameraDisConnect(); + } + foreach (var camera in HKCameras) + { + camera.CameraDisConnect(); + } + StopMonitoring(); + if (PLC != null) + { + PLC.CloseProcess(); + + } + + _visionEngine.Stop();//释放模型 + CloseWindow.Instance.Close();// 关闭提示窗口 + //Application.Exit(); + System.Environment.Exit(0); + } + catch (Exception ex) + { + CloseWindow.Instance.Close(); + + System.Environment.Exit(0); } - PLC.PLCDisConnect(); } private void segmented1_SelectIndexChanged(object sender, EventArgs e) @@ -263,480 +1096,282 @@ namespace DHSoftware case 0: // "启动" (Start) HandleStartButton(); break; + case 1: // "停止" (Stop) HandleStopButton(); break; + case 2: // "复位" (Reset) HandleResetButton(); break; + case 3: // "设置" (Settings) - HandleSettingsButton(); - break; - case 4: // "登录" (Login) HandleLoginButton(); break; + + case 4: // "登录" (Login) + HandleSettingsButton(); + break; + default: break; } + segmented1.SelectIndex = -1; } + + private void segmented2_SelectIndexChanged(object sender, IntEventArgs e) + { + + int selectedIndex = segmented2.SelectIndex; + + + switch (selectedIndex) + { + case 0: + HandleVisualLocalizationButton(); + break; + + default: + break; + } + segmented2.SelectIndex = -1; + } + + + + public string BatchNO { get; set; } public bool CurrentMachine = false; public volatile int ProductNum_Total = 0; public volatile int ProductNum_OK = 0; private readonly object _cameraSummaryLock = new object(); public SimboVisionDriver? _visionEngine = null; - ProcessConfigBase DHconfig; - // - // List SimboStationMLEngineList = new List(); - Dictionary HalconToolDict = new Dictionary(); + + public PLCBase? _PLCConfig = null; + private List DetectionConfigs = new List(); + private List SimboStationMLEngineList = new List(); + private Dictionary HalconToolDict = new Dictionary(); public List RecongnitionLabelList { get; set; } = new List(); - public DateTime startTime; - private void Json() + public DateTime ProcessstartTime; + private void PrepareBatchNO() { - List DetectionConfigs = new List(); - RecongnitionLabel recongnition = new RecongnitionLabel - { - LabelName = "youwu", - LabelDescription = "油污", - LabelCategory = "A_NG" - }; - RecongnitionLabel recongnition2 = new RecongnitionLabel - { - LabelName = "youwu", - LabelDescription = "油污", - LabelCategory = "A_NG" - }; - RecongnitionLabel recongnition3 = new RecongnitionLabel - { - LabelName = "youwu", - LabelDescription = "油污", - LabelCategory = "A_NG" - }; - RecongnitionLabelList.Add(recongnition); - RecongnitionLabelList.Add(recongnition2); - RecongnitionLabelList.Add(recongnition3); - - - - var det1 = new DetectionConfig("相机1", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam1.onnx", false, "Cam1"); - var det2 = new DetectionConfig("相机2", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam2.onnx", false, "Cam2"); - var det3 = new DetectionConfig("相机3", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam3.onnx", false, "Cam3"); - var det4 = new DetectionConfig("相机4", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam4.onnx", false, "Cam4"); - var det5 = new DetectionConfig("相机5", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam5.onnx", false, "Cam5"); - var det6 = new DetectionConfig("相机6", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam6.onnx", false, "Cam6"); - var det7 = new DetectionConfig("相机7", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam7.onnx", false, "Cam7"); - var det8 = new DetectionConfig("相机8", MLModelType.ObjectDetection, @"D:\PROJECTS\X015\Vision\Cam8.onnx", false, "Cam8"); - List CameraCollects = new List(); - CameraCollects.Add(new RelatedCamera("Cam1")); - List CameraCollects2 = new List(); - CameraCollects2.Add(new RelatedCamera("Cam2")); - List CameraCollects3 = new List(); - CameraCollects3.Add(new RelatedCamera("Cam3")); - List CameraCollects4 = new List(); - CameraCollects4.Add(new RelatedCamera("Cam4")); - List CameraCollects5 = new List(); - CameraCollects5.Add(new RelatedCamera("Cam5")); - List CameraCollects6 = new List(); - CameraCollects6.Add(new RelatedCamera("Cam6")); - List CameraCollects7 = new List(); - CameraCollects7.Add(new RelatedCamera("Cam7")); - List CameraCollects8 = new List(); - CameraCollects8.Add(new RelatedCamera("Cam8")); - - float Conf = 0.5f; - - - det1.CameraCollects = CameraCollects; - det1.ModelconfThreshold = Conf; - det1.ModelWidth = 640; - det1.ModelHeight = 640; - det1.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam1.txt"; - det1.IsEnabled = true; - det1.ShowLocation.X = 1; - det1.ShowLocation.Y = 1; - det1.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1} , - }; - - - det2.CameraCollects = CameraCollects2; - det2.ModelconfThreshold = Conf; - det2.ModelWidth = 640; - det2.ModelHeight = 640; - det2.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam2.txt"; - det2.IsEnabled = true; - det2.ShowLocation.X = 2; - det2.ShowLocation.Y = 1; - det2.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - - det3.CameraCollects = CameraCollects3; - det3.ModelconfThreshold = Conf; - det3.ModelWidth = 640; - det3.ModelHeight = 640; - det3.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam3.txt"; - det3.IsEnabled = true; - det3.ShowLocation.X = 3; - det3.ShowLocation.Y = 1; - det3.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - - - det4.CameraCollects = CameraCollects4; - det4.ModelconfThreshold = Conf; - det4.ModelWidth = 640; - det4.ModelHeight = 640; - det4.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam4.txt"; - det4.IsEnabled = true; - det4.ShowLocation.X = 4; - det4.ShowLocation.Y = 1; - det4.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - - - - - det5.CameraCollects = CameraCollects5; - det5.ModelconfThreshold = Conf; - det5.ModelWidth = 640; - det5.ModelHeight = 640; - det5.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam5.txt"; - det5.IsEnabled = true; - det5.ShowLocation.X = 1; - det5.ShowLocation.Y = 2; - det5.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - det5.PreTreatCollects = new List() - { - new SizeTreatParam() - { - PreName="高度测量", - IsEnable=true, - PreType=SizeEnum.高度测量, - ResultShow="sssssss", - OutResultShow="sssssss", - }, - }; - - det6.CameraCollects = CameraCollects6; - det6.ModelconfThreshold = Conf; - det6.ModelWidth = 640; - det6.ModelHeight = 640; - det6.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam6.txt"; - det6.IsEnabled = true; - det6.ShowLocation.X = 2; - det6.ShowLocation.Y = 2; - det6.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - - - det7.CameraCollects = CameraCollects7; - det7.ModelconfThreshold = Conf; - det7.ModelWidth = 640; - det7.ModelHeight = 640; - det7.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam7.txt"; - det7.IsEnabled = true; - det7.ShowLocation.X = 3; - det7.ShowLocation.Y = 2; - det7.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - - - det8.CameraCollects = CameraCollects8; - det8.ModelconfThreshold = Conf; - det8.ModelWidth = 640; - det8.ModelHeight = 640; - det8.in_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam8.txt"; - det8.IsEnabled = true; - det8.IsAddStation = true; - det8.ShowLocation.X = 4; - det8.ShowLocation.Y = 2; - det8.DetectionLableList = new List() - { new DetectionLable{ LabelName="xinquexian1",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian2",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian3",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - new DetectionLable{ LabelName="xinquexian4",MaxArea=99999999,MinArea=1,MinSource=0.6,MaxSource=1 } , - }; - det8.PreTreatCollects = new List() - { - new SizeTreatParam() - { - PreName="高度测量", - IsEnable=true, - PreType=SizeEnum.高度测量, - ResultShow="sssssss", - OutResultShow="sssssss", - }, - }; - - - DetectionConfigs.Add(det1); - DetectionConfigs.Add(det2); - DetectionConfigs.Add(det3); - DetectionConfigs.Add(det4); - DetectionConfigs.Add(det5); - DetectionConfigs.Add(det6); - DetectionConfigs.Add(det7); - DetectionConfigs.Add(det8); - - DHconfig = new ProcessConfigBase(); - DHconfig.StationCode = "小齿轮"; - DHconfig.DetectionConfigCollection = DetectionConfigs; - // DHconfig.ca = "小齿轮"; - - // **序列化** - string json = JsonSerializer.Serialize(DHconfig, new JsonSerializerOptions { WriteIndented = true }); - Console.WriteLine("序列化后的 JSON:\n" + json); - - var deserializedConfig = JsonSerializer.Deserialize(json); - Console.WriteLine("Station Code: " + deserializedConfig?.StationCode); + BatchNO = string.IsNullOrEmpty(BatchNO) ? SystemModel.CurrentScheme + "-" + DateTime.Now.ToString("yyyyMMddHHmmss") : BatchNO; + // DataSavePath = string.IsNullOrEmpty(DataSavePath) ? Path.Combine(X018PLCConfig.ImgDirectory, DateTime.Now.ToString("yyyyMMdd"), BatchNO) : DataSavePath; } + private void HandleStartButton() { - CurrentMachine = true; - - //_visionEngine.Start(); - //[Category("深度学习检测配置")] - //[DisplayName("检测标签定义集合")] - //[Description("定义检测标签的集合,例如:Seg/Detection模式:断裂、油污、划伤...;Class模式:ok、ng、上面、下面、套环、正常...")] - //[TypeConverter(typeof(CollectionCountConvert))] - //[Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] - - - - Cameras.Clear(); - HKCameras.Clear(); - Dectection.Clear(); - _cameraRelatedDetectionDict = new(); - -#if false - for (int i = 1; i <= 8; i++) + lock (_stopLock) { - HikVisionCamera camera = new HikVisionCamera(); - camera.CameraName = $"Cam{i}"; - camera.CameraIP = $"192.168.{i}.1"; - camera.ComputerIP = $"192.168.{i}.1"; - camera.CameraConnect(); - camera.OnHImageOutput += OnCameraHImageOutput; - HKCameras.Add(camera); - - + if (_isStopProcessing) return; + _isStopProcessing = true; } -#else - //Do3ThinkCamera do3ThinkCamera1 = new Do3ThinkCamera(); - - //do3ThinkCamera1.dvpStreamFormat = dvpStreamFormat.S_RAW8; - //do3ThinkCamera1.CameraName = "Cam1"; - //do3ThinkCamera1.CameraConnect(); - //do3ThinkCamera1.OnHImageOutput += OnCameraHImageOutput; - // Cameras.Add(do3ThinkCamera1); - for (int i = 1; i <= 8; i++) + try { + if (SystemModel.CurrentStatus == EnumStatus.待机中) + { + InitialCameraSumsView(); + LogAsync(DateTime.Now, LogLevel.Information, "流程启动中,请稍候..."); + ResetAllCameraCounts(); + //开始流程 + + StartProcess(); + SystemModel.CurrentStatus = EnumStatus.运行中; + this.BeginInvoke(new MethodInvoker(delegate () + { + tagMachineStatus.Type = TTypeMini.Success; + tagMachineStatus.Text = "运行中"; + })); + LogAsync(DateTime.Now, LogLevel.Action, "流程启动完成!"); - Do3ThinkCamera cam = new Do3ThinkCamera(); - if (i == 1) - { - cam.dvpStreamFormat = dvpStreamFormat.S_RAW8; } - else + else if (SystemModel.CurrentStatus == EnumStatus.运行中) { - cam.dvpStreamFormat = dvpStreamFormat.S_RGB24; + LogAsync(DateTime.Now, LogLevel.Warning, "设备正在运行,无需启动!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.清料中) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.警告) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.异常) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!"); } - cam.CameraName = $"Cam{i}"; - Cameras.Add(cam); - cam.CameraConnect(); - cam.OnHImageOutput += OnCameraHImageOutput; } - - -#endif - - - DHconfig?.DetectionConfigCollection.ForEach(detection => + finally { - - detection.CameraCollects.ForEach(cam => - { - List Dets = new List - { - detection.Id - }; - if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) - { - _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); - } - else - { - _cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); - } - - - } - ); - }); - string inferenceDevice = "CPU"; - - - - _visionEngine = new SimboVisionDriver(); - _visionEngine.DetectionConfigs =DHconfig?.DetectionConfigCollection; - - _visionEngine.Init(); - CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); - tabImgDisplay.Controls.Add(ctrlVisionRun); - - //Add the code for the "启动" button click here - - ////初始化Halcon工具 - //InitialHalconTools(); - - ////深度学习模型加载 - //bool resultOK = InitialSimboMLEnginesAsync(); - //if (resultOK) - //{ - // //初始化失败 - // // return; - //} - //位置比较卡 - - sLDMotion.AxisSettings = new List(); - AxisSetting axis1 = new AxisSetting(); - axis1.AxisIndex = 0; - axis1.AxisName = "转盘1"; - axis1.IsAxisEnabled = true; - //axis1.AlarmLogic = AxisDirection.Positive; - sLDMotion.IODefinitionCollection = new List(); - Motion(sLDMotion.IODefinitionCollection); - - - - sLDMotion.SnapshotSettings = new List(); - int[] cameraPositions = { 24161, 33608, 39702, 45701 }; - - - sLDMotion.SnapshotSettings.Add(new SnapshotSetting - { - IsEnabled = true, - CameraIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 13), - CameraPosition = 7613, - StationNumber = 0 - }); - for (int i = 0; i < 4; i++) - { - sLDMotion.SnapshotSettings.Add(new SnapshotSetting + lock (_stopLock) { - IsEnabled = true, - CameraIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == i), - CameraPosition = cameraPositions[i], - StationNumber = 0 - }); + _isStopProcessing = false; + } } - sLDMotion.BlowSettings = new List(); - int[] BlowPositions = { 61353, 68566 }; - sLDMotion.BlowSettings.Add(new BlowSetting - { - IsEnabled = true, - BlowIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 5), - BlowPosition = BlowPositions[0], - StationNumber = 0 - }); - sLDMotion.BlowSettings.Add(new BlowSetting - { - IsEnabled = true, - BlowIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 6), - BlowPosition = BlowPositions[1], - StationNumber = 0 - }); - - //SnapshotSetting sna1 = new SnapshotSetting(); - //sna1.IsEnabled = true; - //sna1.CameraIO= sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 0); - //sna1.CameraPosition = 17000; - //sna1.StationNumber = 0; - - - - // sLDMotion.SnapshotSettings.Add(sna1); - sLDMotion.AxisSettings.Add(axis1); - sLDMotion.Init(); - sLDMotion.OnNewPieces -= MainMotion_NewPieces; - sLDMotion.OnNewPieces += MainMotion_NewPieces; - // sLDMotion.Start(); - - //PLC.IP = "192.168.6.6"; - //PLC.Port = 502; - //PLC.PLCConnect(); - //PLC.OnNewPieces -= MainMotion_NewPieces; - //PLC.OnNewPieces += MainMotion_NewPieces; - ProductBaseCount = 8; - for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) - { - ConcurrentDictionary products = new ConcurrentDictionary(); - _productLists.Add(products); - } - sLDMotion.AxisStop(); - bool e = sLDMotion.CArdReset(); - //转盘速度 - sLDMotion.JOGRun(14000, 100000); - startTime = DateTime.Now; } - public void Motion(List iODefinitions) + + + + private async void StartProcess() { - for (int i = 0; i < 16; i++) + try { - iODefinitions.Add(new IODefinition + + + BatchNO = textBoxBatchNO.Text; + textBoxBatchNO.ReadOnly = true; + btnCreateBatchNO.Enabled = false; + PrepareBatchNO();//生成批次号 + ProcessstartTime = DateTime.Now; + lblStartTime.Text = ProcessstartTime.ToString("yyyy-MM-dd HH:mm:ss"); + //计数清零 + PieceCount = 0; + + //CameraSummaries.Clear(); + + if (PLC?.Enable == true) { - IOType = IOType.INPUT, - IOIndex = i, - IODesc = $"入料传感器{i + 1}" + PLC.OnNewPieces -= MainMotion_NewPieces; + PLC.OnNewPieces += MainMotion_NewPieces; + } + + Cameras.ForEach(d => + { + if (d is CameraBase cam) + { + cam.SnapshotCount = 0; + } }); + + //PrepareBatchNO(); + // isInPositionChecking = false; + //isFullTrayChecking = false; + //队列清空 + // var temp = new List(); + // temp.AddRange(XKRSPLCConfig.TriggerConfigCollection); + // temp.AddRange(XKRSPLCConfig.SnapshotTriggerConfigCollection); + + //temp.ForEach(t => + //{ + // var diskInfo = XKRSPLCConfig.DiskInfoList.FirstOrDefault(u => u.DiskName == t.DiskName); + // if (diskInfo != null) + // { + // t.AxisNum = diskInfo.DiskAxisNum; + // } + // else + // { + // t.AxisNum = -1; + // } + //}); + + //if (temp.Any(u => u.AxisNum < 0)) + //{ + // LogAsync(DateTime.Now, LogLevel.Error, "触发信号归属转盘未确认"); + // return new ProcessResponse(false); + //} + + // _diskInfoListInOrder = XKRSPLCConfig.DiskInfoList.OrderBy(u => u.DiskSequence).ToList(); + // var axisNumList = _diskInfoListInOrder.Select(u => u.DiskAxisNum).ToList(); + + /// PrepareMLEngine(); + + // if (_PLCConfig?.Enable == true) + //挡料电机操作 + // _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection); + + //流程开启操作配置 + // ProcessInitialAction(); + // if (_PLC?Enabled == true) + //皮带 + // _PLC.Belt(true); + + //DeviceCollection.ForEach(d => + //{ + // if (d is CameraBase c) + // { + // c.OnHImageOutput -= OnCameraHImageOutput; + // c.OnHImageOutput += OnCameraHImageOutput; + // c.SnapshotCount = 0; + // } + //}); + _productLists.Clear(); + + #region 虚拟相机 + + //mOfflineImageTimer = new System.Timers.Timer(); + + //mOfflineImageTimer.Elapsed += OnEmitSerialPortAsync; + //mOfflineImageTimer.Interval = 1000; + //mOfflineImageTimer.Start(); + + #endregion 虚拟相机 + + + ///这里会执行完成后,会造成后台线程断断续续,会造成界面UI卡顿 + //var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList(); + //if (settings != null) + //{ + // settings = settings.Where(s => s.IsEnabled).ToList(); + // ProductBaseCount = settings.Count; + + // for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) + // { + // ConcurrentDictionary products = new ConcurrentDictionary(); + // _productLists.Add(products); + // } + //} + + + await Task.Run(() => + { + var settings = ConfigModel.DetectionList.Where(u => u.IsEnabled && u.IsAddStation).ToList(); + if (settings != null) + { + ProductBaseCount = settings.Count; + _productLists.Clear(); // 清空旧数据 + + // 预分配列表容量(减少动态扩容开销) + _productLists.Capacity = ProductBaseCount * ProductListMulti; + + for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) + { + _productLists.Add(new ConcurrentDictionary()); + } + } + }); + // _MGSCameraList = DeviceCollection + //.OfType() // 直接筛选出 MGSCameraDriver 类型的元素 + //.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true + //.ToList(); + + // ProductBaseCount = _MGSCameraList.Count; + + + + + InitialOEEStatistic(); + //流程执行时PLC + PLC.StartProcess(); + CurrentMachine = true; } - for (int i = 0; i < 16; i++) + catch (Exception ex) { - iODefinitions.Add(new IODefinition - { - IOType = IOType.OUTPUT, - IOIndex = i, - IODesc = $"入料传感器{i + 1}" - }); } + + } + private uint PieceCount = 0; private List> _productLists = new List>(); - private int ProductListMulti = 2; + private int ProductListMulti = 1; private int ProductBaseCount = 0; + private int PieceNumberToIndex(uint pn) { // 物料编号,取余 集合数量 @@ -744,7 +1379,9 @@ namespace DHSoftware int ret = (int)(pn % (ProductBaseCount * ProductListMulti)); return ret; } - DateTime _ctTime = DateTime.Now; + + private DateTime _ctTime = DateTime.Now; + public async void MainMotion_NewPieces(int axisIndex, uint pieceNumber) { //if (MachineState != MachineState.Running && MachineState != MachineState.Warning) @@ -752,30 +1389,24 @@ namespace DHSoftware // return; //} - PieceCount++; - int index = PieceNumberToIndex(pieceNumber); // productDatas.Add(pData); //转盘2 的物料是不是重新覆盖之前的pDta if (axisIndex == 1) { - ProductData pData = new ProductData("", pieceNumber, ProductBaseCount); + ProductData pData = new ProductData(BatchNO, pieceNumber, ProductBaseCount); _productLists[index][pieceNumber] = pData; + LogAsync(DateTime.Now, LogLevel.Action, $">> 转盘{axisIndex}新产品{pieceNumber}加入队列{index}----计数{PieceCount}"); + } - string logStr = $"时间:{DateTime.Now} 轴{axisIndex}新产品{pieceNumber}加入队列{index}----入料计数{PieceCount}\n"; - Task.Run(() => - { - //this.BeginInvoke(new MethodInvoker(delegate () { richTextBox1.AppendText(logStr); })); - - }); - DateTime dtNow = DateTime.Now; - UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds); - _ctTime = dtNow; - + //DateTime dtNow = DateTime.Now; + //UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds); + // _ctTime = dtNow; } + public async Task UpdateCT(object objData, float ctTime) { await Task.Run(() => @@ -783,15 +1414,15 @@ namespace DHSoftware //OnUpdateCT?.Invoke(objData, ctTime); }); } + /// /// 相机回调 /// /// /// /// - private void OnCameraHImageOutput(DateTime dt, CameraBase camera, Mat imageSet) + private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet) { - //if (camera.CameraName.Equals("cam1", StringComparison.OrdinalIgnoreCase)) //{ // Console.WriteLine(); @@ -806,7 +1437,7 @@ namespace DHSoftware Task.Run(async () => { - using (Mat localImageSet = imageSet.Clone()) // 复制 Mat 避免并发问题 + //using (Mat localImageSet = imageSet._mat.Clone()) // 复制 Mat 避免并发问题 { // imageSet?.Dispose(); // 拍照计数与物件编号一致,查找对应的产品 @@ -828,8 +1459,8 @@ namespace DHSoftware } else { - // Thread.Sleep(20); - await Task.Delay(20); + Thread.Sleep(20); + //await Task.Delay(20); } retryTimes--; } @@ -845,83 +1476,62 @@ namespace DHSoftware } //LogAsync(DateTime.Now, LogLevel.Error, $"{camera.Name} 未找到产品,编号:{productNumber},队列{index}数量:{tmpDic.Count},列表:{pnStr}"); - localImageSet.Dispose(); - this.BeginInvoke(new MethodInvoker(delegate () - { + imageSet.Dispose(); - int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - - richTextBox1.AppendText(productNumber + "提前推出" + camera.CameraName); - - // 设置回原来的滚动位置 - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); - })); - //重新生成实例 销毁之前的实例 - - using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) - { - sw.WriteLine(productNumber + "提前推出" + camera.CameraName); - } return; } - // LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 找到产品{productNumber},队列{index}数量:{tmpDic.Count}"); + LogAsync(DateTime.Now, LogLevel.Information, $"{camera.CameraName} 找到产品{productNumber},队列{index}数量:{tmpDic.Count}"); if (!_cameraRelatedDetectionDict.ContainsKey(camera.CameraName)) { + imageSet.Dispose(); - localImageSet.Dispose(); - this.BeginInvoke(new MethodInvoker(delegate () - { - int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - richTextBox1.AppendText(productNumber + "提前推出" + camera.CameraName); - - // 设置回原来的滚动位置 - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); - })); - //重新生成实例 销毁之前的实例 - - using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) - { - sw.WriteLine(productNumber + "提前推出" + camera.CameraName); - } - // LogAsync(DateTime.Now, LogLevel.Warning, $"{camera.Name} 找到产品{productNumber},但是没有推理1"); + LogAsync(DateTime.Now, LogLevel.Warning, $"{camera.CameraName} 找到产品{productNumber},但是没有推理1"); return; } - double totalTime = 0.0; List resultStates = new List(); List? detectionDict = _cameraRelatedDetectionDict[camera.CameraName]; - - + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); for (int i = 0; i < detectionDict.Count; i++) { string detectionId = detectionDict[i]; - + var tmpImgSet = camera.CopyImageSet(imageSet as MatSet); + //imageSet + // using (Mat inferenceImage = localImageSet.Clone()) // 仅在此处克隆,确保推理过程中 Mat 有独立副本 - - + DetectStationResult temp1 = _visionEngine.RunInference(tmpImgSet, detectionId); - // 1. 预处理 - using (Mat inferenceImage = localImageSet.Clone()) // 仅在此处克隆,确保推理过程中 Mat 有独立副本 + resultStates.Add(temp1.ResultState); + + product.ResultCollection.Add(temp1); + + if (temp1 != null) { - DetectStationResult temp1=_visionEngine.RunInference(inferenceImage, detectionId); - - resultStates.Add(temp1.ResultState); - - product.ResultCollection.Add(temp1); - + UpdateResultTigger(dt, temp1.DetectName, (int)productNumber); + //if (tmpModuleData.CamIDs.Count == 1) + //{ + // UpdateResultoverride(dt, temp1.DetectName, resultStates, totalTime, _cameraRelatedDetectionDict.Keys.Count); + //} + //else //合图的合成一列 + //{ + // UpdateResultoverride(dt, temp1.DetectName, resultStates, totalTime, _cameraRelatedDetectionDict.Keys.Count); + //} + if (product.ResultCollection.Count != 0) + UpdateResultoverride(dt, temp1.DetectName, resultStates, totalTime, _cameraRelatedDetectionDict.Keys.Count); } } + stopwatch.Stop(); + product.InferenceOne(); @@ -929,38 +1539,38 @@ namespace DHSoftware if (!product.InferenceFinished()) { - return; } - ProductNum_Total++; - CalculateOEE(); - this.BeginInvoke(new MethodInvoker(delegate () - { - int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - - richTextBox1.AppendText($"统计结果成功,{productNumber} 吹气!\n"); - - // 设置回原来的滚动位置 - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); - })); #region 6. 统计产品结果 + product.ProductResult = product.ResultCollection.Any(u => u.ResultState != ResultState.OK) ? ResultState.B_NG : ResultState.OK; product.ProductLabelCategory = product.ProductResult.GetEnumDescription(); product.ProductLabel = product.ProductResult.GetEnumDescription(); - #endregion - #region 7.产品吹气 + UpdateResultPro(DateTime.Now, null, product.ProductResult.GetEnumDescription()); - #endregion + LogAsync(DateTime.Now, LogLevel.Information, $"产品{product.PieceNumber}获取结果:{product.ProductResult} {(product.IsA2B ? "产品IsA2B" : "")}"); + if (product.ProductResult == ResultState.OK) + { + PLC.Blowing(productNumber, 1); + LogAsync(DateTime.Now, LogLevel.Action, $"产品{product.PieceNumber}PLC,OK吹气"); + + } + else + { + PLC.Blowing(productNumber, 2); + LogAsync(DateTime.Now, LogLevel.Action, $"产品{product.PieceNumber}PLC,NG吹气"); + } - // 出列 + #endregion 6. 统计产品结果 + + // 出列 ProductData temp = null; int tryTimes = 10; @@ -980,14 +1590,13 @@ namespace DHSoftware $"当前队列产品数量:{tmpDic.Count}"; this.BeginInvoke(new MethodInvoker(delegate () { + // int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - - richTextBox1.AppendText(logStr); + // richTextBox1.AppendText(logStr); // 设置回原来的滚动位置 - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); + // richTextBox1.SelectionStart = richTextBox1.TextLength; + //richTextBox1.ScrollToCaret(); })); } else @@ -999,21 +1608,16 @@ namespace DHSoftware $"当前队列产品数量:{tmpDic.Count}"; this.BeginInvoke(new MethodInvoker(delegate () { + //int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; - - richTextBox1.AppendText(logStr); + // richTextBox1.AppendText(logStr); // 设置回原来的滚动位置 - richTextBox1.SelectionStart = richTextBox1.TextLength; - richTextBox1.ScrollToCaret(); + // richTextBox1.SelectionStart = richTextBox1.TextLength; + //richTextBox1.ScrollToCaret(); })); //重新生成实例 销毁之前的实例 var saveData = temp.GetProductData(); - using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) - { - sw.WriteLine(logStr); - } } catch (Exception) { } @@ -1025,10 +1629,8 @@ namespace DHSoftware } // UpdateCT((float)(dtNow - _ctTime).TotalSeconds); - //_ctTime = dtNow; + //_ctTime = dtNow; // }); - - } catch (Exception ex) { @@ -1036,58 +1638,266 @@ namespace DHSoftware product?.Dispose(); } } + }); + } + public virtual void AddOKProduct(string resultStr) + { + if (resultStr.ToLower() == "ok") + { + ProductNum_OK++; + } + } + public async Task UpdateResultTigger(DateTime dt, string objData, int _cameraDictCount) + { + CurrentState = RunState.Running; + + + // 根据相机名称找到对应的信息(假设有一个字典或其他集合保存相机相关信息) + var cameraName = objData; // 假设 CameraBase 有 Name 属性 + if (string.IsNullOrEmpty(cameraName)) + { + throw new ArgumentException("相机名称不能为空"); + } + + + + lock (_cameraSummaryLock) + { + // 查找或添加相机统计项 + var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == cameraName) + ?? new CameraSummary { CameraName = cameraName }; + + if (!CameraSummaries.Contains(summary)) + { + CameraSummaries.Add(summary); + } + + + summary.TiggerCount = _cameraDictCount; + } + + await Task.Run(() => + { + OnUpdateCamResult?.Invoke(dt, objData, ""); + }); + } + public async Task UpdateResultoverride(DateTime dt, string objData, List resultStr, double total, int _cameraDictCount) + { + // CurrentState = RunState.Running; + + + + // 根据相机名称找到对应的信息(假设有一个字典或其他集合保存相机相关信息) + var cameraName = objData; // 假设 CameraBase 有 Name 属性 + if (string.IsNullOrEmpty(cameraName)) + { + throw new ArgumentException("相机名称不能为空"); + } + + + + lock (_cameraSummaryLock) + { + // 查找或添加相机统计项 + var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == cameraName) + ?? new CameraSummary { CameraName = cameraName }; + + if (!CameraSummaries.Contains(summary)) + { + CameraSummaries.Add(summary); + } + + if (resultStr.Any(u => u.ToString().ToLower() == "ok")) + { + summary.OKCount++; + } + + else /*if (resultStr.Equals("TBD", StringComparison.OrdinalIgnoreCase))*/ + { + summary.NGCount++; + } + + } + + await Task.Run(() => + { + OnUpdateCamResult?.Invoke(dt, objData, ""); }); } - - public void SetResult() + public async Task UpdateResultPro(DateTime dt, object objData, string resultStr) { + CurrentState = RunState.Running; + + ProductNum_Total++; + AddOKProduct(resultStr); + + + + lock (_productSummaryLock) + { + var product = ProductSummaries.FirstOrDefault(u => u.ResultDesc == resultStr); + if (product != null) + { + product.ProductAmount++; + } + else + { + product = new ProductSummary(); + product.ResultDesc = resultStr; + product.ProductAmount = 1; + + ProductSummaries.Add(product); + } + + int totalNum = ProductSummaries.Sum(p => p.ProductAmount); + ProductSummaries.ForEach(p => p.PercentStr = ((double)p.ProductAmount * 100.0 / totalNum).ToString("f2") + " %"); + } + + CalculateOEE(); + + await Task.Run(() => + { + OnUpdateResult?.Invoke(dt, objData, resultStr); + }); + lock (_cameraSummaryLock) + { + // 查找或添加相机统计项 + var summary = CameraSummaries.FirstOrDefault(c => c.CameraName == "合计") + ?? new CameraSummary { CameraName = "合计" }; + + summary.OKCount = ProductNum_OK; + summary.NGCount = ProductNum_Total - ProductNum_OK; + if (!CameraSummaries.Contains(summary)) + { + CameraSummaries.Add(summary); + } - //// detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag - ////2024-02-29 目标检测不能全是NG - //if (IsPreTreatNG || IsObjectDetectNG) - //{ - // return; - //} + } + await Task.Run(() => + { + OnUpdateCamResult?.Invoke(dt, objData, "合计"); + }); - - //if (IsPreTreatDone && IsMLDetectDone && IsAfterTreatDone) - //{ - // ResultState = ResultState.OK; - // ResultLabel = ResultState.OK.GetEnumDescription(); - //} - } - private void HandleStopButton() - { - Cameras.Clear(); - Dectection.Clear(); - // Add the code for the "停止" button click here - // PLC.TurntableStop(); - CurrentMachine = true; - sLDMotion.Stop(); - } - public int UPH = 0; - public void CalculateOEE() - { - TimeSpan timeSpan = DateTime.Now - startTime; - UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100; - //UPM = (int)UPH / 60; + private readonly object _stopLock = new object(); // 锁对象 + private bool _isStopProcessing = false; // 状态标志 + private async void HandleStopButton() + { + // 通过锁和状态标志实现双重检查 + lock (_stopLock) + { + if (_isStopProcessing) return; + _isStopProcessing = true; + } + try + { + if (SystemModel.CurrentStatus == EnumStatus.待机中) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备待机中,无需停止!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.运行中) + { + textBoxBatchNO.ReadOnly = false; + btnCreateBatchNO.Enabled = true; + + // Cameras.Clear(); + // Dectection.Clear(); + // Add the code for the "停止" button click here + PLC.StopProcess(); + SystemModel.CurrentStatus = EnumStatus.待机中; + this.BeginInvoke(new MethodInvoker(delegate () + { + tagMachineStatus.Type = TTypeMini.Primary; + tagMachineStatus.Text = "待机中"; + })); + LogAsync(DateTime.Now, LogLevel.Action, $"流程停止!"); + await Task.Run(async () => + { + + await ExecuteClearDelayAsync(); + }); + } + else if (SystemModel.CurrentStatus == EnumStatus.清料中) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备正在清料,请稍候!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.警告) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备报警,请复位后重试!"); + } + else if (SystemModel.CurrentStatus == EnumStatus.异常) + { + LogAsync(DateTime.Now, LogLevel.Warning, "设备异常,请检查!"); + } + } + + finally + { + lock (_stopLock) + { + _isStopProcessing = false; + } + } + + + //sLDMotion.Stop(); + } + + private async Task ExecuteClearDelayAsync() + { + LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料开始"); + SystemModel.CurrentStatus = EnumStatus.清料中; this.BeginInvoke(new MethodInvoker(delegate () { - label1.Text = UPH.ToString(); + tagMachineStatus.Type = TTypeMini.Warn; + tagMachineStatus.Text = "清料中"; })); + await PLC.ExecuteClearDelayAsync(); + LogAsync(DateTime.Now, LogLevel.Action, $"转盘清料完成"); - - + SystemModel.CurrentStatus = EnumStatus.待机中; + this.BeginInvoke(new MethodInvoker(delegate () + { + tagMachineStatus.Type = TTypeMini.Primary; + tagMachineStatus.Text = "待机中"; + })); } + + public void CalculateOEE() + { + if (TotalTime.TotalHours == 0) + { + UPH = 0; + UPM = 0; + } + else + { + UPH = (int)(ProductNum_Total / RunTime.TotalHours) + 100; + UPM = (int)UPH / 60; + } + + + //TimeSpan timeSpan = DateTime.Now - ProcessstartTime; + + //UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100; + ////UPM = (int)UPH / 60; + //this.BeginInvoke(new MethodInvoker(delegate () + //{ + // lblNowtime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + // lblUPH.Text = UPH.ToString(); + // lblNum.Text = ProductNum_Total.ToString(); + + //})); + } + private void HandleResetButton() { // Add the code for the "复位" button click here @@ -1097,48 +1907,25 @@ namespace DHSoftware private void HandleSettingsButton() { // Add the code for the "设置" button click here - // MessageBox.Show("设置按钮按下"); - - List listCamBase = new List(); - CameraBase cam1 = new CameraBase - { - CameraName = "Cam1", - CameraIP = "192.168.1.101", - SerialNumber = "1000001", - Gain = 60, - Exposure = 10, - RotateImage = 0, - IsEnabled = false, - }; - CameraBase cam2 = new CameraBase - { - CameraName = "Cam2", - CameraIP = "192.168.1.101", - SerialNumber = "1000002", - Gain = 60, - Exposure = 10, - RotateImage = 0, - IsEnabled = false, - }; - listCamBase.Add(cam1); - listCamBase.Add(cam2); - - SettingWindow1 settingWindow = new SettingWindow1(DHconfig); - settingWindow.Show(); - //s.cameras = listCamBase; - //s.Show(); + SettingWindow.Instance.Show(); } private void HandleLoginButton() { // Add the code for the "登录" button click here - MessageBox.Show("登录按钮按下"); + LoginWindow.Instance.parentForm = this; + LoginWindow.Instance.Show(); } - - private void splitter1_SplitterMoved(object sender, SplitterEventArgs e) + private void HandleVisualLocalizationButton() { - + VisualLocalizationWindow.Instance.Show(); } + private void btnCreateBatchNO_Click(object sender, EventArgs e) + { + textBoxBatchNO.Text = SystemModel.CurrentScheme + "-" + DateTime.Now.ToString("yyyyMMddHHmmss"); + } + + } -} +} \ No newline at end of file diff --git a/DHSoftware/MainWindow.resx b/DHSoftware/MainWindow.resx index 1e30dff..303c0be 100644 --- a/DHSoftware/MainWindow.resx +++ b/DHSoftware/MainWindow.resx @@ -117,32 +117,29 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <svg t="1724122928419" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2893" width="200" height="200"><path d="M920.5 435.9c-7.6-40.3-36.1-66.8-69.8-66.2h-3.4c-36.6 0-66.3-29.7-66.3-66.3 0-7.8 3.6-19.1 6-24.9 15.4-35.1 3.3-78.1-28.9-100.6l-102-56.9-4.2-2c-31.7-13.7-72.7-5.4-96.4 19.2-15.1 15.6-42.2 33.7-54.6 33.7-12.5 0-39.8-18.5-54.9-34.3-23.6-24.9-62.2-34.4-97.4-19.5l-105.4 57.7-4.2 2.7c-31.7 22-43.8 65.3-28.3 100.1 1.9 4.6 6 16.7 6 24.9 0 36.6-29.7 66.3-66.3 66.3h-2.6c-34.9-0.6-63.1 25.8-70.7 66.2-0.9 4.8-8.9 48.2-8.9 84s8 79.2 8.9 84c7.5 39.6 35.3 66.2 69.2 66.2h4.1c36.6 0 66.3 29.7 66.3 66.3 0 8.2-4 20.3-5.8 24.5-15.6 35.2-3.6 78.4 28.9 101.2l99.8 56 4.1 2c10.5 4.6 21.8 6.9 33.6 6.9 24.5 0 47.8-9.9 63.7-27.3 14.8-16.1 43.5-35.8 55.8-35.8 12.8 0 40.8 19.7 56.1 36.5 15.8 17.4 39.8 27.8 64.2 27.8 11.6 0 22.6-2.2 34.3-7.3l103.2-56.9 4.2-2.7c31.6-22 43.7-65.2 28.1-100.4-1.9-4.6-5.9-16.5-5.9-24.6 0-36.6 29.7-66.3 66.3-66.3h4c34 0 61.7-26.4 69.2-65.9 0.1-0.5 9-46.3 9-84.4-0.1-35.9-8.1-79.1-9-83.9z m-71.3 154.6c-0.6 3.3-1.5 5.6-2.2 7.1-76.4 0.1-138.6 62.4-138.6 138.8 0 23 8.4 45.7 12.1 53.9 1.6 3.5 0.4 8.4-3.3 11.5l-96.4 53.3c-4.7 1.6-11.9-0.9-14.3-3.5-5.6-6.2-56.5-60.3-109.8-60.3-54 0-106.9 56.8-109.1 59.2-2.2 2.4-7.4 5.7-14.6 3.1l-93.1-52.1c-3.1-2.5-4.5-7.7-2.8-11.6 1.2-2.8 12-28.1 12-53.7 0-76.5-62.1-138.7-138.6-138.8-0.7-1.5-1.6-3.8-2.3-7.1-0.3-1.6-7.6-40.9-7.6-70.6 0-29.7 7.3-69 7.6-70.6 0.6-3.3 1.5-5.7 2.3-7.1 76.4-0.1 138.6-62.3 138.6-138.8 0-25-9.9-49.1-12.1-54-1.5-3.5-0.4-8.3 3.2-11.4l98.2-53.9c4.8-1.7 12.5 0.8 15 3.4 5.5 5.8 55.7 56.8 107.4 56.8 51.2 0 101.2-50 106.7-55.8 2.4-2.4 8.3-5.6 15.1-3.1l94.9 52.7c3.2 2.5 4.5 7.7 2.9 11.3l-0.7 1.8c-3.1 7.6-11.3 29.8-11.3 52.2 0 76.5 62.1 138.7 138.6 138.8 0.7 1.5 1.6 3.8 2.3 7.1 0.1 0.4 7.6 40.6 7.6 70.6-0.1 25.6-5.7 60.4-7.7 70.8z" p-id="2894"></path><path d="M498.7 355.9c-90.3 0-163.8 73.5-163.8 163.8 0 90.3 73.5 163.8 163.8 163.8 90.3 0 163.8-73.5 163.8-163.8 0-90.4-73.5-163.8-163.8-163.8z m0 273.1c-60.3 0-109.4-49.1-109.4-109.4 0-60.3 49.1-109.4 109.4-109.4 60.3 0 109.4 49.1 109.4 109.4 0 60.3-49.1 109.4-109.4 109.4z" p-id="2895"></path></svg> - - <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512zm0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/><path d="M199.555 528.063h293.116v278.095L710.638 300.43 199.555 528.063zm148.53-39.044 252.043 112.252L531.715 616.92V489.019H383.185z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512zm0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/><path d="M199.555 528.063h293.116v278.095L710.638 300.43 199.555 528.063zm148.53-39.044 252.043 112.252L531.715 616.92V489.019H383.185z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M731.818667 500.280889L386.844444 239.729778a14.677333 14.677333 0 0 0-23.495111 11.719111v521.159111a14.677333 14.677333 0 0 0 23.495111 11.662222l344.860445-260.608a14.677333 14.677333 0 0 0 0.113778-23.381333z" fill="#FFFFFF"/><path d="M512 1024a512 512 0 1 1 512-512 512.568889 512.568889 0 0 1-512 512z m0-946.915556A434.915556 434.915556 0 1 0 946.915556 512 435.427556 435.427556 0 0 0 512 77.084444z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M365.014704 657.815846H657.084939V365.74561H365.014704V657.815846zm584.140471-146.035118c0-240.906781-197.125482-438.105353-438.105353-438.105353-240.979872 0-438.105353 197.198572-438.105354 438.105353 0 240.979872 197.125482 438.178444 438.105354 438.178444 240.979872 0 438.105353-197.198572 438.105353-438.178444zM511.634547 0.730906c281.399001 0 511.634547 230.235546 511.634547 511.634547s-230.235546 511.634547-511.634547 511.634547-511.634547-230.235546-511.634547-511.634547 230.235546-511.634547 511.634547-511.634547z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg> - <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg> + <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M527.36 351.744V292.864L410.624 380.416 527.36 468.48V410.624c72.192 8.192 124.416 73.216 116.224 145.408-8.192 72.192-73.216 124.416-145.408 116.224-66.56-7.168-117.248-64-117.248-131.072-0.512-5.12-0.512-9.728 0-14.848H323.584c-0.512 5.12-0.512 9.728 0 14.848 0 104.96 85.504 189.952 190.464 189.952s189.952-85.504 189.952-190.464c-0.512-99.328-77.312-181.76-176.64-188.928z" fill="#FFFFFF"/></svg> <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path transform="scale(0.8) translate(128,128)" d="M960.853333 903.816533a463.633067 463.633067 0 0 0-11.264-39.185066c-1.536-4.539733-3.413333-8.942933-5.051733-13.448534a484.078933 484.078933 0 0 0-9.557333-24.4736c-2.2528-5.188267-4.881067-10.274133-7.338667-15.394133-3.413333-7.099733-6.8608-14.165333-10.6496-21.0944-2.901333-5.3248-6.075733-10.513067-9.181867-15.701333-2.423467-4.061867-4.573867-8.226133-7.133866-12.219734-1.604267-2.4576-3.413333-4.778667-5.0176-7.202133-1.501867-2.218667-2.730667-4.608-4.266667-6.792533-0.4096-0.6144-1.058133-0.887467-1.501867-1.4336a461.482667 461.482667 0 0 0-90.385066-96.768c-13.5168-10.786133-27.7504-20.48-42.257067-29.5936-0.477867-0.341333-0.7168-0.8192-1.194667-1.1264-3.6864-2.286933-7.509333-4.3008-11.264-6.485334-4.266667-2.491733-8.4992-5.051733-12.868266-7.441066-6.826667-3.6864-13.789867-7.099733-20.753067-10.478934-3.618133-1.7408-7.202133-3.618133-10.8544-5.290666a449.194667 449.194667 0 0 0-31.607467-12.731734c-0.7168-0.273067-1.365333-0.6144-2.082133-0.8192-3.140267-1.1264-6.417067-1.911467-9.557333-2.935466-4.164267-1.399467-8.328533-2.833067-12.561067-4.096a259.9936 259.9936 0 0 0 129.194667-225.450667 260.061867 260.061867 0 0 0-76.629334-185.002667 259.9936 259.9936 0 0 0-185.002666-76.629333H512h-0.034133a259.857067 259.857067 0 0 0-185.002667 76.629333 259.925333 259.925333 0 0 0-76.629333 185.002667 259.584 259.584 0 0 0 76.629333 185.002667c15.906133 15.940267 33.655467 29.2864 52.565333 40.448-4.266667 1.262933-8.430933 2.730667-12.663466 4.096-3.140267 1.058133-6.3488 1.8432-9.489067 2.935466-0.7168 0.238933-1.365333 0.580267-2.048 0.8192-10.683733 3.822933-21.265067 8.0896-31.675733 12.765867-3.584 1.604267-7.0656 3.4816-10.615467 5.154133-7.099733 3.413333-14.165333 6.826667-21.0944 10.615467-4.266667 2.321067-8.3968 4.8128-12.561067 7.2704-3.822933 2.218667-7.748267 4.266667-11.502933 6.621867-0.512 0.3072-0.750933 0.8192-1.2288 1.160533-14.506667 9.147733-28.706133 18.807467-42.222933 29.559467a459.6736 459.6736 0 0 0-90.385067 96.768c-0.443733 0.546133-1.092267 0.8192-1.501867 1.4336-1.536 2.184533-2.7648 4.573867-4.266666 6.792533-1.604267 2.423467-3.447467 4.744533-5.0176 7.202133-2.56 3.9936-4.7104 8.157867-7.133867 12.219734-3.106133 5.188267-6.280533 10.376533-9.181867 15.701333-3.7888 6.929067-7.202133 13.994667-10.6496 21.0944-2.4576 5.12-5.051733 10.205867-7.338666 15.394133-3.515733 8.021333-6.519467 16.247467-9.557334 24.4736-1.672533 4.5056-3.549867 8.9088-5.051733 13.448534-4.3008 12.868267-8.0896 25.941333-11.264 39.185066-3.072 12.970667 2.594133 25.770667 13.073067 32.802134a31.3344 31.3344 0 0 0 9.966933 4.608 30.9248 30.9248 0 0 0 34.030933-15.2576 30.446933 30.446933 0 0 0 3.345067-7.7824c2.833067-11.844267 6.178133-23.483733 10.0352-34.9184 0.6144-1.8432 1.399467-3.549867 2.013867-5.358934 3.447467-9.762133 7.133867-19.456 11.332266-28.945066 0.512-1.160533 1.1264-2.2528 1.6384-3.447467 4.7104-10.308267 9.728-20.48 15.291734-30.344533l0.068266-0.1024a402.773333 402.773333 0 0 1 19.694934-31.4368l0.136533-0.375467a397.4144 397.4144 0 0 1 116.599467-111.2064c0.136533-0.1024 0.3072-0.068267 0.443733-0.170667a397.824 397.824 0 0 1 94.993067-42.973866c2.7648-0.8192 5.495467-1.7408 8.2944-2.491734 5.7344-1.604267 11.5712-3.003733 17.373866-4.334933a367.8208 367.8208 0 0 1 47.342934-7.953067c3.8912-0.443733 7.7824-0.9216 11.6736-1.2288 10.410667-0.785067 20.8896-1.3312 31.505066-1.3312s21.060267 0.546133 31.505067 1.3312c3.8912 0.3072 7.816533 0.785067 11.707733 1.2288a361.3696 361.3696 0 0 1 47.240534 7.953067c5.870933 1.3312 11.707733 2.730667 17.5104 4.334933 2.696533 0.750933 5.358933 1.6384 8.021333 2.4576 33.348267 10.103467 65.365333 24.405333 95.197867 43.008 0.136533 0.1024 0.3072 0.068267 0.443733 0.170667a396.151467 396.151467 0 0 1 116.599467 111.2064c0.1024 0.136533 0.1024 0.273067 0.170666 0.375467 13.687467 19.7632 25.3952 40.5504 35.191467 62.1568l1.467733 3.037866c4.3008 9.659733 8.055467 19.592533 11.605334 29.5936 0.546133 1.604267 1.2288 3.106133 1.774933 4.7104 3.822933 11.4688 7.236267 23.176533 10.0352 35.0208a31.061333 31.061333 0 0 0 60.450133-14.336zm-249.275733-560.2304A199.850667 199.850667 0 0 1 512 543.197867a199.850667 199.850667 0 0 1-199.5776-199.611734A199.816533 199.816533 0 0 1 512 144.008533a199.816533 199.816533 0 0 1 199.5776 199.5776z" fill="#FFFFFF"/></svg> @@ -150,257 +147,16 @@ <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path transform="scale(0.8) translate(128,128)" d="M960.853333 903.816533a463.633067 463.633067 0 0 0-11.264-39.185066c-1.536-4.539733-3.413333-8.942933-5.051733-13.448534a484.078933 484.078933 0 0 0-9.557333-24.4736c-2.2528-5.188267-4.881067-10.274133-7.338667-15.394133-3.413333-7.099733-6.8608-14.165333-10.6496-21.0944-2.901333-5.3248-6.075733-10.513067-9.181867-15.701333-2.423467-4.061867-4.573867-8.226133-7.133866-12.219734-1.604267-2.4576-3.413333-4.778667-5.0176-7.202133-1.501867-2.218667-2.730667-4.608-4.266667-6.792533-0.4096-0.6144-1.058133-0.887467-1.501867-1.4336a461.482667 461.482667 0 0 0-90.385066-96.768c-13.5168-10.786133-27.7504-20.48-42.257067-29.5936-0.477867-0.341333-0.7168-0.8192-1.194667-1.1264-3.6864-2.286933-7.509333-4.3008-11.264-6.485334-4.266667-2.491733-8.4992-5.051733-12.868266-7.441066-6.826667-3.6864-13.789867-7.099733-20.753067-10.478934-3.618133-1.7408-7.202133-3.618133-10.8544-5.290666a449.194667 449.194667 0 0 0-31.607467-12.731734c-0.7168-0.273067-1.365333-0.6144-2.082133-0.8192-3.140267-1.1264-6.417067-1.911467-9.557333-2.935466-4.164267-1.399467-8.328533-2.833067-12.561067-4.096a259.9936 259.9936 0 0 0 129.194667-225.450667 260.061867 260.061867 0 0 0-76.629334-185.002667 259.9936 259.9936 0 0 0-185.002666-76.629333H512h-0.034133a259.857067 259.857067 0 0 0-185.002667 76.629333 259.925333 259.925333 0 0 0-76.629333 185.002667 259.584 259.584 0 0 0 76.629333 185.002667c15.906133 15.940267 33.655467 29.2864 52.565333 40.448-4.266667 1.262933-8.430933 2.730667-12.663466 4.096-3.140267 1.058133-6.3488 1.8432-9.489067 2.935466-0.7168 0.238933-1.365333 0.580267-2.048 0.8192-10.683733 3.822933-21.265067 8.0896-31.675733 12.765867-3.584 1.604267-7.0656 3.4816-10.615467 5.154133-7.099733 3.413333-14.165333 6.826667-21.0944 10.615467-4.266667 2.321067-8.3968 4.8128-12.561067 7.2704-3.822933 2.218667-7.748267 4.266667-11.502933 6.621867-0.512 0.3072-0.750933 0.8192-1.2288 1.160533-14.506667 9.147733-28.706133 18.807467-42.222933 29.559467a459.6736 459.6736 0 0 0-90.385067 96.768c-0.443733 0.546133-1.092267 0.8192-1.501867 1.4336-1.536 2.184533-2.7648 4.573867-4.266666 6.792533-1.604267 2.423467-3.447467 4.744533-5.0176 7.202133-2.56 3.9936-4.7104 8.157867-7.133867 12.219734-3.106133 5.188267-6.280533 10.376533-9.181867 15.701333-3.7888 6.929067-7.202133 13.994667-10.6496 21.0944-2.4576 5.12-5.051733 10.205867-7.338666 15.394133-3.515733 8.021333-6.519467 16.247467-9.557334 24.4736-1.672533 4.5056-3.549867 8.9088-5.051733 13.448534-4.3008 12.868267-8.0896 25.941333-11.264 39.185066-3.072 12.970667 2.594133 25.770667 13.073067 32.802134a31.3344 31.3344 0 0 0 9.966933 4.608 30.9248 30.9248 0 0 0 34.030933-15.2576 30.446933 30.446933 0 0 0 3.345067-7.7824c2.833067-11.844267 6.178133-23.483733 10.0352-34.9184 0.6144-1.8432 1.399467-3.549867 2.013867-5.358934 3.447467-9.762133 7.133867-19.456 11.332266-28.945066 0.512-1.160533 1.1264-2.2528 1.6384-3.447467 4.7104-10.308267 9.728-20.48 15.291734-30.344533l0.068266-0.1024a402.773333 402.773333 0 0 1 19.694934-31.4368l0.136533-0.375467a397.4144 397.4144 0 0 1 116.599467-111.2064c0.136533-0.1024 0.3072-0.068267 0.443733-0.170667a397.824 397.824 0 0 1 94.993067-42.973866c2.7648-0.8192 5.495467-1.7408 8.2944-2.491734 5.7344-1.604267 11.5712-3.003733 17.373866-4.334933a367.8208 367.8208 0 0 1 47.342934-7.953067c3.8912-0.443733 7.7824-0.9216 11.6736-1.2288 10.410667-0.785067 20.8896-1.3312 31.505066-1.3312s21.060267 0.546133 31.505067 1.3312c3.8912 0.3072 7.816533 0.785067 11.707733 1.2288a361.3696 361.3696 0 0 1 47.240534 7.953067c5.870933 1.3312 11.707733 2.730667 17.5104 4.334933 2.696533 0.750933 5.358933 1.6384 8.021333 2.4576 33.348267 10.103467 65.365333 24.405333 95.197867 43.008 0.136533 0.1024 0.3072 0.068267 0.443733 0.170667a396.151467 396.151467 0 0 1 116.599467 111.2064c0.1024 0.136533 0.1024 0.273067 0.170666 0.375467 13.687467 19.7632 25.3952 40.5504 35.191467 62.1568l1.467733 3.037866c4.3008 9.659733 8.055467 19.592533 11.605334 29.5936 0.546133 1.604267 1.2288 3.106133 1.774933 4.7104 3.822933 11.4688 7.236267 23.176533 10.0352 35.0208a31.061333 31.061333 0 0 0 60.450133-14.336zm-249.275733-560.2304A199.850667 199.850667 0 0 1 512 543.197867a199.850667 199.850667 0 0 1-199.5776-199.611734A199.816533 199.816533 0 0 1 512 144.008533a199.816533 199.816533 0 0 1 199.5776 199.5776z" fill="#FFFFFF"/></svg> + + <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg> + + + <svg viewBox="0 0 1027 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0zm0 963.584c-249.344 0-451.584-202.24-451.584-451.584S262.656 60.416 512 60.416s451.584 202.24 451.584 451.584-202.24 451.584-451.584 451.584z" fill="#FFFFFF"/><path d="M437.314 840.84l-18.967-5.795c-43.935-13.425-84.182-35.551-119.623-65.767l-15.203-12.962 11.199-16.544c17.376-25.668 17.938-59.158 1.433-85.319-14.356-22.787-39.028-36.385-66.006-36.385-4.102 0-8.229 0.328-12.267 0.974l-19.752 3.158-5.301-19.288c-8.196-29.823-12.353-59.896-12.353-89.381 0-19.675 1.863-39.491 5.694-60.582l3.652-20.105 20.349 1.862c2.343 0.214 4.726 0.323 7.081 0.323 29.007 0 55.436-15.908 68.974-41.516 14.941-28.2 11.264-62.223-9.356-86.694l-13.166-15.625L278.1 276.7c38.694-38.954 86.677-68.095 138.76-84.273l19.741-6.132 7.631 19.211c11.88 29.908 40.312 49.234 72.432 49.234 32.097 0 60.521-19.328 72.413-49.241l7.632-19.197 19.73 6.122c43.968 13.642 84.295 36.164 119.862 66.938l15.414 13.337-11.883 16.561c-18.636 25.975-19.684 60.166-2.671 87.105 14.369 22.78 39.055 36.373 66.04 36.372 4.344 0 8.71-0.366 12.978-1.087l20.143-3.403 5.176 19.762c7.539 28.792 11.362 57.566 11.362 85.522 0 21.328-2.143 43.048-6.365 64.554l-3.859 19.65-19.952-1.709a77.999 77.999 0 0 0-6.612-0.281c-28.998 0-55.44 15.917-69.009 41.542-14.47 27.405-11.311 60.816 8.063 85.095l12.496 15.661-14.222 14.111c-38.674 38.378-86.551 67.041-138.455 82.892l-18.968 5.792-7.988-18.152c-12.462-28.318-40.459-46.617-71.325-46.617-30.883 0-58.893 18.299-71.36 46.619l-7.99 18.152zm-95.455-94.18c22.324 16.82 46.59 30.174 72.469 39.881 22.445-34.023 60.731-55.125 102.336-55.125 41.59 0 79.862 21.1 102.303 55.12 32.745-12.298 63.249-30.557 89.663-53.667-19.709-35.774-20.525-79.555-1.04-116.455 19.699-37.203 56.634-61.386 98.053-64.883 1.705-12.731 2.565-25.453 2.565-38 0-18.339-1.923-37.155-5.729-56.144-42.123-0.241-80.616-21.581-103.077-57.189-22.944-36.331-25.024-81.029-6.697-118.768-22.165-16.932-46.203-30.4-71.788-40.221-8.847 14.328-20.577 26.719-34.618 36.447-20.522 14.219-44.602 21.735-69.635 21.735-25.044 0-49.131-7.516-69.657-21.734-14.042-9.727-25.773-22.116-34.618-36.441-32.551 12.503-62.856 30.935-89.106 54.196 21.198 36.233 22.547 80.974 2.407 118.987-19.71 37.285-56.808 61.499-98.402 64.875-1.45 11.713-2.161 23.035-2.161 34.255 0 19.715 2.166 39.792 6.449 59.894 41.851 0.474 80.029 21.785 102.35 57.214 22.218 35.217 24.782 78.871 7.933 116.023z" fill="#FFFFFF"/><path d="M516.664 633.864c-66.246 0-120.141-53.897-120.141-120.147 0-66.249 53.895-120.146 120.141-120.146 66.237 0 120.127 53.897 120.127 120.146 0 66.25-53.89 120.147-120.127 120.147zm0-195.641c-41.625 0-75.488 33.866-75.488 75.494s33.863 75.495 75.488 75.495c41.617 0 75.475-33.867 75.475-75.495s-33.858-75.494-75.475-75.494z" fill="#FFFFFF"/></svg> + - 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 - AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn - H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E - u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D - uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE - u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn - H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn - H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAL+/AAS7ph6HvKcf/ryn - H/+8px//vKcf/7ynH/+9px+tu6oiDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAAAAAAAAAAAAMKq - JBW8px+/vKcf/7ynH/+8px//vKcf/7umH/28px+Fv78ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ - vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAA - AAAAAAAAAAAAALqmID+8px/2vKcf/7ynH/+8px//vKcf/7ynH/C8px5UAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF - u08AAAAAAAAAAAAAAAAAAAAAtpIkB7unHrm8px//vKcf/7ynH/+8px//vKcf/7yoH9i/pBscAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE - u/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAACAgAACu6ggabynH/28px//vKcf/7ynH/+8px//vKcf/7yn - H4UAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAAAAAAC9px86vKcf4LynH/+8px//vKcf/7yn - H/+8px//vKcf6LyuGxMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAAAAAAL2lIR+9pyC6vKcf/7yn - H/+8px//vKcf/7ynH/+8px/5vKgeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ - vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HFu08AAAAAv6cgILyn - HrC7px/9vKcf/7ynH/+8px//vKcf/7ynH/68ph6yvKEbEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0HF - u0+5qB0su6cfx7ynH/68px//vKcf/7ynH/+8px//vKcf/7ynH+a6qR47//8AAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE - u/9AxLv/RMO2/3y0cIi8ph/VvKcf/7ynH/+8px//vKcf/7ynH/+8px//vKce87ymHl8AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAE+w7t4QMS7/EHEuv9Tv6P/g7Rm/7apKPq8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/svagebf// - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAE+w7t4Q8O3/HW3eP+pqzf/uqch/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7um - H/S7piBwtrYkBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ - vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAv58gCL2lIR+PsViWqas3/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+9qB/+vagf6rymHWqAgAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA - AAAAAAAAAAAAAAAAAAAAAAAAqqoAA76qISe7px9avKcflLynHtS8px77vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/y9px/EvKYgSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ - vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -409,7 +165,159 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6JAAAIBYAAHdlBQBcTAMAeGYGAIVzBwB6aQUA//0XAFlK + AQBRPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAADAAAARRYDADkRBAA1DQAAURoIAP+rVQAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEkAABjUgMAGw8AAKOODAD//xMANy0NBVtP + Dgb//wAA1L8VAJyKIQCqlx8A794+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA8DAQA/7uNALhNOQDLUDoAqkMzAI89KwAAAAAAZScTAEweEgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRSBABBMwMA//8bAJJ/ + Cii7pAx80LcNrNe+C7HSug+Owq4TP2JZMAOvnigAtaUqAFdVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4CgQA/XFPAJI9KzSsQy9Zoj8wMHg4LArcXEAAnEcwAMNY + PwBfKhUAQygNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANysAAAAA + AAD/6xEApY8LQ9K2CtTpywX/8NID//HUAv/v0wT/5c0L69O8HG17cz8DqZorADwmAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBCwAA/5JlALdGLoTdUTT+3lA26M9U + NrG4UjVUiEIvC71fPAAAAAAAfEQqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOzIAAKGICQCUfAob1bcLyfHPBP/x0gH/8tMB//PTAf/y1gD/8dYB/+jPDuvMuyg/3MslAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBDgAA/39YAL1H + L4PoUzT/7lU0/+xWNP/jVjf2zlc5pKZaOSXXZz8AAAUWAHtCLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAOi4AANrADwCzmwtb58kG+/LSAf/y0gH/8tQB//LVAf/y1gH/8NcA/+7V + Bv/dyCCM//8AAJiKKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAA9DAIA/31TAMBIMIPnUzT/7VQ1/+5VNP/uVzP/6Vg0/9VdOca2YD4sz2hDAP+QYQBcGw4AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMSgAAP//FAC+pQt+7M4E//LRAP/z0gH/8tQB//LV + AP/z1wD/89cA//HYA//l0B2leXOHA6eYMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAA6CgEA/3tRAMBIMYLnUzX/7lU0/+5VM//uVjP/7VY1/+lZM//TYDy5sGNHF7tl + RwCuZEcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCYAAP//FQDCqAuA7c8E//LS + AP/z0gH/89QB//LVAP/z1wD/9NcB//LYA//l0Rume3J1A6WULAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2CgAA/3NLAMFJMIDnUzT/7lUz/+5WM//tVjT/7Vc1/+xY + Mv/lXDX+zmVDfgArtQCZVz8AVEIOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOyoAAP// + EwDGqgx97c4E//LSAf/y0gH/8tQB//LVAP/z1wD/9NgA//PYAv/l0BqnfnNtA6SSKQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsBgAA/2xFAMNLMXznVDP/7VQz/+5V + NP/tVjT/7lgz/+5YM//uWTP/22I82sNzUyLIclIAj1M5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAOjAAAP//EADFqwt87M4E//HSAf/x0wH/8dQA//LUAP/y1wD/89gA//LZAv/l0RqngHRsBKOT + KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAA/2hDAMRM + MXroVTT/7lU0/+5VNP/uVjT/7lg0/+9ZNP/vWTP/5101/c5sSGLiakMAXjkaAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAASDAAAP//DwDGrAt77c8E//LTAf/y1AH/8tQB//LVAP/z1wD/89gA//PZ + Av/m0RungHRwA6WUKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAHAAAA/2RAAMNMMXnnVDP/7lU0/+5VNP/uVzT/7lk0/+5YM//vWTP/6Vwz/9VmQ5cAoMMBi1A0AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQTYAAP//EADHrAx9788D//PUAf/01AH/89UB//HW + AP/z2AH/9NgB//TaA//o1B2niH18A6qaLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA/mM+AMRMMXnmVTP/7VYz/+5WNP/vWDT/7lkz/+5YM//vWDP/61sz/9dk + QLSbdl8HrWlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVEABAP/8DgDKrgx77tAD//LU + Af/z1QH/89YB//PXAP/02AH/9NkB//TaA//o1B2nin1+A6uaMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAA/2RAAMRLMXnnVDT/7lY0/+1YM//uWDP/7lkz/+1Y + M//tWDP/7Vsz/9tlQbyld18JsWxQAGdSAgB9agUAh3MMAIZxDACLdg4AkXsQAI95EACHdQ4AZFgAAP/o + DwDIrQx17c8E//LUAP/y1AH/89cB//PXAP/02AH/9NkB//PaA//o0xylg3aCA6yaMAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAA/2RAAMZMMXjoVTT/7lc0/+9Y + NP/uWDP/7lkz/+5YMv/uWDP/5Vw0/9BjP6uSZ3gFy6wbAP/8EwAAABoAHhMgA0U2GwRURR4FXVAgBVdL + IAUAADQB6dIaAOfMEgDCqgxp680F//PVAP/z1QH/89cB//PXAf/z2AD/9NkB//PaAv/o0xymhXp9A6qZ + MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/WU+AMdO + MXXoVzT/7lY0/+5XNP/tWDP/7Vkz/+dZNP7YWDfRw1Y0daJQMymjjBQevaMTSsywD3jXug2V2r4MpNu+ + DKrcvgys3sAMrN7ADazZwA+azboXSwAAmgG4pBBF58sH9fLWAv/01gH/89cB//PYAP/02QD/9NkA//Pb + Av/p1RymhoKFA62fMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/GU/AMhOMnXoVjX/7lY0/+5XNP/qWTP/2Foz6MNUNX6VSyslqZYNQc2zC5bewQnX58oH9uzO + BP/u0QP/8NIC//LSAv/x0QL/8tEC//PSAv/x0QT/6c4K8M6+FmafixQg4ccK2/TWAv/y1wD/89gA//PX + AP/12gD/9NkA//PaAv/p1hukgX6MA66hLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA92E+AMdNMnToVjX/71gy/+daM//PWDPMp0stRJ+KDC/KsQqe4cMJ7+3P + A//y0QL/89IB//PRAf/x0wH/8dMA//LUAP/y0wH/8dIA//HTAP/y0wD/8tUB/+HKEtOdkygf0rwOnfHU + BP/01gD/89gB//PXAP/12gD/9NoA//PaAv/p1hqjfHuhArOmMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA92FAAMVMMnTnVjX/61kz/9FZNcKdRy4suaEOU9q+ + C9rszwP/89IB//PSAP/z0gD/9NMA//PSAf/y0QH/89IB//LTAf/y1AH/89MB//LTAf/y1AH/89QB/+bO + EO67sC00vacSPeXMCe311wH/9NkA//TYAf/12QH/9NoA//PbA//p1Ruhe3a/ArioOQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+mNAAMNLMXXlVzP/01g1z6BO + MC+7pg1i48MJ7PHTAv/z0wH/8tMB//PSAP/z0wD/9NMB//PSAP/z0gH/9NMB//PUAf/y1AH/8tQB//LU + Af/z1QL/89YB/+jQD/K/tCw8AAAAAc65DpDu1AT/9NgB//TYAf/12gH/9dsA//TcA//p1RyheXHNArim + OwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+2NBAMJL + MXjWVjbusE00SrehDFbhwwnt8NMC//LTAv/z1AH/8tMB//PSAP/00wD/9NMA//PTAf/00wH/9NMB//PU + Af/z1QH/8tQA//LUAP/01QH/9dYB/+rQD/HBtC07xLQkAKWQEBzXwwy58NYE//TZAP/22wD/9twB//Tc + A//q1R2ifnemArKiNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA42BFALdLNHK9TTiKoYkPNNy/Ctzx0gH/8tMA//PVAf/y1QH/8tMB//LTAf/z0wD/9NMB//PT + Af/y0wH/8tMB//PTAf/z1AH/89UB//PVAP/01gH/9dcB/+XPEea7rC8rwbEvANnDEgCxnBIl28YNs/DW + Bf/22wL/9dwC//TdA//p1x+je4KlArClOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAOAAAA13NYAJJENkONSiwrzbIKoPDPBP/y0wD/8tQB//PVAP/y1AD/8dMA//HT + AP/y0wD/9NMB//TTAf/z0wH/8tMB//TTAf/01AD/89UA//TUAf/z1gH/8dYG/9bGGKiMhzQKopcoAP// + yQDRvRIApZcTF868D4Tjzwrj8dkG//XdBP/n2Bulc3qcA62iNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAVxwRACQAQQWslQ1F4sYG7/PTAf/x0wH/8tQB//PV + AP/y1AD/8dMA//HTAP/z0wH/89QB//LVAv/v0wP/7dEE++zRBvnt0Af68NEG+vDRBvrq0Avx3cgYs7+s + JCnaxigArZYaALShFAC0nhYAtqUUAAAAAAG2pw8u0MAPeuHKErvayyaGc32FAqKZNgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAcFgHAAAAAAPKsA6a7tAE//PU + Af/y1AH/89UB//PVAP/y1QD/9NMB//PUAf/01QH/79UF/uTOC87bxBJ/0rkQVs22EVHMthNSzLcPUsy3 + ElHGshw+qpwnENzHJACGcxYDq5UbHLKeFSKynRcitKEWIKydFhgzNSgD//8WAIV7Gwujni0OlZp5AI2I + OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqYwAAmIMNAJN+ + Dh/avQvZ89MC//HTAf/y1AH/9NYB//PVAP/01QD/9NUB//XVAf/u0wf32sUUi7+uHBv//wAA5ssPAOHJ + EgDiyRUA4swQAOLKFADTvh4AtaUjAJmHDwCYhxMV1r8Su+XOCeLlzQvg5c8I3+LPCtTcyBGpz7sZS31+ + LQSupSgA/9cAAJCKOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABIQgAAwacPALKaDkPnyAb09dMB//HTAf/y0wD/89UA//PWAP/01QH/89UB/+/VBv/ZyBuWhYUqCMS1 + GgBjTgoAnIkTAGBRAwBcUgQAW1EDAFlOAwBZSgQAQkEIAKKPDgCfjhIa48oL2fXcAf/12wH/9NoB//Pb + Af/y3QP/6tYK8NLDHHF6ckwDrKAuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC3ngEA5cYSAMGoDmbrzAb+89QB//LUAP/z1AD/9NUA//XWAf/01QH/9NYB/+bQ + D+TBtikux70kAMG7HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKPDgCgjREa48oL1/Tc + Af/12wH/89oB//PaAP/13AH/89wC/+rUEenSwi053swrAPDlWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cRAMyyDnftzwT/8tQA//LUAP/01QD/9dUB//XW + Af/11gH/89UC/+PMGL+tpkALs6gwAHhgGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOR + DgChkBEZ5MwK1/XbAf/02wH/89oA//PaAP/02wH/9dwB//LbB//f0CCD//8AAKaaNgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAAA//0OAM+2Dn3v0QT/8tQA//PV + AP/z1QD/9NUA//TWAf/01QH/8tQD/+DKGreilkwIr6AyAH4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKOTEAChkRQY48wM1fXcAf/02wH/89oA//PaAP/02wH/9NwC//TcA//o1xygYGzxArir + QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaEgAA//8PAM+2 + Dn7v0gT/8tQA//PVAP/z1gD/9NYA//TXAf/01gH/89UC/+DKG7mel0cJq54xAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqJEACKexkL3coPuvbdAv/22wL/9doB//TbAf/03AH/9N0B//Td + A//r1x6hgIDVAr2tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAYDQAA//8PAM+1Dn3v0gT/89UA//PWAP/z1gD/9NcA//XYAf/01wD/89UC/+DLGbuYmEYJpp4wAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdlBgD//w4A0LwRa+/XB/zz3QH/9twA//bc + AP/13QH/9d0B//XeA//r1xyjjYKtArmoOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAFAAAA//kPANG3Dnvv0gT/89UA//TXAP/01wD/9NcA//TXAP/11wD/89YC/+HM + G7udnEsJq6E0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIVzCgCznxYApZAXD9jE + Epru2Af79NsD//XdAP/13QD/9t0B//XeA//r1x6lj4OZA7WkOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+0PAM+3Dnjw0wT/9NYA//TXAP/z2AD/9NcA//XY + Af/12AD/8tYD/9/KHLiUk0wIpJoyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKms + AwDPtxsAxbIYAKOYFw7RvxRl4MsOwufUCPDw2gT/9t4C//XfA//p2BulgX2MA66hMgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKtgcA4ccVAMWwEVrs0Af79NcA//TY + Af/02AL/9NcA//XYAf/01wH/89YG/9zLI5cAAJ0BjYUlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABdUgAAzr8bALOkFgD//xgAnpAVEL+uEz/RvRCD38sMxu3VCvPj0iCle31oBKGX + KwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAsZ8SAKmW + ExzfxQzN9dYD//TZAf/02AH/9NgB//XYAf/z2AH/6dMS79LHNUXk2DAA//+CAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEwAAId2CgBfSQQAppcSAMu7FAD//w8AlYwPEsW0 + FD3ItzBAi3xSApODLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABPOgAAKRgAAP//HAC/qhRL48oK3vLWA//12AL/9NgC//PYBP/s0w/y1sQleoyVWASwrD0AcmkbAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWRwAAYUwBAIiA + CwBtYgYAn5QMANC/EwDl1DAAj4FdAKKSLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAgGwHAH9vBwD///8Au6gRM9a/D5DiyA3B4csLxdnHEaTOuSFOmYctBr2x + MwDAuz0AUygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABfTgAANCQAAAAAAABNPw4AYlMmAFA/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCACABvYgUAzbgSAAAANQGbiRgNnZAYD1ZP + GwTs2SQArZwpALyqKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpLAAA8KwAAuqYXAIx5 + DAClkRAApZUSAJKFDQAAAAAAbVgHAEw4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/ + AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA + D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/ + AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A + H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAA= \ No newline at end of file diff --git a/DHSoftware/Models/DataModel.cs b/DHSoftware/Models/DataModel.cs index 2d36f4c..dafd868 100644 --- a/DHSoftware/Models/DataModel.cs +++ b/DHSoftware/Models/DataModel.cs @@ -1,16 +1,12 @@ using AntdUI; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace DHSoftware.Models { public class DataModel { } - public class DefectRow:NotifyProperty + + public class DefectRow : NotifyProperty { private bool selected = false; public string LabelId { get; set; } @@ -35,4 +31,4 @@ namespace DHSoftware.Models } } } -} +} \ No newline at end of file diff --git a/DHSoftware/Models/DataUtil.cs b/DHSoftware/Models/DataUtil.cs index cec7af6..eb23c3e 100644 --- a/DHSoftware/Models/DataUtil.cs +++ b/DHSoftware/Models/DataUtil.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace AntdUIDemo.Models +namespace AntdUIDemo.Models { public class DataUtil { @@ -220,9 +218,5 @@ namespace AntdUIDemo.Models { "Chat", "MessageOutlined" }, { "Other", "SettingOutlined" } }; - - } - - -} +} \ No newline at end of file diff --git a/DHSoftware/Models/FileName.cs b/DHSoftware/Models/FileName.cs index 1a9389c..1d93e34 100644 --- a/DHSoftware/Models/FileName.cs +++ b/DHSoftware/Models/FileName.cs @@ -1,20 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - - -namespace DHSoftware.Models +namespace DHSoftware.Models { public class Camera { public string DeviceName { get; set; } public string Alias { get; set; } public string ImagePath { get; set; } - } - - - } +} \ No newline at end of file diff --git a/DHSoftware/Models/MenuItems.cs b/DHSoftware/Models/MenuItems.cs index f7f9b3d..e61531c 100644 --- a/DHSoftware/Models/MenuItems.cs +++ b/DHSoftware/Models/MenuItems.cs @@ -6,4 +6,4 @@ public string Text { get; set; } = string.Empty; public string Tag { get; set; } = null; } -} +} \ No newline at end of file diff --git a/DHSoftware/Models/User.cs b/DHSoftware/Models/User.cs deleted file mode 100644 index 789392d..0000000 --- a/DHSoftware/Models/User.cs +++ /dev/null @@ -1,166 +0,0 @@ -using AntdUI; - -namespace AntdUIDemo.Models -{ - public class User : NotifyProperty - { - private bool selected = false; - private string name; - private int age = 0; - private string address; - private bool enabled = false; - private CellImage[] cellImages; - private CellTag[] cellTags; - private CellBadge cellBadge; - private CellText cellText; - private CellLink[] cellLinks; - private CellProgress cellProgress; - private CellDivider cellDivider; - //用于设置树形表格,加入自身数组 - private User[] users; - - public bool Selected - { - get { return selected; } - set - { - if (selected == value) return; - selected = value; - OnPropertyChanged(nameof(Selected)); - } - } - - public string Name - { - get { return name; } - set - { - if (name == value) return; - name = value; - OnPropertyChanged(nameof(Name)); - } - } - - public int Age - { - get { return age; } - set - { - if (age == value) return; - age = value; - OnPropertyChanged(nameof(Age)); - } - } - - public string Address - { - get { return address; } - set - { - if (address == value) return; - address = value; - OnPropertyChanged(nameof(Address)); - } - } - - public bool Enabled - { - get { return enabled; } - set - { - if (enabled == value) return; - enabled = value; - OnPropertyChanged(nameof(Enabled)); - } - } - - public CellImage[] CellImages - { - get { return cellImages; } - set - { - if (cellImages == value) return; - cellImages = value; - OnPropertyChanged(nameof(CellImages)); - } - } - - public CellTag[] CellTags - { - get { return cellTags; } - set - { - if (cellTags == value) return; - cellTags = value; - OnPropertyChanged(nameof(CellTags)); - } - } - - public CellBadge CellBadge - { - get { return cellBadge; } - set - { - if (cellBadge == value) return; - cellBadge = value; - OnPropertyChanged(nameof(CellBadge)); - } - } - - public CellText CellText - { - get { return cellText; } - set - { - if (cellText == value) return; - cellText = value; - OnPropertyChanged(nameof(CellText)); - } - } - - public CellLink[] CellLinks - { - get { return cellLinks; } - set - { - if (cellLinks == value) return; - cellLinks = value; - OnPropertyChanged(nameof(CellLinks)); - } - } - - public CellProgress CellProgress - { - get { return cellProgress; } - set - { - if (cellProgress == value) return; - cellProgress = value; - OnPropertyChanged(nameof(CellProgress)); - } - } - - public CellDivider CellDivider - { - get { return cellDivider; } - set - { - if (cellDivider == value) return; - cellDivider = value; - OnPropertyChanged(nameof(CellDivider)); - } - } - - public User[] Users - { - get { return users; } - set - { - if (users == value) return; - users = value; - OnPropertyChanged(nameof(Users)); - } - - } - } -} diff --git a/DHSoftware/Program.cs b/DHSoftware/Program.cs index 9979be0..e489760 100644 --- a/DHSoftware/Program.cs +++ b/DHSoftware/Program.cs @@ -1,31 +1,127 @@ using System; +using System.Data.Entity; using System.Drawing; +using System.Reflection; using System.Windows.Forms; +using AntdUI; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Helper; +using DH.Commons.Models; +using DH.RBAC.Common; +using DH.RBAC.Logic.Base; +using DH.RBAC.Utility.Extension; +using DH.RBAC.Utility.Other; +using DHSoftware.Utils; using DHSoftware.Views; +using Microsoft.VisualBasic.Logging; +using Newtonsoft.Json; +using GlobalConfig = DH.RBAC.Common.GlobalConfig; namespace DHSoftware { internal static class Program { + private static MainWindow mainWindow; - /// - /// 应用程序的主入口点 - /// - [STAThread] + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() { + // 必须在第一个窗口创建前调用以下两行 + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + // 注册全局异常处理 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + // 初始化AntdUI配置 AntdUI.Localization.DefaultLanguage = "zh-CN"; - //若文字不清晰,切换其他渲染方式 AntdUI.Config.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; AntdUI.Config.SetCorrectionTextRendering("Microsoft YaHei UI"); - - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - mainWindow = new MainWindow(); - Application.Run(mainWindow); + AntdUI.Style.Set(AntdUI.Colour.Primary, Color.FromArgb(46, 108, 227)); + + // 现在再创建窗口 + WelcomeWindow.Instance.Show(); + UpdateStep(0, "正在初始化", true); + UpdateStep(10, "正在加载数据库", true); + try + { + MyConfig config = File.ReadAllText(MyEnvironment.RootPath("db/config.json")).ToObject(); + GlobalConfig.Config = config; + string message = ""; + bool flag = BaseLogic.InitDB(config.DbType, config.DbHost, config.DbName, config.DbUserName, config.DbPassword, ref message); + + if (!flag) + { + Console.Write(message); + return; + } + //DatabaseUtil.InitializeDatabase(); + } + catch (Exception ex) + { + SystemModel.CurrentStatus = EnumStatus.异常; + MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error; + MainWindow.Instance.tagMachineStatus.Text = "异常"; + Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); + } + + + UpdateStep(30, "正在加载解决方案", true); + try + { + MainWindow.Instance.LoadScheme(); + } + catch (Exception ex) + { + SystemModel.CurrentStatus = EnumStatus.异常; + Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); + } + UpdateStep(50, "正在连接相机", true); + try + { + MainWindow.Instance.ConnectCamera(); + } + catch(Exception ex) + { + SystemModel.CurrentStatus = EnumStatus.异常; + Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); + } + UpdateStep(70, "正在连接PLC", true); + try + { + MainWindow.Instance.ConnectPLC(); + } + catch (Exception ex) + { + SystemModel.CurrentStatus = EnumStatus.异常; + MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error; + MainWindow.Instance.tagMachineStatus.Text = "异常"; + Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); + } + UpdateStep(80, "正在加载算法模型", true); + try + { + MainWindow.Instance.InitModel(); + } + catch (Exception ex) + { + SystemModel.CurrentStatus = EnumStatus.异常; + MainWindow.Instance.tagMachineStatus.Type = TTypeMini.Error; + MainWindow.Instance.tagMachineStatus.Text = "异常"; + Modal.open(WelcomeWindow.Instance, "错误!", ex.ToString(), TType.Error); + } + UpdateStep(100, "程序初始化完成", true); + Thread.Sleep(100); + WelcomeWindow.Instance.Close(); + // 启动主窗口 + Application.Run(MainWindow.Instance); } // 捕获UI线程中的未处理异常 @@ -39,5 +135,22 @@ namespace DHSoftware { AntdUI.Notification.error(mainWindow, "未处理的非UI线程异常", e.ToString(), autoClose: 3, align: AntdUI.TAlignFrom.TR); } + + //更新进度 + internal static void UpdateStep(int percentValue, string stepMsg, bool succeed) + { + try + { + WelcomeWindow.Instance.bar_step.Value = percentValue; + WelcomeWindow.Instance.lbl_step.Text = stepMsg + "......"; + Thread.Sleep(200); + Application.DoEvents(); + } + catch (Exception ex) + { + } + } + + } } diff --git a/DHSoftware/Properties/Resources.resx b/DHSoftware/Properties/Resources.resx index 50a363e..1af7de1 100644 --- a/DHSoftware/Properties/Resources.resx +++ b/DHSoftware/Properties/Resources.resx @@ -117,26 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\bg1.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bg2.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\bg3.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\head.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\head2.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\assets\logo.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\关闭.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - \ No newline at end of file diff --git a/DHSoftware/Utils/AdaptiveHelper.cs b/DHSoftware/Utils/AdaptiveHelper.cs index 15f77cd..c69617a 100644 --- a/DHSoftware/Utils/AdaptiveHelper.cs +++ b/DHSoftware/Utils/AdaptiveHelper.cs @@ -1,18 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AntdUI; - -namespace DHSoftware.Utils +namespace DHSoftware.Utils { public static class AdaptiveHelper { #region 控件大小随窗体大小等比例缩放 - - public static void setTag(Control cons) { foreach (Control con in cons.Controls) @@ -35,15 +26,13 @@ namespace DHSoftware.Utils con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度 con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距 con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距 - var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小 + var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小 if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); con.Focus(); if (con.Controls.Count > 0) setControls(newx, newy, con); } } - - - #endregion + #endregion 控件大小随窗体大小等比例缩放 } -} +} \ No newline at end of file diff --git a/DHSoftware/Utils/ConfigManager.cs b/DHSoftware/Utils/ConfigManager.cs deleted file mode 100644 index 8cefcf4..0000000 --- a/DHSoftware/Utils/ConfigManager.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Json; -using System.Windows.Forms; -using DH.Commons.Enums; -using DH.Devices.Devices; -using DH.Devices.PLC; - -namespace DH.Commons.Helper -{ - // 配置数据模型 - public class AppConfig - { - public List Cameras { get; set; } = new List(); - public List PLCs { get; set; } = new List(); - public List Detections { get; set; } = new List(); - } - - // 配置管理工具类 - public static class ConfigManager - { - private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions - { - WriteIndented = true, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - IgnoreNullValues = true - }; - - // 默认路径配置 - private static readonly string DefaultConfigDir = Path.Combine( - Application.StartupPath, - "configs" - ); - - public static readonly string DefaultConfigPath = Path.Combine( - DefaultConfigDir, - "appsettings.json" - ); - - /// - /// 保存配置文件(自动处理目录和备份) - /// - /// 配置对象 - /// 可选文件路径 - public static void SaveConfig(AppConfig config, string filePath = null) - { - try - { - // 使用默认路径如果未指定 - filePath ??= DefaultConfigPath; - - // 确保配置目录存在 - var configDir = Path.GetDirectoryName(filePath); - if (!Directory.Exists(configDir)) - { - Directory.CreateDirectory(configDir); - } - - // 备份已有配置 - if (File.Exists(filePath)) - { - BackupConfig(filePath); - } - - // 序列化并保存 - string json = JsonSerializer.Serialize(config, _jsonOptions); - File.WriteAllText(filePath, json); - } - catch (Exception ex) - { - throw new InvalidOperationException("配置保存失败", ex); - } - } - - /// - /// 加载配置文件 - /// - /// 可选文件路径 - /// 配置对象 - public static AppConfig LoadConfig(string filePath = null) - { - try - { - filePath ??= DefaultConfigPath; - - if (!File.Exists(filePath)) - { - return new AppConfig(); // 返回空配置而不是null - } - - string json = File.ReadAllText(filePath); - return JsonSerializer.Deserialize(json, _jsonOptions); - } - catch (Exception ex) - { - throw new InvalidOperationException("配置加载失败", ex); - } - } - - /// - /// 创建带时间戳的备份文件 - /// - private static void BackupConfig(string originalPath) - { - try - { - // 创建备份目录 - var backupDir = Path.Combine( - Path.GetDirectoryName(originalPath), - "backups" - ); - - if (!Directory.Exists(backupDir)) - { - Directory.CreateDirectory(backupDir); - } - - // 生成带时间戳的文件名 - string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); - string fileName = $"{Path.GetFileNameWithoutExtension(originalPath)}_" + - $"{timestamp}" + - $"{Path.GetExtension(originalPath)}"; - - // 执行备份 - File.Copy( - originalPath, - Path.Combine(backupDir, fileName), - overwrite: true - ); - } - catch (Exception ex) - { - throw new InvalidOperationException("配置备份失败", ex); - } - } - - /// - /// 创建新的配置对象 - /// - public static AppConfig CreateConfig( - List cameras = null, - List plcs = null, - List detections = null) - { - return new AppConfig - { - Cameras = cameras ?? new List(), - PLCs = plcs ?? new List(), - Detections = detections ?? new List() - }; - } - } - -} \ No newline at end of file diff --git a/DHSoftware/Utils/HashHelper.cs b/DHSoftware/Utils/HashHelper.cs new file mode 100644 index 0000000..202baa0 --- /dev/null +++ b/DHSoftware/Utils/HashHelper.cs @@ -0,0 +1,19 @@ +using System.Security.Cryptography; +using System.Text; + +namespace DHSoftware.Utils +{ + // 密码加密辅助类 + public static class HashHelper + { + public static string MD5Encrypt(string input) + { + using (var md5 = MD5.Create()) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + return BitConverter.ToString(hashBytes).Replace("-", ""); + } + } + } +} \ No newline at end of file diff --git a/DHSoftware/Utils/ThemeHelper.cs b/DHSoftware/Utils/ThemeHelper.cs index 7bc2147..bba023d 100644 --- a/DHSoftware/Utils/ThemeHelper.cs +++ b/DHSoftware/Utils/ThemeHelper.cs @@ -1,5 +1,4 @@ using Microsoft.Win32; -using System.Drawing; namespace DHSoftware.Utils { @@ -45,4 +44,4 @@ namespace DHSoftware.Utils } } } -} +} \ No newline at end of file diff --git a/DHSoftware/Views/AddCameraControl.Designer.cs b/DHSoftware/Views/AddCameraControl.Designer.cs index 8002e44..4774654 100644 --- a/DHSoftware/Views/AddCameraControl.Designer.cs +++ b/DHSoftware/Views/AddCameraControl.Designer.cs @@ -29,6 +29,7 @@ private void InitializeComponent() { panel1 = new AntdUI.Panel(); + lbTitleName = new AntdUI.Label(); input_name = new AntdUI.Input(); label3 = new AntdUI.Label(); divider1 = new AntdUI.Divider(); @@ -36,7 +37,6 @@ button_cancel = new AntdUI.Button(); button_ok = new AntdUI.Button(); divider2 = new AntdUI.Divider(); - label1 = new AntdUI.Label(); panel1.SuspendLayout(); stackPanel1.SuspendLayout(); SuspendLayout(); @@ -48,7 +48,7 @@ panel1.Controls.Add(divider1); panel1.Controls.Add(stackPanel1); panel1.Controls.Add(divider2); - panel1.Controls.Add(label1); + panel1.Controls.Add(lbTitleName); panel1.Dock = DockStyle.Fill; panel1.Location = new Point(0, 0); panel1.Name = "panel1"; @@ -58,6 +58,16 @@ panel1.TabIndex = 0; panel1.Text = "panel1"; // + // lbTitleName + // + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 23; + lbTitleName.Text = "新增相机操作"; + // // input_name // input_name.Dock = DockStyle.Top; @@ -66,7 +76,7 @@ input_name.Name = "input_name"; input_name.Radius = 3; input_name.Size = new Size(464, 38); - input_name.TabIndex = 22; + input_name.TabIndex = 28; // // label3 // @@ -75,7 +85,7 @@ label3.Location = new Point(18, 110); label3.Name = "label3"; label3.Size = new Size(464, 24); - label3.TabIndex = 21; + label3.TabIndex = 27; label3.Text = "相机名称"; // // divider1 @@ -84,7 +94,7 @@ divider1.Location = new Point(18, 98); divider1.Name = "divider1"; divider1.Size = new Size(464, 12); - divider1.TabIndex = 20; + divider1.TabIndex = 26; // // stackPanel1 // @@ -95,7 +105,7 @@ stackPanel1.Name = "stackPanel1"; stackPanel1.RightToLeft = RightToLeft.No; stackPanel1.Size = new Size(464, 44); - stackPanel1.TabIndex = 19; + stackPanel1.TabIndex = 25; stackPanel1.Text = "stackPanel1"; // // button_cancel @@ -118,6 +128,7 @@ button_ok.TabIndex = 0; button_ok.Text = "确定"; button_ok.Type = AntdUI.TTypeMini.Primary; + // // divider2 // @@ -125,17 +136,7 @@ divider2.Location = new Point(18, 42); divider2.Name = "divider2"; divider2.Size = new Size(464, 12); - divider2.TabIndex = 18; - // - // label1 - // - label1.Dock = DockStyle.Top; - label1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - label1.Location = new Point(18, 18); - label1.Name = "label1"; - label1.Size = new Size(464, 24); - label1.TabIndex = 17; - label1.Text = "新增相机操作"; + divider2.TabIndex = 24; // // AddCameraControl // @@ -150,7 +151,6 @@ #endregion private AntdUI.Panel panel1; - private AntdUI.Label label1; private AntdUI.Input input_name; private AntdUI.Label label3; private AntdUI.Divider divider1; @@ -158,5 +158,6 @@ private AntdUI.Button button_cancel; private AntdUI.Button button_ok; private AntdUI.Divider divider2; + private AntdUI.Label lbTitleName; } } diff --git a/DHSoftware/Views/AddCameraControl.cs b/DHSoftware/Views/AddCameraControl.cs index c9a0ef9..6d61cbc 100644 --- a/DHSoftware/Views/AddCameraControl.cs +++ b/DHSoftware/Views/AddCameraControl.cs @@ -7,10 +7,13 @@ namespace DHSoftware.Views private AntdUI.Window window; public bool submit; public string CubicleName; - public AddCameraControl(AntdUI.Window _window) + public AddCameraControl(AntdUI.Window _window, string TitleName) { this.window = _window; + InitializeComponent(); + lbTitleName.Text = TitleName; + // 绑定事件 BindEventHandler(); } @@ -19,6 +22,12 @@ namespace DHSoftware.Views { button_ok.Click += Button_ok_Click; button_cancel.Click += Button_cancel_Click; + Load += AddCameraControl_Load; + } + + private void AddCameraControl_Load(object? sender, EventArgs e) + { + input_name.Text = CubicleName; } private void Button_cancel_Click(object sender, EventArgs e) diff --git a/DHSoftware/Views/AddCubicleControl.Designer.cs b/DHSoftware/Views/AddCubicleControl.Designer.cs index c81ee77..ec622c7 100644 --- a/DHSoftware/Views/AddCubicleControl.Designer.cs +++ b/DHSoftware/Views/AddCubicleControl.Designer.cs @@ -36,6 +36,8 @@ button_cancel = new AntdUI.Button(); button_ok = new AntdUI.Button(); divider2 = new AntdUI.Divider(); + lbTitleName = new AntdUI.Label(); + sltdetectionType = new AntdUI.Select(); label1 = new AntdUI.Label(); panel1.SuspendLayout(); stackPanel1.SuspendLayout(); @@ -43,18 +45,20 @@ // // panel1 // + panel1.Controls.Add(sltdetectionType); + panel1.Controls.Add(label1); panel1.Controls.Add(input_name); panel1.Controls.Add(label3); panel1.Controls.Add(divider1); panel1.Controls.Add(stackPanel1); panel1.Controls.Add(divider2); - panel1.Controls.Add(label1); + panel1.Controls.Add(lbTitleName); panel1.Dock = DockStyle.Fill; panel1.Location = new Point(0, 0); panel1.Name = "panel1"; panel1.Padding = new Padding(12); panel1.Shadow = 6; - panel1.Size = new Size(500, 194); + panel1.Size = new Size(500, 243); panel1.TabIndex = 0; panel1.Text = "panel1"; // @@ -127,21 +131,41 @@ divider2.Size = new Size(464, 12); divider2.TabIndex = 18; // + // lbTitleName + // + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 17; + lbTitleName.Text = "新增工位操作"; + // + // sltdetectionType + // + sltdetectionType.Dock = DockStyle.Top; + sltdetectionType.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + sltdetectionType.Location = new Point(18, 196); + sltdetectionType.Name = "sltdetectionType"; + sltdetectionType.Radius = 3; + sltdetectionType.Size = new Size(464, 38); + sltdetectionType.TabIndex = 24; + // // label1 // label1.Dock = DockStyle.Top; label1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - label1.Location = new Point(18, 18); + label1.Location = new Point(18, 172); label1.Name = "label1"; label1.Size = new Size(464, 24); - label1.TabIndex = 17; - label1.Text = "新增工位操作"; + label1.TabIndex = 23; + label1.Text = "检测类型"; // // AddCubicleControl // Controls.Add(panel1); Name = "AddCubicleControl"; - Size = new Size(500, 194); + Size = new Size(500, 243); panel1.ResumeLayout(false); stackPanel1.ResumeLayout(false); ResumeLayout(false); @@ -150,7 +174,7 @@ #endregion private AntdUI.Panel panel1; - private AntdUI.Label label1; + private AntdUI.Label lbTitleName; private AntdUI.Input input_name; private AntdUI.Label label3; private AntdUI.Divider divider1; @@ -158,5 +182,7 @@ private AntdUI.Button button_cancel; private AntdUI.Button button_ok; private AntdUI.Divider divider2; + private AntdUI.Select sltdetectionType; + private AntdUI.Label label1; } } diff --git a/DHSoftware/Views/AddCubicleControl.cs b/DHSoftware/Views/AddCubicleControl.cs index 83fc308..b60f87a 100644 --- a/DHSoftware/Views/AddCubicleControl.cs +++ b/DHSoftware/Views/AddCubicleControl.cs @@ -1,5 +1,7 @@  +using DH.Commons.Enums; + namespace DHSoftware.Views { public partial class AddCubicleControl : UserControl @@ -7,10 +9,17 @@ namespace DHSoftware.Views private AntdUI.Window window; public bool submit; public string CubicleName; - public AddCubicleControl(AntdUI.Window _window) + public EnumDetectionType DetectionType; + public AddCubicleControl(AntdUI.Window _window,string TitleName) { this.window = _window; InitializeComponent(); + lbTitleName.Text = TitleName; + sltdetectionType.Items.Clear(); + foreach (EnumDetectionType value in Enum.GetValues(typeof(EnumDetectionType))) + { + sltdetectionType.Items.Add(value.ToString()); + } // 绑定事件 BindEventHandler(); } @@ -19,6 +28,13 @@ namespace DHSoftware.Views { button_ok.Click += Button_ok_Click; button_cancel.Click += Button_cancel_Click; + Load += AddCubicleControl_Load; + } + + private void AddCubicleControl_Load(object? sender, EventArgs e) + { + input_name.Text = CubicleName; + sltdetectionType.SelectedIndex =(int)DetectionType; } private void Button_cancel_Click(object sender, EventArgs e) @@ -37,7 +53,14 @@ namespace DHSoftware.Views AntdUI.Message.warn(window, "工位名称不能为空!", autoClose: 3); return; } - CubicleName=input_name.Text; + if (String.IsNullOrEmpty(sltdetectionType.Text)) + { + input_name.Status = AntdUI.TType.Error; + AntdUI.Message.warn(window, "请选择检测类型!", autoClose: 3); + return; + } + CubicleName =input_name.Text; + DetectionType = (EnumDetectionType)sltdetectionType.SelectedIndex; submit = true; this.Dispose(); } diff --git a/DHSoftware/Views/AddGlobalControl.Designer.cs b/DHSoftware/Views/AddGlobalControl.Designer.cs new file mode 100644 index 0000000..83b7108 --- /dev/null +++ b/DHSoftware/Views/AddGlobalControl.Designer.cs @@ -0,0 +1,162 @@ +namespace DHSoftware.Views +{ + partial class AddGlobalControl + { + /// + /// 必需的设计器变量。 + /// + 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() + { + panel1 = new AntdUI.Panel(); + input_name = new AntdUI.Input(); + label3 = new AntdUI.Label(); + divider1 = new AntdUI.Divider(); + stackPanel1 = new AntdUI.StackPanel(); + button_cancel = new AntdUI.Button(); + button_ok = new AntdUI.Button(); + divider2 = new AntdUI.Divider(); + lbTitleName = new AntdUI.Label(); + panel1.SuspendLayout(); + stackPanel1.SuspendLayout(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(input_name); + panel1.Controls.Add(label3); + panel1.Controls.Add(divider1); + panel1.Controls.Add(stackPanel1); + panel1.Controls.Add(divider2); + panel1.Controls.Add(lbTitleName); + panel1.Dock = DockStyle.Fill; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Padding = new Padding(12); + panel1.Shadow = 6; + panel1.Size = new Size(500, 192); + panel1.TabIndex = 0; + panel1.Text = "panel1"; + // + // input_name + // + input_name.Dock = DockStyle.Top; + input_name.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + input_name.Location = new Point(18, 134); + input_name.Name = "input_name"; + input_name.Radius = 3; + input_name.Size = new Size(464, 38); + input_name.TabIndex = 22; + // + // label3 + // + label3.Dock = DockStyle.Top; + label3.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + label3.Location = new Point(18, 110); + label3.Name = "label3"; + label3.Size = new Size(464, 24); + label3.TabIndex = 21; + label3.Text = "全局配置名称"; + // + // divider1 + // + divider1.Dock = DockStyle.Top; + divider1.Location = new Point(18, 98); + divider1.Name = "divider1"; + divider1.Size = new Size(464, 12); + divider1.TabIndex = 20; + // + // stackPanel1 + // + stackPanel1.Controls.Add(button_cancel); + stackPanel1.Controls.Add(button_ok); + stackPanel1.Dock = DockStyle.Top; + stackPanel1.Location = new Point(18, 54); + stackPanel1.Name = "stackPanel1"; + stackPanel1.RightToLeft = RightToLeft.No; + stackPanel1.Size = new Size(464, 44); + stackPanel1.TabIndex = 19; + stackPanel1.Text = "stackPanel1"; + // + // button_cancel + // + button_cancel.BorderWidth = 1F; + button_cancel.Font = new Font("Microsoft YaHei UI", 9F); + button_cancel.Ghost = true; + button_cancel.Location = new Point(84, 3); + button_cancel.Name = "button_cancel"; + button_cancel.Size = new Size(75, 38); + button_cancel.TabIndex = 1; + button_cancel.Text = "取消"; + // + // button_ok + // + button_ok.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button_ok.Location = new Point(3, 3); + button_ok.Name = "button_ok"; + button_ok.Size = new Size(75, 38); + button_ok.TabIndex = 0; + button_ok.Text = "确定"; + button_ok.Type = AntdUI.TTypeMini.Primary; + // + // divider2 + // + divider2.Dock = DockStyle.Top; + divider2.Location = new Point(18, 42); + divider2.Name = "divider2"; + divider2.Size = new Size(464, 12); + divider2.TabIndex = 18; + // + // lbTitleName + // + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 17; + lbTitleName.Text = "新增全局配置操作"; + // + // AddGlobalControl + // + Controls.Add(panel1); + Name = "AddGlobalControl"; + Size = new Size(500, 192); + panel1.ResumeLayout(false); + stackPanel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.Panel panel1; + private AntdUI.Label lbTitleName; + private AntdUI.Input input_name; + private AntdUI.Label label3; + private AntdUI.Divider divider1; + private AntdUI.StackPanel stackPanel1; + private AntdUI.Button button_cancel; + private AntdUI.Button button_ok; + private AntdUI.Divider divider2; + } +} diff --git a/DHSoftware/Views/AddGlobalControl.cs b/DHSoftware/Views/AddGlobalControl.cs new file mode 100644 index 0000000..9d34c7b --- /dev/null +++ b/DHSoftware/Views/AddGlobalControl.cs @@ -0,0 +1,48 @@ + + +namespace DHSoftware.Views +{ + public partial class AddGlobalControl : UserControl + { + private AntdUI.Window window; + public bool submit; + public string GlobalName; + public AddGlobalControl(AntdUI.Window _window,string TitleName) + { + this.window = _window; + InitializeComponent(); + lbTitleName.Text = TitleName; + // 绑定事件 + BindEventHandler(); + } + + private void BindEventHandler() + { + button_ok.Click += Button_ok_Click; + button_cancel.Click += Button_cancel_Click; + } + + private void Button_cancel_Click(object sender, EventArgs e) + { + submit = false; + this.Dispose(); + } + + private void Button_ok_Click(object sender, EventArgs e) + { + input_name.Status = AntdUI.TType.None; + //检查输入内容 + if (String.IsNullOrEmpty(input_name.Text)) + { + input_name.Status = AntdUI.TType.Error; + AntdUI.Message.warn(window, "全局配置名称名称不能为空!", autoClose: 3); + return; + } + GlobalName = input_name.Text; + submit = true; + this.Dispose(); + } + + + } +} diff --git a/DHSoftware/Views/UserConfigFrm.resx b/DHSoftware/Views/AddGlobalControl.resx similarity index 100% rename from DHSoftware/Views/UserConfigFrm.resx rename to DHSoftware/Views/AddGlobalControl.resx diff --git a/DHSoftware/Views/AddMotionControl.Designer.cs b/DHSoftware/Views/AddMotionControl.Designer.cs index 2e80fc4..7c0b65f 100644 --- a/DHSoftware/Views/AddMotionControl.Designer.cs +++ b/DHSoftware/Views/AddMotionControl.Designer.cs @@ -36,31 +36,25 @@ button_cancel = new AntdUI.Button(); button_ok = new AntdUI.Button(); divider2 = new AntdUI.Divider(); - label1 = new AntdUI.Label(); - label2 = new AntdUI.Label(); - divider3 = new AntdUI.Divider(); - select_type = new AntdUI.Select(); + lbTitleName = new AntdUI.Label(); panel1.SuspendLayout(); stackPanel1.SuspendLayout(); SuspendLayout(); // // panel1 // - panel1.Controls.Add(select_type); - panel1.Controls.Add(label2); - panel1.Controls.Add(divider3); panel1.Controls.Add(input_name); panel1.Controls.Add(label3); panel1.Controls.Add(divider1); panel1.Controls.Add(stackPanel1); panel1.Controls.Add(divider2); - panel1.Controls.Add(label1); + panel1.Controls.Add(lbTitleName); panel1.Dock = DockStyle.Fill; panel1.Location = new Point(0, 0); panel1.Name = "panel1"; panel1.Padding = new Padding(12); panel1.Shadow = 6; - panel1.Size = new Size(500, 260); + panel1.Size = new Size(500, 192); panel1.TabIndex = 0; panel1.Text = "panel1"; // @@ -124,6 +118,7 @@ button_ok.TabIndex = 0; button_ok.Text = "确定"; button_ok.Type = AntdUI.TTypeMini.Primary; + // // divider2 // @@ -133,47 +128,21 @@ divider2.Size = new Size(464, 12); divider2.TabIndex = 18; // - // label1 + // lbTitleName // - label1.Dock = DockStyle.Top; - label1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - label1.Location = new Point(18, 18); - label1.Name = "label1"; - label1.Size = new Size(464, 24); - label1.TabIndex = 17; - label1.Text = "新增运动控制操作"; - // - // label2 - // - label2.Dock = DockStyle.Top; - label2.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - label2.Location = new Point(18, 184); - label2.Name = "label2"; - label2.Size = new Size(464, 24); - label2.TabIndex = 24; - label2.Text = "运动控制类型"; - // - // divider3 - // - divider3.Dock = DockStyle.Top; - divider3.Location = new Point(18, 172); - divider3.Name = "divider3"; - divider3.Size = new Size(464, 12); - divider3.TabIndex = 23; - // - // select_type - // - select_type.Dock = DockStyle.Top; - select_type.Location = new Point(18, 208); - select_type.Name = "select_type"; - select_type.Size = new Size(464, 37); - select_type.TabIndex = 25; + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 17; + lbTitleName.Text = "新增运动控制操作"; // // AddMotionControl // Controls.Add(panel1); Name = "AddMotionControl"; - Size = new Size(500, 260); + Size = new Size(500, 192); panel1.ResumeLayout(false); stackPanel1.ResumeLayout(false); ResumeLayout(false); @@ -182,7 +151,7 @@ #endregion private AntdUI.Panel panel1; - private AntdUI.Label label1; + private AntdUI.Label lbTitleName; private AntdUI.Input input_name; private AntdUI.Label label3; private AntdUI.Divider divider1; @@ -190,8 +159,5 @@ private AntdUI.Button button_cancel; private AntdUI.Button button_ok; private AntdUI.Divider divider2; - private AntdUI.Select select_type; - private AntdUI.Label label2; - private AntdUI.Divider divider3; } } diff --git a/DHSoftware/Views/AddMotionControl.cs b/DHSoftware/Views/AddMotionControl.cs index 7d3cd09..5fa90ce 100644 --- a/DHSoftware/Views/AddMotionControl.cs +++ b/DHSoftware/Views/AddMotionControl.cs @@ -8,10 +8,11 @@ namespace DHSoftware.Views public bool submit; public string MotionName; public string MotionType; - public AddMotionControl(AntdUI.Window _window) + public AddMotionControl(AntdUI.Window _window,string TitleName) { this.window = _window; InitializeComponent(); + lbTitleName.Text = TitleName; // 绑定事件 BindEventHandler(); } @@ -39,7 +40,6 @@ namespace DHSoftware.Views return; } MotionName = input_name.Text; - MotionType = select_type.Text; submit = true; this.Dispose(); } diff --git a/DHSoftware/Views/AddSchemeControl.Designer.cs b/DHSoftware/Views/AddSchemeControl.Designer.cs new file mode 100644 index 0000000..0c98f85 --- /dev/null +++ b/DHSoftware/Views/AddSchemeControl.Designer.cs @@ -0,0 +1,201 @@ +namespace DHSoftware.Views +{ + partial class AddSchemeControl + { + /// + /// 必需的设计器变量。 + /// + 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() + { + panel1 = new AntdUI.Panel(); + input_name = new AntdUI.Input(); + label3 = new AntdUI.Label(); + stackPanel2 = new AntdUI.StackPanel(); + label1 = new AntdUI.Label(); + ckNullScheme = new AntdUI.Checkbox(); + divider1 = new AntdUI.Divider(); + stackPanel1 = new AntdUI.StackPanel(); + button_cancel = new AntdUI.Button(); + button_ok = new AntdUI.Button(); + divider2 = new AntdUI.Divider(); + lbTitleName = new AntdUI.Label(); + panel1.SuspendLayout(); + stackPanel2.SuspendLayout(); + stackPanel1.SuspendLayout(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(input_name); + panel1.Controls.Add(label3); + panel1.Controls.Add(stackPanel2); + panel1.Controls.Add(divider1); + panel1.Controls.Add(stackPanel1); + panel1.Controls.Add(divider2); + panel1.Controls.Add(lbTitleName); + panel1.Dock = DockStyle.Fill; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Padding = new Padding(12); + panel1.Shadow = 6; + panel1.Size = new Size(500, 234); + panel1.TabIndex = 0; + panel1.Text = "panel1"; + // + // input_name + // + input_name.Dock = DockStyle.Top; + input_name.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + input_name.Location = new Point(18, 164); + input_name.Name = "input_name"; + input_name.Radius = 3; + input_name.Size = new Size(464, 38); + input_name.TabIndex = 25; + // + // label3 + // + label3.Dock = DockStyle.Top; + label3.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + label3.Location = new Point(18, 140); + label3.Name = "label3"; + label3.Size = new Size(464, 24); + label3.TabIndex = 24; + label3.Text = "方案名称"; + // + // stackPanel2 + // + stackPanel2.Controls.Add(label1); + stackPanel2.Controls.Add(ckNullScheme); + stackPanel2.Dock = DockStyle.Top; + stackPanel2.Location = new Point(18, 110); + stackPanel2.Name = "stackPanel2"; + stackPanel2.RightToLeft = RightToLeft.No; + stackPanel2.Size = new Size(464, 30); + stackPanel2.TabIndex = 23; + stackPanel2.Text = "stackPanel2"; + // + // label1 + // + label1.Dock = DockStyle.Fill; + label1.Location = new Point(84, 3); + label1.Name = "label1"; + label1.Size = new Size(333, 24); + label1.TabIndex = 1; + label1.Text = "默认从当前方案派生,若想创建新方案选中此项"; + // + // ckNullScheme + // + ckNullScheme.Dock = DockStyle.Left; + ckNullScheme.Location = new Point(3, 3); + ckNullScheme.Name = "ckNullScheme"; + ckNullScheme.Size = new Size(75, 24); + ckNullScheme.TabIndex = 0; + ckNullScheme.Text = "新方案"; + // + // divider1 + // + divider1.Dock = DockStyle.Top; + divider1.Location = new Point(18, 98); + divider1.Name = "divider1"; + divider1.Size = new Size(464, 12); + divider1.TabIndex = 20; + // + // stackPanel1 + // + stackPanel1.Controls.Add(button_cancel); + stackPanel1.Controls.Add(button_ok); + stackPanel1.Dock = DockStyle.Top; + stackPanel1.Location = new Point(18, 54); + stackPanel1.Name = "stackPanel1"; + stackPanel1.RightToLeft = RightToLeft.No; + stackPanel1.Size = new Size(464, 44); + stackPanel1.TabIndex = 19; + stackPanel1.Text = "stackPanel1"; + // + // button_cancel + // + button_cancel.BorderWidth = 1F; + button_cancel.Font = new Font("Microsoft YaHei UI", 9F); + button_cancel.Ghost = true; + button_cancel.Location = new Point(84, 3); + button_cancel.Name = "button_cancel"; + button_cancel.Size = new Size(75, 38); + button_cancel.TabIndex = 1; + button_cancel.Text = "取消"; + // + // button_ok + // + button_ok.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button_ok.Location = new Point(3, 3); + button_ok.Name = "button_ok"; + button_ok.Size = new Size(75, 38); + button_ok.TabIndex = 0; + button_ok.Text = "确定"; + button_ok.Type = AntdUI.TTypeMini.Primary; + // + // divider2 + // + divider2.Dock = DockStyle.Top; + divider2.Location = new Point(18, 42); + divider2.Name = "divider2"; + divider2.Size = new Size(464, 12); + divider2.TabIndex = 18; + // + // lbTitleName + // + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 17; + lbTitleName.Text = "新增方案操作"; + // + // AddSchemeControl + // + Controls.Add(panel1); + Name = "AddSchemeControl"; + Size = new Size(500, 234); + panel1.ResumeLayout(false); + stackPanel2.ResumeLayout(false); + stackPanel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.Panel panel1; + private AntdUI.Label lbTitleName; + private AntdUI.Divider divider1; + private AntdUI.StackPanel stackPanel1; + private AntdUI.Button button_cancel; + private AntdUI.Button button_ok; + private AntdUI.Divider divider2; + private AntdUI.Input input_name; + private AntdUI.Label label3; + private AntdUI.StackPanel stackPanel2; + private AntdUI.Checkbox ckNullScheme; + private AntdUI.Label label1; + } +} diff --git a/DHSoftware/Views/AddSchemeControl.cs b/DHSoftware/Views/AddSchemeControl.cs new file mode 100644 index 0000000..4475414 --- /dev/null +++ b/DHSoftware/Views/AddSchemeControl.cs @@ -0,0 +1,52 @@ + + +namespace DHSoftware.Views +{ + public partial class AddSchemeControl : UserControl + { + private AntdUI.Window window; + public bool submit; + public string SchemeName; + public bool NullScheme; + public AddSchemeControl(AntdUI.Window _window,string TitleName) + { + this.window = _window; + InitializeComponent(); + lbTitleName.Text = TitleName; + // 绑定事件 + BindEventHandler(); + } + + private void BindEventHandler() + { + button_ok.Click += Button_ok_Click; + button_cancel.Click += Button_cancel_Click; + + } + + + private void Button_cancel_Click(object sender, EventArgs e) + { + submit = false; + this.Dispose(); + } + + private void Button_ok_Click(object sender, EventArgs e) + { + input_name.Status = AntdUI.TType.None; + //检查输入内容 + if (String.IsNullOrEmpty(input_name.Text)) + { + input_name.Status = AntdUI.TType.Error; + AntdUI.Message.warn(window, "方案名称不能为空!", autoClose: 3); + return; + } + SchemeName = input_name.Text; + NullScheme = ckNullScheme.Checked; + submit = true; + this.Dispose(); + } + + + } +} diff --git a/DHSoftware/Views/SettingWindow1.resx b/DHSoftware/Views/AddSchemeControl.resx similarity index 100% rename from DHSoftware/Views/SettingWindow1.resx rename to DHSoftware/Views/AddSchemeControl.resx diff --git a/DHSoftware/Views/CamConfigFrm.cs b/DHSoftware/Views/CamConfigFrm.cs index 29427c2..f85b8ae 100644 --- a/DHSoftware/Views/CamConfigFrm.cs +++ b/DHSoftware/Views/CamConfigFrm.cs @@ -1,5 +1,5 @@ -using DH.Commons.Enums; -using DH.Devices.Devices; +using DH.Commons.Base; +using DH.Commons.Enums; using DVPCameraType; using System; using System.Collections.Generic; diff --git a/DHSoftware/Views/CameraConfigControl.cs b/DHSoftware/Views/CameraConfigControl.cs index 5fbfa03..deaff4c 100644 --- a/DHSoftware/Views/CameraConfigControl.cs +++ b/DHSoftware/Views/CameraConfigControl.cs @@ -1,5 +1,5 @@ using AntdUI; -using DH.Devices.Devices; +using DH.Commons.Base; using System; using System.Collections.Generic; using System.ComponentModel; diff --git a/DHSoftware/Views/CameraControl.Designer.cs b/DHSoftware/Views/CameraControl.Designer.cs index 1ab7176..b00320e 100644 --- a/DHSoftware/Views/CameraControl.Designer.cs +++ b/DHSoftware/Views/CameraControl.Designer.cs @@ -28,217 +28,65 @@ /// private void InitializeComponent() { - swhEnable = new AntdUI.Switch(); + panel3 = new AntdUI.Panel(); + button3 = new AntdUI.Button(); + button2 = new AntdUI.Button(); + button1 = new AntdUI.Button(); + btnSizeAdd = new AntdUI.Button(); + panel4 = new AntdUI.Panel(); + pictureBox1 = new PictureBox(); + panel2 = new AntdUI.Panel(); label18 = new AntdUI.Label(); + swhEnable = new AntdUI.Switch(); label1 = new AntdUI.Label(); label2 = new AntdUI.Label(); label3 = new AntdUI.Label(); - iptExposure = new AntdUI.InputNumber(); - iptGain = new AntdUI.InputNumber(); - iptRevolve = new AntdUI.InputNumber(); + iptExposure = new AntdUI.Input(); + iptGain = new AntdUI.Input(); + iptRevolve = new AntdUI.Select(); label4 = new AntdUI.Label(); sltAcquisitionMode = new AntdUI.Select(); label5 = new AntdUI.Label(); sltTriggerMode = new AntdUI.Select(); label7 = new AntdUI.Label(); - iptROIW = new AntdUI.InputNumber(); - iptROIY = new AntdUI.InputNumber(); - iptROIX = new AntdUI.InputNumber(); - iptROIH = new AntdUI.InputNumber(); - pictureBox1 = new PictureBox(); - btnSizeAdd = new AntdUI.Button(); - button1 = new AntdUI.Button(); - button2 = new AntdUI.Button(); - button3 = new AntdUI.Button(); + iptROIX = new AntdUI.Input(); + iptROIY = new AntdUI.Input(); + iptROIW = new AntdUI.Input(); + iptROIH = new AntdUI.Input(); + label6 = new AntdUI.Label(); + sthPic = new AntdUI.Switch(); + label8 = new AntdUI.Label(); + label9 = new AntdUI.Label(); + label10 = new AntdUI.Label(); + label11 = new AntdUI.Label(); + label12 = new AntdUI.Label(); + sthAllPic = new AntdUI.Switch(); + label13 = new AntdUI.Label(); + sltCamType = new AntdUI.Select(); + label14 = new AntdUI.Label(); + switch1 = new AntdUI.Switch(); + panel1 = new AntdUI.Panel(); + sltPicType = new AntdUI.Select(); + label15 = new AntdUI.Label(); + panel3.SuspendLayout(); + panel4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); + panel2.SuspendLayout(); + panel1.SuspendLayout(); SuspendLayout(); // - // swhEnable + // panel3 // - swhEnable.CheckedText = "启用"; - swhEnable.Location = new Point(84, 13); - swhEnable.Name = "swhEnable"; - swhEnable.Size = new Size(93, 33); - swhEnable.TabIndex = 13; - swhEnable.UnCheckedText = "关闭"; - // - // label18 - // - label18.Location = new Point(28, 23); - label18.Name = "label18"; - label18.Size = new Size(59, 23); - label18.TabIndex = 12; - label18.Text = "状 态"; - // - // label1 - // - label1.Location = new Point(28, 71); - label1.Name = "label1"; - label1.Size = new Size(59, 23); - label1.TabIndex = 14; - label1.Text = "曝 光"; - // - // label2 - // - label2.Location = new Point(28, 113); - label2.Name = "label2"; - label2.Size = new Size(59, 23); - label2.TabIndex = 15; - label2.Text = "增 益"; - // - // label3 - // - label3.Location = new Point(28, 155); - label3.Name = "label3"; - label3.Size = new Size(59, 23); - label3.TabIndex = 16; - label3.Text = "旋转角度"; - // - // iptExposure - // - iptExposure.Location = new Point(84, 57); - iptExposure.Name = "iptExposure"; - iptExposure.Size = new Size(93, 37); - iptExposure.TabIndex = 17; - iptExposure.Tag = ""; - iptExposure.Text = "0"; - // - // iptGain - // - iptGain.Location = new Point(84, 100); - iptGain.Name = "iptGain"; - iptGain.Size = new Size(93, 37); - iptGain.TabIndex = 18; - iptGain.Text = "0"; - // - // iptRevolve - // - iptRevolve.Location = new Point(84, 143); - iptRevolve.Name = "iptRevolve"; - iptRevolve.Size = new Size(93, 37); - iptRevolve.TabIndex = 19; - iptRevolve.Text = "0"; - // - // label4 - // - label4.Location = new Point(28, 199); - label4.Name = "label4"; - label4.Size = new Size(59, 23); - label4.TabIndex = 20; - label4.Text = "采图模式"; - // - // sltAcquisitionMode - // - sltAcquisitionMode.List = true; - sltAcquisitionMode.Location = new Point(84, 186); - sltAcquisitionMode.Name = "sltAcquisitionMode"; - sltAcquisitionMode.Size = new Size(93, 36); - sltAcquisitionMode.TabIndex = 21; - // - // label5 - // - label5.Location = new Point(28, 244); - label5.Name = "label5"; - label5.Size = new Size(59, 23); - label5.TabIndex = 22; - label5.Text = "触发模式"; - // - // sltTriggerMode - // - sltTriggerMode.List = true; - sltTriggerMode.Location = new Point(84, 231); - sltTriggerMode.Name = "sltTriggerMode"; - sltTriggerMode.Size = new Size(93, 36); - sltTriggerMode.TabIndex = 26; - // - // label7 - // - label7.Location = new Point(28, 354); - label7.Name = "label7"; - label7.Size = new Size(59, 23); - label7.TabIndex = 28; - label7.Text = "ROI范围"; - // - // iptROIW - // - iptROIW.Location = new Point(84, 371); - iptROIW.Name = "iptROIW"; - iptROIW.Size = new Size(93, 37); - iptROIW.TabIndex = 31; - iptROIW.Text = "0"; - // - // iptROIY - // - iptROIY.Location = new Point(84, 328); - iptROIY.Name = "iptROIY"; - iptROIY.Size = new Size(93, 37); - iptROIY.TabIndex = 30; - iptROIY.Text = "0"; - // - // iptROIX - // - iptROIX.Location = new Point(84, 285); - iptROIX.Name = "iptROIX"; - iptROIX.Size = new Size(93, 37); - iptROIX.TabIndex = 29; - iptROIX.Tag = ""; - iptROIX.Text = "0"; - // - // iptROIH - // - iptROIH.Location = new Point(84, 414); - iptROIH.Name = "iptROIH"; - iptROIH.Size = new Size(93, 37); - iptROIH.TabIndex = 32; - iptROIH.Text = "0"; - // - // pictureBox1 - // - pictureBox1.BorderStyle = BorderStyle.FixedSingle; - pictureBox1.Location = new Point(219, 23); - pictureBox1.Name = "pictureBox1"; - pictureBox1.Size = new Size(659, 429); - pictureBox1.TabIndex = 33; - pictureBox1.TabStop = false; - // - // btnSizeAdd - // - btnSizeAdd.BorderWidth = 2F; - btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); - btnSizeAdd.Ghost = true; - btnSizeAdd.IconRatio = 0F; - btnSizeAdd.IconSvg = ""; - btnSizeAdd.Location = new Point(280, 458); - btnSizeAdd.Name = "btnSizeAdd"; - btnSizeAdd.Size = new Size(80, 38); - btnSizeAdd.TabIndex = 34; - btnSizeAdd.Text = "连接相机"; - // - // button1 - // - button1.BorderWidth = 2F; - button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); - button1.Ghost = true; - button1.IconRatio = 0F; - button1.IconSvg = ""; - button1.Location = new Point(438, 458); - button1.Name = "button1"; - button1.Size = new Size(80, 38); - button1.TabIndex = 35; - button1.Text = "断开相机"; - // - // button2 - // - button2.BorderWidth = 2F; - button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); - button2.Ghost = true; - button2.IconRatio = 0F; - button2.IconSvg = ""; - button2.Location = new Point(593, 458); - button2.Name = "button2"; - button2.Size = new Size(80, 38); - button2.TabIndex = 36; - button2.Text = "单次触发"; + panel3.Controls.Add(button3); + panel3.Controls.Add(button2); + panel3.Controls.Add(button1); + panel3.Controls.Add(btnSizeAdd); + panel3.Dock = DockStyle.Bottom; + panel3.Location = new Point(0, 585); + panel3.Name = "panel3"; + panel3.Size = new Size(691, 59); + panel3.TabIndex = 39; + panel3.Text = "panel3"; // // button3 // @@ -247,67 +95,434 @@ button3.Ghost = true; button3.IconRatio = 0F; button3.IconSvg = ""; - button3.Location = new Point(741, 458); + button3.Location = new Point(536, 13); button3.Name = "button3"; button3.Size = new Size(80, 38); - button3.TabIndex = 37; + button3.TabIndex = 46; button3.Text = "连续触发"; // + // button2 + // + button2.BorderWidth = 2F; + button2.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button2.Ghost = true; + button2.IconRatio = 0F; + button2.IconSvg = ""; + button2.Location = new Point(388, 13); + button2.Name = "button2"; + button2.Size = new Size(80, 38); + button2.TabIndex = 45; + button2.Text = "单次触发"; + // + // button1 + // + button1.BorderWidth = 2F; + button1.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button1.Ghost = true; + button1.IconRatio = 0F; + button1.IconSvg = ""; + button1.Location = new Point(233, 13); + button1.Name = "button1"; + button1.Size = new Size(80, 38); + button1.TabIndex = 44; + button1.Text = "断开相机"; + // + // btnSizeAdd + // + btnSizeAdd.BorderWidth = 2F; + btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSizeAdd.Ghost = true; + btnSizeAdd.IconRatio = 0F; + btnSizeAdd.IconSvg = ""; + btnSizeAdd.Location = new Point(75, 13); + btnSizeAdd.Name = "btnSizeAdd"; + btnSizeAdd.Size = new Size(80, 38); + btnSizeAdd.TabIndex = 43; + btnSizeAdd.Text = "连接相机"; + // + // panel4 + // + panel4.Controls.Add(pictureBox1); + panel4.Dock = DockStyle.Fill; + panel4.Location = new Point(0, 0); + panel4.Name = "panel4"; + panel4.Size = new Size(691, 585); + panel4.TabIndex = 40; + panel4.Text = "panel4"; + // + // pictureBox1 + // + pictureBox1.BorderStyle = BorderStyle.FixedSingle; + pictureBox1.Dock = DockStyle.Fill; + pictureBox1.Location = new Point(0, 0); + pictureBox1.Name = "pictureBox1"; + pictureBox1.Size = new Size(691, 585); + pictureBox1.TabIndex = 39; + pictureBox1.TabStop = false; + // + // panel2 + // + panel2.Controls.Add(panel4); + panel2.Controls.Add(panel3); + panel2.Dock = DockStyle.Fill; + panel2.Location = new Point(218, 0); + panel2.Name = "panel2"; + panel2.Size = new Size(691, 644); + panel2.TabIndex = 49; + panel2.Text = "panel2"; + // + // label18 + // + label18.Location = new Point(21, 19); + label18.Name = "label18"; + label18.Size = new Size(59, 23); + label18.TabIndex = 48; + label18.Text = "状 态"; + // + // swhEnable + // + swhEnable.CheckedText = "启用"; + swhEnable.Location = new Point(86, 9); + swhEnable.Name = "swhEnable"; + swhEnable.Size = new Size(111, 33); + swhEnable.TabIndex = 49; + swhEnable.UnCheckedText = "关闭"; + // + // label1 + // + label1.Location = new Point(21, 136); + label1.Name = "label1"; + label1.Size = new Size(59, 36); + label1.TabIndex = 50; + label1.Text = "曝 光"; + // + // label2 + // + label2.Location = new Point(21, 179); + label2.Name = "label2"; + label2.Size = new Size(59, 36); + label2.TabIndex = 51; + label2.Text = "增 益"; + // + // label3 + // + label3.Location = new Point(21, 222); + label3.Name = "label3"; + label3.Size = new Size(59, 36); + label3.TabIndex = 52; + label3.Text = "旋转角度"; + // + // iptExposure + // + iptExposure.Location = new Point(86, 136); + iptExposure.Name = "iptExposure"; + iptExposure.Size = new Size(111, 36); + iptExposure.TabIndex = 53; + iptExposure.Tag = ""; + iptExposure.Text = "0"; + // + // iptGain + // + iptGain.Location = new Point(86, 179); + iptGain.Name = "iptGain"; + iptGain.Size = new Size(111, 36); + iptGain.TabIndex = 54; + iptGain.Text = "0"; + // + // iptRevolve + // + iptRevolve.Items.AddRange(new object[] { "0", "90", "180", "270" }); + iptRevolve.List = true; + iptRevolve.Location = new Point(86, 222); + iptRevolve.Name = "iptRevolve"; + iptRevolve.Size = new Size(111, 36); + iptRevolve.TabIndex = 55; + // + // label4 + // + label4.Location = new Point(21, 265); + label4.Name = "label4"; + label4.Size = new Size(59, 36); + label4.TabIndex = 56; + label4.Text = "采图模式"; + // + // sltAcquisitionMode + // + sltAcquisitionMode.List = true; + sltAcquisitionMode.Location = new Point(86, 265); + sltAcquisitionMode.Name = "sltAcquisitionMode"; + sltAcquisitionMode.Size = new Size(111, 36); + sltAcquisitionMode.TabIndex = 57; + // + // label5 + // + label5.Location = new Point(21, 310); + label5.Name = "label5"; + label5.Size = new Size(59, 36); + label5.TabIndex = 58; + label5.Text = "触发模式"; + // + // sltTriggerMode + // + sltTriggerMode.List = true; + sltTriggerMode.Location = new Point(86, 310); + sltTriggerMode.Name = "sltTriggerMode"; + sltTriggerMode.Size = new Size(111, 36); + sltTriggerMode.TabIndex = 59; + // + // label7 + // + label7.Location = new Point(3, 538); + label7.Name = "label7"; + label7.Size = new Size(29, 23); + label7.TabIndex = 60; + label7.Text = "ROI"; + // + // iptROIX + // + iptROIX.Location = new Point(86, 470); + iptROIX.Name = "iptROIX"; + iptROIX.Size = new Size(111, 37); + iptROIX.TabIndex = 61; + iptROIX.Tag = ""; + iptROIX.Text = "0"; + // + // iptROIY + // + iptROIY.Location = new Point(86, 513); + iptROIY.Name = "iptROIY"; + iptROIY.Size = new Size(111, 37); + iptROIY.TabIndex = 62; + iptROIY.Text = "0"; + // + // iptROIW + // + iptROIW.Location = new Point(86, 556); + iptROIW.Name = "iptROIW"; + iptROIW.Size = new Size(111, 37); + iptROIW.TabIndex = 63; + iptROIW.Text = "0"; + // + // iptROIH + // + iptROIH.Location = new Point(86, 599); + iptROIH.Name = "iptROIH"; + iptROIH.Size = new Size(111, 37); + iptROIH.TabIndex = 64; + iptROIH.Text = "0"; + // + // label6 + // + label6.Location = new Point(21, 66); + label6.Name = "label6"; + label6.Size = new Size(59, 23); + label6.TabIndex = 65; + label6.Text = "相 机 图"; + // + // sthPic + // + sthPic.CheckedText = "启用"; + sthPic.Location = new Point(86, 56); + sthPic.Name = "sthPic"; + sthPic.Size = new Size(111, 33); + sthPic.TabIndex = 66; + sthPic.UnCheckedText = "关闭"; + // + // label8 + // + label8.Location = new Point(36, 470); + label8.Name = "label8"; + label8.Size = new Size(29, 37); + label8.TabIndex = 67; + label8.Text = "X:"; + // + // label9 + // + label9.Location = new Point(36, 513); + label9.Name = "label9"; + label9.Size = new Size(29, 37); + label9.TabIndex = 68; + label9.Text = "Y:"; + // + // label10 + // + label10.Location = new Point(28, 556); + label10.Name = "label10"; + label10.Size = new Size(44, 37); + label10.TabIndex = 69; + label10.Text = "宽度:"; + // + // label11 + // + label11.Location = new Point(28, 600); + label11.Name = "label11"; + label11.Size = new Size(44, 36); + label11.TabIndex = 70; + label11.Text = "高度:"; + // + // label12 + // + label12.Location = new Point(21, 402); + label12.Name = "label12"; + label12.Size = new Size(59, 23); + label12.TabIndex = 71; + label12.Text = "全 画 幅"; + // + // sthAllPic + // + sthAllPic.CheckedText = "启用"; + sthAllPic.Location = new Point(86, 392); + sthAllPic.Name = "sthAllPic"; + sthAllPic.Size = new Size(111, 33); + sthAllPic.TabIndex = 72; + sthAllPic.UnCheckedText = "关闭"; + // + // label13 + // + label13.Location = new Point(21, 95); + label13.Name = "label13"; + label13.Size = new Size(59, 36); + label13.TabIndex = 73; + label13.Text = "相机类型"; + // + // sltCamType + // + sltCamType.List = true; + sltCamType.Location = new Point(86, 93); + sltCamType.Name = "sltCamType"; + sltCamType.Size = new Size(111, 36); + sltCamType.TabIndex = 74; + // + // label14 + // + label14.Location = new Point(21, 441); + label14.Name = "label14"; + label14.Size = new Size(59, 23); + label14.TabIndex = 75; + label14.Text = "变焦相机"; + // + // switch1 + // + switch1.CheckedText = "启用"; + switch1.Location = new Point(86, 431); + switch1.Name = "switch1"; + switch1.Size = new Size(111, 33); + switch1.TabIndex = 76; + switch1.UnCheckedText = "关闭"; + // + // panel1 + // + panel1.Controls.Add(sltPicType); + panel1.Controls.Add(label15); + panel1.Controls.Add(switch1); + panel1.Controls.Add(label14); + panel1.Controls.Add(sltCamType); + panel1.Controls.Add(label13); + panel1.Controls.Add(sthAllPic); + panel1.Controls.Add(label12); + panel1.Controls.Add(label11); + panel1.Controls.Add(label10); + panel1.Controls.Add(label9); + panel1.Controls.Add(label8); + panel1.Controls.Add(sthPic); + panel1.Controls.Add(label6); + panel1.Controls.Add(iptROIH); + panel1.Controls.Add(iptROIW); + panel1.Controls.Add(iptROIY); + panel1.Controls.Add(iptROIX); + panel1.Controls.Add(label7); + panel1.Controls.Add(sltTriggerMode); + panel1.Controls.Add(label5); + panel1.Controls.Add(sltAcquisitionMode); + panel1.Controls.Add(label4); + panel1.Controls.Add(iptRevolve); + panel1.Controls.Add(iptGain); + panel1.Controls.Add(iptExposure); + panel1.Controls.Add(label3); + panel1.Controls.Add(label2); + panel1.Controls.Add(label1); + panel1.Controls.Add(swhEnable); + panel1.Controls.Add(label18); + panel1.Dock = DockStyle.Left; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(218, 644); + panel1.TabIndex = 48; + panel1.Text = "panel1"; + // + // sltPicType + // + sltPicType.List = true; + sltPicType.Location = new Point(86, 352); + sltPicType.Name = "sltPicType"; + sltPicType.Size = new Size(111, 36); + sltPicType.TabIndex = 78; + // + // label15 + // + label15.Location = new Point(21, 352); + label15.Name = "label15"; + label15.Size = new Size(59, 36); + label15.TabIndex = 77; + label15.Text = "图片格式"; + // // CameraControl // AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleMode = AutoScaleMode.Font; - Controls.Add(button3); - Controls.Add(button2); - Controls.Add(button1); - Controls.Add(btnSizeAdd); - Controls.Add(pictureBox1); - Controls.Add(iptROIH); - Controls.Add(iptROIW); - Controls.Add(iptROIY); - Controls.Add(iptROIX); - Controls.Add(label7); - Controls.Add(sltTriggerMode); - Controls.Add(label5); - Controls.Add(sltAcquisitionMode); - Controls.Add(label4); - Controls.Add(iptRevolve); - Controls.Add(iptGain); - Controls.Add(iptExposure); - Controls.Add(label3); - Controls.Add(label2); - Controls.Add(label1); - Controls.Add(swhEnable); - Controls.Add(label18); + Controls.Add(panel2); + Controls.Add(panel1); Name = "CameraControl"; - Size = new Size(909, 505); + Size = new Size(909, 644); + panel3.ResumeLayout(false); + panel4.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); + panel2.ResumeLayout(false); + panel1.ResumeLayout(false); ResumeLayout(false); } #endregion - private AntdUI.Switch swhEnable; + private AntdUI.Panel panel3; + private AntdUI.Button button3; + private AntdUI.Button button2; + private AntdUI.Button button1; + private AntdUI.Button btnSizeAdd; + private AntdUI.Panel panel4; + private PictureBox pictureBox1; + private AntdUI.Panel panel2; private AntdUI.Label label18; + private AntdUI.Switch swhEnable; private AntdUI.Label label1; private AntdUI.Label label2; private AntdUI.Label label3; - private AntdUI.InputNumber iptExposure; - private AntdUI.InputNumber iptGain; - private AntdUI.InputNumber iptRevolve; + private AntdUI.Input iptExposure; + private AntdUI.Input iptGain; + private AntdUI.Select iptRevolve; private AntdUI.Label label4; private AntdUI.Select sltAcquisitionMode; private AntdUI.Label label5; private AntdUI.Select sltTriggerMode; private AntdUI.Label label7; - private AntdUI.InputNumber iptROIW; - private AntdUI.InputNumber iptROIY; - private AntdUI.InputNumber iptROIX; - private AntdUI.InputNumber iptROIH; - private PictureBox pictureBox1; - private AntdUI.Button btnSizeAdd; - private AntdUI.Button button1; - private AntdUI.Button button2; - private AntdUI.Button button3; + private AntdUI.Input iptROIX; + private AntdUI.Input iptROIY; + private AntdUI.Input iptROIW; + private AntdUI.Input iptROIH; + private AntdUI.Label label6; + private AntdUI.Switch sthPic; + private AntdUI.Label label8; + private AntdUI.Label label9; + private AntdUI.Label label10; + private AntdUI.Label label11; + private AntdUI.Label label12; + private AntdUI.Switch sthAllPic; + private AntdUI.Label label13; + private AntdUI.Select sltCamType; + private AntdUI.Label label14; + private AntdUI.Switch switch1; + private AntdUI.Panel panel1; + private AntdUI.Select sltPicType; + private AntdUI.Label label15; } } diff --git a/DHSoftware/Views/CameraControl.cs b/DHSoftware/Views/CameraControl.cs index 8877e93..860029b 100644 --- a/DHSoftware/Views/CameraControl.cs +++ b/DHSoftware/Views/CameraControl.cs @@ -8,8 +8,11 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using AntdUI; +using DH.Commons.Base; using DH.Commons.Enums; -using DH.Devices.Devices; +using DVPCameraType; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using Window = AntdUI.Window; namespace DHSoftware.Views { @@ -17,17 +20,69 @@ namespace DHSoftware.Views { Window window; CameraBase CameraBase; - public CameraControl(Window _window,CameraBase cameraBase) + public CameraControl(Window _window, CameraBase cameraBase) { - window= _window; + window = _window; CameraBase = cameraBase; InitializeComponent(); - + sltCamType.TextChanged += SltCamTpye_TextChanged; + sltPicType.TextChanged += SltPicTpye_TextChanged; InitData(); BindData(); } + private void SltPicTpye_TextChanged(object? sender, EventArgs e) + { + if (sender is Select slt && !string.IsNullOrEmpty(slt.Text)) + { + // 将文本转换为枚举值 + if (Enum.TryParse(slt.Text, out var plcType)) + { + switch (plcType) + { + case dvpStreamFormat.S_RGB24: + case dvpStreamFormat.S_MONO8: + break; + + + + default: + break; + } + } + else + { + + } + } + } + private void SltCamTpye_TextChanged(object? sender, EventArgs e) + { + if (sender is Select slt && !string.IsNullOrEmpty(slt.Text)) + { + // 将文本转换为枚举值 + if (Enum.TryParse(slt.Text, out var plcType)) + { + switch (plcType) + { + case EnumCamType.度申Do3think: + case EnumCamType.海康hik: + + break; + + + + default: + break; + } + } + else + { + + } + } + } private void SltAcquisitionMode_SelectedIndexChanged(object sender, IntEventArgs e) @@ -40,7 +95,7 @@ namespace DHSoftware.Views case (int)CameraAcquisitionMode.触发模式: sltTriggerMode.Enabled = true; break; - default: + default: break; } } @@ -48,27 +103,33 @@ namespace DHSoftware.Views private void BindData() { + + sltCamType.DataBindings.Add("Text", CameraBase, "CamType", true, DataSourceUpdateMode.OnPropertyChanged, ""); + sltPicType.DataBindings.Add("Text", CameraBase, "DvpImageFormat", true, DataSourceUpdateMode.OnPropertyChanged, ""); + sthPic.DataBindings.Add(nameof(sthPic.Checked), CameraBase, nameof(CameraBase.IsSavePicEnabled), + true, DataSourceUpdateMode.OnPropertyChanged); + sthAllPic.DataBindings.Add(nameof(sthAllPic.Checked), CameraBase, nameof(CameraBase.IsAllPicEnabled), + true, DataSourceUpdateMode.OnPropertyChanged); // 启用状态绑定 swhEnable.DataBindings.Add(nameof(swhEnable.Checked), CameraBase, nameof(CameraBase.IsEnabled), true, DataSourceUpdateMode.OnPropertyChanged); - + switch1.DataBindings.Add(nameof(switch1.Checked), CameraBase, nameof(CameraBase.IsZoomCamera), + true, DataSourceUpdateMode.OnPropertyChanged); // 曝光时间绑定(假设iptExposure是NumericUpDown) - iptExposure.DataBindings.Add(nameof(iptExposure.Value), CameraBase, nameof(CameraBase.Exposure), - true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2"); - + + iptExposure.DataBindings.Add(nameof(iptExposure.Text), CameraBase, nameof(CameraBase.Exposure)); // 增益绑定 - iptGain.DataBindings.Add(nameof(iptGain.Value), CameraBase, nameof(CameraBase.Gain), - true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2"); + iptGain.DataBindings.Add(nameof(iptGain.Text), CameraBase, nameof(CameraBase.Gain)); // 旋转角度绑定 - iptRevolve.DataBindings.Add(nameof(iptRevolve.Value), CameraBase, nameof(CameraBase.RotateImage), - true, DataSourceUpdateMode.OnPropertyChanged, 0M, "N2"); + iptRevolve.DataBindings.Add(nameof(iptRevolve.Text), CameraBase, nameof(CameraBase.RotateImage)); + // ROI坐标绑定 - iptROIX.DataBindings.Add(nameof(iptROIX.Value), CameraBase, nameof(CameraBase.ROIX)); - iptROIY.DataBindings.Add(nameof(iptROIY.Value), CameraBase, nameof(CameraBase.ROIY)); - iptROIW.DataBindings.Add(nameof(iptROIW.Value), CameraBase, nameof(CameraBase.ROIW)); - iptROIH.DataBindings.Add(nameof(iptROIH.Value), CameraBase, nameof(CameraBase.ROIH)); + iptROIX.DataBindings.Add(nameof(iptROIX.Text), CameraBase, nameof(CameraBase.ROIX)); + iptROIY.DataBindings.Add(nameof(iptROIY.Text), CameraBase, nameof(CameraBase.ROIY)); + iptROIW.DataBindings.Add(nameof(iptROIW.Text), CameraBase, nameof(CameraBase.ROIW)); + iptROIH.DataBindings.Add(nameof(iptROIH.Text), CameraBase, nameof(CameraBase.ROIH)); // 采集模式下拉框处理 sltAcquisitionMode.SelectedIndexChanged += (s, e) => @@ -85,13 +146,27 @@ namespace DHSoftware.Views private void InitData() { + iptRevolve.Text = Convert.ToInt32(CameraBase.RotateImage).ToString(); + // 获取枚举字段名列表(原描述改为字段名) + sltCamType.Items.Clear(); + foreach (EnumCamType value in Enum.GetValues(typeof(EnumCamType))) + { + sltCamType.Items.Add(value.ToString()); + } + sltPicType.Items.Clear(); + foreach (dvpStreamFormat value in Enum.GetValues(typeof(dvpStreamFormat))) + { + sltPicType.Items.Add(value.ToString()); + } // 初始化下拉框选项 sltAcquisitionMode.Items.AddRange(new[] { "连续模式", "触发模式" }); sltTriggerMode.Items.AddRange(new[] { "软触发", "硬触发" }); + // 设置初始选择 sltAcquisitionMode.SelectedIndex = CameraBase.IsContinueMode ? 0 : 1; sltTriggerMode.SelectedIndex = CameraBase.IsHardwareTrigger ? 1 : 0; } + } } diff --git a/DHSoftware/Views/CloseWindow.Designer.cs b/DHSoftware/Views/CloseWindow.Designer.cs new file mode 100644 index 0000000..c8874ea --- /dev/null +++ b/DHSoftware/Views/CloseWindow.Designer.cs @@ -0,0 +1,102 @@ + +namespace DHSoftware.Views +{ + partial class CloseWindow + { + /// + /// 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(CloseWindow)); + panel1 = new AntdUI.Panel(); + panel2 = new AntdUI.Panel(); + spin1 = new AntdUI.Spin(); + panel1.SuspendLayout(); + panel2.SuspendLayout(); + SuspendLayout(); + // + // panel1 + // + panel1.Back = Color.Transparent; + panel1.Controls.Add(panel2); + panel1.Dock = DockStyle.Fill; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(280, 124); + panel1.TabIndex = 0; + panel1.Text = "panel1"; + // + // panel2 + // + panel2.Back = Color.Transparent; + panel2.Controls.Add(spin1); + panel2.Dock = DockStyle.Fill; + panel2.Location = new Point(0, 0); + panel2.Name = "panel2"; + panel2.Radius = 0; + panel2.Size = new Size(280, 124); + panel2.TabIndex = 4; + panel2.Text = "panel2"; + // + // spin1 + // + spin1.Fill = SystemColors.Window; + spin1.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); + spin1.ForeColor = SystemColors.Window; + spin1.Location = new Point(50, 20); + spin1.Name = "spin1"; + spin1.Size = new Size(170, 92); + spin1.TabIndex = 0; + spin1.Text = "软件正在关闭,请稍候......"; + // + // CloseWindow + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(46, 108, 227); + ClientSize = new Size(280, 124); + ControlBox = false; + Controls.Add(panel1); + Icon = (Icon)resources.GetObject("$this.Icon"); + MaximizeBox = false; + MinimizeBox = false; + Name = "CloseWindow"; + ShowIcon = false; + StartPosition = FormStartPosition.CenterScreen; + Text = "WelcomeForm"; + panel1.ResumeLayout(false); + panel2.ResumeLayout(false); + ResumeLayout(false); + } + + + + #endregion + + private AntdUI.Panel panel1; + private AntdUI.Panel panel2; + private AntdUI.Spin spin1; + } +} \ No newline at end of file diff --git a/DHSoftware/Views/CloseWindow.cs b/DHSoftware/Views/CloseWindow.cs new file mode 100644 index 0000000..7a00271 --- /dev/null +++ b/DHSoftware/Views/CloseWindow.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; +using AntdUI; +namespace DHSoftware.Views +{ + public partial class CloseWindow : Window + { + public CloseWindow() + { + InitializeComponent(); + Control.CheckForIllegalCrossThreadCalls = false; + } + + /// + /// 窗体对象实例 + /// + private static CloseWindow _instance; + public static CloseWindow Instance + { + get + { + if (_instance == null) + { + _instance = new CloseWindow(); + } + return _instance; + } + } + + } +} diff --git a/DHSoftware/Views/CloseWindow.resx b/DHSoftware/Views/CloseWindow.resx new file mode 100644 index 0000000..97a5e62 --- /dev/null +++ b/DHSoftware/Views/CloseWindow.resx @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn + H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE + u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E + u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D + uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn + H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE + u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn + H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn + 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 + H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn + H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE + u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ + vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn + H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn + H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE + u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/DHSoftware/Views/CorrelatedCameraEdit.Designer.cs b/DHSoftware/Views/CorrelatedCameraEdit.Designer.cs index e87c6ea..1defceb 100644 --- a/DHSoftware/Views/CorrelatedCameraEdit.Designer.cs +++ b/DHSoftware/Views/CorrelatedCameraEdit.Designer.cs @@ -96,6 +96,7 @@ button_ok.TabIndex = 0; button_ok.Text = "确定"; button_ok.Type = AntdUI.TTypeMini.Primary; + // // divider1 // diff --git a/DHSoftware/Views/CorrelatedCameraEdit.cs b/DHSoftware/Views/CorrelatedCameraEdit.cs index 536c431..8afaf0c 100644 --- a/DHSoftware/Views/CorrelatedCameraEdit.cs +++ b/DHSoftware/Views/CorrelatedCameraEdit.cs @@ -3,7 +3,7 @@ using System.ComponentModel; using System.Reflection; using AntdUI; -using DH.Commons.Enums; +using DH.Commons.Base; using DH.Devices.Vision; namespace DHSoftware.Views @@ -97,6 +97,7 @@ namespace DHSoftware.Views Font = new System.Drawing.Font("Microsoft YaHei UI", 9F), Size = new Size(90, 42), Text = name, + ForeColor = Color.FromArgb(61, 94, 218) }; foreach (var item in Cameras) { diff --git a/DHSoftware/Views/CtrlVisionRunBase.cs b/DHSoftware/Views/CtrlVisionRunBase.cs index f762271..162ae3f 100644 --- a/DHSoftware/Views/CtrlVisionRunBase.cs +++ b/DHSoftware/Views/CtrlVisionRunBase.cs @@ -7,10 +7,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; - using System.IO; using DH.Commons.Enums; -using DH.Devices.Devices; +using DH.Commons.Base; namespace XKRS.UI.Device.Winform diff --git a/DHSoftware/Views/DefectRowEdit.cs b/DHSoftware/Views/DefectRowEdit.cs index b83f6a7..3678205 100644 --- a/DHSoftware/Views/DefectRowEdit.cs +++ b/DHSoftware/Views/DefectRowEdit.cs @@ -8,7 +8,7 @@ namespace AntdUIDemo.Views.Table { public partial class DefectRowEdit : UserControl { - DetectConfigControl detectConfigControl; + //DetectConfigControl detectConfigControl; private AntdUI.Window window; private DefectRow user; public bool submit; @@ -48,6 +48,8 @@ namespace AntdUIDemo.Views.Table user.LabelDescription = input_name.Text; user.ScoreMinValue =(double)input_minScore.Value; user.ScoreMaxValue = (double)input_maxScore.Value; + user.AreaMinValue = (double)input_minArea.Value; + user.AreaMaxValue = (double)input_maxArea.Value; submit = true; this.Dispose(); } @@ -58,8 +60,8 @@ namespace AntdUIDemo.Views.Table // input_addr.Text = user.Address; input_minScore.Value =(decimal) user.ScoreMinValue; input_maxScore.Value =(decimal) user.ScoreMaxValue; - input_minArea.Value =(decimal) user.ScoreMaxValue; - input_maxScore.Value =(decimal) user.ScoreMaxValue; + input_minArea.Value =(decimal) user.AreaMinValue; + input_maxArea.Value =(decimal) user.AreaMaxValue; } } } diff --git a/DHSoftware/Views/DetectConfigControl.Designer.cs b/DHSoftware/Views/DetectConfigControl.Designer.cs deleted file mode 100644 index 43f57ba..0000000 --- a/DHSoftware/Views/DetectConfigControl.Designer.cs +++ /dev/null @@ -1,297 +0,0 @@ -namespace DHSoftware.Views -{ - partial class DetectConfigControl - { - /// - /// 必需的设计器变量 - /// - 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() - { - panel1 = new Panel(); - panel3 = new Panel(); - label6 = new AntdUI.Label(); - cbxDetectType = new AntdUI.Select(); - label1 = new AntdUI.Label(); - tbDetectName = new AntdUI.Input(); - btnPreOpen = new AntdUI.Button(); - tbModelpath = new AntdUI.Input(); - button3 = new AntdUI.Button(); - switchEnable = new AntdUI.Switch(); - label8 = new AntdUI.Label(); - label10 = new AntdUI.Label(); - sthPic = new AntdUI.Switch(); - sthSaveNGPic = new AntdUI.Switch(); - label7 = new AntdUI.Label(); - label9 = new AntdUI.Label(); - swSaveOKPic = new AntdUI.Switch(); - panel2 = new Panel(); - label2 = new AntdUI.Label(); - buttonDEL = new AntdUI.Button(); - table_base = new AntdUI.Table(); - buttonADD = new AntdUI.Button(); - panel1.SuspendLayout(); - panel3.SuspendLayout(); - panel2.SuspendLayout(); - SuspendLayout(); - // - // panel1 - // - panel1.BorderStyle = BorderStyle.FixedSingle; - panel1.Controls.Add(panel3); - panel1.Controls.Add(panel2); - panel1.Dock = DockStyle.Fill; - panel1.Location = new Point(0, 0); - panel1.Name = "panel1"; - panel1.Size = new Size(600, 445); - panel1.TabIndex = 0; - // - // panel3 - // - panel3.Controls.Add(label6); - panel3.Controls.Add(cbxDetectType); - panel3.Controls.Add(label1); - panel3.Controls.Add(tbDetectName); - panel3.Controls.Add(btnPreOpen); - panel3.Controls.Add(tbModelpath); - panel3.Controls.Add(button3); - panel3.Controls.Add(switchEnable); - panel3.Controls.Add(label8); - panel3.Controls.Add(label10); - panel3.Controls.Add(sthPic); - panel3.Controls.Add(sthSaveNGPic); - panel3.Controls.Add(label7); - panel3.Controls.Add(label9); - panel3.Controls.Add(swSaveOKPic); - panel3.Dock = DockStyle.Fill; - panel3.Location = new Point(0, 0); - panel3.Name = "panel3"; - panel3.Size = new Size(598, 206); - panel3.TabIndex = 41; - // - // label6 - // - label6.Location = new Point(3, 15); - label6.Name = "label6"; - label6.Size = new Size(58, 23); - label6.TabIndex = 25; - label6.Text = "检测名称"; - // - // cbxDetectType - // - cbxDetectType.Anchor = AnchorStyles.Top | AnchorStyles.Right; - cbxDetectType.Location = new Point(341, 7); - cbxDetectType.Name = "cbxDetectType"; - cbxDetectType.Size = new Size(226, 31); - cbxDetectType.TabIndex = 40; - // - // label1 - // - label1.Location = new Point(3, 44); - label1.Name = "label1"; - label1.Size = new Size(73, 23); - label1.TabIndex = 9; - label1.Text = "模型路径"; - // - // tbDetectName - // - tbDetectName.Location = new Point(82, 7); - tbDetectName.Name = "tbDetectName"; - tbDetectName.Size = new Size(249, 31); - tbDetectName.TabIndex = 39; - // - // btnPreOpen - // - btnPreOpen.Anchor = AnchorStyles.Top | AnchorStyles.Right; - btnPreOpen.Location = new Point(507, 36); - btnPreOpen.MinimumSize = new Size(20, 0); - btnPreOpen.Name = "btnPreOpen"; - btnPreOpen.Size = new Size(60, 31); - btnPreOpen.TabIndex = 22; - btnPreOpen.Text = "..."; - // - // tbModelpath - // - tbModelpath.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - tbModelpath.Location = new Point(82, 36); - tbModelpath.Name = "tbModelpath"; - tbModelpath.Size = new Size(415, 31); - tbModelpath.TabIndex = 38; - // - // button3 - // - button3.Anchor = AnchorStyles.Top | AnchorStyles.Right; - button3.Location = new Point(385, 73); - button3.Name = "button3"; - button3.Size = new Size(182, 34); - button3.TabIndex = 37; - button3.Text = "查看文件夹"; - // - // switchEnable - // - switchEnable.Location = new Point(82, 84); - switchEnable.Name = "switchEnable"; - switchEnable.Size = new Size(60, 23); - switchEnable.TabIndex = 27; - switchEnable.Text = "switch1"; - // - // label8 - // - label8.Location = new Point(3, 84); - label8.Name = "label8"; - label8.Size = new Size(58, 23); - label8.TabIndex = 28; - label8.Text = "模型启用"; - // - // label10 - // - label10.Location = new Point(176, 113); - label10.Name = "label10"; - label10.Size = new Size(73, 23); - label10.TabIndex = 34; - label10.Text = "保存NG原图"; - // - // sthPic - // - sthPic.Location = new Point(263, 84); - sthPic.Name = "sthPic"; - sthPic.Size = new Size(60, 23); - sthPic.TabIndex = 29; - sthPic.Text = "switch2"; - // - // sthSaveNGPic - // - sthSaveNGPic.Location = new Point(263, 113); - sthSaveNGPic.Name = "sthSaveNGPic"; - sthSaveNGPic.Size = new Size(60, 23); - sthSaveNGPic.TabIndex = 33; - sthSaveNGPic.Text = "switch4"; - // - // label7 - // - label7.Location = new Point(184, 84); - label7.Name = "label7"; - label7.Size = new Size(58, 23); - label7.TabIndex = 30; - label7.Text = "数据保存"; - // - // label9 - // - label9.Location = new Point(3, 113); - label9.Name = "label9"; - label9.Size = new Size(73, 23); - label9.TabIndex = 32; - label9.Text = "保存OK原图"; - // - // swSaveOKPic - // - swSaveOKPic.Location = new Point(82, 113); - swSaveOKPic.Name = "swSaveOKPic"; - swSaveOKPic.Size = new Size(60, 23); - swSaveOKPic.TabIndex = 31; - swSaveOKPic.Text = "switch3"; - // - // panel2 - // - panel2.Controls.Add(label2); - panel2.Controls.Add(buttonDEL); - panel2.Controls.Add(table_base); - panel2.Controls.Add(buttonADD); - panel2.Dock = DockStyle.Bottom; - panel2.Location = new Point(0, 206); - panel2.Name = "panel2"; - panel2.Size = new Size(598, 237); - panel2.TabIndex = 35; - // - // label2 - // - label2.Location = new Point(3, 3); - label2.Name = "label2"; - label2.Size = new Size(58, 23); - label2.TabIndex = 29; - label2.Text = "模型参数"; - // - // buttonDEL - // - buttonDEL.Location = new Point(93, 28); - buttonDEL.Name = "buttonDEL"; - buttonDEL.Size = new Size(84, 34); - buttonDEL.TabIndex = 24; - buttonDEL.Text = "删除"; - // - // table_base - // - table_base.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - table_base.Location = new Point(0, 68); - table_base.Name = "table_base"; - table_base.Size = new Size(598, 169); - table_base.TabIndex = 22; - table_base.Text = "table1"; - // - // buttonADD - // - buttonADD.Location = new Point(3, 28); - buttonADD.Name = "buttonADD"; - buttonADD.Size = new Size(84, 34); - buttonADD.TabIndex = 23; - buttonADD.Text = "新增"; - // - // DetectConfigControl - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - Controls.Add(panel1); - Name = "DetectConfigControl"; - Size = new Size(600, 445); - panel1.ResumeLayout(false); - panel3.ResumeLayout(false); - panel2.ResumeLayout(false); - ResumeLayout(false); - } - - #endregion - - private Panel panel1; - private AntdUI.Label label1; - private AntdUI.Label label6; - private AntdUI.Button btnPreOpen; - private AntdUI.Label label7; - private AntdUI.Switch sthPic; - private AntdUI.Label label8; - private AntdUI.Switch switchEnable; - private AntdUI.Label label10; - private AntdUI.Switch sthSaveNGPic; - private AntdUI.Label label9; - private AntdUI.Switch swSaveOKPic; - private Panel panel2; - private AntdUI.Button buttonDEL; - private AntdUI.Table table_base; - private AntdUI.Button buttonADD; - private AntdUI.Button button3; - private AntdUI.Input tbDetectName; - private AntdUI.Input tbModelpath; - private AntdUI.Label label2; - private AntdUI.Select cbxDetectType; - private Panel panel3; - } -} diff --git a/DHSoftware/Views/DetectConfigControl.cs b/DHSoftware/Views/DetectConfigControl.cs deleted file mode 100644 index ce661cb..0000000 --- a/DHSoftware/Views/DetectConfigControl.cs +++ /dev/null @@ -1,459 +0,0 @@ -using AntdUI; -using AntdUIDemo.Views.Table; -using DH.Commons.Enums; -using DH.Devices.Vision; -using DHSoftware.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -using System.Drawing; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using DH.Devices.Vision; - -namespace DHSoftware.Views -{ - public partial class DetectConfigControl : UserControl - { - - private DetectionConfig _currentConfig = new DetectionConfig(); - private readonly string _configName; - List> MLModelTypes = GetFilteredEnumDescriptionsAndValues(); - - public static List> GetFilteredEnumDescriptionsAndValues() where T : Enum - { - return Enum.GetValues(typeof(T)) - .Cast() - .Select(e => - { - // 获取枚举的 Description 属性,如果没有,则使用枚举的名称 - var description = e.GetType() - .GetField(e.ToString()) - ?.GetCustomAttribute() - ?.Description ?? e.ToString(); - - // 返回枚举的描述和对应的整数值 - return new KeyValuePair(description, Convert.ToInt32(e)); - }) - .ToList(); - } - - List> resultStates = GetFilteredEnumDescriptionsAndValues(); - // 获取枚举的描述和对应的值,只筛选出 OK 和 NG - public static List> GetFilteredEnumDescriptionsAndValuesres() where T : Enum - { - return Enum.GetValues(typeof(T)) - .Cast() - .Where(e => e.Equals(ResultState.OK) || e.Equals(ResultState.DetectNG)) // 只保留 OK 和 NG - .Select(e => - { - // 通过反射获取 DescriptionAttribute 描述,如果没有描述,则使用枚举项名称 - var description = e.GetType() - .GetField(e.ToString()) - ?.GetCustomAttribute() - ?.Description ?? e.ToString(); // 如果没有 DescriptionAttribute,则使用枚举名称 - - // 返回描述和值的键值对 - return new KeyValuePair(description, Convert.ToInt32(e)); - }) - .ToList(); - } - - - DetectionConfig Detection = new DetectionConfig(); - AntList antList; - public AntdUI.Window _window; - DefectRow curUser; - public DetectConfigControl() - { - InitializeComponent(); - InitTableColumns(); - InitData(); - BindEventHandler(); - foreach (var item in MLModelTypes) - { - cbxDetectType.Items.Add(item.Key); - } - cbxDetectType.SelectedIndex = (int)Detection.ModelType - 1; - tbDetectName.Text = Detection.Name; - - } - - public bool IsEnabled - { - get => switchEnable.AutoCheck; - set => switchEnable.AutoCheck = value; - } - // 模型路径属性 - public string ModelPath - { - get => Detection.ModelPath; - set - { - Detection.ModelPath = value; - tbModelpath.Text = value; // 更新到文本框 - } - } - - - public bool IsPicNGEnable - { - - get => sthSaveNGPic.AutoCheck; - set => sthSaveNGPic.AutoCheck = value; - } - public bool IsPicEnable - { - - get => sthPic.AutoCheck; - set => sthPic.AutoCheck = value; - } - //public MLModelType LModelType - //{ - - //} - - private string _picTag; - - public string picTag - { - get => _picTag; - set - { - _picTag = value; - } - } - - - - private string _afterTag; - - public string afterTag - { - get => _afterTag; - set - { - _afterTag = value; - } - } - private void InitTableColumns() - { - table_base.Columns = new ColumnCollection() { - new ColumnCheck("Selected"){Fixed = true}, - new Column("LabelDescription", "标签名", ColumnAlign.Center) - { - Width="120", - //设置树节点,名称需和User里的User[]名称保持一致 - KeyTree = "Users" - }, - new ColumnSwitch("IsEnable", "是否启用", ColumnAlign.Center){ - //支持点击回调 - //Call= (value,record, i_row, i_col) =>{ - // //执行耗时操作 - // Thread.Sleep(10); - // // AntdUI.Message.info(window, value.ToString(),autoClose:1); - // return value; - //} - }, - new Column("ScoreMinValue", "最小得分",ColumnAlign.Center), - new Column("ScoreMaxValue", "最大得分",ColumnAlign.Center), - - new Column("AreaMinValue", "最小面积",ColumnAlign.Center), - new Column("AreaMaxValue", "最大面积",ColumnAlign.Center), - //new Column("CellBadge", "徽标",ColumnAlign.Center), - //new Column("CellText", "富文本") - //{ - // ColAlign = ColumnAlign.Center,//支持表头位置单独设置 - //}, - //new Column("CellProgress", "进度条",ColumnAlign.Center), - //new Column("CellDivider", "分割线",ColumnAlign.Center), - //new Column("CellLinks", "链接", ColumnAlign.Center) - //{ - // Fixed = true,//冻结列 - //}, - }; - } - - private void InitData() - { - antList = new AntList(); - - for (int i = 0; i < 10; i++) - { - antList.Add(new DefectRow - { - LabelDescription = "张三", - - }); - } - - - table_base.Binding(antList); - - //设置行禁用 - // table_base.SetRowEnable(0, false, true); - } - - - private void BindEventHandler() - { - buttonADD.Click += ButtonADD_Click; - buttonDEL.Click += ButtonDEL_Click; - - - table_base.CellClick += Table_base_CellClick; - table_base.CellButtonClick += Table_base_CellButtonClick; - } - - - private AntdUI.Table.CellStyleInfo Table_base_SetRowStyle(object sender, TableSetRowStyleEventArgs e) - { - if (e.RowIndex % 2 == 0) - { - return new AntdUI.Table.CellStyleInfo - { - BackColor = AntdUI.Style.Db.ErrorBg, - }; - } - return null; - } - - private void ButtonADD_Click(object sender, EventArgs e) - { - DefectRow useradd = new DefectRow() - { - LabelDescription="xinquexian", - IsEnable=true, - ScoreMinValue=0.3, - ScoreMaxValue=1, - AreaMinValue=1, - AreaMaxValue=999999999, - - }; - var form = new DefectRowEdit(_window, useradd) { Size = new Size(700, 500) }; - AntdUI.Modal.open(new AntdUI.Modal.Config(_window, "", form, TType.None) - { - BtnHeight = 0, - }); - if (form.submit) - { - antList.Add(useradd); - } - - } - - private void Table_base_CellClick(object sender, TableClickEventArgs e) - { - var record = e.Record; - if (record is DefectRow user) - { - curUser = user; - //判断是否右键 - if (e.Button == MouseButtons.Right) - { - if (antList.Count == 0) return; - AntdUI.ContextMenuStrip.open(new AntdUI.ContextMenuStrip.Config(table_base, - (item) => - { - if (item.Text == "开启") - { - user.IsEnable = true; - } - else if (item.Text == "关闭") - { - user.IsEnable = false; - } - else if (item.Text == "编辑") - { - var form = new DefectRowEdit(_window, user) { Size = new Size(500, 300) }; - AntdUI.Drawer.open(new AntdUI.Drawer.Config(_window, form) - { - OnLoad = () => - { - AntdUI.Message.info(_window, "进入编辑", autoClose: 1); - }, - OnClose = () => - { - AntdUI.Message.info(_window, "结束编辑", autoClose: 1); - } - }); - } - else if (item.Text == "删除") - { - var result = Modal.open(_window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); - if (result == DialogResult.OK) - { - //父元素没有勾选或者子元素也没有勾选,则删除当前行 - bool delCurrent = !antList.Any(x => x.Selected /*|| (x.?.Any(u => u.Selected) ?? false)*/); - - if (delCurrent) - { - //删除当前行,先判断是否父元素,再判断是否子元素,只支持一层子元素,需实现嵌套查询 - for (int i = 0; i < antList.Count; i++) - { - if (antList[i] == user) - { - antList.RemoveAt(i); - } - //else - //{ - // antList[i].Users = antList[i].Users?.Where(x => x != user).ToArray(); - //} - } - } - else - { - // 使用反转for循环删除主列表中选中的项 - for (int i = antList.Count - 1; i >= 0; i--) - { - // 1.删除选中的主列表项 - if (antList[i].Selected) - { - antList.RemoveAt(i); - } - //else - //{ - // // 删除子列表中选中的项 - // antList[i].Users = antList[i].Users?.Where(childUser => !childUser.Selected).ToArray(); - //} - } - } - - } - } - else if (item.Text == "查看图片") - { - //查看其他来源的高清图片 - Preview.open(new Preview.Config(_window, Properties.Resources.head2)); - } - else - AntdUI.Message.info(_window, item.Text, autoClose: 1); - }, - new IContextMenuStripItem[] { - //根据行数据动态修改右键菜单 - user.IsEnable? new ContextMenuStripItem("关闭") - { - IconSvg = "CloseOutlined" - }:new ContextMenuStripItem("开启") - { - IconSvg = "CheckOutlined" - }, - new AntdUI.ContextMenuStripItem("编辑"){ - IconSvg = "EditOutlined", - }, - new AntdUI.ContextMenuStripItem("删除"){ - IconSvg = "DeleteOutlined" - }, - new ContextMenuStripItem("查看图片") - { - IconSvg = "FundViewOutlined" - }, - new ContextMenuStripItemDivider(), - new AntdUI.ContextMenuStripItem("详情"){ - Sub = new IContextMenuStripItem[]{ new AntdUI.ContextMenuStripItem("打印", "Ctrl + P") { }, - new AntdUI.ContextMenuStripItem("另存为", "Ctrl + S") { } }, - IconSvg = "", - } - })); - } - else - { - - } - } - } - - //表格内部按钮事件 - private void Table_base_CellButtonClick(object sender, TableButtonEventArgs e) - { - var buttontext = e.Btn.Text; - - if (e.Record is DefectRow user) - { - curUser = user; - switch (buttontext) - { - //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 - case "编辑": - var form = new DefectRowEdit(_window, user) { Size = new Size(500, 300) }; - AntdUI.Drawer.open(new AntdUI.Drawer.Config(_window, form) - { - OnLoad = () => - { - AntdUI.Message.info(_window, "进入编辑", autoClose: 1); - }, - OnClose = () => - { - AntdUI.Message.info(_window, "结束编辑", autoClose: 1); - } - }); - break; - case "删除": - var result = Modal.open(_window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); - if (result == DialogResult.OK) - antList.Remove(user); - break; - case "AntdUI": - //超链接内容 - // AntdUI.Message.info(_window, user.CellLinks.FirstOrDefault().Id, autoClose: 1); - break; - case "查看图片": - //使用clone可以防止table中的image被修改 - // Preview.open(new Preview.Config(window, (Image)curUser.CellImages[0].Image.Clone())); - break; - } - } - } - - private void ButtonDEL_Click(object sender, EventArgs e) - { - if (antList.Count == 0 || !antList.Any(x => x.Selected)) - { - bool isSubSelected = false; - //// 判断子元素是否勾选 - //for (int i = 0; i < antList.Count; i++) - //{ - // if (antList[i].Users != null && antList[i].Users.Any(x => x.Selected)) - // { - // isSubSelected = true; - // break; - // } - //} - if (!isSubSelected) - { - AntdUI.Message.warn(_window, "请选择要删除的行!", autoClose: 3); - return; - } - } - - var result = Modal.open(_window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); - if (result == DialogResult.OK) - { - // 使用反转for循环删除主列表中选中的项 - for (int i = antList.Count - 1; i >= 0; i--) - { - // 删除选中的主列表项 - if (antList[i].Selected) - { - antList.RemoveAt(i); - } - else - { - // 删除子列表中选中的项 - // antList[i].Users = antList[i].Users?.Where(user => !user.Selected).ToArray(); - } - } - // 提示删除完成 - // AntdUI.Message.success(this.w, "删除成功!", autoClose: 3); - MessageBox.Show("删除成功!"); - } - } - - - } -} diff --git a/DHSoftware/Views/DetectControl.Designer.cs b/DHSoftware/Views/DetectControl.Designer.cs index 3467a3b..cf06a98 100644 --- a/DHSoftware/Views/DetectControl.Designer.cs +++ b/DHSoftware/Views/DetectControl.Designer.cs @@ -40,8 +40,8 @@ btnPreAdd = new AntdUI.Button(); preTable = new AntdUI.Table(); label3 = new AntdUI.Label(); - btnPath = new AntdUI.Button(); - swtPre = new AntdUI.Switch(); + btnPrePath = new AntdUI.Button(); + sthPreStatus = new AntdUI.Switch(); label2 = new AntdUI.Label(); iptPrePath = new AntdUI.Input(); label1 = new AntdUI.Label(); @@ -51,34 +51,33 @@ lableTable = new AntdUI.Table(); label15 = new AntdUI.Label(); btnPic = new AntdUI.Button(); - switch6 = new AntdUI.Switch(); + sthDetectNG = new AntdUI.Switch(); label13 = new AntdUI.Label(); - switch7 = new AntdUI.Switch(); + sthOKDetect = new AntdUI.Switch(); label14 = new AntdUI.Label(); - switch4 = new AntdUI.Switch(); + sthNGOriginal = new AntdUI.Switch(); label6 = new AntdUI.Label(); - switch5 = new AntdUI.Switch(); + sthOKOriginal = new AntdUI.Switch(); label12 = new AntdUI.Label(); - iptScore = new AntdUI.Input(); + iptConfidence = new AntdUI.Input(); label5 = new AntdUI.Label(); - flowPanel1 = new AntdUI.FlowPanel(); + flowCameraPanel = new AntdUI.FlowPanel(); label11 = new AntdUI.Label(); - swIsAddStation = new AntdUI.Switch(); + sthStation = new AntdUI.Switch(); label10 = new AntdUI.Label(); stDetectType = new AntdUI.Select(); label9 = new AntdUI.Label(); btnCorrelatedCamera = new AntdUI.Button(); btnPath2 = new AntdUI.Button(); - swIsEnabled = new AntdUI.Switch(); + sthDetectStatus = new AntdUI.Switch(); label7 = new AntdUI.Label(); - iptModelPath = new AntdUI.Input(); + iptDetectPath = new AntdUI.Input(); label8 = new AntdUI.Label(); tabPage3 = new AntdUI.TabPage(); tabPage4 = new AntdUI.TabPage(); btnSizeDel = new AntdUI.Button(); btnSizeAdd = new AntdUI.Button(); SizeTable = new AntdUI.Table(); - label17 = new AntdUI.Label(); tabs1.SuspendLayout(); tabPage1.SuspendLayout(); tabPage2.SuspendLayout(); @@ -96,6 +95,7 @@ tabs1.Pages.Add(tabPage1); tabs1.Pages.Add(tabPage2); tabs1.Pages.Add(tabPage3); + tabs1.SelectedIndex = 1; tabs1.Size = new Size(915, 609); tabs1.Style = styleLine1; tabs1.TabIndex = 1; @@ -111,8 +111,8 @@ tabPage1.Controls.Add(btnPreAdd); tabPage1.Controls.Add(preTable); tabPage1.Controls.Add(label3); - tabPage1.Controls.Add(btnPath); - tabPage1.Controls.Add(swtPre); + tabPage1.Controls.Add(btnPrePath); + tabPage1.Controls.Add(sthPreStatus); tabPage1.Controls.Add(label2); tabPage1.Controls.Add(iptPrePath); tabPage1.Controls.Add(label1); @@ -158,6 +158,8 @@ // // PreOutTable // + PreOutTable.EmptyHeader = true; + PreOutTable.EnableHeaderResizing = true; PreOutTable.Location = new Point(191, 355); PreOutTable.Name = "PreOutTable"; PreOutTable.Size = new Size(423, 181); @@ -192,6 +194,8 @@ // // preTable // + preTable.EmptyHeader = true; + preTable.EnableHeaderResizing = true; preTable.Location = new Point(191, 148); preTable.Name = "preTable"; preTable.Size = new Size(423, 181); @@ -206,27 +210,27 @@ label3.TabIndex = 1; label3.Text = "输入参数"; // - // btnPath + // btnPrePath // - btnPath.BorderWidth = 2F; - btnPath.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); - btnPath.Ghost = true; - btnPath.IconRatio = 0.8F; - btnPath.IconSvg = resources.GetString("btnPath.IconSvg"); - btnPath.Location = new Point(620, 79); - btnPath.Name = "btnPath"; - btnPath.Size = new Size(80, 38); - btnPath.TabIndex = 7; - btnPath.Text = "打开"; + btnPrePath.BorderWidth = 2F; + btnPrePath.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnPrePath.Ghost = true; + btnPrePath.IconRatio = 0.8F; + btnPrePath.IconSvg = resources.GetString("btnPrePath.IconSvg"); + btnPrePath.Location = new Point(620, 79); + btnPrePath.Name = "btnPrePath"; + btnPrePath.Size = new Size(80, 38); + btnPrePath.TabIndex = 7; + btnPrePath.Text = "打开"; // - // swtPre + // sthPreStatus // - swtPre.CheckedText = "启用"; - swtPre.Location = new Point(207, 33); - swtPre.Name = "swtPre"; - swtPre.Size = new Size(82, 33); - swtPre.TabIndex = 4; - swtPre.UnCheckedText = "关闭"; + sthPreStatus.CheckedText = "启用"; + sthPreStatus.Location = new Point(207, 33); + sthPreStatus.Name = "sthPreStatus"; + sthPreStatus.Size = new Size(82, 33); + sthPreStatus.TabIndex = 4; + sthPreStatus.UnCheckedText = "关闭"; // // label2 // @@ -240,7 +244,7 @@ // iptPrePath.Location = new Point(191, 79); iptPrePath.Name = "iptPrePath"; - iptPrePath.PlaceholderText = "请点击打开按钮选择预处理路径"; + iptPrePath.PlaceholderText = "请点击打开按钮选择模型路径"; iptPrePath.ReadOnly = true; iptPrePath.Size = new Size(423, 42); iptPrePath.TabIndex = 1; @@ -260,34 +264,33 @@ tabPage2.Controls.Add(lableTable); tabPage2.Controls.Add(label15); tabPage2.Controls.Add(btnPic); - tabPage2.Controls.Add(switch6); + tabPage2.Controls.Add(sthDetectNG); tabPage2.Controls.Add(label13); - tabPage2.Controls.Add(switch7); + tabPage2.Controls.Add(sthOKDetect); tabPage2.Controls.Add(label14); - tabPage2.Controls.Add(switch4); + tabPage2.Controls.Add(sthNGOriginal); tabPage2.Controls.Add(label6); - tabPage2.Controls.Add(switch5); + tabPage2.Controls.Add(sthOKOriginal); tabPage2.Controls.Add(label12); - tabPage2.Controls.Add(iptScore); + tabPage2.Controls.Add(iptConfidence); tabPage2.Controls.Add(label5); - tabPage2.Controls.Add(flowPanel1); + tabPage2.Controls.Add(flowCameraPanel); tabPage2.Controls.Add(label11); - tabPage2.Controls.Add(swIsAddStation); + tabPage2.Controls.Add(sthStation); tabPage2.Controls.Add(label10); tabPage2.Controls.Add(stDetectType); tabPage2.Controls.Add(label9); tabPage2.Controls.Add(btnCorrelatedCamera); tabPage2.Controls.Add(btnPath2); - tabPage2.Controls.Add(swIsEnabled); + tabPage2.Controls.Add(sthDetectStatus); tabPage2.Controls.Add(label7); - tabPage2.Controls.Add(iptModelPath); + tabPage2.Controls.Add(iptDetectPath); tabPage2.Controls.Add(label8); - tabPage2.Location = new Point(-909, -575); + tabPage2.Location = new Point(3, 31); tabPage2.Name = "tabPage2"; tabPage2.Size = new Size(909, 575); tabPage2.TabIndex = 1; tabPage2.Text = "模型检测"; - tabPage2.Click += tabPage2_Click; // // btnLableDelete // @@ -317,7 +320,8 @@ // // lableTable // - lableTable.BackColor = SystemColors.ControlLight; + lableTable.BackColor = SystemColors.Window; + lableTable.EmptyHeader = true; lableTable.Location = new Point(110, 252); lableTable.Name = "lableTable"; lableTable.Size = new Size(656, 288); @@ -345,14 +349,14 @@ btnPic.TabIndex = 44; btnPic.Text = "查看图片"; // - // switch6 + // sthDetectNG // - switch6.CheckedText = "启用"; - switch6.Location = new Point(607, 194); - switch6.Name = "switch6"; - switch6.Size = new Size(82, 33); - switch6.TabIndex = 43; - switch6.UnCheckedText = "关闭"; + sthDetectNG.CheckedText = "启用"; + sthDetectNG.Location = new Point(607, 194); + sthDetectNG.Name = "sthDetectNG"; + sthDetectNG.Size = new Size(82, 33); + sthDetectNG.TabIndex = 43; + sthDetectNG.UnCheckedText = "关闭"; // // label13 // @@ -362,14 +366,14 @@ label13.TabIndex = 42; label13.Text = "NG检测图"; // - // switch7 + // sthOKDetect // - switch7.CheckedText = "启用"; - switch7.Location = new Point(438, 194); - switch7.Name = "switch7"; - switch7.Size = new Size(82, 33); - switch7.TabIndex = 41; - switch7.UnCheckedText = "关闭"; + sthOKDetect.CheckedText = "启用"; + sthOKDetect.Location = new Point(438, 194); + sthOKDetect.Name = "sthOKDetect"; + sthOKDetect.Size = new Size(82, 33); + sthOKDetect.TabIndex = 41; + sthOKDetect.UnCheckedText = "关闭"; // // label14 // @@ -379,14 +383,14 @@ label14.TabIndex = 40; label14.Text = "OK检测图"; // - // switch4 + // sthNGOriginal // - switch4.CheckedText = "启用"; - switch4.Location = new Point(270, 194); - switch4.Name = "switch4"; - switch4.Size = new Size(82, 33); - switch4.TabIndex = 39; - switch4.UnCheckedText = "关闭"; + sthNGOriginal.CheckedText = "启用"; + sthNGOriginal.Location = new Point(270, 194); + sthNGOriginal.Name = "sthNGOriginal"; + sthNGOriginal.Size = new Size(82, 33); + sthNGOriginal.TabIndex = 39; + sthNGOriginal.UnCheckedText = "关闭"; // // label6 // @@ -396,14 +400,14 @@ label6.TabIndex = 38; label6.Text = "NG原图"; // - // switch5 + // sthOKOriginal // - switch5.CheckedText = "启用"; - switch5.Location = new Point(110, 194); - switch5.Name = "switch5"; - switch5.Size = new Size(82, 33); - switch5.TabIndex = 37; - switch5.UnCheckedText = "关闭"; + sthOKOriginal.CheckedText = "启用"; + sthOKOriginal.Location = new Point(110, 194); + sthOKOriginal.Name = "sthOKOriginal"; + sthOKOriginal.Size = new Size(82, 33); + sthOKOriginal.TabIndex = 37; + sthOKOriginal.UnCheckedText = "关闭"; // // label12 // @@ -413,13 +417,14 @@ label12.TabIndex = 36; label12.Text = "OK原图"; // - // iptScore + // iptConfidence // - iptScore.Location = new Point(649, 24); - iptScore.Name = "iptScore"; - iptScore.PlaceholderText = ""; - iptScore.Size = new Size(117, 42); - iptScore.TabIndex = 35; + iptConfidence.Location = new Point(649, 24); + iptConfidence.Name = "iptConfidence"; + iptConfidence.PlaceholderText = ""; + iptConfidence.ReadOnly = true; + iptConfidence.Size = new Size(117, 42); + iptConfidence.TabIndex = 35; // // label5 // @@ -429,15 +434,15 @@ label5.TabIndex = 34; label5.Text = "置信度"; // - // flowPanel1 + // flowCameraPanel // - flowPanel1.AutoScroll = true; - flowPanel1.BackColor = SystemColors.ControlLight; - flowPanel1.Location = new Point(110, 136); - flowPanel1.Name = "flowPanel1"; - flowPanel1.Size = new Size(656, 49); - flowPanel1.TabIndex = 33; - flowPanel1.Text = "flowPanel1"; + flowCameraPanel.AutoScroll = true; + flowCameraPanel.BackColor = SystemColors.Window; + flowCameraPanel.Location = new Point(110, 136); + flowCameraPanel.Name = "flowCameraPanel"; + flowCameraPanel.Size = new Size(656, 49); + flowCameraPanel.TabIndex = 33; + flowCameraPanel.Text = "flowPanel1"; // // label11 // @@ -447,14 +452,14 @@ label11.TabIndex = 32; label11.Text = "关联相机"; // - // swIsAddStation + // sthStation // - swIsAddStation.CheckedText = "启用"; - swIsAddStation.Location = new Point(270, 26); - swIsAddStation.Name = "swIsAddStation"; - swIsAddStation.Size = new Size(82, 33); - swIsAddStation.TabIndex = 31; - swIsAddStation.UnCheckedText = "关闭"; + sthStation.CheckedText = "启用"; + sthStation.Location = new Point(270, 26); + sthStation.Name = "sthStation"; + sthStation.Size = new Size(82, 33); + sthStation.TabIndex = 31; + sthStation.UnCheckedText = "关闭"; // // label10 // @@ -508,14 +513,14 @@ btnPath2.TabIndex = 20; btnPath2.Text = "打开"; // - // swIsEnabled + // sthDetectStatus // - swIsEnabled.CheckedText = "启用"; - swIsEnabled.Location = new Point(110, 26); - swIsEnabled.Name = "swIsEnabled"; - swIsEnabled.Size = new Size(82, 33); - swIsEnabled.TabIndex = 19; - swIsEnabled.UnCheckedText = "关闭"; + sthDetectStatus.CheckedText = "启用"; + sthDetectStatus.Location = new Point(110, 26); + sthDetectStatus.Name = "sthDetectStatus"; + sthDetectStatus.Size = new Size(82, 33); + sthDetectStatus.TabIndex = 19; + sthDetectStatus.UnCheckedText = "关闭"; // // label7 // @@ -525,14 +530,14 @@ label7.TabIndex = 18; label7.Text = "状 态"; // - // iptModelPath + // iptDetectPath // - iptModelPath.Location = new Point(110, 75); - iptModelPath.Name = "iptModelPath"; - iptModelPath.PlaceholderText = "请点击打开按钮选择模型路径"; - iptModelPath.ReadOnly = true; - iptModelPath.Size = new Size(656, 42); - iptModelPath.TabIndex = 17; + iptDetectPath.Location = new Point(110, 75); + iptDetectPath.Name = "iptDetectPath"; + iptDetectPath.PlaceholderText = "请点击打开按钮选择模型路径"; + iptDetectPath.ReadOnly = true; + iptDetectPath.Size = new Size(656, 42); + iptDetectPath.TabIndex = 17; // // label8 // @@ -556,7 +561,6 @@ tabPage4.Controls.Add(btnSizeDel); tabPage4.Controls.Add(btnSizeAdd); tabPage4.Controls.Add(SizeTable); - tabPage4.Controls.Add(label17); tabPage4.Location = new Point(8, 8); tabPage4.Name = "tabPage4"; tabPage4.Size = new Size(909, 575); @@ -570,7 +574,7 @@ btnSizeDel.Ghost = true; btnSizeDel.IconRatio = 0.8F; btnSizeDel.IconSvg = resources.GetString("btnSizeDel.IconSvg"); - btnSizeDel.Location = new Point(775, 192); + btnSizeDel.Location = new Point(745, 147); btnSizeDel.Name = "btnSizeDel"; btnSizeDel.Size = new Size(80, 38); btnSizeDel.TabIndex = 10; @@ -583,7 +587,7 @@ btnSizeAdd.Ghost = true; btnSizeAdd.IconRatio = 0.8F; btnSizeAdd.IconSvg = resources.GetString("btnSizeAdd.IconSvg"); - btnSizeAdd.Location = new Point(775, 148); + btnSizeAdd.Location = new Point(745, 103); btnSizeAdd.Name = "btnSizeAdd"; btnSizeAdd.Size = new Size(80, 38); btnSizeAdd.TabIndex = 9; @@ -591,21 +595,13 @@ // // SizeTable // - SizeTable.AutoSizeColumnsMode = AntdUI.ColumnsMode.Fill; - SizeTable.Location = new Point(38, 65); + SizeTable.EmptyHeader = true; + SizeTable.Location = new Point(20, 52); SizeTable.Name = "SizeTable"; - SizeTable.Size = new Size(705, 455); + SizeTable.Size = new Size(706, 402); SizeTable.TabIndex = 8; SizeTable.Text = "table1"; // - // label17 - // - label17.Location = new Point(38, 24); - label17.Name = "label17"; - label17.Size = new Size(91, 23); - label17.TabIndex = 1; - label17.Text = "配 置"; - // // DetectControl // AutoScaleDimensions = new SizeF(7F, 17F); @@ -631,8 +627,8 @@ private AntdUI.Label label1; private AntdUI.Input iptPrePath; private AntdUI.Label label2; - private AntdUI.Switch swtPre; - private AntdUI.Button btnPath; + private AntdUI.Switch sthPreStatus; + private AntdUI.Button btnPrePath; private AntdUI.Label label3; private AntdUI.Button btnPreDelete; private AntdUI.Button btnPreAdd; @@ -643,25 +639,25 @@ private AntdUI.Table PreOutTable; private AntdUI.Button btnCorrelatedCamera; private AntdUI.Button btnPath2; - private AntdUI.Switch swIsEnabled; + private AntdUI.Switch sthDetectStatus; private AntdUI.Label label7; - private AntdUI.Input iptModelPath; + private AntdUI.Input iptDetectPath; private AntdUI.Label label8; private AntdUI.Select stDetectType; private AntdUI.Label label9; - private AntdUI.Switch swIsAddStation; + private AntdUI.Switch sthStation; private AntdUI.Label label10; private AntdUI.Label label11; - private AntdUI.FlowPanel flowPanel1; + private AntdUI.FlowPanel flowCameraPanel; private AntdUI.Label label5; - private AntdUI.Input iptScore; - private AntdUI.Switch switch4; + private AntdUI.Input iptConfidence; + private AntdUI.Switch sthNGOriginal; private AntdUI.Label label6; - private AntdUI.Switch switch5; + private AntdUI.Switch sthOKOriginal; private AntdUI.Label label12; - private AntdUI.Switch switch6; + private AntdUI.Switch sthDetectNG; private AntdUI.Label label13; - private AntdUI.Switch switch7; + private AntdUI.Switch sthOKDetect; private AntdUI.Label label14; private AntdUI.Button btnPic; private AntdUI.Label label15; @@ -672,6 +668,5 @@ private AntdUI.Button btnSizeDel; private AntdUI.Button btnSizeAdd; private AntdUI.Table SizeTable; - private AntdUI.Label label17; } } diff --git a/DHSoftware/Views/DetectControl.cs b/DHSoftware/Views/DetectControl.cs index f774106..bbb0d4d 100644 --- a/DHSoftware/Views/DetectControl.cs +++ b/DHSoftware/Views/DetectControl.cs @@ -1,19 +1,12 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; +using System.ComponentModel; using System.Data; -using System.Drawing; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.Xml.Linq; using AntdUI; +using DH.Commons.Base; using DH.Commons.Enums; -using DH.Devices.Vision; +using DH.Devices.PLC; using XKRS.CanFly; -using static AntdUI.Table; +using static System.Windows.Forms.AxHost; using static DH.Commons.Enums.EnumHelper; namespace DHSoftware.Views @@ -21,88 +14,11 @@ namespace DHSoftware.Views public partial class DetectControl : UserControl { Window window; - // DetectionConfig detectionConfig; - private DetectionConfig _config; - List relatedCameras = new List(); - - AntList PreTreatList; - AntList PreOutTreatList; - AntList DetectionLableList; - AntList SizeLableList; - PreTreatParam curPreTreat; - PreTreatParam curPreOutTreat; - DetectionLable curDetectionLable; - SizeTreatParam SizeParamLable; - public DetectionConfig detectionConfig - { - get => _config; - set - { - if (_config != null) - { - _config.PropertyChanged -= Config_PropertyChanged; // 解绑旧的 - } - - _config = value; - - if (_config != null) - { - _config.PropertyChanged += Config_PropertyChanged; // 绑定新的 - UpdateUI(); // 初始化 UI - } - } - } - private void Config_PropertyChanged(object sender, PropertyChangedEventArgs e) - { - // 监听所有属性变化 - switch (e.PropertyName) - { - case nameof(DetectionConfig.IsAddStation): - swIsAddStation.Checked = _config.IsAddStation; - break; - case nameof(DetectionConfig.IsEnabled): - swIsEnabled.Checked = _config.IsEnabled; - break; - case nameof(DetectionConfig.ModelType): - stDetectType.SelectedIndex = (int)_config.ModelType-1; - break; - case nameof(DetectionConfig.ModelconfThreshold): - if (iptScore.InvokeRequired) - { - iptScore.Invoke(() => iptScore.Text = _config.ModelconfThreshold.ToString()); - } - else - { - iptScore.Text = _config.ModelconfThreshold.ToString(); - } - break; - - - case nameof(DetectionConfig.PreTreatCollects): - - break; - - } - } - - - private void UpdateUI() - { - if (_config == null) return; - - swIsAddStation.Checked = _config.IsAddStation; - swIsEnabled.Checked = _config.IsEnabled; - stDetectType.SelectedIndex = (int)_config.ModelType - 1; - iptScore.Text = _config.ModelconfThreshold.ToString(); - iptModelPath.Text = _config.ModelPath; - swtPre.Checked = _config.IsPreEnabled; - iptPrePath.Text = _config.HalconAlgorithemPath_Pre; - // textBoxName.Text = _config.Name; - // checkBoxEnableGPU.Checked = _config.IsEnableGPU; - } - public DetectControl(Window _window) + DetectionConfig detectionConfig; + public DetectControl(Window _window, DetectionConfig _detection) { window = _window; + detectionConfig = _detection; InitializeComponent(); //this.detectionConfig = detectionConfig; //初始化表格列头 @@ -216,7 +132,7 @@ namespace DHSoftware.Views private void BindEventHandler() { //预处理 - btnPath.Click += btnPath_Click; + btnPrePath.Click += btnPath_Click; btnPreAdd.Click += BtnPreAdd_Click; ; btnPreDelete.Click += BtnPreDelete_Click; ; preTable.CellClick += PreTable_CellClick; ; @@ -248,12 +164,11 @@ namespace DHSoftware.Views if (e.Record is DetectionLable DetectionLable) { - curDetectionLable = DetectionLable; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": - var form = new DetectionLableEdit(window, curDetectionLable) { Size = new Size(500, 300) }; + var form = new DetectionLableEdit(window, DetectionLable) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => @@ -269,7 +184,7 @@ namespace DHSoftware.Views case "删除": var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) - DetectionLableList.Remove(DetectionLable); + detectionConfig.DetectionLableList.Remove(DetectionLable); break; } @@ -283,12 +198,11 @@ namespace DHSoftware.Views if (e.Record is SizeTreatParam sizeTreat) { - SizeParamLable = sizeTreat; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": - var form = new SizeLabelEdit(window, SizeParamLable) { Size = new Size(500, 300) }; + var form = new SizeLabelEdit(window, sizeTreat) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => @@ -306,11 +220,10 @@ namespace DHSoftware.Views case "删除": var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) - SizeLableList.Remove(sizeTreat); - UpdatePreTreatCollectsFromSizeTable(); + detectionConfig.SizeTreatParamList.Remove(sizeTreat); break; case "进行测量": - var sizeType = ((int)SizeParamLable.PreType).ToString(); + var sizeType = ((int)sizeTreat.PreType).ToString(); // 根据测量类型打开不同的窗口 switch (sizeType) @@ -350,7 +263,7 @@ namespace DHSoftware.Views private void BtnLableDelete_Click(object? sender, EventArgs e) { - if (DetectionLableList.Count == 0 || !DetectionLableList.Any(x => x.Selected)) + if (detectionConfig.DetectionLableList.Count == 0 || !detectionConfig.DetectionLableList.Any(x => x.Selected)) { AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); return; @@ -360,12 +273,12 @@ namespace DHSoftware.Views if (result == DialogResult.OK) { // 使用反转for循环删除主列表中选中的项 - for (int i = DetectionLableList.Count - 1; i >= 0; i--) + for (int i = detectionConfig.DetectionLableList.Count - 1; i >= 0; i--) { // 删除选中的主列表项 - if (DetectionLableList[i].Selected) + if (detectionConfig.DetectionLableList[i].Selected) { - DetectionLableList.RemoveAt(i); + detectionConfig.DetectionLableList.RemoveAt(i); } } // 提示删除完成 @@ -389,13 +302,13 @@ namespace DHSoftware.Views }); if (form.submit) { - DetectionLableList.Add(detectionLable); + detectionConfig.DetectionLableList.Add(detectionLable); } } private void BtnSizeDelete_Click(object? sender, EventArgs e) { - if (SizeLableList.Count == 0 || !SizeLableList.Any(x => x.Selected)) + if (detectionConfig.SizeTreatParamList.Count == 0 || !detectionConfig.SizeTreatParamList.Any(x => x.Selected)) { AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); return; @@ -405,12 +318,12 @@ namespace DHSoftware.Views if (result == DialogResult.OK) { // 使用反转for循环删除主列表中选中的项 - for (int i = SizeLableList.Count - 1; i >= 0; i--) + for (int i = detectionConfig.SizeTreatParamList.Count - 1; i >= 0; i--) { // 删除选中的主列表项 - if (SizeLableList[i].Selected) + if (detectionConfig.SizeTreatParamList[i].Selected) { - SizeLableList.RemoveAt(i); + detectionConfig.SizeTreatParamList.RemoveAt(i); } } // 提示删除完成 @@ -439,7 +352,7 @@ namespace DHSoftware.Views }); if (form.submit) { - SizeLableList.Add(SizeParamLable); + detectionConfig.SizeTreatParamList.Add(SizeParamLable); } } @@ -448,22 +361,48 @@ namespace DHSoftware.Views } - private void BtnCorrelatedCamera_Click(object? sender, EventArgs e) { - - - var form = new CorrelatedCameraEdit(window, relatedCameras) { Size = new Size(500, 400) }; + var form = new CorrelatedCameraEdit(window, detectionConfig.CameraCollects) { Size = new Size(500, 400) }; AntdUI.Modal.open(new AntdUI.Modal.Config(window, "", form, TType.None) { BtnHeight = 0, }); if (form.submit) { - flowPanel1.Controls.Clear(); - InitRelatedCamera(); - detectionConfig.CameraCollects=relatedCameras; + flowCameraPanel.Controls.Clear(); + if (detectionConfig.CameraCollects.Count > 0) + { + foreach (var item in detectionConfig.CameraCollects) + { + var control = new AntdUI.Tag() + { + Font = new System.Drawing.Font("Microsoft YaHei UI", 9F), + Size = new Size(90, 42), + Text = item.CameraSourceId, + CloseIcon = true + }; + control.CloseChanged += (sender, e) => + { + var tag = sender as Tag; + foreach (var item in detectionConfig.CameraCollects) + { + if (item.CameraSourceId.Equals(tag.Text)) + { + detectionConfig.CameraCollects.Remove(item); + break; + } + } + return true; + + }; + // 通过主窗口设置DPI控制添加控件保持缩放比例 + window.AutoDpi(control); + flowCameraPanel.Controls.Add(control); + control.BringToFront(); + } + } } } @@ -488,8 +427,8 @@ namespace DHSoftware.Views { string filePath = openFileDialog.FileName; - iptModelPath.Text = filePath; - _config.ModelPath = filePath; + iptDetectPath.Text = filePath; + } } } @@ -500,12 +439,11 @@ namespace DHSoftware.Views if (e.Record is PreTreatParam PreTreat) { - curPreOutTreat = PreTreat; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": - var form = new PreTreatEdit(window, curPreOutTreat) { Size = new Size(500, 300) }; + var form = new PreTreatEdit(window, PreTreat) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => @@ -521,7 +459,7 @@ namespace DHSoftware.Views case "删除": var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) - PreOutTreatList.Remove(PreTreat); + detectionConfig.OUTPreTreatParams.Remove(PreTreat); break; } @@ -530,7 +468,7 @@ namespace DHSoftware.Views private void BtnOutDelete_Click(object? sender, EventArgs e) { - if (PreOutTreatList.Count == 0 || !PreOutTreatList.Any(x => x.Selected)) + if (detectionConfig.OUTPreTreatParams.Count == 0 || !detectionConfig.OUTPreTreatParams.Any(x => x.Selected)) { AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); return; @@ -540,12 +478,12 @@ namespace DHSoftware.Views if (result == DialogResult.OK) { // 使用反转for循环删除主列表中选中的项 - for (int i = PreOutTreatList.Count - 1; i >= 0; i--) + for (int i = detectionConfig.OUTPreTreatParams.Count - 1; i >= 0; i--) { // 删除选中的主列表项 - if (PreOutTreatList[i].Selected) + if (detectionConfig.OUTPreTreatParams[i].Selected) { - PreOutTreatList.RemoveAt(i); + detectionConfig.OUTPreTreatParams.RemoveAt(i); } } // 提示删除完成 @@ -570,7 +508,7 @@ namespace DHSoftware.Views }); if (form.submit) { - PreOutTreatList.Add(preParam); + detectionConfig.OUTPreTreatParams.Add(preParam); } } @@ -580,12 +518,11 @@ namespace DHSoftware.Views if (e.Record is PreTreatParam PreTreat) { - curPreTreat = PreTreat; switch (buttontext) { //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 case "编辑": - var form = new PreTreatEdit(window, curPreTreat) { Size = new Size(500, 300) }; + var form = new PreTreatEdit(window, PreTreat) { Size = new Size(500, 300) }; AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) { OnLoad = () => @@ -601,7 +538,7 @@ namespace DHSoftware.Views case "删除": var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); if (result == DialogResult.OK) - PreTreatList.Remove(PreTreat); + detectionConfig.PreTreatParams.Remove(PreTreat); break; } @@ -616,7 +553,7 @@ namespace DHSoftware.Views private void BtnPreDelete_Click(object? sender, EventArgs e) { - if (PreTreatList.Count == 0 || !PreTreatList.Any(x => x.Selected)) + if (detectionConfig.PreTreatParams.Count == 0 || !detectionConfig.PreTreatParams.Any(x => x.Selected)) { AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); return; @@ -626,12 +563,12 @@ namespace DHSoftware.Views if (result == DialogResult.OK) { // 使用反转for循环删除主列表中选中的项 - for (int i = PreTreatList.Count - 1; i >= 0; i--) + for (int i = detectionConfig.PreTreatParams.Count - 1; i >= 0; i--) { // 删除选中的主列表项 - if (PreTreatList[i].Selected) + if (detectionConfig.PreTreatParams[i].Selected) { - PreTreatList.RemoveAt(i); + detectionConfig.PreTreatParams.RemoveAt(i); } } // 提示删除完成 @@ -655,7 +592,7 @@ namespace DHSoftware.Views }); if (form.submit) { - PreTreatList.Add(preParam); + detectionConfig.PreTreatParams.Add(preParam); } } @@ -697,74 +634,98 @@ namespace DHSoftware.Views } } - + + private void InitData() { - relatedCameras = detectionConfig.CameraCollects; - InitRelatedCamera(); - - // swIsAddStation. = detectionConfig.IsAddStation; - PreTreatList = new AntList(); - foreach (var item in detectionConfig.PreTreatParams) + stDetectType.Items.Clear(); + foreach (ModelType value in Enum.GetValues(typeof(ModelType))) { - PreTreatParam lable = item; - lable.CellLinks = new CellLink[] { - new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), - new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), - }; - PreTreatList.Add(lable); + stDetectType.Items.Add(value.ToString()); } - preTable.Binding(PreTreatList); + preTable.Binding(detectionConfig.PreTreatParams); + PreOutTable.Binding(detectionConfig.OUTPreTreatParams); + lableTable.Binding(detectionConfig.DetectionLableList); + SizeTable.Binding(detectionConfig.SizeTreatParamList); - PreOutTreatList = new AntList(); - foreach (var item in detectionConfig.OUTPreTreatParams) + + if (detectionConfig.PreTreatParams.Count > 0) { - PreTreatParam lable = item; - lable.CellLinks = new CellLink[] { - new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), - new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), - }; - PreOutTreatList.Add(lable); + foreach (var item in detectionConfig.PreTreatParams) + { + + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } } - PreOutTable.Binding(PreOutTreatList); - - - - - DetectionLableList = new AntList(); - foreach (var item in detectionConfig.DetectionLableList) + if (detectionConfig.OUTPreTreatParams.Count > 0) { - DetectionLable lable = item; - lable.CellLinks = new CellLink[] { - new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), - new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), - }; - DetectionLableList.Add(lable); + foreach (var item in detectionConfig.OUTPreTreatParams) + { + + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } } - - - lableTable.Binding(DetectionLableList); - - // SizeLableList = new AntList(_config.PreTreatCollects); - foreach (var item in _config.PreTreatCollects) + if (detectionConfig.DetectionLableList.Count > 0) { + foreach (var item in detectionConfig.DetectionLableList) + { - - item.CellLinks = new CellLink[] { - new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), - new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), - new CellButton(Guid.NewGuid().ToString(),"进行测量",TTypeMini.Primary) - }; - // SizeLableList.Add(item); + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } } - // 将 List 转换为 AntList - SizeLableList = new AntList(_config.PreTreatCollects); + if (detectionConfig.SizeTreatParamList.Count > 0) + { + foreach (var item in detectionConfig.SizeTreatParamList) + { - // 绑定转换后的数据到 SizeTable - SizeTable.Binding(SizeLableList); - //SizeTable.Binding(_config.PreTreatCollects); + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error), + new CellButton(Guid.NewGuid().ToString(),"进行测量",TTypeMini.Primary) + }; + } + } + if (detectionConfig.CameraCollects.Count > 0) + { + foreach (var item in detectionConfig.CameraCollects) + { + var control = new AntdUI.Tag() + { + Font = new System.Drawing.Font("Microsoft YaHei UI", 9F), + Size = new Size(90, 42), + Text = item.CameraSourceId, + CloseIcon = true + }; + window.AutoDpi(control); + flowCameraPanel.Controls.Add(control); + control.BringToFront(); + } + } + //1 + sthPreStatus.DataBindings.Add("Checked", detectionConfig, "IsPreEnabled", true, DataSourceUpdateMode.OnPropertyChanged); + iptPrePath.DataBindings.Add("Text", detectionConfig, "HalconAlgorithemPath_Pre", true, DataSourceUpdateMode.OnPropertyChanged); + + //2 + sthDetectStatus.DataBindings.Add("Checked", detectionConfig, "IsEnabled", true, DataSourceUpdateMode.OnPropertyChanged); + sthStation.DataBindings.Add("Checked", detectionConfig, "IsAddStation", true, DataSourceUpdateMode.OnPropertyChanged); + stDetectType.DataBindings.Add("Text", detectionConfig, "ModelType", true, DataSourceUpdateMode.OnPropertyChanged); + iptConfidence.DataBindings.Add("Text", detectionConfig, "ModelconfThreshold", true, DataSourceUpdateMode.OnPropertyChanged); + iptDetectPath.DataBindings.Add("Text", detectionConfig, "ModelPath", true, DataSourceUpdateMode.OnPropertyChanged); + sthOKOriginal.DataBindings.Add("Checked", detectionConfig, "SaveOKOriginal", true, DataSourceUpdateMode.OnPropertyChanged); + sthNGOriginal.DataBindings.Add("Checked", detectionConfig, "SaveNGOriginal", true, DataSourceUpdateMode.OnPropertyChanged); + sthOKDetect.DataBindings.Add("Checked", detectionConfig, "SaveOKDetect", true, DataSourceUpdateMode.OnPropertyChanged); + sthDetectNG.DataBindings.Add("Checked", detectionConfig, "SaveNGDetect", true, DataSourceUpdateMode.OnPropertyChanged); } @@ -788,9 +749,9 @@ namespace DHSoftware.Views lableTable.Columns = new ColumnCollection() { new ColumnCheck("Selected"){Fixed = true}, new Column("LabelName", "名称", ColumnAlign.Center), - new Column("MinSource", "最小得分",ColumnAlign.Center), - new Column("MaxArea", "最大得分", ColumnAlign.Center), - new Column("MinSource", "最小面积",ColumnAlign.Center), + new Column("MinScore", "最小得分",ColumnAlign.Center), + new Column("MaxScore", "最大得分", ColumnAlign.Center), + new Column("MinArea", "最小面积",ColumnAlign.Center), new Column("MaxArea", "最大面积", ColumnAlign.Center), new Column("ResultState", "结果", ColumnAlign.Center), new Column("CellLinks", "操作", ColumnAlign.Center) @@ -831,42 +792,6 @@ namespace DHSoftware.Views } } } - - - - - - List> MLModelTypes = GetFilteredEnumDescriptionsAndValues(); - List> SizeEnum = GetFilteredEnumDescriptionsAndValues(); - - private void tabPage2_Click(object sender, EventArgs e) - { - - } - - private void DetectControl_Load(object sender, EventArgs e) - { - InitData(); - - } - - public static List> GetFilteredEnumDescriptionsAndValues() where T : Enum - { - return Enum.GetValues(typeof(T)) - .Cast() - .Select(e => - { - // 获取枚举的 Description 属性,如果没有,则使用枚举的名称 - var description = e.GetType() - .GetField(e.ToString()) - ?.GetCustomAttribute() - ?.Description ?? e.ToString(); - - // 返回枚举的描述和对应的整数值 - return new KeyValuePair(description, Convert.ToInt32(e)); - }) - .ToList(); - } } } diff --git a/DHSoftware/Views/DetectControl.resx b/DHSoftware/Views/DetectControl.resx index a0dc3a8..d97480c 100644 --- a/DHSoftware/Views/DetectControl.resx +++ b/DHSoftware/Views/DetectControl.resx @@ -129,7 +129,7 @@ <svg t="1741939836774" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21349" width="200" height="200"><path d="M1003.153333 404.96a52.933333 52.933333 0 0 0-42.38-20.96H896V266.666667a53.393333 53.393333 0 0 0-53.333333-53.333334H461.253333a10.573333 10.573333 0 0 1-7.54-3.126666L344.46 100.953333A52.986667 52.986667 0 0 0 306.746667 85.333333H53.333333a53.393333 53.393333 0 0 0-53.333333 53.333334v704a53.393333 53.393333 0 0 0 53.333333 53.333333h796.893334a53.453333 53.453333 0 0 0 51.453333-39.333333l110.546667-405.333334a52.953333 52.953333 0 0 0-9.073334-46.373333zM53.333333 128h253.413334a10.573333 10.573333 0 0 1 7.54 3.126667l109.253333 109.253333A52.986667 52.986667 0 0 0 461.253333 256H842.666667a10.666667 10.666667 0 0 1 10.666666 10.666667v117.333333H173.773333a53.453333 53.453333 0 0 0-51.453333 39.333333L42.666667 715.366667V138.666667a10.666667 10.666667 0 0 1 10.666666-10.666667zm917.726667 312.14l-110.546667 405.333333a10.666667 10.666667 0 0 1-10.286666 7.86H63.226667a10.666667 10.666667 0 0 1-10.286667-13.473333l110.546667-405.333333A10.666667 10.666667 0 0 1 173.773333 426.666667h787a10.666667 10.666667 0 0 1 10.286667 13.473333z" fill="#5C5C66" p-id="21350"/></svg> - + <svg t="1741939836774" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21349" width="200" height="200"><path d="M1003.153333 404.96a52.933333 52.933333 0 0 0-42.38-20.96H896V266.666667a53.393333 53.393333 0 0 0-53.333333-53.333334H461.253333a10.573333 10.573333 0 0 1-7.54-3.126666L344.46 100.953333A52.986667 52.986667 0 0 0 306.746667 85.333333H53.333333a53.393333 53.393333 0 0 0-53.333333 53.333334v704a53.393333 53.393333 0 0 0 53.333333 53.333333h796.893334a53.453333 53.453333 0 0 0 51.453333-39.333333l110.546667-405.333334a52.953333 52.953333 0 0 0-9.073334-46.373333zM53.333333 128h253.413334a10.573333 10.573333 0 0 1 7.54 3.126667l109.253333 109.253333A52.986667 52.986667 0 0 0 461.253333 256H842.666667a10.666667 10.666667 0 0 1 10.666666 10.666667v117.333333H173.773333a53.453333 53.453333 0 0 0-51.453333 39.333333L42.666667 715.366667V138.666667a10.666667 10.666667 0 0 1 10.666666-10.666667zm917.726667 312.14l-110.546667 405.333333a10.666667 10.666667 0 0 1-10.286666 7.86H63.226667a10.666667 10.666667 0 0 1-10.286667-13.473333l110.546667-405.333333A10.666667 10.666667 0 0 1 173.773333 426.666667h787a10.666667 10.666667 0 0 1 10.286667 13.473333z" fill="#5C5C66" p-id="21350"/></svg> diff --git a/DHSoftware/Views/DetectionLableEdit.cs b/DHSoftware/Views/DetectionLableEdit.cs index ead8cc7..fc1189b 100644 --- a/DHSoftware/Views/DetectionLableEdit.cs +++ b/DHSoftware/Views/DetectionLableEdit.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Reflection; using AntdUI; +using DH.Commons.Base; using DH.Commons.Enums; using DH.Devices.Vision; using static System.Windows.Forms.AxHost; @@ -48,8 +49,8 @@ namespace DHSoftware.Views return; } detectionLable.LabelName = iptName.Text; - detectionLable.MinSource=Convert.ToDouble(iptMinSource.Text); - detectionLable.MaxSource = Convert.ToDouble(iptMaxSource.Text); + detectionLable.MinScore=Convert.ToDouble(iptMinSource.Text); + detectionLable.MaxScore = Convert.ToDouble(iptMaxSource.Text); detectionLable.MinArea = Convert.ToDouble(iptMinArea.Text); detectionLable.MaxArea = Convert.ToDouble(iptMaxArea.Text); ResultState state = EnumHelper.GetEnumFromDescription(sltResultState.Text); @@ -83,8 +84,8 @@ namespace DHSoftware.Views else { iptName.Text = detectionLable.LabelName; - iptMinSource.Text = detectionLable.MinSource.ToString(); - iptMaxSource.Text = detectionLable.MaxSource.ToString(); + iptMinSource.Text = detectionLable.MinScore.ToString(); + iptMaxSource.Text = detectionLable.MaxScore.ToString(); iptMinArea.Text = detectionLable.MinArea.ToString(); iptMaxArea.Text = detectionLable.MaxArea.ToString(); sltResultState.Text= EnumHelper.GetEnumDescription(detectionLable.ResultState); diff --git a/DHSoftware/Views/FrmLog.Designer.cs b/DHSoftware/Views/FrmLog.Designer.cs new file mode 100644 index 0000000..4eb8b94 --- /dev/null +++ b/DHSoftware/Views/FrmLog.Designer.cs @@ -0,0 +1,148 @@ +namespace DHSoftware.Views +{ + partial class FrmLog + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.tsmiClearLog = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.tsmiLogLevels = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiLogSources = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiClearLog2 = new System.Windows.Forms.ToolStripMenuItem(); + this.lvLog = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiClearLog}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(125, 26); + // + // tsmiClearLog + // + this.tsmiClearLog.Name = "tsmiClearLog"; + this.tsmiClearLog.Size = new System.Drawing.Size(124, 22); + this.tsmiClearLog.Text = "清空日志"; + // this.tsmiClearLog.Click += new System.EventHandler(this.tsmiClearLog_Click); + // + // menuStrip1 + // + this.menuStrip1.BackColor = System.Drawing.Color.Transparent; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiLogLevels, + this.tsmiLogSources, + this.tsmiClearLog2}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(800, 25); + this.menuStrip1.TabIndex = 3; + this.menuStrip1.Text = "menuStrip1"; + // + // tsmiLogLevels + // + this.tsmiLogLevels.Name = "tsmiLogLevels"; + this.tsmiLogLevels.Size = new System.Drawing.Size(68, 21); + this.tsmiLogLevels.Text = "日志级别"; + // + // tsmiLogSources + // + this.tsmiLogSources.Name = "tsmiLogSources"; + this.tsmiLogSources.Size = new System.Drawing.Size(68, 21); + this.tsmiLogSources.Text = "日志来源"; + // + // tsmiClearLog2 + // + this.tsmiClearLog2.Name = "tsmiClearLog2"; + this.tsmiClearLog2.Size = new System.Drawing.Size(68, 21); + this.tsmiClearLog2.Text = "清空日志"; + // this.tsmiClearLog2.Click += new System.EventHandler(this.tsmiClearLog2_Click); + // + // lvLog + // + this.lvLog.BackColor = System.Drawing.SystemColors.Control; + this.lvLog.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lvLog.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3}); + this.lvLog.ContextMenuStrip = this.contextMenuStrip1; + this.lvLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvLog.FullRowSelect = true; + this.lvLog.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; + this.lvLog.HideSelection = false; + this.lvLog.Location = new System.Drawing.Point(0, 25); + this.lvLog.MultiSelect = false; + this.lvLog.Name = "lvLog"; + this.lvLog.Size = new System.Drawing.Size(800, 463); + this.lvLog.TabIndex = 5; + this.lvLog.UseCompatibleStateImageBehavior = false; + this.lvLog.View = System.Windows.Forms.View.Details; + this.lvLog.SizeChanged += new System.EventHandler(this.lvLog_SizeChanged); + // + // columnHeader1 + // + this.columnHeader1.Width = 80; + // + // FrmLog + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit; + this.ClientSize = new System.Drawing.Size(800, 488); + this.Controls.Add(this.lvLog); + this.Controls.Add(this.menuStrip1); + //this.MainMenuStrip = this.menuStrip1; + this.Name = "FrmLog"; + this.Text = "日志"; + this.contextMenuStrip1.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiClearLog; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiLogLevels; + private System.Windows.Forms.ToolStripMenuItem tsmiLogSources; + private System.Windows.Forms.ListView lvLog; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ToolStripMenuItem tsmiClearLog2; + //private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem; + } +} \ No newline at end of file diff --git a/DHSoftware/Views/FrmLog.cs b/DHSoftware/Views/FrmLog.cs new file mode 100644 index 0000000..f2c1fc3 --- /dev/null +++ b/DHSoftware/Views/FrmLog.cs @@ -0,0 +1,553 @@ + +using XKRS.UI.Model.Winform; +using Newtonsoft.Json; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using static DH.Commons.Enums.EnumHelper; +using DH.Commons.Enums; +using System.ComponentModel; +using System.Reflection; + + +namespace DHSoftware.Views +{ + public partial class FrmLog : UserControl + { + #region Win32 API双缓冲处理 + private const int LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1036; + private const int LVS_EX_DOUBLEBUFFER = 0x00010000; + + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); + #endregion + + #region 常量配置 + private const string SOURCE_PROCESS = "流程"; + private const int LOG_NUM_LIMIT = 2000; + // private const int BATCH_SIZE = 50; + // 调整常量配置 + private const int BATCH_SIZE = 100; // 从50提升到100 + private const int PROCESS_INTERVAL = 200; // 从100ms调整到200ms + // private const int PROCESS_INTERVAL = 100; + private const int FIRST_COL_WIDTH = 120; + #endregion + + #region 控件状态 + private readonly ConcurrentQueue _logQueue = new ConcurrentQueue(); + private List _logBuffer = new List(); + private List _showLevels = new List(); + private List _showSources = new List(); + private Task _logTask; + private static readonly object _logLock = new object(); + #endregion + + public FrmLog() + { + InitializeComponent(); + InitializeCustomComponents(); + } + + private void InitializeCustomComponents() + { + // 启用双缓冲 + SendMessage(lvLog.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, + LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); + + lvLog.ShowItemToolTips = true; + lvLog.FullRowSelect = true; + lvLog.View = View.Details; + // 启用自定义绘制 + //lvLog.OwnerDraw = true; + //lvLog.DrawColumnHeader += LvLog_DrawColumnHeader; + //lvLog.DrawSubItem += LvLog_DrawSubItem; + //lvLog.DrawItem += LvLog_DrawItem; + + // 初始化列头 + lvLog.Columns.Add("时间", FIRST_COL_WIDTH); + lvLog.Columns.Add("来源", 150); + lvLog.Columns.Add("内容", 400); + + InitializeLevelFilter(); + StartProcessingTask(); + } + + private void InitializeLevelFilter() + { + _showLevels.Clear(); + tsmiLogLevels.DropDownItems.Clear(); + + foreach (LogLevel level in Enum.GetValues(typeof(LogLevel))) + { + var item = new ToolStripMenuItem(level.GetEnumDescription()) + { + CheckOnClick = true, + Checked = true, + Tag = level, + BackColor = level.GetEnumSelectedColor(), + ForeColor = level.GetEnumSelectedFontColor() + }; + item.CheckedChanged += LevelItem_CheckedChanged; + tsmiLogLevels.DropDownItems.Add(item); + _showLevels.Add(level); + } + } + #region 自定义绘制方法 + private void LvLog_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.DrawDefault = true; + } + + private void LvLog_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + var item = e.Item; + var log = item.Tag as LogMsg; + + // 设置背景色 + e.Graphics.FillRectangle(new SolidBrush(log.LogLevel.GetEnumSelectedColor()), e.Bounds); + + // 设置文字颜色 + TextRenderer.DrawText(e.Graphics, e.SubItem.Text, lvLog.Font, + e.Bounds, log.LogLevel.GetEnumSelectedFontColor(), TextFormatFlags.Left); + } + //private ListViewItem CreateLogItem(LogMsg log) + //{ + // var item = new ListViewItem(log.LogTime.ToString("HH:mm:ss.fff")); + // item.SubItems.Add(FormatSource(log)); + // item.SubItems.Add(log.Msg); + // item.Tag = log; // 重要:将日志对象绑定到Tag + // return item; + //} + private void LvLog_DrawItem(object sender, DrawListViewItemEventArgs e) + { + e.DrawDefault = false; // 禁用默认绘制 + } + #endregion + private void StartProcessingTask() + { + lock (_logLock) + { + if (_logTask == null || _logTask.IsCompleted) + { + _logTask = Task.Run(ProcessLogs); + } + } + } + + private async Task ProcessLogs() + { + while (!IsDisposed) + { + try + { + await Task.Delay(PROCESS_INTERVAL); + ProcessBatch(BATCH_SIZE); + } + catch (Exception ex) + { + DebugWrite($"日志处理异常: {ex.Message}"); + } + } + } + + private void ProcessBatch(int batchSize) + { + if (InvokeRequired) + { + BeginInvoke(new Action(() => ProcessBatch(batchSize))); + return; + } + + lvLog.BeginUpdate(); + try + { + var items = new List(); + int processed = 0; + + while (processed < batchSize && _logQueue.TryDequeue(out var log)) + { + _logBuffer.Add(log); + if (ShouldShow(log)) + { + items.Add(CreateLogItem(log)); + processed++; + } + } + + if (items.Count > 0) + { + lvLog.Items.AddRange(items.ToArray()); + MaintainBuffer(); + AutoScrollIfNeeded(); + } + } + finally + { + lvLog.EndUpdate(); + UpdateLayout(); + } + } + + private bool ShouldShow(LogMsg log) + { + return _showLevels.Contains(log.LogLevel) && + (_showSources.Count == 0 || + (string.IsNullOrEmpty(log.MsgSource) ? + _showSources.Contains(SOURCE_PROCESS) : + _showSources.Contains(log.MsgSource))); + } + + private ListViewItem CreateLogItem(LogMsg log) + { + var item = new ListViewItem(log.LogTime.ToString("HH:mm:ss.fff")); + item.SubItems.Add(FormatSource(log)); + item.SubItems.Add(log.Msg); + item.ToolTipText = log.Msg; + item.BackColor = log.LogLevel.GetEnumSelectedColor(); + item.ForeColor = log.LogLevel.GetEnumSelectedFontColor(); + return item; + } + + private string FormatSource(LogMsg log) + { + return string.IsNullOrEmpty(log.MsgSource) ? + SOURCE_PROCESS : + $"{log.MsgSource}[{log.ThreadId}]"; + } + + private void MaintainBuffer() + { + if (_logBuffer.Count > LOG_NUM_LIMIT * 2) + { + _logBuffer = _logBuffer + .Skip(_logBuffer.Count - LOG_NUM_LIMIT) + .ToList(); + RefreshLogs(); + } + } + + public void AddLog(LogMsg log) + { + _logQueue.Enqueue(log); + } + + private void RefreshLogs() + { + lvLog.BeginUpdate(); + try + { + lvLog.Items.Clear(); + var items = _logBuffer + .Where(ShouldShow) + .Select(CreateLogItem); + lvLog.Items.AddRange(items.ToArray()); + } + finally + { + lvLog.EndUpdate(); + UpdateLayout(); + } + } + + private void AutoScrollIfNeeded() + { + try + { + if (lvLog.Items.Count > 0 /*&& chkAutoScroll.Checked*/) + { + lvLog.EnsureVisible(lvLog.Items.Count - 1); + } + } + catch (Exception ex) { + } + + } + + private void UpdateLayout() + { + if (lvLog.Columns.Count < 3) return; + + // 动态调整列宽 + lvLog.Columns[0].Width = FIRST_COL_WIDTH; + lvLog.Columns[1].Width = lvLog.Width > 600 ? 150 : 0; + lvLog.Columns[2].Width = lvLog.ClientSize.Width - + lvLog.Columns[0].Width - + lvLog.Columns[1].Width - + SystemInformation.VerticalScrollBarWidth; + } + + #region 事件处理 + private void LevelItem_CheckedChanged(object sender, EventArgs e) + { + _showLevels = tsmiLogLevels.DropDownItems + .Cast() + .Where(i => i.Checked) + .Select(i => (LogLevel)i.Tag) + .ToList(); + + RefreshLogs(); + } + + private void SourceItem_CheckedChanged(object sender, EventArgs e) + { + _showSources = tsmiLogSources.DropDownItems + .Cast() + .Where(i => i.Checked) + .Select(i => i.Text) + .ToList(); + + RefreshLogs(); + } + + private void tsmiClearLog_Click(object sender, EventArgs e) + { + lvLog.Items.Clear(); + _logBuffer.Clear(); + } + + private void lvLog_SizeChanged(object sender, EventArgs e) + { + UpdateLayout(); + } + #endregion + + #region 辅助方法 + private void DebugWrite(string message) + { + System.Diagnostics.Debug.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] {message}"); + } + #endregion + } + + + //public partial class FrmLog1 : UserControl + //{ + // // 添加双缓冲字段 + // private const int LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1036; + // private const int LVS_EX_DOUBLEBUFFER = 0x00010000; + + // [System.Runtime.InteropServices.DllImport("user32.dll")] + // private static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); + + // public FrmLog() + // { + // InitializeComponent(); + // // 启用双缓冲 + // SendMessage(lvLog.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER); + // lvLog.ShowItemToolTips = true; + + // this.Load += (s, e) => + // { + // _showLevels.Clear(); + // tsmiLogLevels.DropDownItems.Clear(); + // JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(EnumHelper.GetEnumListByType(typeof(LogLevel)))).ForEach(d => + // { + // LogLevel lvl = (LogLevel)((int)d.Value); + // ToolStripMenuItem item = new ToolStripMenuItem(d.Desc.ToString()); + // item.CheckOnClick = true; + // item.Checked = true; + // item.Tag = lvl; + // item.CheckedChanged += LevelItem_CheckedChanged; + + // item.BackColor = lvl.GetEnumSelectedColor(); + // item.ForeColor = lvl.GetEnumSelectedFontColor(); + // tsmiLogLevels.DropDownItems.Add(item); + // _showLevels.Add(lvl); + // }); + // }; + // } + + // //public override void OnProcessUpdated() + // //{ + + + // // Invoke(new Action(() => + // // { + // // _showDevice.Clear(); + // // tsmiLogSources.DropDownItems.Clear(); + // // ToolStripMenuItem processItem = new ToolStripMenuItem(SOURCE_PROCESS); + // // processItem.CheckOnClick = true; + // // processItem.Checked = true; + // // processItem.CheckedChanged += SourceItem_CheckedChanged; + // // tsmiLogSources.DropDownItems.Add(processItem); + // // _showDevice.Add(SOURCE_PROCESS); + + // // Process.DeviceCollection.ForEach(d => + // // { + // // ToolStripMenuItem item = new ToolStripMenuItem(d.Name); + // // item.CheckOnClick = true; + // // item.Checked = true; + // // item.CheckedChanged += SourceItem_CheckedChanged; + // // tsmiLogSources.DropDownItems.Add(item); + // // _showDevice.Add(d.Name); + // // }); + // // })); + // //} + + // private void LevelItem_CheckedChanged(object sender, EventArgs e) + // { + // _showLevels.Clear(); + // foreach (ToolStripMenuItem item in tsmiLogLevels.DropDownItems) + // { + // if (item.Checked) + // { + // LogLevel lv = (LogLevel)Convert.ToInt32(item.Tag); + // _showLevels.Add(lv); + // } + // } + + // RefreshLogs(); + // } + + // private void SourceItem_CheckedChanged(object sender, EventArgs e) + // { + // _showDevice.Clear(); + // foreach (ToolStripMenuItem item in tsmiLogSources.DropDownItems) + // { + // if (item.Checked) + // { + // _showDevice.Add(item.Text); + // } + // } + // RefreshLogs(); + // } + // //public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning); + // readonly ConcurrentQueue _logQueue = new ConcurrentQueue(); + // Task _logTask = null; + // static readonly object _logLock = new object(); + + // List _logBuffer = new List(); + // List _showLevels = new List(); + // List _showDevice = new List(); + // const string SOURCE_PROCESS = "流程"; + // const int LOG_NUM_LIMIT = 20; + + // public void LogDisplay(LogMsg msg) + // { + // _logQueue.Enqueue(msg); + + // lock (_logLock) + // { + // if (_logTask == null) + // { + // _logTask = Task.Run(async () => + // { + // while (true) + // { + // try + // { + // Invoke(new Action(() => + // { + // bool isNeedScroll = false; + // while (_logQueue.TryDequeue(out LogMsg log)) + // { + // _logBuffer.Add(log); + + // if (_showLevels.Contains(log.LogLevel) && (_showDevice.Count == 0 || (string.IsNullOrWhiteSpace(log.MsgSource) && _showDevice.Contains(SOURCE_PROCESS)) || _showDevice.Contains(log.MsgSource))) + // { + // isNeedScroll = true; + + // ListViewItem item = new ListViewItem($"{log.LogTime.ToString("HH:mm:ss.fff")}"); + // item.SubItems.Add($"{log.MsgSource}[{log.ThreadId}]"); + // item.SubItems.Add(log.Msg); + + // item.ToolTipText = log.Msg; + // item.ForeColor = log.LogLevel.GetEnumSelectedFontColor(); + // item.BackColor = log.LogLevel.GetEnumSelectedColor(); + + // lvLog.Items.Add(item); + // } + // } + + // if (_logBuffer.Count > LOG_NUM_LIMIT * 2) + // { + // _logBuffer = _logBuffer.Skip(_logBuffer.Count - LOG_NUM_LIMIT).ToList(); + // RefreshLogs(); + // isNeedScroll = true; + // } + + // if (isNeedScroll && lvLog.Items.Count > 0) + // { + // RefreshLvLayout(); + // } + // })); + // } + // catch (Exception ex) + // { + // } + + // await Task.Delay(2000); + // } + // }); + // } + // } + // } + + // private void RefreshLogs() + // { + // lvLog.Items.Clear(); + + // _logBuffer.ForEach(log => + // { + // if (_showLevels.Contains(log.LogLevel) && ((string.IsNullOrWhiteSpace(log.MsgSource) && _showDevice.Contains(SOURCE_PROCESS)) || _showDevice.Contains(log.MsgSource))) + // { + // ListViewItem item = new ListViewItem($"{log.LogTime.ToString("HH:mm:ss.fff")}"); + // item.SubItems.Add($"{log.MsgSource}[{log.ThreadId}]"); + // item.SubItems.Add(log.Msg); + + // item.ToolTipText = log.Msg; + // item.ForeColor = log.LogLevel.GetEnumSelectedFontColor(); + // item.BackColor = log.LogLevel.GetEnumSelectedColor(); + + // lvLog.Items.Add(item); + // } + // }); + + // RefreshLvLayout(); + // } + + // private void lvLog_SizeChanged(object sender, EventArgs e) + // { + // RefreshLvLayout(); + // } + + // int width_1stCol = 80; + + // public event Action OnLogMsgOutput; + + // private void RefreshLvLayout() + // { + // if (lvLog.Columns.Count <= 0) + // return; + + // lvLog.Columns[0].Width = width_1stCol; + // if (lvLog.Width <= lvLog.Height) + // { + // lvLog.Columns[1].Width = 0; + // } + // else + // { + // lvLog.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); + // } + // lvLog.Columns[2].Width = lvLog.Width - width_1stCol - lvLog.Columns[1].Width - 10; + + // if (lvLog.Items.Count > 0) + // lvLog.EnsureVisible(lvLog.Items.Count - 1); + // } + + // private void tsmiClearLog_Click(object sender, EventArgs e) + // { + // lvLog.Items.Clear(); + // } + + // private void tsmiClearLog2_Click(object sender, EventArgs e) + // { + // lvLog.Items.Clear(); + // } + //} +} diff --git a/DHSoftware/Views/FrmLog.resx b/DHSoftware/Views/FrmLog.resx new file mode 100644 index 0000000..5a1e2fd --- /dev/null +++ b/DHSoftware/Views/FrmLog.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 182, 17 + + \ No newline at end of file diff --git a/DHSoftware/Views/GlobalControl.Designer.cs b/DHSoftware/Views/GlobalControl.Designer.cs new file mode 100644 index 0000000..7dfd36d --- /dev/null +++ b/DHSoftware/Views/GlobalControl.Designer.cs @@ -0,0 +1,526 @@ +namespace DHSoftware.Views +{ + partial class GlobalControl + { + /// + /// 必需的设计器变量。 + /// + 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() + { + AntdUI.Tabs.StyleLine styleLine2 = new AntdUI.Tabs.StyleLine(); + tabs1 = new AntdUI.Tabs(); + tabPage6 = new AntdUI.TabPage(); + tabPage1 = new AntdUI.TabPage(); + TableInitProcess = new AntdUI.Table(); + panel1 = new AntdUI.Panel(); + btnAdd = new AntdUI.Button(); + btnDelete = new AntdUI.Button(); + tabPage2 = new AntdUI.TabPage(); + TableSartProcess = new AntdUI.Table(); + panel2 = new AntdUI.Panel(); + btnSartProcessDelete = new AntdUI.Button(); + btnSartProcessAdd = new AntdUI.Button(); + tabPage3 = new AntdUI.TabPage(); + TableStopProcess = new AntdUI.Table(); + panel3 = new AntdUI.Panel(); + btnStopProcessDelete = new AntdUI.Button(); + btnStopProcessAdd = new AntdUI.Button(); + tabPage4 = new AntdUI.TabPage(); + TableStartReset = new AntdUI.Table(); + panel4 = new AntdUI.Panel(); + btnStartResetDelete = new AntdUI.Button(); + btnStartResetAdd = new AntdUI.Button(); + tabPage5 = new AntdUI.TabPage(); + TableStopReset = new AntdUI.Table(); + panel5 = new AntdUI.Panel(); + btnStopResetDelete = new AntdUI.Button(); + btnStopResetAdd = new AntdUI.Button(); + panel6 = new AntdUI.Panel(); + panel7 = new AntdUI.Panel(); + uiLabel1 = new Sunny.UI.UILabel(); + swhEnableVibrator = new AntdUI.Switch(); + swhEnableBelt = new AntdUI.Switch(); + uiLabel2 = new Sunny.UI.UILabel(); + uiLabel3 = new Sunny.UI.UILabel(); + iptClearTime = new AntdUI.Input(); + tabs1.SuspendLayout(); + tabPage6.SuspendLayout(); + tabPage1.SuspendLayout(); + panel1.SuspendLayout(); + tabPage2.SuspendLayout(); + panel2.SuspendLayout(); + tabPage3.SuspendLayout(); + panel3.SuspendLayout(); + tabPage4.SuspendLayout(); + panel4.SuspendLayout(); + tabPage5.SuspendLayout(); + panel5.SuspendLayout(); + panel6.SuspendLayout(); + SuspendLayout(); + // + // tabs1 + // + tabs1.Dock = DockStyle.Fill; + tabs1.Location = new Point(0, 0); + tabs1.Name = "tabs1"; + tabs1.Pages.Add(tabPage6); + tabs1.Pages.Add(tabPage1); + tabs1.Pages.Add(tabPage2); + tabs1.Pages.Add(tabPage3); + tabs1.Pages.Add(tabPage4); + tabs1.Pages.Add(tabPage5); + tabs1.Size = new Size(898, 530); + tabs1.Style = styleLine2; + tabs1.TabIndex = 26; + tabs1.Text = "tabs1"; + // + // tabPage6 + // + tabPage6.Controls.Add(panel7); + tabPage6.Controls.Add(panel6); + tabPage6.Location = new Point(3, 28); + tabPage6.Name = "tabPage6"; + tabPage6.Size = new Size(892, 499); + tabPage6.TabIndex = 5; + tabPage6.Text = "全局配置"; + // + // tabPage1 + // + tabPage1.Controls.Add(TableInitProcess); + tabPage1.Controls.Add(panel1); + tabPage1.Location = new Point(-892, -499); + tabPage1.Name = "tabPage1"; + tabPage1.Size = new Size(892, 499); + tabPage1.TabIndex = 0; + tabPage1.Text = "流程加载操作"; + // + // TableInitProcess + // + TableInitProcess.Dock = DockStyle.Fill; + TableInitProcess.EmptyHeader = true; + TableInitProcess.Location = new Point(0, 45); + TableInitProcess.Name = "TableInitProcess"; + TableInitProcess.Padding = new Padding(5); + TableInitProcess.Size = new Size(892, 454); + TableInitProcess.TabIndex = 36; + // + // panel1 + // + panel1.Back = Color.Transparent; + panel1.BackColor = SystemColors.Window; + panel1.Controls.Add(btnAdd); + panel1.Controls.Add(btnDelete); + panel1.Dock = DockStyle.Top; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(892, 45); + panel1.TabIndex = 35; + // + // btnAdd + // + btnAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnAdd.Location = new Point(13, 10); + btnAdd.Name = "btnAdd"; + btnAdd.Size = new Size(82, 32); + btnAdd.TabIndex = 35; + btnAdd.Text = "新增"; + btnAdd.Type = AntdUI.TTypeMini.Primary; + btnAdd.WaveSize = 0; + // + // btnDelete + // + btnDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnDelete.Location = new Point(110, 10); + btnDelete.Name = "btnDelete"; + btnDelete.Size = new Size(74, 32); + btnDelete.TabIndex = 36; + btnDelete.Text = "删除"; + btnDelete.Type = AntdUI.TTypeMini.Error; + btnDelete.WaveSize = 0; + // + // tabPage2 + // + tabPage2.Controls.Add(TableSartProcess); + tabPage2.Controls.Add(panel2); + tabPage2.Location = new Point(-669, -499); + tabPage2.Name = "tabPage2"; + tabPage2.Size = new Size(669, 499); + tabPage2.TabIndex = 1; + tabPage2.Text = "流程启动操作"; + // + // TableSartProcess + // + TableSartProcess.Dock = DockStyle.Fill; + TableSartProcess.EmptyHeader = true; + TableSartProcess.Location = new Point(0, 45); + TableSartProcess.Name = "TableSartProcess"; + TableSartProcess.Padding = new Padding(5); + TableSartProcess.Size = new Size(669, 454); + TableSartProcess.TabIndex = 38; + TableSartProcess.Text = "table1"; + // + // panel2 + // + panel2.Back = Color.Transparent; + panel2.BackColor = SystemColors.Window; + panel2.Controls.Add(btnSartProcessDelete); + panel2.Controls.Add(btnSartProcessAdd); + panel2.Dock = DockStyle.Top; + panel2.Location = new Point(0, 0); + panel2.Name = "panel2"; + panel2.Size = new Size(669, 45); + panel2.TabIndex = 37; + panel2.Text = "panel2"; + // + // btnSartProcessDelete + // + btnSartProcessDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSartProcessDelete.Location = new Point(110, 10); + btnSartProcessDelete.Name = "btnSartProcessDelete"; + btnSartProcessDelete.Size = new Size(74, 32); + btnSartProcessDelete.TabIndex = 36; + btnSartProcessDelete.Text = "删除"; + btnSartProcessDelete.Type = AntdUI.TTypeMini.Error; + btnSartProcessDelete.WaveSize = 0; + // + // btnSartProcessAdd + // + btnSartProcessAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSartProcessAdd.Location = new Point(13, 10); + btnSartProcessAdd.Name = "btnSartProcessAdd"; + btnSartProcessAdd.Size = new Size(82, 32); + btnSartProcessAdd.TabIndex = 35; + btnSartProcessAdd.Text = "新增"; + btnSartProcessAdd.Type = AntdUI.TTypeMini.Primary; + btnSartProcessAdd.WaveSize = 0; + // + // tabPage3 + // + tabPage3.Controls.Add(TableStopProcess); + tabPage3.Controls.Add(panel3); + tabPage3.Location = new Point(-669, -499); + tabPage3.Name = "tabPage3"; + tabPage3.Size = new Size(669, 499); + tabPage3.TabIndex = 2; + tabPage3.Text = "流程结束操作"; + // + // TableStopProcess + // + TableStopProcess.Dock = DockStyle.Fill; + TableStopProcess.EmptyHeader = true; + TableStopProcess.Location = new Point(0, 45); + TableStopProcess.Name = "TableStopProcess"; + TableStopProcess.Padding = new Padding(5); + TableStopProcess.Size = new Size(669, 454); + TableStopProcess.TabIndex = 38; + TableStopProcess.Text = "table1"; + // + // panel3 + // + panel3.Back = Color.Transparent; + panel3.BackColor = SystemColors.Window; + panel3.Controls.Add(btnStopProcessDelete); + panel3.Controls.Add(btnStopProcessAdd); + panel3.Dock = DockStyle.Top; + panel3.Location = new Point(0, 0); + panel3.Name = "panel3"; + panel3.Size = new Size(669, 45); + panel3.TabIndex = 37; + panel3.Text = "panel3"; + // + // btnStopProcessDelete + // + btnStopProcessDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStopProcessDelete.Location = new Point(110, 10); + btnStopProcessDelete.Name = "btnStopProcessDelete"; + btnStopProcessDelete.Size = new Size(74, 32); + btnStopProcessDelete.TabIndex = 36; + btnStopProcessDelete.Text = "删除"; + btnStopProcessDelete.Type = AntdUI.TTypeMini.Error; + btnStopProcessDelete.WaveSize = 0; + // + // btnStopProcessAdd + // + btnStopProcessAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStopProcessAdd.Location = new Point(13, 10); + btnStopProcessAdd.Name = "btnStopProcessAdd"; + btnStopProcessAdd.Size = new Size(82, 32); + btnStopProcessAdd.TabIndex = 35; + btnStopProcessAdd.Text = "新增"; + btnStopProcessAdd.Type = AntdUI.TTypeMini.Primary; + btnStopProcessAdd.WaveSize = 0; + // + // tabPage4 + // + tabPage4.Controls.Add(TableStartReset); + tabPage4.Controls.Add(panel4); + tabPage4.Location = new Point(-669, -499); + tabPage4.Name = "tabPage4"; + tabPage4.Size = new Size(669, 499); + tabPage4.TabIndex = 3; + tabPage4.Text = "复位开始操作"; + // + // TableStartReset + // + TableStartReset.Dock = DockStyle.Fill; + TableStartReset.EmptyHeader = true; + TableStartReset.Location = new Point(0, 45); + TableStartReset.Name = "TableStartReset"; + TableStartReset.Padding = new Padding(5); + TableStartReset.Size = new Size(669, 454); + TableStartReset.TabIndex = 38; + TableStartReset.Text = "table1"; + // + // panel4 + // + panel4.Back = Color.Transparent; + panel4.BackColor = SystemColors.Window; + panel4.Controls.Add(btnStartResetDelete); + panel4.Controls.Add(btnStartResetAdd); + panel4.Dock = DockStyle.Top; + panel4.Location = new Point(0, 0); + panel4.Name = "panel4"; + panel4.Size = new Size(669, 45); + panel4.TabIndex = 37; + panel4.Text = "panel4"; + // + // btnStartResetDelete + // + btnStartResetDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStartResetDelete.Location = new Point(110, 10); + btnStartResetDelete.Name = "btnStartResetDelete"; + btnStartResetDelete.Size = new Size(74, 32); + btnStartResetDelete.TabIndex = 36; + btnStartResetDelete.Text = "删除"; + btnStartResetDelete.Type = AntdUI.TTypeMini.Error; + btnStartResetDelete.WaveSize = 0; + // + // btnStartResetAdd + // + btnStartResetAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStartResetAdd.Location = new Point(13, 10); + btnStartResetAdd.Name = "btnStartResetAdd"; + btnStartResetAdd.Size = new Size(82, 32); + btnStartResetAdd.TabIndex = 35; + btnStartResetAdd.Text = "新增"; + btnStartResetAdd.Type = AntdUI.TTypeMini.Primary; + btnStartResetAdd.WaveSize = 0; + // + // tabPage5 + // + tabPage5.Controls.Add(TableStopReset); + tabPage5.Controls.Add(panel5); + tabPage5.Location = new Point(-669, -499); + tabPage5.Name = "tabPage5"; + tabPage5.Size = new Size(669, 499); + tabPage5.TabIndex = 4; + tabPage5.Text = "复位结束操作"; + // + // TableStopReset + // + TableStopReset.Dock = DockStyle.Fill; + TableStopReset.EmptyHeader = true; + TableStopReset.Location = new Point(0, 45); + TableStopReset.Name = "TableStopReset"; + TableStopReset.Padding = new Padding(5); + TableStopReset.Size = new Size(669, 454); + TableStopReset.TabIndex = 38; + TableStopReset.Text = "table1"; + // + // panel5 + // + panel5.Back = Color.Transparent; + panel5.BackColor = SystemColors.Window; + panel5.Controls.Add(btnStopResetDelete); + panel5.Controls.Add(btnStopResetAdd); + panel5.Dock = DockStyle.Top; + panel5.Location = new Point(0, 0); + panel5.Name = "panel5"; + panel5.Size = new Size(669, 45); + panel5.TabIndex = 37; + panel5.Text = "panel5"; + // + // btnStopResetDelete + // + btnStopResetDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStopResetDelete.Location = new Point(110, 10); + btnStopResetDelete.Name = "btnStopResetDelete"; + btnStopResetDelete.Size = new Size(74, 32); + btnStopResetDelete.TabIndex = 36; + btnStopResetDelete.Text = "删除"; + btnStopResetDelete.Type = AntdUI.TTypeMini.Error; + btnStopResetDelete.WaveSize = 0; + // + // btnStopResetAdd + // + btnStopResetAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnStopResetAdd.Location = new Point(13, 10); + btnStopResetAdd.Name = "btnStopResetAdd"; + btnStopResetAdd.Size = new Size(82, 32); + btnStopResetAdd.TabIndex = 35; + btnStopResetAdd.Text = "新增"; + btnStopResetAdd.Type = AntdUI.TTypeMini.Primary; + btnStopResetAdd.WaveSize = 0; + // + // panel6 + // + panel6.Controls.Add(iptClearTime); + panel6.Controls.Add(uiLabel3); + panel6.Controls.Add(swhEnableBelt); + panel6.Controls.Add(uiLabel2); + panel6.Controls.Add(swhEnableVibrator); + panel6.Controls.Add(uiLabel1); + panel6.Dock = DockStyle.Left; + panel6.Location = new Point(0, 0); + panel6.Name = "panel6"; + panel6.Size = new Size(427, 499); + panel6.TabIndex = 0; + panel6.Text = "panel6"; + // + // panel7 + // + panel7.Dock = DockStyle.Fill; + panel7.Location = new Point(427, 0); + panel7.Name = "panel7"; + panel7.Size = new Size(465, 499); + panel7.TabIndex = 1; + panel7.Text = "panel7"; + // + // uiLabel1 + // + uiLabel1.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + uiLabel1.ForeColor = Color.FromArgb(48, 48, 48); + uiLabel1.Location = new Point(28, 36); + uiLabel1.Name = "uiLabel1"; + uiLabel1.Size = new Size(63, 23); + uiLabel1.TabIndex = 0; + uiLabel1.Text = "振动盘"; + // + // swhEnableVibrator + // + swhEnableVibrator.CheckedText = "启用"; + swhEnableVibrator.Location = new Point(97, 26); + swhEnableVibrator.Name = "swhEnableVibrator"; + swhEnableVibrator.Size = new Size(94, 33); + swhEnableVibrator.TabIndex = 50; + swhEnableVibrator.UnCheckedText = "关闭"; + // + // swhEnableBelt + // + swhEnableBelt.CheckedText = "启用"; + swhEnableBelt.Location = new Point(97, 82); + swhEnableBelt.Name = "swhEnableBelt"; + swhEnableBelt.Size = new Size(94, 33); + swhEnableBelt.TabIndex = 52; + swhEnableBelt.UnCheckedText = "关闭"; + // + // uiLabel2 + // + uiLabel2.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + uiLabel2.ForeColor = Color.FromArgb(48, 48, 48); + uiLabel2.Location = new Point(28, 92); + uiLabel2.Name = "uiLabel2"; + uiLabel2.Size = new Size(63, 23); + uiLabel2.TabIndex = 51; + uiLabel2.Text = "皮带"; + // + // uiLabel3 + // + uiLabel3.Font = new Font("宋体", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + uiLabel3.ForeColor = Color.FromArgb(48, 48, 48); + uiLabel3.Location = new Point(17, 142); + uiLabel3.Name = "uiLabel3"; + uiLabel3.Size = new Size(74, 23); + uiLabel3.TabIndex = 53; + uiLabel3.Text = "清料时间"; + // + // iptClearTime + // + iptClearTime.Location = new Point(97, 131); + iptClearTime.Name = "iptClearTime"; + iptClearTime.Size = new Size(94, 43); + iptClearTime.TabIndex = 54; + iptClearTime.Text = "0"; + // + // GlobalControl + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + Controls.Add(tabs1); + Name = "GlobalControl"; + Size = new Size(898, 530); + tabs1.ResumeLayout(false); + tabPage6.ResumeLayout(false); + tabPage1.ResumeLayout(false); + panel1.ResumeLayout(false); + tabPage2.ResumeLayout(false); + panel2.ResumeLayout(false); + tabPage3.ResumeLayout(false); + panel3.ResumeLayout(false); + tabPage4.ResumeLayout(false); + panel4.ResumeLayout(false); + tabPage5.ResumeLayout(false); + panel5.ResumeLayout(false); + panel6.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + private AntdUI.Tabs tabs1; + private AntdUI.TabPage tabPage2; + private AntdUI.TabPage tabPage3; + private AntdUI.TabPage tabPage4; + private AntdUI.TabPage tabPage5; + private AntdUI.Table TableSartProcess; + private AntdUI.Panel panel2; + private AntdUI.Button btnSartProcessDelete; + private AntdUI.Button btnSartProcessAdd; + private AntdUI.Table TableStopProcess; + private AntdUI.Panel panel3; + private AntdUI.Button btnStopProcessDelete; + private AntdUI.Button btnStopProcessAdd; + private AntdUI.Table TableStartReset; + private AntdUI.Panel panel4; + private AntdUI.Button btnStartResetDelete; + private AntdUI.Button btnStartResetAdd; + private AntdUI.Table TableStopReset; + private AntdUI.Panel panel5; + private AntdUI.Button btnStopResetDelete; + private AntdUI.Button btnStopResetAdd; + private AntdUI.TabPage tabPage1; + private AntdUI.Table TableInitProcess; + private AntdUI.Panel panel1; + private AntdUI.Button btnAdd; + private AntdUI.Button btnDelete; + private AntdUI.TabPage tabPage6; + private AntdUI.Panel panel7; + private AntdUI.Panel panel6; + private Sunny.UI.UILabel uiLabel1; + private AntdUI.Switch swhEnableBelt; + private Sunny.UI.UILabel uiLabel2; + private AntdUI.Switch swhEnableVibrator; + private Sunny.UI.UILabel uiLabel3; + private AntdUI.Input iptClearTime; + } +} diff --git a/DHSoftware/Views/GlobalControl.cs b/DHSoftware/Views/GlobalControl.cs new file mode 100644 index 0000000..e66f3b5 --- /dev/null +++ b/DHSoftware/Views/GlobalControl.cs @@ -0,0 +1,822 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using AntdUI; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Models; +using XKRS.CanFly; + +namespace DHSoftware.Views +{ + public partial class GlobalControl : UserControl + { + private Window window; + private GlobalConfig global; + public GlobalControl(Window _window, GlobalConfig _global) + { + window = _window; + global = _global; + InitializeComponent(); + BindEventHandler(); + InitData(); + + } + + private void BindEventHandler() + { + + btnAdd.Click += BtnAdd_Click; + btnDelete.Click += BtnDelete_Click; + TableInitProcess.CellButtonClick += ItemsTable_CellButtonClick; + + btnSartProcessAdd.Click += BtnSartProcessAdd_Click; + btnSartProcessDelete.Click += BtnSartProcessDelete_Click; + TableSartProcess.CellButtonClick += TableSartProcess_CellButtonClick; + + btnStopProcessAdd.Click += BtnStopProcessAdd_Click; + btnStopProcessDelete.Click += BtnStopProcessDelete_Click; + TableStopProcess.CellButtonClick += TableStopProcess_CellButtonClick; + + btnStartResetAdd.Click += BtnStartResetAdd_Click; + btnStartResetDelete.Click += BtnStartResetDelete_Click; + TableStartReset.CellButtonClick += TableStartReset_CellButtonClick; + + btnStopResetAdd.Click += BtnStopResetAdd_Click; + btnStopResetDelete.Click += BtnStopResetDelete_Click; + TableStopReset.CellButtonClick += TableStopReset_CellButtonClick; + } + + private void TableStopReset_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem Item) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionProcessEdit(window, "复位结束表操作-编辑", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入复位结束表编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "退出复位结束表编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + global.StopResetList.Remove(Item); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(global.StopResetList, Item); + break; + + case "下移": + if (e.RowIndex > global.StopResetList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(global.StopResetList, Item); + break; + } + } + } + + private void BtnStopResetDelete_Click(object? sender, EventArgs e) + { + if (global.StopResetList.Count == 0 || !global.StopResetList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = global.StopResetList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (global.StopResetList[i].Selected) + { + global.StopResetList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnStopResetAdd_Click(object? sender, EventArgs e) + { + if (ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList.Count == 0) + { + AntdUI.Message.warn(window, "点位表无数据,不允许新增!", autoClose: 3); + return; + } + + PLCItem Item = new PLCItem() + { + StartIndex = global.StopResetList.Count + 1, + CellLinks = new CellLink[] + { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionProcessEdit(window, "复位结束表操作-新增", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入复位结束表新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + global.StopResetList.Add(Item); + } + + AntdUI.Message.info(window, "退出复位结束表新增", autoClose: 1); + } + }); + } + + private void TableStartReset_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem Item) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionProcessEdit(window, "复位开始表操作-编辑", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入复位开始表编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "退出复位开始表编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + global.StartResetList.Remove(Item); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(global.StartResetList, Item); + break; + + case "下移": + if (e.RowIndex > global.StartResetList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(global.StartResetList, Item); + break; + } + } + } + + private void BtnStartResetDelete_Click(object? sender, EventArgs e) + { + if (global.StartResetList.Count == 0 || !global.StartResetList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = global.StartResetList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (global.StartResetList[i].Selected) + { + global.StartResetList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnStartResetAdd_Click(object? sender, EventArgs e) + { + if (ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList.Count == 0) + { + AntdUI.Message.warn(window, "点位表无数据,不允许新增!", autoClose: 3); + return; + } + + + PLCItem Item = new PLCItem() + { + StartIndex = global.StartResetList.Count + 1, + CellLinks = new CellLink[] + { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionProcessEdit(window, "复位开始表操作-新增", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入复位开始表新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + global.StartResetList.Add(Item); + } + + AntdUI.Message.info(window, "退出复位开始表新增", autoClose: 1); + } + }); + } + + private void TableStopProcess_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem Item) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionProcessEdit(window, "流程结束表操作-编辑", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程结束表编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "退出流程结束表编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + global.StopProcessList.Remove(Item); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(global.StopProcessList, Item); + break; + + case "下移": + if (e.RowIndex > global.StopProcessList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(global.StopProcessList, Item); + break; + } + } + } + + private void BtnStopProcessDelete_Click(object? sender, EventArgs e) + { + if (global.StopProcessList.Count == 0 || !global.StopProcessList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = global.StopProcessList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (global.StopProcessList[i].Selected) + { + global.StopProcessList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnStopProcessAdd_Click(object? sender, EventArgs e) + { + if (ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList.Count == 0) + { + AntdUI.Message.warn(window, "点位表无数据,不允许新增!", autoClose: 3); + return; + } + + + PLCItem Item = new PLCItem() + { + StartIndex = global.StopProcessList.Count + 1, + CellLinks = new CellLink[] + { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionProcessEdit(window, "流程结束表操作-新增", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程结束表新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + global.StopProcessList.Add(Item); + } + + AntdUI.Message.info(window, "退出流程结束表新增", autoClose: 1); + } + }); + } + + private void TableSartProcess_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem Item) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionProcessEdit(window, "流程开始表操作-编辑", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程开始表编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "退出流程开始表编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + global.StartProcessList.Remove(Item); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(global.StartProcessList, Item); + break; + + case "下移": + if (e.RowIndex > global.StartProcessList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(global.StartProcessList, Item); + break; + } + } + } + + private void BtnSartProcessDelete_Click(object? sender, EventArgs e) + { + if (global.StartProcessList.Count == 0 || !global.StartProcessList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = global.StartProcessList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (global.StartProcessList[i].Selected) + { + global.StartProcessList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnSartProcessAdd_Click(object? sender, EventArgs e) + { + if (ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList.Count == 0) + { + AntdUI.Message.warn(window, "点位表无数据,不允许新增!", autoClose: 3); + return; + } + + + PLCItem Item = new PLCItem() + { + StartIndex = global.StartProcessList.Count + 1, + CellLinks = new CellLink[] + { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionProcessEdit(window, "流程开始表操作-新增", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程开始表新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + global.StartProcessList.Add(Item); + } + + AntdUI.Message.info(window, "退出流程开始表新增", autoClose: 1); + } + }); + } + + private void ItemsTable_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem Item) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionProcessEdit(window, "流程加载表操作-编辑", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程加载表编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "退出流程加载表编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + global.InitProcessList.Remove(Item); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(global.InitProcessList, Item); + break; + + case "下移": + if (e.RowIndex > global.InitProcessList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(global.InitProcessList, Item); + break; + } + } + } + + // 上移项 + public static void MoveItemUp(BindingList list, PLCItem item) + { + int index = list.IndexOf(item); + if (index > 0) + { + // 移除并插入到前一位 + list.RemoveAt(index); + list.Insert(index - 1, item); + UpdateStartIndexes(list); // 更新序号 + } + } + + // 下移项 + public static void MoveItemDown(BindingList list, PLCItem item) + { + int index = list.IndexOf(item); + if (index < list.Count - 1) + { + // 移除并插入到后一位 + list.RemoveAt(index); + list.Insert(index + 1, item); + UpdateStartIndexes(list); // 更新序号 + } + } + + // 更新所有项的序号 + public static void UpdateStartIndexes(BindingList list) + { + for (int i = 0; i < list.Count; i++) + { + PLCItem item = list[i]; + if (item.StartIndex != i + 1) + { + item.StartIndex = i + 1; // 触发 PropertyChanged 事件 + } + } + } + + private void BtnDelete_Click(object? sender, EventArgs e) + { + if (global.InitProcessList.Count == 0 || !global.InitProcessList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = global.InitProcessList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (global.InitProcessList[i].Selected) + { + global.InitProcessList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnAdd_Click(object? sender, EventArgs e) + { + if (ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList.Count == 0) + { + AntdUI.Message.warn(window, "点位表无数据,不允许新增!", autoClose: 3); + return; + } + + + PLCItem Item = new PLCItem() + { + StartIndex = global.InitProcessList.Count + 1, + CellLinks = new CellLink[] + { new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionProcessEdit(window, "流程加载表操作-新增", Item, ConfigModel.PLCBaseList?.FirstOrDefault()?.PLCItemList) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入流程加载表新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + global.InitProcessList.Add(Item); + } + + AntdUI.Message.info(window, "退出流程加载表新增", autoClose: 1); + } + }); + } + + + private void InitData() + { + + // 启用状态绑定 + swhEnableVibrator.DataBindings.Add("Checked", global, "EnableVibrator", true, DataSourceUpdateMode.OnPropertyChanged); + swhEnableBelt.DataBindings.Add("Checked", global, "EnableBelt", true, DataSourceUpdateMode.OnPropertyChanged); + iptClearTime.DataBindings.Add("Text", global, "ClearTime", true, DataSourceUpdateMode.OnPropertyChanged); + + TableInitProcess.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new ColumnSwitch("StartExecute", "启用", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center){Visible=false}, + new Column("Address", "地址",ColumnAlign.Center){Visible=false}, + new Column("Value", "值",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (global.InitProcessList.Count > 0) + { + foreach (var item in global.InitProcessList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + TableInitProcess.Binding(global.InitProcessList); + + TableSartProcess.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new ColumnSwitch("StartExecute", "启用", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center){Visible=false}, + new Column("Address", "地址",ColumnAlign.Center){Visible=false}, + new Column("Value", "值",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (global.StartProcessList.Count > 0) + { + foreach (var item in global.StartProcessList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + //TableSartProcess.Binding(global.StartProcessList); + TableSartProcess.Binding(global.StartProcessList); + TableStopProcess.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new ColumnSwitch("StartExecute", "启用", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center){Visible=false}, + new Column("Address", "地址",ColumnAlign.Center){Visible=false}, + new Column("Value", "值",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (global.StopProcessList.Count > 0) + { + foreach (var item in global.StopProcessList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + TableStopProcess.Binding(global.StopProcessList); + + TableStartReset.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new ColumnSwitch("StartExecute", "启用", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center){Visible=false}, + new Column("Address", "地址",ColumnAlign.Center){Visible=false}, + new Column("Value", "值",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (global.StartResetList.Count > 0) + { + foreach (var item in global.StartResetList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + TableStartReset.Binding(global.StartResetList); + + TableStopReset.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new ColumnSwitch("StartExecute", "启用", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center){Visible=false}, + new Column("Address", "地址",ColumnAlign.Center){Visible=false}, + new Column("Value", "值",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (global.StopResetList.Count > 0) + { + foreach (var item in global.StopResetList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + TableStopReset.Binding(global.StopResetList); + } + + + } +} \ No newline at end of file diff --git a/DHSoftware/Views/​MotionControl.resx b/DHSoftware/Views/GlobalControl.resx similarity index 100% rename from DHSoftware/Views/​MotionControl.resx rename to DHSoftware/Views/GlobalControl.resx diff --git a/DHSoftware/Views/ImageViewerControl.Designer.cs b/DHSoftware/Views/ImageViewerControl.Designer.cs new file mode 100644 index 0000000..8c08a85 --- /dev/null +++ b/DHSoftware/Views/ImageViewerControl.Designer.cs @@ -0,0 +1,28 @@ +namespace DHSoftware.Views +{ + partial class ImageViewerControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/DHSoftware/Views/ImageViewerControl.cs b/DHSoftware/Views/ImageViewerControl.cs new file mode 100644 index 0000000..3865c47 --- /dev/null +++ b/DHSoftware/Views/ImageViewerControl.cs @@ -0,0 +1,346 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace DHSoftware.Views +{ + public partial class ImageViewerControl : UserControl + { + #region 内部控件 + private PictureBox pictureBox; + private Label statusLabel; + #endregion + + #region 核心字段 + private Bitmap _currentImage; + private float _scale = 1.0f; + private PointF _offset = PointF.Empty; + private Point _dragStart; + private bool _isDragging; + private readonly object _imageLock = new object(); + #endregion + + #region 公开属性 + public Bitmap Image + { + get + { + lock (_imageLock) + { + return _currentImage?.Clone() as Bitmap; + } + } + set + { + Bitmap newImage = value?.Clone() as Bitmap; + Bitmap oldImageToDispose = null; + + lock (_imageLock) + { + // 交换图像引用 + oldImageToDispose = _currentImage; + _currentImage = newImage; + + if (_currentImage != null) + { + if (oldImageToDispose?.Size != _currentImage.Size) + { + AutoFit(); + } + else + { + ClampOffset(); + } + } + } + + // 在锁外安全释放旧图像 + if (oldImageToDispose != null) + { + // 使用BeginInvoke确保在UI线程释放资源 + BeginInvoke(new Action(() => + { + oldImageToDispose.Dispose(); + oldImageToDispose = null; + })); + } + + SafeInvalidate(); + } + } + #endregion + + public ImageViewerControl() + { + InitializeComponents(); + SetupDoubleBuffering(); + } + + #region 初始化 + private void InitializeComponents() + { + pictureBox = new PictureBox + { + Dock = DockStyle.Fill, + BackColor = Color.DarkGray, + Cursor = Cursors.Hand + }; + + statusLabel = new Label + { + Dock = DockStyle.Bottom, + Height = 20, + Text = "就绪", + BorderStyle = BorderStyle.FixedSingle, + Font = new Font("Consolas", 10) + }; + + pictureBox.MouseDown += PictureBox_MouseDown; + pictureBox.MouseMove += PictureBox_MouseMove; + pictureBox.MouseUp += PictureBox_MouseUp; + pictureBox.MouseWheel += PictureBox_MouseWheel; + pictureBox.Paint += PictureBox_Paint; + + Controls.Add(pictureBox); + Controls.Add(statusLabel); + } + + private void SetupDoubleBuffering() + { + typeof(PictureBox).GetMethod("SetStyle", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance)? + .Invoke(pictureBox, new object[] { + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.AllPaintingInWmPaint, + true + }); + } + #endregion + + #region 核心功能 + private void AutoFit() + { + lock (_imageLock) + { + if (_currentImage == null) return; + + const float marginRatio = 0.1f; + float marginWidth = Width * marginRatio; + float marginHeight = Height * marginRatio; + + _scale = Math.Min( + (Width - marginWidth * 2) / _currentImage.Width, + (Height - marginHeight * 2) / _currentImage.Height + ); + + _offset.X = marginWidth + (Width - marginWidth * 2 - _currentImage.Width * _scale) / 2; + _offset.Y = marginHeight + (Height - marginHeight * 2 - _currentImage.Height * _scale) / 2; + + ClampOffset(); + } + } + + private void PictureBox_Paint(object sender, PaintEventArgs e) + { + Bitmap drawImage = null; + RectangleF destRect; + float scale; + PointF offset; + + // 创建临时绘图参数 + lock (_imageLock) + { + if (_currentImage == null) return; + + // 创建绘图副本 + drawImage = _currentImage.Clone() as Bitmap; + scale = _scale; + offset = _offset; + + destRect = new RectangleF( + offset.X, + offset.Y, + drawImage.Width * scale, + drawImage.Height * scale); + } + + try + { + e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + e.Graphics.DrawImage(drawImage, destRect); + } + finally + { + drawImage?.Dispose(); + } + } + #endregion + + #region 鼠标交互(左键拖动) + private void PictureBox_MouseDown(object sender, MouseEventArgs e) + { + if (InvokeRequired) return; + + lock (_imageLock) + { + if (_currentImage == null) return; + + if (e.Button == MouseButtons.Left) + { + _dragStart = e.Location; + _isDragging = true; + } + } + } + + private void PictureBox_MouseMove(object sender, MouseEventArgs e) + { + if (InvokeRequired) return; + + lock (_imageLock) + { + if (_currentImage == null) return; + + if (_isDragging) + { + _offset.X += e.X - _dragStart.X; + _offset.Y += e.Y - _dragStart.Y; + _dragStart = e.Location; + ClampOffset(); + SafeInvalidate(); + } + + UpdateStatus(e.Location); + } + } + + private void PictureBox_MouseUp(object sender, MouseEventArgs e) + { + lock (_imageLock) + { + _isDragging = false; + } + } + + private void PictureBox_MouseWheel(object sender, MouseEventArgs e) + { + if (InvokeRequired) return; + + lock (_imageLock) + { + if (_currentImage == null) return; + + PointF imgPos = ConvertToImageCoords(e.Location); + if (imgPos.X < 0 || imgPos.X > _currentImage.Width || + imgPos.Y < 0 || imgPos.Y > _currentImage.Height) + return; + + float zoom = e.Delta > 0 ? 1.1f : 0.9f; + float newScale = Math.Clamp(_scale * zoom, 0.1f, 10f); + + _offset.X = e.Location.X - imgPos.X * newScale; + _offset.Y = e.Location.Y - imgPos.Y * newScale; + + _scale = newScale; + ClampOffset(); + SafeInvalidate(); + } + } + #endregion + + #region 辅助方法 + private PointF ConvertToImageCoords(Point mousePos) + { + lock (_imageLock) + { + if (_currentImage == null) return PointF.Empty; + return new PointF( + (mousePos.X - _offset.X) / _scale, + (mousePos.Y - _offset.Y) / _scale); + } + } + + private void ClampOffset() + { + lock (_imageLock) + { + if (_currentImage == null) return; + + float imgWidth = _currentImage.Width * _scale; + float imgHeight = _currentImage.Height * _scale; + + _offset.X = Math.Clamp(_offset.X, + imgWidth > Width ? Width - imgWidth : 0, + imgWidth > Width ? 0 : Width - imgWidth); + + _offset.Y = Math.Clamp(_offset.Y, + imgHeight > Height ? Height - imgHeight : 0, + imgHeight > Height ? 0 : Height - imgHeight); + } + } + + private void UpdateStatus(Point mousePos) + { + if (InvokeRequired) + { + BeginInvoke(new Action(UpdateStatus), mousePos); + return; + } + + lock (_imageLock) + { + if (_currentImage == null) + { + statusLabel.Text = "无有效图像"; + return; + } + + PointF imgPos = ConvertToImageCoords(mousePos); + bool inImage = imgPos.X >= 0 && imgPos.X <= _currentImage.Width && + imgPos.Y >= 0 && imgPos.Y <= _currentImage.Height; + + statusLabel.Text = inImage ? + $"坐标: ({imgPos.X:F1}, {imgPos.Y:F1}) | 缩放: {_scale * 100:0}%" : + $"图像尺寸: {_currentImage.Width}x{_currentImage.Height} | 缩放: {_scale * 100:0}%"; + } + } + + private void SafeInvalidate() + { + if (InvokeRequired) + { + BeginInvoke(new Action(pictureBox.Invalidate)); + } + else + { + pictureBox.Invalidate(); + } + } + #endregion + + public Bitmap GetCurrentSnapshot() + { + lock (_imageLock) + { + // 返回深拷贝防止原始图像被修改 + return _currentImage?.Clone() as Bitmap; + } + } + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + lock (_imageLock) + { + _currentImage?.Dispose(); + _currentImage = null; + } + base.Dispose(disposing); + } + } +} \ No newline at end of file diff --git a/DHSoftware/Views/ImageViewerControl.resx b/DHSoftware/Views/ImageViewerControl.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/DHSoftware/Views/ImageViewerControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DHSoftware/Views/MotionControl.Designer.cs b/DHSoftware/Views/MotionControl.Designer.cs new file mode 100644 index 0000000..dbde12b --- /dev/null +++ b/DHSoftware/Views/MotionControl.Designer.cs @@ -0,0 +1,470 @@ +namespace DHSoftware.Views +{ + partial class MotionControl + { + /// + /// 必需的设计器变量。 + /// + 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() + { + AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine(); + stackPanel2 = new AntdUI.StackPanel(); + swhEnable = new AntdUI.Switch(); + label4 = new AntdUI.Label(); + stackPanel3 = new AntdUI.StackPanel(); + sltTpye = new AntdUI.Select(); + label1 = new AntdUI.Label(); + stpCom = new AntdUI.StackPanel(); + cmbCom = new AntdUI.Select(); + label2 = new AntdUI.Label(); + stackPanel1 = new AntdUI.StackPanel(); + stpPort = new AntdUI.StackPanel(); + iptPort = new AntdUI.Input(); + label9 = new AntdUI.Label(); + stpIP = new AntdUI.StackPanel(); + iptIP = new AntdUI.Input(); + label8 = new AntdUI.Label(); + stpParity = new AntdUI.StackPanel(); + cmbParity = new AntdUI.Select(); + label7 = new AntdUI.Label(); + stpStop = new AntdUI.StackPanel(); + cmbStopBits = new AntdUI.Select(); + label6 = new AntdUI.Label(); + stpData = new AntdUI.StackPanel(); + cmbDataBits = new AntdUI.Select(); + label5 = new AntdUI.Label(); + stpBaud = new AntdUI.StackPanel(); + cmbBaudRate = new AntdUI.Select(); + label3 = new AntdUI.Label(); + tabs1 = new AntdUI.Tabs(); + tabPage1 = new AntdUI.TabPage(); + PLCItemsTable = new AntdUI.Table(); + panel1 = new AntdUI.Panel(); + btnDelete = new AntdUI.Button(); + btnAdd = new AntdUI.Button(); + stackPanel2.SuspendLayout(); + stackPanel3.SuspendLayout(); + stpCom.SuspendLayout(); + stackPanel1.SuspendLayout(); + stpPort.SuspendLayout(); + stpIP.SuspendLayout(); + stpParity.SuspendLayout(); + stpStop.SuspendLayout(); + stpData.SuspendLayout(); + stpBaud.SuspendLayout(); + tabs1.SuspendLayout(); + tabPage1.SuspendLayout(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // stackPanel2 + // + stackPanel2.Controls.Add(swhEnable); + stackPanel2.Controls.Add(label4); + stackPanel2.Dock = DockStyle.Top; + stackPanel2.Location = new Point(3, 3); + stackPanel2.Name = "stackPanel2"; + stackPanel2.Size = new Size(217, 43); + stackPanel2.TabIndex = 0; + stackPanel2.Text = "stackPanel2"; + // + // swhEnable + // + swhEnable.CheckedText = "启用"; + swhEnable.Location = new Point(68, 3); + swhEnable.Name = "swhEnable"; + swhEnable.Size = new Size(93, 37); + swhEnable.TabIndex = 25; + swhEnable.UnCheckedText = "关闭"; + // + // label4 + // + label4.Location = new Point(3, 3); + label4.Name = "label4"; + label4.Size = new Size(59, 37); + label4.TabIndex = 24; + label4.Text = "状 态"; + // + // stackPanel3 + // + stackPanel3.Controls.Add(sltTpye); + stackPanel3.Controls.Add(label1); + stackPanel3.Dock = DockStyle.Top; + stackPanel3.Location = new Point(3, 52); + stackPanel3.Name = "stackPanel3"; + stackPanel3.Size = new Size(217, 43); + stackPanel3.TabIndex = 1; + stackPanel3.Text = "stackPanel3"; + // + // sltTpye + // + sltTpye.List = true; + sltTpye.Location = new Point(68, 3); + sltTpye.Name = "sltTpye"; + sltTpye.Size = new Size(129, 37); + sltTpye.TabIndex = 25; + // + // label1 + // + label1.Location = new Point(3, 3); + label1.Name = "label1"; + label1.Size = new Size(59, 37); + label1.TabIndex = 24; + label1.Text = "类 型"; + // + // stpCom + // + stpCom.Controls.Add(cmbCom); + stpCom.Controls.Add(label2); + stpCom.Dock = DockStyle.Top; + stpCom.Location = new Point(3, 101); + stpCom.Name = "stpCom"; + stpCom.Size = new Size(217, 43); + stpCom.TabIndex = 2; + stpCom.Text = "stackPanel4"; + // + // cmbCom + // + cmbCom.List = true; + cmbCom.Location = new Point(68, 3); + cmbCom.Name = "cmbCom"; + cmbCom.Size = new Size(129, 37); + cmbCom.TabIndex = 25; + // + // label2 + // + label2.Location = new Point(3, 3); + label2.Name = "label2"; + label2.Size = new Size(59, 37); + label2.TabIndex = 24; + label2.Text = "串 口"; + // + // stackPanel1 + // + stackPanel1.Controls.Add(stpPort); + stackPanel1.Controls.Add(stpIP); + stackPanel1.Controls.Add(stpParity); + stackPanel1.Controls.Add(stpStop); + stackPanel1.Controls.Add(stpData); + stackPanel1.Controls.Add(stpBaud); + stackPanel1.Controls.Add(stpCom); + stackPanel1.Controls.Add(stackPanel3); + stackPanel1.Controls.Add(stackPanel2); + stackPanel1.Dock = DockStyle.Left; + stackPanel1.Location = new Point(0, 0); + stackPanel1.Name = "stackPanel1"; + stackPanel1.Size = new Size(223, 530); + stackPanel1.TabIndex = 25; + stackPanel1.Text = "stackPanel1"; + stackPanel1.Vertical = true; + // + // stpPort + // + stpPort.Controls.Add(iptPort); + stpPort.Controls.Add(label9); + stpPort.Dock = DockStyle.Top; + stpPort.Location = new Point(3, 395); + stpPort.Name = "stpPort"; + stpPort.Size = new Size(217, 43); + stpPort.TabIndex = 14; + stpPort.Text = "stackPanel10"; + // + // iptPort + // + iptPort.Location = new Point(68, 3); + iptPort.Name = "iptPort"; + iptPort.Size = new Size(129, 37); + iptPort.TabIndex = 26; + // + // label9 + // + label9.Location = new Point(3, 3); + label9.Name = "label9"; + label9.Size = new Size(59, 37); + label9.TabIndex = 24; + label9.Text = "端 口 号"; + // + // stpIP + // + stpIP.Controls.Add(iptIP); + stpIP.Controls.Add(label8); + stpIP.Dock = DockStyle.Top; + stpIP.Location = new Point(3, 346); + stpIP.Name = "stpIP"; + stpIP.Size = new Size(217, 43); + stpIP.TabIndex = 13; + stpIP.Text = "stackPanel9"; + // + // iptIP + // + iptIP.Location = new Point(68, 3); + iptIP.Name = "iptIP"; + iptIP.Size = new Size(129, 37); + iptIP.TabIndex = 25; + // + // label8 + // + label8.Location = new Point(3, 3); + label8.Name = "label8"; + label8.Size = new Size(59, 37); + label8.TabIndex = 24; + label8.Text = "I P 地 址"; + // + // stpParity + // + stpParity.Controls.Add(cmbParity); + stpParity.Controls.Add(label7); + stpParity.Dock = DockStyle.Top; + stpParity.Location = new Point(3, 297); + stpParity.Name = "stpParity"; + stpParity.Size = new Size(217, 43); + stpParity.TabIndex = 12; + stpParity.Text = "stackPanel8"; + // + // cmbParity + // + cmbParity.List = true; + cmbParity.Location = new Point(68, 3); + cmbParity.Name = "cmbParity"; + cmbParity.Size = new Size(129, 37); + cmbParity.TabIndex = 25; + // + // label7 + // + label7.Location = new Point(3, 3); + label7.Name = "label7"; + label7.Size = new Size(59, 37); + label7.TabIndex = 24; + label7.Text = "校 验 位"; + // + // stpStop + // + stpStop.Controls.Add(cmbStopBits); + stpStop.Controls.Add(label6); + stpStop.Dock = DockStyle.Top; + stpStop.Location = new Point(3, 248); + stpStop.Name = "stpStop"; + stpStop.Size = new Size(217, 43); + stpStop.TabIndex = 11; + stpStop.Text = "stackPanel7"; + // + // cmbStopBits + // + cmbStopBits.List = true; + cmbStopBits.Location = new Point(68, 3); + cmbStopBits.Name = "cmbStopBits"; + cmbStopBits.Size = new Size(129, 37); + cmbStopBits.TabIndex = 25; + // + // label6 + // + label6.Location = new Point(3, 3); + label6.Name = "label6"; + label6.Size = new Size(59, 37); + label6.TabIndex = 24; + label6.Text = "停 止 位"; + // + // stpData + // + stpData.Controls.Add(cmbDataBits); + stpData.Controls.Add(label5); + stpData.Dock = DockStyle.Top; + stpData.Location = new Point(3, 199); + stpData.Name = "stpData"; + stpData.Size = new Size(217, 43); + stpData.TabIndex = 10; + stpData.Text = "stackPanel6"; + // + // cmbDataBits + // + cmbDataBits.List = true; + cmbDataBits.Location = new Point(68, 3); + cmbDataBits.Name = "cmbDataBits"; + cmbDataBits.Size = new Size(129, 37); + cmbDataBits.TabIndex = 25; + // + // label5 + // + label5.Location = new Point(3, 3); + label5.Name = "label5"; + label5.Size = new Size(59, 37); + label5.TabIndex = 24; + label5.Text = "数 据 位"; + // + // stpBaud + // + stpBaud.Controls.Add(cmbBaudRate); + stpBaud.Controls.Add(label3); + stpBaud.Dock = DockStyle.Top; + stpBaud.Location = new Point(3, 150); + stpBaud.Name = "stpBaud"; + stpBaud.Size = new Size(217, 43); + stpBaud.TabIndex = 9; + stpBaud.Text = "stackPanel5"; + // + // cmbBaudRate + // + cmbBaudRate.List = true; + cmbBaudRate.Location = new Point(68, 3); + cmbBaudRate.Name = "cmbBaudRate"; + cmbBaudRate.Size = new Size(129, 37); + cmbBaudRate.TabIndex = 25; + // + // label3 + // + label3.Location = new Point(3, 3); + label3.Name = "label3"; + label3.Size = new Size(59, 37); + label3.TabIndex = 24; + label3.Text = "波 特 率"; + // + // tabs1 + // + tabs1.Dock = DockStyle.Fill; + tabs1.Location = new Point(223, 0); + tabs1.Name = "tabs1"; + tabs1.Pages.Add(tabPage1); + tabs1.Size = new Size(675, 530); + tabs1.Style = styleLine1; + tabs1.TabIndex = 26; + tabs1.Text = "tabs1"; + // + // tabPage1 + // + tabPage1.Controls.Add(PLCItemsTable); + tabPage1.Controls.Add(panel1); + tabPage1.Location = new Point(3, 28); + tabPage1.Name = "tabPage1"; + tabPage1.Size = new Size(669, 499); + tabPage1.TabIndex = 0; + tabPage1.Text = "点位表"; + // + // PLCItemsTable + // + PLCItemsTable.Dock = DockStyle.Fill; + PLCItemsTable.EmptyHeader = true; + PLCItemsTable.Location = new Point(0, 45); + PLCItemsTable.Name = "PLCItemsTable"; + PLCItemsTable.Padding = new Padding(5); + PLCItemsTable.Size = new Size(669, 454); + PLCItemsTable.TabIndex = 36; + PLCItemsTable.Text = "table1"; + // + // panel1 + // + panel1.Back = Color.Transparent; + panel1.BackColor = SystemColors.Window; + panel1.Controls.Add(btnDelete); + panel1.Controls.Add(btnAdd); + panel1.Dock = DockStyle.Top; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(669, 45); + panel1.TabIndex = 35; + panel1.Text = "panel1"; + // + // btnDelete + // + btnDelete.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnDelete.Location = new Point(110, 10); + btnDelete.Name = "btnDelete"; + btnDelete.Size = new Size(74, 32); + btnDelete.TabIndex = 36; + btnDelete.Text = "删除"; + btnDelete.Type = AntdUI.TTypeMini.Error; + btnDelete.WaveSize = 0; + // + // btnAdd + // + btnAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnAdd.Location = new Point(13, 10); + btnAdd.Name = "btnAdd"; + btnAdd.Size = new Size(82, 32); + btnAdd.TabIndex = 35; + btnAdd.Text = "新增"; + btnAdd.Type = AntdUI.TTypeMini.Primary; + btnAdd.WaveSize = 0; + // + // MotionControl + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + Controls.Add(tabs1); + Controls.Add(stackPanel1); + Name = "MotionControl"; + Size = new Size(898, 530); + stackPanel2.ResumeLayout(false); + stackPanel3.ResumeLayout(false); + stpCom.ResumeLayout(false); + stackPanel1.ResumeLayout(false); + stpPort.ResumeLayout(false); + stpIP.ResumeLayout(false); + stpParity.ResumeLayout(false); + stpStop.ResumeLayout(false); + stpData.ResumeLayout(false); + stpBaud.ResumeLayout(false); + tabs1.ResumeLayout(false); + tabPage1.ResumeLayout(false); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.StackPanel stackPanel2; + private AntdUI.Label label4; + private AntdUI.StackPanel stackPanel3; + private AntdUI.Select sltTpye; + private AntdUI.Label label1; + private AntdUI.StackPanel stpCom; + private AntdUI.Select cmbCom; + private AntdUI.Label label2; + private AntdUI.StackPanel stackPanel1; + private AntdUI.Switch swhEnable; + private AntdUI.StackPanel stpPort; + private AntdUI.Input iptPort; + private AntdUI.Label label9; + private AntdUI.StackPanel stpIP; + private AntdUI.Input iptIP; + private AntdUI.Label label8; + private AntdUI.StackPanel stpParity; + private AntdUI.Select cmbParity; + private AntdUI.Label label7; + private AntdUI.StackPanel stpStop; + private AntdUI.Select cmbStopBits; + private AntdUI.Label label6; + private AntdUI.StackPanel stpData; + private AntdUI.Select cmbDataBits; + private AntdUI.Label label5; + private AntdUI.StackPanel stpBaud; + private AntdUI.Select cmbBaudRate; + private AntdUI.Label label3; + private AntdUI.Tabs tabs1; + private AntdUI.TabPage tabPage1; + private AntdUI.Table PLCItemsTable; + private AntdUI.Panel panel1; + private AntdUI.Button btnDelete; + private AntdUI.Button btnAdd; + } +} diff --git a/DHSoftware/Views/MotionControl.cs b/DHSoftware/Views/MotionControl.cs new file mode 100644 index 0000000..7d57ee6 --- /dev/null +++ b/DHSoftware/Views/MotionControl.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using AntdUI; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Devices.PLC; +using XKRS.CanFly; + +namespace DHSoftware.Views +{ + public partial class MotionControl : UserControl + { + private Window window; + private PLCBase pLCBase; + + public MotionControl(Window _window, PLCBase _pLCBase) + { + window = _window; + pLCBase = _pLCBase; + InitializeComponent(); + BindEventHandler(); + InitData(); + SetupDataBindings(); + } + + private void BindEventHandler() + { + sltTpye.TextChanged += SltTpye_TextChanged; + btnAdd.Click += BtnAdd_Click; + btnDelete.Click += BtnDelete_Click; + PLCItemsTable.CellButtonClick += PLCItemsTable_CellButtonClick; + + } + + + private void PLCItemsTable_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is PLCItem pLCItem) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new MotionEdit(window, "点位表操作-编辑", pLCItem) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "结束编辑", autoClose: 1); + } + }); + break; + + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + pLCBase.PLCItemList.Remove(pLCItem); + } + break; + + case "上移": + if (e.RowIndex <= 1) + { + AntdUI.Message.warn(window, "已是第一条,无法上移!", autoClose: 3); + return; + } + MoveItemUp(pLCBase.PLCItemList, pLCItem); + break; + + case "下移": + if (e.RowIndex > pLCBase.PLCItemList.Count - 1) + { + AntdUI.Message.warn(window, "已是最后一条,无法下移!", autoClose: 3); + return; + } + MoveItemDown(pLCBase.PLCItemList, pLCItem); + break; + } + } + } + + // 上移项 + public static void MoveItemUp(BindingList list, PLCItem item) + { + int index = list.IndexOf(item); + if (index > 0) + { + // 移除并插入到前一位 + list.RemoveAt(index); + list.Insert(index - 1, item); + UpdateStartIndexes(list); // 更新序号 + } + } + + // 下移项 + public static void MoveItemDown(BindingList list, PLCItem item) + { + int index = list.IndexOf(item); + if (index < list.Count - 1) + { + // 移除并插入到后一位 + list.RemoveAt(index); + list.Insert(index + 1, item); + UpdateStartIndexes(list); // 更新序号 + } + } + + // 更新所有项的序号 + public static void UpdateStartIndexes(BindingList list) + { + for (int i = 0; i < list.Count; i++) + { + PLCItem item = list[i]; + if (item.StartIndex != i + 1) + { + item.StartIndex = i + 1; // 触发 PropertyChanged 事件 + } + } + } + + private void BtnDelete_Click(object? sender, EventArgs e) + { + if (pLCBase.PLCItemList.Count == 0 || !pLCBase.PLCItemList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = pLCBase.PLCItemList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (pLCBase.PLCItemList[i].Selected) + { + pLCBase.PLCItemList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnAdd_Click(object? sender, EventArgs e) + { + PLCItem pLCItem = new PLCItem() + { + StartIndex = pLCBase.PLCItemList.Count + 1, + CellLinks = new CellLink[] + { new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary), + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + } + }; + + var form = new MotionEdit(window, "点位表操作-新增", pLCItem) { Size = new Size(450, 550) }; + + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入新增", autoClose: 1); + }, + OnClose = () => + { + if (form.submit) + { + pLCBase.PLCItemList.Add(pLCItem); + } + + AntdUI.Message.info(window, "结束新增", autoClose: 1); + } + }); + + //AntdUI.Modal.open(new AntdUI.Modal.Config(window, "", form, TType.None) + //{ + // BtnHeight = 0, + //}); + + //if (form.submit) + //{ + // pLCBase.PLCItemList.Add(pLCItem); + //} + } + + private void SltTpye_TextChanged(object? sender, EventArgs e) + { + if (sender is Select slt && !string.IsNullOrEmpty(slt.Text)) + { + // 将文本转换为枚举值 + if (Enum.TryParse(slt.Text, out var plcType)) + { + switch (plcType) + { + case EnumPLCType.信捷XC网口: + case EnumPLCType.信捷XD网口: + stpCom.Visible = false; + stpBaud.Visible = false; + stpData.Visible = false; + stpParity.Visible = false; + stpStop.Visible = false; + stpIP.Visible = true; + stpPort.Visible = true; + break; + + case EnumPLCType.信捷XD串口: + case EnumPLCType.信捷XC串口: + stpCom.Visible = true; + stpBaud.Visible = true; + stpData.Visible = true; + stpParity.Visible = true; + stpStop.Visible = true; + stpIP.Visible = false; + stpPort.Visible = false; + break; + + default: + break; + } + } + else + { + } + } + } + + private void InitData() + { + // 获取枚举字段名列表(原描述改为字段名) + sltTpye.Items.Clear(); + foreach (EnumPLCType value in Enum.GetValues(typeof(EnumPLCType))) + { + sltTpye.Items.Add(value.ToString()); + } + + // 波特率选项(保持不变) + cmbBaudRate.Items.AddRange(new object[] { 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200 }); + + // 数据位选项(保持不变) + cmbDataBits.Items.AddRange(new object[] { 5, 6, 7, 8 }); + + // 停止位选项改为字段名 + var stopBitsNames = Enum.GetNames(typeof(StopBits)); + foreach (var name in stopBitsNames) + { + cmbStopBits.Items.Add(name); + } + + // 校验位选项改为字段名 + var parityNames = Enum.GetNames(typeof(Parity)); + foreach (var name in parityNames) + { + cmbParity.Items.Add(name); + } + + // COM端口列表(保持不变) + List comList = SerialPort.GetPortNames().ToList(); + foreach (var item in comList) + { + cmbCom.Items.Add(item); + } + + PLCItemsTable.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new Column("StartIndex", "序号", ColumnAlign.Center), + new Column("Name", "名称", ColumnAlign.Center), + new Column("Type", "类型",ColumnAlign.Center), + new Column("Address", "地址",ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + if (pLCBase.PLCItemList.Count > 0) + { + foreach (var item in pLCBase.PLCItemList) + { + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "上移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "下移", TTypeMini.Default), + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error) + }; + } + } + PLCItemsTable.Binding(pLCBase.PLCItemList); + + + } + + private void SetupDataBindings() + { + // 添加双向类型转换 + sltTpye.DataBindings.Add("Text", pLCBase, "PLCType", true, DataSourceUpdateMode.OnPropertyChanged, ""); + cmbCom.DataBindings.Add(nameof(cmbCom.Text), pLCBase, nameof(pLCBase.COM)); + cmbBaudRate.DataBindings.Add(nameof(cmbBaudRate.Text), pLCBase, nameof(pLCBase.BaudRate)); + cmbDataBits.DataBindings.Add(nameof(cmbDataBits.Text), pLCBase, nameof(pLCBase.DataBit)); + cmbParity.DataBindings.Add(nameof(cmbParity.Text), pLCBase, nameof(pLCBase.Parity)); + cmbStopBits.DataBindings.Add(nameof(cmbStopBits.Text), pLCBase, nameof(pLCBase.StopBit)); + + iptIP.DataBindings.Add(nameof(iptIP.Text), pLCBase, nameof(pLCBase.IP)); + iptPort.DataBindings.Add(nameof(iptPort.Text), pLCBase, nameof(pLCBase.Port)); + + swhEnable.DataBindings.Add(nameof(swhEnable.Checked), pLCBase, nameof(pLCBase.Enable)); + } + } +} \ No newline at end of file diff --git a/DHSoftware/Views/SizeConfigControl.resx b/DHSoftware/Views/MotionControl.resx similarity index 99% rename from DHSoftware/Views/SizeConfigControl.resx rename to DHSoftware/Views/MotionControl.resx index af32865..8b2ff64 100644 --- a/DHSoftware/Views/SizeConfigControl.resx +++ b/DHSoftware/Views/MotionControl.resx @@ -1,7 +1,7 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DHSoftware/Views/PreTreatEdit.cs b/DHSoftware/Views/PreTreatEdit.cs index f4ecff7..86c32cd 100644 --- a/DHSoftware/Views/PreTreatEdit.cs +++ b/DHSoftware/Views/PreTreatEdit.cs @@ -1,6 +1,6 @@  -using DH.Commons.Enums; +using DH.Commons.Base; using DH.Devices.Vision; namespace DHSoftware.Views diff --git a/DHSoftware/Views/PreTreatUserControl.Designer.cs b/DHSoftware/Views/PreTreatUserControl.Designer.cs deleted file mode 100644 index d444fcf..0000000 --- a/DHSoftware/Views/PreTreatUserControl.Designer.cs +++ /dev/null @@ -1,213 +0,0 @@ -namespace DHSoftware.Views -{ - partial class PreTreatUserControl - { - /// - /// 必需的设计器变量 - /// - 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() - { - btnPreOpen = new AntdUI.Button(); - tbxPrePath = new TextBox(); - label1 = new AntdUI.Label(); - panel1 = new Panel(); - btnOParmDel = new Panel(); - label3 = new Label(); - btnDelOParm = new AntdUI.Button(); - tbOutputParm = new AntdUI.Table(); - btnAddOParm = new AntdUI.Button(); - panel2 = new Panel(); - label2 = new Label(); - btnDelIParm = new AntdUI.Button(); - tbInputParm = new AntdUI.Table(); - btnAddIParm = new AntdUI.Button(); - panel1.SuspendLayout(); - btnOParmDel.SuspendLayout(); - panel2.SuspendLayout(); - SuspendLayout(); - // - // btnPreOpen - // - btnPreOpen.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - btnPreOpen.Location = new Point(570, 17); - btnPreOpen.Name = "btnPreOpen"; - btnPreOpen.Size = new Size(28, 23); - btnPreOpen.TabIndex = 21; - btnPreOpen.Text = "..."; - btnPreOpen.Click += btnPreOpen_Click; - // - // tbxPrePath - // - tbxPrePath.Location = new Point(91, 17); - tbxPrePath.Name = "tbxPrePath"; - tbxPrePath.Size = new Size(473, 23); - tbxPrePath.TabIndex = 20; - // - // label1 - // - label1.Location = new Point(12, 17); - label1.Name = "label1"; - label1.Size = new Size(73, 23); - label1.TabIndex = 19; - label1.Text = "预处理路径"; - // - // panel1 - // - panel1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - panel1.BorderStyle = BorderStyle.FixedSingle; - panel1.Controls.Add(btnOParmDel); - panel1.Controls.Add(panel2); - panel1.Controls.Add(label1); - panel1.Controls.Add(btnPreOpen); - panel1.Controls.Add(tbxPrePath); - panel1.Location = new Point(0, 0); - panel1.Name = "panel1"; - panel1.Size = new Size(633, 243); - panel1.TabIndex = 22; - // - // btnOParmDel - // - btnOParmDel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - btnOParmDel.Controls.Add(label3); - btnOParmDel.Controls.Add(btnDelOParm); - btnOParmDel.Controls.Add(tbOutputParm); - btnOParmDel.Controls.Add(btnAddOParm); - btnOParmDel.Location = new Point(352, 44); - btnOParmDel.Name = "btnOParmDel"; - btnOParmDel.Size = new Size(246, 194); - btnOParmDel.TabIndex = 26; - // - // label3 - // - label3.AutoSize = true; - label3.Location = new Point(3, 2); - label3.Name = "label3"; - label3.Size = new Size(56, 17); - label3.TabIndex = 25; - label3.Text = "输出参数"; - // - // btnDelOParm - // - btnDelOParm.Location = new Point(93, 25); - btnDelOParm.Name = "btnDelOParm"; - btnDelOParm.Size = new Size(84, 34); - btnDelOParm.TabIndex = 24; - btnDelOParm.Text = "删除"; - // - // tbOutputParm - // - tbOutputParm.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - tbOutputParm.Location = new Point(3, 65); - tbOutputParm.Name = "tbOutputParm"; - tbOutputParm.Size = new Size(240, 126); - tbOutputParm.TabIndex = 22; - tbOutputParm.Text = "table2"; - // - // btnAddOParm - // - btnAddOParm.Location = new Point(3, 25); - btnAddOParm.Name = "btnAddOParm"; - btnAddOParm.Size = new Size(84, 34); - btnAddOParm.TabIndex = 23; - btnAddOParm.Text = "新增"; - // - // panel2 - // - panel2.Controls.Add(label2); - panel2.Controls.Add(btnDelIParm); - panel2.Controls.Add(tbInputParm); - panel2.Controls.Add(btnAddIParm); - panel2.Location = new Point(12, 45); - panel2.Name = "panel2"; - panel2.Size = new Size(264, 194); - panel2.TabIndex = 25; - // - // label2 - // - label2.AutoSize = true; - label2.Location = new Point(3, 5); - label2.Name = "label2"; - label2.Size = new Size(56, 17); - label2.TabIndex = 25; - label2.Text = "输入参数"; - // - // btnDelIParm - // - btnDelIParm.Location = new Point(93, 25); - btnDelIParm.Name = "btnDelIParm"; - btnDelIParm.Size = new Size(84, 34); - btnDelIParm.TabIndex = 24; - btnDelIParm.Text = "删除"; - // - // tbInputParm - // - tbInputParm.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; - tbInputParm.Location = new Point(3, 65); - tbInputParm.Name = "tbInputParm"; - tbInputParm.Size = new Size(258, 126); - tbInputParm.TabIndex = 22; - tbInputParm.Text = "table1"; - // - // btnAddIParm - // - btnAddIParm.Location = new Point(3, 25); - btnAddIParm.Name = "btnAddIParm"; - btnAddIParm.Size = new Size(84, 34); - btnAddIParm.TabIndex = 23; - btnAddIParm.Text = "新增"; - // - // PreTreatUserControl - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - Controls.Add(panel1); - Name = "PreTreatUserControl"; - Size = new Size(635, 243); - panel1.ResumeLayout(false); - panel1.PerformLayout(); - btnOParmDel.ResumeLayout(false); - btnOParmDel.PerformLayout(); - panel2.ResumeLayout(false); - panel2.PerformLayout(); - ResumeLayout(false); - } - - #endregion - - private AntdUI.Button btnPreOpen; - private TextBox tbxPrePath; - private AntdUI.Label label1; - private Panel panel1; - private AntdUI.Button btnDelIParm; - private AntdUI.Button btnAddIParm; - private AntdUI.Table tbInputParm; - private Panel panel2; - private Panel btnOParmDel; - private Label label3; - private AntdUI.Button btnDelOParm; - private AntdUI.Table tbOutputParm; - private AntdUI.Button btnAddOParm; - private Label label2; - } -} diff --git a/DHSoftware/Views/PreTreatUserControl.cs b/DHSoftware/Views/PreTreatUserControl.cs deleted file mode 100644 index 6b20868..0000000 --- a/DHSoftware/Views/PreTreatUserControl.cs +++ /dev/null @@ -1,25 +0,0 @@ -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 DHSoftware.Views -{ - public partial class PreTreatUserControl : UserControl - { - public PreTreatUserControl() - { - InitializeComponent(); - } - - private void btnPreOpen_Click(object sender, EventArgs e) - { - - } - } -} diff --git a/DHSoftware/Views/SavePositionControl.Designer.cs b/DHSoftware/Views/SavePositionControl.Designer.cs new file mode 100644 index 0000000..6168432 --- /dev/null +++ b/DHSoftware/Views/SavePositionControl.Designer.cs @@ -0,0 +1,189 @@ +namespace DHSoftware.Views +{ + partial class SavePositionControl + { + /// + /// 必需的设计器变量。 + /// + 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() + { + panel1 = new AntdUI.Panel(); + sltName = new AntdUI.Select(); + label1 = new AntdUI.Label(); + iptPosition = new AntdUI.Input(); + label3 = new AntdUI.Label(); + divider1 = new AntdUI.Divider(); + stackPanel1 = new AntdUI.StackPanel(); + button_cancel = new AntdUI.Button(); + button_ok = new AntdUI.Button(); + divider2 = new AntdUI.Divider(); + lbTitleName = new AntdUI.Label(); + panel1.SuspendLayout(); + stackPanel1.SuspendLayout(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(sltName); + panel1.Controls.Add(label1); + panel1.Controls.Add(iptPosition); + panel1.Controls.Add(label3); + panel1.Controls.Add(divider1); + panel1.Controls.Add(stackPanel1); + panel1.Controls.Add(divider2); + panel1.Controls.Add(lbTitleName); + panel1.Dock = DockStyle.Fill; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Padding = new Padding(12); + panel1.Shadow = 6; + panel1.Size = new Size(500, 243); + panel1.TabIndex = 0; + panel1.Text = "panel1"; + // + // sltName + // + sltName.Dock = DockStyle.Top; + sltName.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + sltName.Location = new Point(18, 196); + sltName.MaxCount = 20; + sltName.Name = "sltName"; + sltName.Radius = 3; + sltName.Size = new Size(464, 38); + sltName.TabIndex = 24; + // + // label1 + // + label1.Dock = DockStyle.Top; + label1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + label1.Location = new Point(18, 172); + label1.Name = "label1"; + label1.Size = new Size(464, 24); + label1.TabIndex = 23; + label1.Text = "工位名称"; + // + // iptPosition + // + iptPosition.Dock = DockStyle.Top; + iptPosition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + iptPosition.Location = new Point(18, 134); + iptPosition.Name = "iptPosition"; + iptPosition.Radius = 3; + iptPosition.Size = new Size(464, 38); + iptPosition.TabIndex = 22; + // + // label3 + // + label3.Dock = DockStyle.Top; + label3.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + label3.Location = new Point(18, 110); + label3.Name = "label3"; + label3.Size = new Size(464, 24); + label3.TabIndex = 21; + label3.Text = "当前位置"; + // + // divider1 + // + divider1.Dock = DockStyle.Top; + divider1.Location = new Point(18, 98); + divider1.Name = "divider1"; + divider1.Size = new Size(464, 12); + divider1.TabIndex = 20; + // + // stackPanel1 + // + stackPanel1.Controls.Add(button_cancel); + stackPanel1.Controls.Add(button_ok); + stackPanel1.Dock = DockStyle.Top; + stackPanel1.Location = new Point(18, 54); + stackPanel1.Name = "stackPanel1"; + stackPanel1.RightToLeft = RightToLeft.No; + stackPanel1.Size = new Size(464, 44); + stackPanel1.TabIndex = 19; + stackPanel1.Text = "stackPanel1"; + // + // button_cancel + // + button_cancel.BorderWidth = 1F; + button_cancel.Font = new Font("Microsoft YaHei UI", 9F); + button_cancel.Ghost = true; + button_cancel.Location = new Point(84, 3); + button_cancel.Name = "button_cancel"; + button_cancel.Size = new Size(75, 38); + button_cancel.TabIndex = 1; + button_cancel.Text = "取消"; + // + // button_ok + // + button_ok.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + button_ok.Location = new Point(3, 3); + button_ok.Name = "button_ok"; + button_ok.Size = new Size(75, 38); + button_ok.TabIndex = 0; + button_ok.Text = "确定"; + button_ok.Type = AntdUI.TTypeMini.Primary; + // + // divider2 + // + divider2.Dock = DockStyle.Top; + divider2.Location = new Point(18, 42); + divider2.Name = "divider2"; + divider2.Size = new Size(464, 12); + divider2.TabIndex = 18; + // + // lbTitleName + // + lbTitleName.Dock = DockStyle.Top; + lbTitleName.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbTitleName.Location = new Point(18, 18); + lbTitleName.Name = "lbTitleName"; + lbTitleName.Size = new Size(464, 24); + lbTitleName.TabIndex = 17; + lbTitleName.Text = "保存当前位置操作"; + // + // SavePositionControl + // + Controls.Add(panel1); + Name = "SavePositionControl"; + Size = new Size(500, 243); + panel1.ResumeLayout(false); + stackPanel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.Panel panel1; + private AntdUI.Label lbTitleName; + private AntdUI.Input iptPosition; + private AntdUI.Label label3; + private AntdUI.Divider divider1; + private AntdUI.StackPanel stackPanel1; + private AntdUI.Button button_cancel; + private AntdUI.Button button_ok; + private AntdUI.Divider divider2; + private AntdUI.Select sltName; + private AntdUI.Label label1; + } +} diff --git a/DHSoftware/Views/SavePositionControl.cs b/DHSoftware/Views/SavePositionControl.cs new file mode 100644 index 0000000..38c78a1 --- /dev/null +++ b/DHSoftware/Views/SavePositionControl.cs @@ -0,0 +1,116 @@ + + +using System.Text.RegularExpressions; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Helper; +using DH.Commons.Models; + +namespace DHSoftware.Views +{ + public partial class SavePositionControl : UserControl + { + private AntdUI.Window window; + public bool submit; + public int Position; + + + public SavePositionControl(AntdUI.Window _window,int _position) + { + this.window = _window; + InitializeComponent(); + Position=_position; + sltName.Items.Clear(); + var targetFields = GetSpecificIOFields(); + foreach(var item in targetFields) + { + sltName.Items.Add(item); + } + iptPosition.Text= Position.ToString(); + // 绑定事件 + BindEventHandler(); + } + + private void BindEventHandler() + { + button_ok.Click += Button_ok_Click; + button_cancel.Click += Button_cancel_Click; + } + + private void Button_cancel_Click(object sender, EventArgs e) + { + submit = false; + this.Dispose(); + } + + private void Button_ok_Click(object sender, EventArgs e) + { + iptPosition.Status = AntdUI.TType.None; + + if (String.IsNullOrEmpty(sltName.Text)) + { + sltName.Status = AntdUI.TType.Error; + AntdUI.Message.warn(window, "请选择工位!", autoClose: 3); + return; + } + + //根据工位查找点位 + PLCItem? pLCItem = ConfigModel.PLCBaseList? + .FirstOrDefault()? + .PLCItemList? + .Where(it=>it.Name==sltName.Text).FirstOrDefault(); + if (pLCItem == null) + { + AntdUI.Message.warn(window, $"未找到{sltName.Text}地址,请检查该地址是否存在于点位表!", autoClose: 3); + return; + } + + PLCItem? pLCItem1 = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it=>it.Name ==sltName.Text).FirstOrDefault(); + + if (pLCItem1 == null) + { + pLCItem1=new PLCItem(); + pLCItem1.Name = pLCItem.Name; + pLCItem1.Address = pLCItem.Address; + pLCItem1.Value = iptPosition.Text; + pLCItem1.Type = pLCItem.Type; + pLCItem1.StartExecute = true; + ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList?.Add(pLCItem1); + } + else + { + pLCItem1.Value = iptPosition.Text; + } + + ConfigHelper.SaveConfig(); + AntdUI.Message.success(window, "保存成功!", autoClose: 3); + submit = true; + this.Dispose(); + } + + public static List GetSpecificIOFields() + { + return Enum.GetNames(typeof(EnumPLCOutputIO)) + .Where(name => + Regex.IsMatch(name, @"^工位[1-9]|10$") || // 匹配工位1-10 + name == "OK脉冲" || + name == "NG脉冲") + .OrderBy(name => + { + // 对工位进行数字排序 + if (name.StartsWith("工位")) + { + return int.Parse(name.Substring(2)); + } + return 99; // OK/NG放在最后 + }) + .ToList(); + } + } +} + diff --git a/DHSoftware/Views/SavePositionControl.resx b/DHSoftware/Views/SavePositionControl.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/DHSoftware/Views/SavePositionControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DHSoftware/Views/SettingWindow.Designer.cs b/DHSoftware/Views/SettingWindow.Designer.cs index c087be4..8973ba0 100644 --- a/DHSoftware/Views/SettingWindow.Designer.cs +++ b/DHSoftware/Views/SettingWindow.Designer.cs @@ -28,28 +28,38 @@ /// private void InitializeComponent() { - panel3 = new AntdUI.Panel(); - panel1 = new AntdUI.Panel(); - panel2 = new AntdUI.Panel(); - btnSave = new AntdUI.Button(); - btnAdd = new AntdUI.Button(); - menu1 = new AntdUI.Menu(); + AntdUI.MenuItem menuItem1 = new AntdUI.MenuItem(); + AntdUI.MenuItem menuItem2 = new AntdUI.MenuItem(); + AntdUI.MenuItem menuItem3 = new AntdUI.MenuItem(); + AntdUI.MenuItem menuItem4 = new AntdUI.MenuItem(); + AntdUI.MenuItem menuItem5 = new AntdUI.MenuItem(); + AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard(); pageHeader1 = new AntdUI.PageHeader(); - panel3.SuspendLayout(); + panel1 = new AntdUI.Panel(); + panel2 = new AntdUI.StackPanel(); + btnSave = new AntdUI.Dropdown(); + btnAdd = new AntdUI.Dropdown(); + menu1 = new AntdUI.Menu(); + panel3 = new AntdUI.Panel(); + tabs1 = new AntdUI.Tabs(); + divider1 = new AntdUI.Divider(); panel1.SuspendLayout(); panel2.SuspendLayout(); + panel3.SuspendLayout(); SuspendLayout(); // - // panel3 + // pageHeader1 // - panel3.Controls.Add(panel1); - panel3.Controls.Add(pageHeader1); - panel3.Dock = DockStyle.Fill; - panel3.Location = new Point(0, 0); - panel3.Name = "panel3"; - panel3.Size = new Size(838, 561); - panel3.TabIndex = 1; - panel3.Text = "panel3"; + 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(1042, 33); + pageHeader1.TabIndex = 1; + pageHeader1.Text = "设置"; // // panel1 // @@ -58,20 +68,19 @@ panel1.Dock = DockStyle.Left; panel1.Location = new Point(0, 33); panel1.Name = "panel1"; - panel1.Size = new Size(141, 528); + panel1.Size = new Size(141, 666); panel1.TabIndex = 2; panel1.Text = "panel1"; // // panel2 // - panel2.Back = SystemColors.Window; panel2.BackColor = SystemColors.Window; panel2.Controls.Add(btnSave); panel2.Controls.Add(btnAdd); panel2.Dock = DockStyle.Fill; - panel2.Location = new Point(0, 497); + panel2.Location = new Point(0, 632); panel2.Name = "panel2"; - panel2.Size = new Size(141, 31); + panel2.Size = new Size(141, 34); panel2.TabIndex = 1; panel2.Text = "panel2"; // @@ -79,77 +88,127 @@ // btnSave.BackActive = SystemColors.Control; btnSave.BackColor = SystemColors.Control; - btnSave.Dock = DockStyle.Left; + btnSave.Dock = DockStyle.Right; + btnSave.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); btnSave.ForeColor = Color.Black; - btnSave.IconRatio = 1F; - btnSave.IconSvg = "AppstoreAddOutlined"; - btnSave.Location = new Point(35, 0); + btnSave.IconSvg = "SaveOutlined"; + btnSave.Location = new Point(72, 3); btnSave.Name = "btnSave"; - btnSave.Size = new Size(35, 31); + btnSave.Size = new Size(63, 28); btnSave.TabIndex = 2; - btnSave.Click += btnSave_Click; + btnSave.Tag = "sys-setsave"; + btnSave.Text = "保存"; // // btnAdd // btnAdd.BackActive = SystemColors.Control; btnAdd.BackColor = SystemColors.Control; btnAdd.Dock = DockStyle.Left; + btnAdd.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); btnAdd.ForeColor = Color.Black; - btnAdd.IconRatio = 1F; btnAdd.IconSvg = "AppstoreAddOutlined"; - btnAdd.Location = new Point(0, 0); + btnAdd.Location = new Point(3, 3); btnAdd.Name = "btnAdd"; - btnAdd.Size = new Size(35, 31); + btnAdd.Placement = AntdUI.TAlignFrom.TL; + btnAdd.Size = new Size(63, 28); btnAdd.TabIndex = 1; - btnAdd.Click += btnAdd_Click; + btnAdd.Tag = "sys-setadd"; + btnAdd.Text = "新增"; + btnAdd.Trigger = AntdUI.Trigger.Hover; // // menu1 // menu1.BackColor = SystemColors.Window; menu1.Dock = DockStyle.Top; + menuItem1.Expand = false; + menuItem1.IconSvg = "VideoCameraOutlined"; + menuItem1.Text = "相机设置"; + menuItem2.Expand = false; + menuItem2.IconSvg = "AppstoreOutlined"; + menuItem2.Text = "工位设置"; + menuItem3.Expand = false; + menuItem3.IconSvg = "ControlOutlined"; + menuItem3.Text = "运控设置"; + menuItem4.Expand = false; + menuItem4.IconSvg = "BarsOutlined"; + menuItem5.IconSvg = "BarsOutlined"; + menuItem5.Text = "全局设置"; + menuItem4.Sub.Add(menuItem5); + menuItem4.Text = "其他设置"; + menu1.Items.Add(menuItem1); + menu1.Items.Add(menuItem2); + menu1.Items.Add(menuItem3); + menu1.Items.Add(menuItem4); menu1.Location = new Point(0, 0); menu1.Name = "menu1"; - menu1.Size = new Size(141, 497); + menu1.Size = new Size(141, 632); menu1.TabIndex = 0; menu1.Text = "menu1"; - menu1.MouseClick += menu1_MouseClick; - menu1.MouseDown += Menu_MouseDown; + menu1.MouseDown += menu1_MouseDown; // - // pageHeader1 + // panel3 // - pageHeader1.BackColor = SystemColors.MenuHighlight; - 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(838, 33); - pageHeader1.TabIndex = 1; - pageHeader1.Text = "设置"; + panel3.Controls.Add(tabs1); + panel3.Controls.Add(divider1); + panel3.Controls.Add(panel1); + panel3.Controls.Add(pageHeader1); + panel3.Dock = DockStyle.Fill; + panel3.Location = new Point(0, 0); + panel3.Name = "panel3"; + panel3.Size = new Size(1042, 699); + panel3.TabIndex = 1; + panel3.Text = "panel3"; + // + // tabs1 + // + tabs1.BackColor = SystemColors.Window; + tabs1.Dock = DockStyle.Fill; + tabs1.Location = new Point(151, 33); + tabs1.Name = "tabs1"; + tabs1.Size = new Size(891, 666); + styleCard1.Closable = true; + tabs1.Style = styleCard1; + tabs1.TabIndex = 5; + tabs1.Text = "tabs1"; + tabs1.Type = AntdUI.TabType.Card; + // + // divider1 + // + divider1.BackColor = SystemColors.Window; + divider1.Dock = DockStyle.Left; + divider1.Location = new Point(141, 33); + divider1.Name = "divider1"; + divider1.OrientationMargin = 0F; + divider1.Size = new Size(10, 666); + divider1.TabIndex = 4; + divider1.Text = ""; + divider1.Vertical = true; // // SettingWindow // AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(838, 561); + ClientSize = new Size(1042, 699); Controls.Add(panel3); Name = "SettingWindow"; StartPosition = FormStartPosition.CenterScreen; Text = "SettingWinform"; - panel3.ResumeLayout(false); panel1.ResumeLayout(false); panel2.ResumeLayout(false); + panel3.ResumeLayout(false); ResumeLayout(false); } #endregion - private AntdUI.Panel panel3; + private AntdUI.PageHeader pageHeader1; private AntdUI.Panel panel1; - private AntdUI.Panel panel2; - private AntdUI.Button btnAdd; + private AntdUI.StackPanel panel2; private AntdUI.Menu menu1; - private AntdUI.Button btnSave; + private AntdUI.Panel panel3; + private AntdUI.Tabs tabs1; + private AntdUI.Divider divider1; + private AntdUI.Dropdown btnAdd; + private AntdUI.Dropdown btnSave; } } \ No newline at end of file diff --git a/DHSoftware/Views/SettingWindow.cs b/DHSoftware/Views/SettingWindow.cs index af316d3..30aa869 100644 --- a/DHSoftware/Views/SettingWindow.cs +++ b/DHSoftware/Views/SettingWindow.cs @@ -1,133 +1,921 @@ -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 System.Data; using AntdUI; +using DH.Commons.Helper; +using DH.Commons.Models; +using DHSoftware.Utils; +using DH.Commons.Base; +using DH.RBAC.Model.Sys; +using System.Reflection; +using ScrollBar = AntdUI.ScrollBar; using DH.Commons.Enums; -using DH.Devices.Devices; -using DH.Devices.Vision; namespace DHSoftware.Views { - public partial class SettingWindow : Window { - public List cameras = new List(); - public List detections = new List(); + private UserControl currControl; + public SettingWindow() { InitializeComponent(); - AntdUI.TooltipComponent tooltip = new AntdUI.TooltipComponent() - { - Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(134))), - }; - tooltip.ArrowAlign = AntdUI.TAlign.Right; - tooltip.SetTip(btnAdd, "新增工位"); - - - - + BindEventHandler(); + InitData(); } - private void Menu_MouseDown(object sender, MouseEventArgs e) + /// + /// 窗体对象实例 + /// + private static SettingWindow _instance; + + internal static SettingWindow Instance { - if (e.Button == MouseButtons.Right) + get { - // 转换坐标到控件内部坐标系(考虑滚动条) - Point clickPoint = new Point(e.X, e.Y + menu1.ScrollBar.Value); + if (_instance == null || _instance.IsDisposed) + _instance = new SettingWindow(); + return _instance; + } + } - // 递归查找命中的菜单项 - MenuItem clickedItem = FindClickedItem(menu1.Items, clickPoint); + private void BindEventHandler() + { + Resize += SettingWindow1_Resize; + btnAdd.SelectedValueChanged += btnAdd_SelectedValueChanged; + btnSave.Click += BtnSave_Click; + menu1.SelectChanged += Menu1_SelectChanged; + } - if (clickedItem != null) + private void Menu1_SelectChanged(object sender, MenuSelectEventArgs e) + { + MenuItem clickedItem = e.Value; + + if (clickedItem != null) + { + if (clickedItem.PARENTITEM == null) { - // 显示节点名称弹窗 - //MessageBox.Show($"右键点击的节点: {clickedItem.Text}"); - - var menulist = new AntdUI.IContextMenuStripItem[] - { - new AntdUI.ContextMenuStripItem("关联相机", "") + return; + } + + switch (clickedItem.PARENTITEM.Text) + { + case "相机设置": + bool b = false; + if (ButtonPermissionList.Count > 0) { - IconSvg = "VideoCameraAddOutlined" + foreach (var item in ButtonPermissionList) + { + if (item.EnCode == "sys-cameraset") + { + b = true; + break; + } + } } - }; - + if (!b) { AntdUI.Message.warn(this, $"对不起,无权限访问相机设置!", autoClose: 3); return; } + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + //先获取是否存在该名称的配置 + //如果没有新建项 + CameraBase? CameraBase = ConfigModel.CameraBaseList.Where(c => c.CameraName == clickedItem.Text).FirstOrDefault(); + if (CameraBase == null) + { + CameraBase = new CameraBase(); + } + UserControl control = null; + control = new CameraControl(this, CameraBase); + if (control != null) + { + //容器添加控件,需要调整dpi + control.Dock = DockStyle.Fill; + AutoDpi(control); + AntdUI.TabPage tabPage = new AntdUI.TabPage() + { + Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", + ReadOnly = false, + }; + tabPage.Controls.Add(control); + tabs1.Pages.Add(tabPage); + isUpdatingTabs = true; + tabs1.SelectedTab = tabPage; + isUpdatingTabs = false; + currControl = control; + } + break; + + case "工位设置": + bool b1 = false; + if (ButtonPermissionList.Count > 0) + { + foreach (var item in ButtonPermissionList) + { + if (item.EnCode == "sys-stationset") + { + b1 = true; + break; + } + } + } + if (!b1) { AntdUI.Message.warn(this, $"对不起,无权限访问工位设置!", autoClose: 3); return; } + // 检查是否已存在同名 TabPage + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + DetectionConfig? detectionConfig = ConfigModel.DetectionList.Where(c => c.Name == clickedItem.Text).FirstOrDefault(); + //if (detectionConfig == null) + //{ + // detectionConfig = new DetectionConfig(); + //} + UserControl control1 = null; + if (DH.Commons.Enums.EnumDetectionType.深度学习==detectionConfig?.DetectionType) + { + control1 = new DetectControl(this, detectionConfig); + } + else + { + control1=new SizeControl(this,detectionConfig); + } + + if (control1 != null) + { + //容器添加控件,需要调整dpi + control1.Dock = DockStyle.Fill; + AutoDpi(control1); + AntdUI.TabPage tabPage = new AntdUI.TabPage() + { + Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", + ReadOnly = false, + }; + tabPage.Controls.Add(control1); + tabs1.Pages.Add(tabPage); + isUpdatingTabs = true; + tabs1.SelectedTab = tabPage; + isUpdatingTabs = false; + currControl = control1; + } + break; + + case "运控设置": + bool b2 = false; + if (ButtonPermissionList.Count > 0) + { + foreach (var item in ButtonPermissionList) + { + if (item.EnCode == "sys-motionset") + { + b2 = true; + break; + } + } + } + if (!b2) { AntdUI.Message.warn(this, $"对不起,无权限访问运控设置!", autoClose: 3); return; } + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + //先获取是否存在该名称的配置 + //如果没有新建项 + PLCBase? pLCBase = ConfigModel.PLCBaseList.Where(c => c.PLCName == clickedItem.Text).FirstOrDefault(); + if (pLCBase == null) + { + pLCBase = new PLCBase(); + } + UserControl control2 = null; + control = new MotionControl(this, pLCBase); + if (control != null) + { + //容器添加控件,需要调整dpi + control.Dock = DockStyle.Fill; + AutoDpi(control); + AntdUI.TabPage tabPage = new AntdUI.TabPage() + { + Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", + ReadOnly = false, + }; + tabPage.Controls.Add(control); + tabs1.Pages.Add(tabPage); + isUpdatingTabs = true; + tabs1.SelectedTab = tabPage; + isUpdatingTabs = false; + currControl = control; + } + break; + case "其他设置": + bool b3 = false; + if (ButtonPermissionList.Count > 0) + { + foreach (var item in ButtonPermissionList) + { + if (item.EnCode == "sys-globalset") + { + b3 = true; + break; + } + } + } + if (!b3) { AntdUI.Message.warn(this, $"对不起,无权限访问其他设置!", autoClose: 3); return; } + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + + if (clickedItem.Text == "全局设置") + { + //先获取是否存在该名称的配置 + //如果没有新建项 + GlobalConfig? global = ConfigModel + .GlobalList.FirstOrDefault() ; + if (global == null) + { + global = new GlobalConfig(); + } + + UserControl control3 = null; + control = new GlobalControl(this, global); + if (control != null) + { + //容器添加控件,需要调整dpi + control.Dock = DockStyle.Fill; + AutoDpi(control); + AntdUI.TabPage tabPage = new AntdUI.TabPage() + { + Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", + ReadOnly = false, + }; + tabPage.Controls.Add(control); + tabs1.Pages.Add(tabPage); + isUpdatingTabs = true; + tabs1.SelectedTab = tabPage; + isUpdatingTabs = false; + currControl = control; + } + } + break; } } } - private MenuItem FindClickedItem(MenuItemCollection items, Point clickPoint) + private float x; //定义当前窗体的宽度 + private float y; //定义当前窗体的高度 + + private void InitData() + { + ButtonPermissionList = DH.RBAC.Common.GlobalConfig.PermissionList.ToList(); + + btnAdd.Items.Clear(); + btnAdd.Items.Add("相机设置"); + btnAdd.Items.Add("工位设置"); + btnAdd.Items.Add("运控设置"); + x = Width; + y = Height; + AdaptiveHelper.setTag(this); + + if (ConfigModel.CameraBaseList.Count > 0) + { + var workstationItem = FindMenuItem(menu1.Items, "相机设置"); + + if (workstationItem != null) + { + foreach (var item in ConfigModel.CameraBaseList) + { + var newItem = new MenuItem(); + newItem.Text = item.CameraName; + newItem.IconSvg = "VideoCameraOutlined"; + workstationItem.Sub.Add(newItem); + } + } + } + if (ConfigModel.DetectionList.Count > 0) + { + var workstationItem = FindMenuItem(menu1.Items, "工位设置"); + + if (workstationItem != null) + { + foreach (var item in ConfigModel.DetectionList) + { + var newItem = new MenuItem(); + newItem.Text = item.Name; + newItem.IconSvg = "AppstoreOutlined"; + workstationItem.Sub.Add(newItem); + } + } + } + + if (ConfigModel.PLCBaseList.Count > 0) + { + var workstationItem = FindMenuItem(menu1.Items, "运控设置"); + + if (workstationItem != null) + { + foreach (var item in ConfigModel.PLCBaseList) + { + var newItem = new MenuItem(); + newItem.Text = item.PLCName; + newItem.IconSvg = "ControlOutlined"; + workstationItem.Sub.Add(newItem); + } + } + } + if (ConfigModel.GlobalList?.Count <= 0) + { + GlobalConfig globalConfig = new GlobalConfig(); + ConfigModel.GlobalList.Add(globalConfig); + } + + } + + private void BtnSave_Click(object? sender, EventArgs e) + { + ConfigHelper.SaveConfig(); + AntdUI.Message.success(this, "保存成功!", autoClose: 3); + } + + private void SettingWindow1_Resize(object? sender, EventArgs e) + { + var newx = Width / x; + var newy = Height / y; + AdaptiveHelper.setControls(newx, newy, this); + } + + // 递归查找菜单项 + private MenuItem FindMenuItem(MenuItemCollection items, string targetText) { foreach (MenuItem item in items) { - // 检查当前项是否可见且包含点击坐标 - if (item.Visible && item.Rect.Contains(clickPoint)) + if (item.Text == targetText) return item; + if (item.Sub != null) { - return item; + var subResult = FindMenuItem(item.Sub, targetText); + if (subResult != null) return subResult; + } + } + return null; + } + private List _buttonPermissionList = new List(); + private readonly object _permissionLock = new object(); + + /// + /// 按钮权限列表(线程安全) + /// + public List ButtonPermissionList + { + get + { + lock (_permissionLock) + { + return new List(_buttonPermissionList); // 返回副本避免外部修改 + } + } + set + { + lock (_permissionLock) + { + _buttonPermissionList = value ?? new List(); + SetPermission(_buttonPermissionList, this.Controls); // 应用权限到控件 + } + } + } + private void SetPermission(List list, Control.ControlCollection controls) + { + foreach (Control control in controls) + { + if (control.HasChildren) + { + SetPermission(list, control.Controls); + continue; } - // 递归检查子项(如果展开) - if (item.Expand && item.Sub != null) + if (control is AntdUI.Button button) { - var childResult = FindClickedItem(item.Sub, clickPoint); + HandleButtonVisibility(button, list); + continue; + } + if (control is AntdUI.Label label) + { + HandleLabelVisibility(label, list); + continue; + } + if (control is AntdUI.Dropdown dropdown) + { + HandleDropdownVisibility(dropdown, list); + continue; + } + + } + } + + private void HandleDropdownVisibility(Dropdown dropdown, List permissions) + { + if (dropdown.Tag is string tag && !string.IsNullOrEmpty(tag)) + { + bool hasPermission = permissions.Any(p => p.EnCode == tag); + dropdown.Visible = hasPermission; + } + } + + + + /// + /// 处理 Button 可见性 + /// + private void HandleButtonVisibility(AntdUI.Button button, List permissions) + { + if (button.Tag is string tag && !string.IsNullOrEmpty(tag)) + { + bool hasPermission = permissions.Any(p => p.EnCode == tag); + button.Visible = hasPermission; + } + } + + /// + /// 处理 Label 可见性 + /// + private void HandleLabelVisibility(AntdUI.Label label, List permissions) + { + if (label.Tag is string tag && !string.IsNullOrEmpty(tag)) + { + bool hasPermission = permissions.Any(p => p.EnCode == tag); + label.Visible = hasPermission; + } + } + + private bool isUpdatingTabs = false; + + public static int GetMenuScrollValue(Menu menu) + { + try + { + // 通过反射获取内部 ScrollBar 的 Value + var scrollBarField = typeof(Menu).GetField("ScrollBar", + BindingFlags.NonPublic | BindingFlags.Instance); + if (scrollBarField != null) + { + var scrollBar = scrollBarField.GetValue(menu) as ScrollBar; + return scrollBar?.Value ?? 0; + } + } + catch { /* 异常处理 */ } + return 0; + } + + public static MenuItem FindClickedMenuItem(Menu menu, Point clickPoint) + { + int scrollY = GetMenuScrollValue(menu); + // 调整点击坐标为内容坐标系(叠加滚动偏移) + Point adjustedPoint = new Point(clickPoint.X, clickPoint.Y + scrollY); + return TraverseMenuItems(menu.Items, adjustedPoint); + } + + private static MenuItem TraverseMenuItems(MenuItemCollection items, Point adjustedPoint) + { + foreach (MenuItem item in items) + { + if (!item.Visible) continue; + + // 检查当前项是否命中 + if (item.Rect.Contains(adjustedPoint)) return item; + + // 如果子菜单展开且存在子项,递归查找 + if (item.Expand && item.Sub != null && item.Sub.Count > 0) + { + var childResult = TraverseMenuItems(item.Sub, adjustedPoint); if (childResult != null) return childResult; } } return null; } - private void btnAdd_Click(object sender, EventArgs e) - { - var form = new AddCubicleControl(this) { Size = new Size(400, 300) }; - AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + private void menu1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) { - BtnHeight = 0, - }); - if (form.submit) - { - var newItem = new MenuItem(form.CubicleName); - newItem.IconSvg = "AppstoreOutlined"; - // 防止重复添加 - if (!menu1.Items.Cast().Any(m => m.Text == newItem.Text)) + bool b = false; + if (ButtonPermissionList.Count > 0) { - menu1.Items.Add(newItem); + foreach(var item in ButtonPermissionList) + { + if (item.EnCode == "sys-setright") + { + b= true; + break; + } + } } - else + if (!b) { return; } + var menu = sender as Menu; + if (menu == null) return; + + // 获取命中的 MenuItem + MenuItem clickedItem = FindClickedMenuItem(menu, e.Location); + + + if (clickedItem != null) { - AntdUI.Notification.warn(this, "新增工位失败", $"{form.CubicleName}已存在!", autoClose: 3, align: TAlignFrom.TR); + if (clickedItem.PARENTITEM == null) + { + return; + } + + switch (clickedItem.PARENTITEM.Text) + { + case "相机设置": + var menulist = new AntdUI.IContextMenuStripItem[] + { + new AntdUI.ContextMenuStripItem("重命名", "") + { + IconSvg = "RetweetOutlined" + }, + new AntdUI.ContextMenuStripItem("删除相机", "") + { + IconSvg = "DeleteOutlined" + } + }; + AntdUI.ContextMenuStrip.open(menu1, it => + { + switch (it.Text) + { + case "删除相机": + var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn); + if (result == DialogResult.OK) + { + menu1.Remove(clickedItem); + ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text); + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.Pages.Remove(tab); + ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text); + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + + } + break; + + case "重命名": + // 保存原始名称用于查找 + string originalName = clickedItem.Text; + + var form = new AddCameraControl(this, "重命名相机操作") + { + Size = new Size(300, 200), + // 传递当前名称到表单 + CubicleName = originalName, + + }; + + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + + if (form.submit && !string.IsNullOrWhiteSpace(form.CubicleName)) + { + string newName = form.CubicleName.Trim(); + + if (ConfigModel.CameraBaseList.Any(c => + c.CameraName.Equals(newName, StringComparison.OrdinalIgnoreCase) && + c.CameraName != originalName)) + { + AntdUI.Message.warn(this, $"相机名称 '{newName}' 已存在!", autoClose: 3); + return; + } + + clickedItem.Text = newName; + var camera = ConfigModel.CameraBaseList.FirstOrDefault(c => + c.CameraName.Equals(originalName, StringComparison.OrdinalIgnoreCase)); + camera.CameraName = newName; + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}") + { + isUpdatingTabs = true; + existingTab.Text = $"{clickedItem.PARENTITEM.Text}-{newName}"; + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + AntdUI.Message.success(this, $"已将 '{originalName}重命名成{newName}'!", autoClose: 3); + } + break; + } + }, menulist); + break; + + case "工位设置": + var menulist1 = new AntdUI.IContextMenuStripItem[] + { new AntdUI.ContextMenuStripItem("重命名", "") + { + IconSvg = "RetweetOutlined" + }, + new AntdUI.ContextMenuStripItem("删除工位", "") + { + IconSvg = "DeleteOutlined" + } + }; + AntdUI.ContextMenuStrip.open(menu1, it => + { + switch (it.Text) + { + case "删除工位": + var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn); + if (result == DialogResult.OK) + { + menu1.Remove(clickedItem); + ConfigModel.CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text); + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + tabs1.Pages.Remove(tab); + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + ConfigModel.DetectionList.RemoveAll(c => c.Name == clickedItem.Text); + } + break; + + case "重命名": + // 保存原始名称用于查找 + string originalName = clickedItem.Text; + EnumDetectionType enumDetectionType= ConfigModel.DetectionList.FirstOrDefault(c => + c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)).DetectionType; + var form = new AddCubicleControl(this, "重命名工位操作") + { + Size = new Size(300, 500), + // 传递当前名称到表单 + CubicleName = originalName, + DetectionType = enumDetectionType + }; + + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + + if (form.submit && !string.IsNullOrWhiteSpace(form.CubicleName)) + { + string newName = form.CubicleName.Trim(); + + if (ConfigModel.DetectionList.Any(c => + c.Name.Equals(newName, StringComparison.OrdinalIgnoreCase) && + c.Name != originalName)) + { + AntdUI.Message.warn(this, $"工位名称 '{newName}' 已存在!", autoClose: 3); + return; + } + + clickedItem.Text = newName; + var detection = ConfigModel.DetectionList.FirstOrDefault(c => + c.Name.Equals(originalName, StringComparison.OrdinalIgnoreCase)); + detection.Name = newName; + detection.DetectionType = form.DetectionType; + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}") + { + isUpdatingTabs = true; + existingTab.Text = $"{clickedItem.PARENTITEM.Text}-{newName}"; + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + AntdUI.Message.success(this, $"已将 '{originalName}重命名成{newName}'!", autoClose: 3); + } + break; + } + }, menulist1); + break; + + case "运控设置": + var menulist2 = new AntdUI.IContextMenuStripItem[] + { + new AntdUI.ContextMenuStripItem("重命名", "") + { + IconSvg = "RetweetOutlined" + }, + new AntdUI.ContextMenuStripItem("删除运控", "") + { + IconSvg = "DeleteOutlined" + } + }; + AntdUI.ContextMenuStrip.open(menu1, it => + { + switch (it.Text) + { + case "删除运控": + var result = AntdUI.Modal.open(this, "删除警告!", $"确定删除{clickedItem.Text}?", TType.Warn); + if (result == DialogResult.OK) + { + menu1.Remove(clickedItem); + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") + { + isUpdatingTabs = true; + //tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage + tabs1.Pages.Remove(tab); + ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text); + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + ConfigModel.PLCBaseList.RemoveAll(c => c.PLCName == clickedItem.Text); + } + break; + + case "重命名": + + var form = new AddMotionControl(this, "重命名运动控制操作") { Size = new Size(300, 200) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + string originalName = clickedItem.Text; + if (form.submit && !string.IsNullOrWhiteSpace(form.MotionName)) + { + string newName = form.MotionName.Trim(); + + if (ConfigModel.PLCBaseList.Any(c => + c.PLCName.Equals(newName, StringComparison.OrdinalIgnoreCase) && + c.PLCName != originalName)) + { + AntdUI.Message.warn(this, $"运动控制名称 '{newName}' 已存在!", autoClose: 3); + return; + } + + clickedItem.Text = newName; + var plc = ConfigModel.PLCBaseList.FirstOrDefault(c => + c.PLCName.Equals(originalName, StringComparison.OrdinalIgnoreCase)); + plc.PLCName = newName; + foreach (var tab in tabs1.Pages) + { + if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{originalName}") + { + isUpdatingTabs = true; + existingTab.Text = $"{clickedItem.PARENTITEM.Text}-{newName}"; + isUpdatingTabs = false; + currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; + return; + } + } + AntdUI.Message.success(this, $"已将 '{originalName}重命名成{newName}'!", autoClose: 3); + } + } + + break; + } + }, menulist2); + break; + } } } - - } - private void menu1_MouseClick(object sender, MouseEventArgs e) - { - //if (e.Button == MouseButtons.Right) - //{ - // var menu =sender as Menu; - // if (menu?.Items.Count == 0) - // { - // return; - // } - //} - } - - private void btnSave_Click(object sender, EventArgs e) + private void btnAdd_SelectedValueChanged(object sender, ObjectNEventArgs e) { - foreach(var item in menu1.Items) + string selectedValue = e.Value.ToString(); + switch (selectedValue) { + case "相机设置": + var workstationItem = FindMenuItem(menu1.Items, "相机设置"); + + if (workstationItem != null) + { + var form = new AddCameraControl(this, "新增相机操作") { Size = new Size(300, 200) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + var newItem = new MenuItem(form.CubicleName); + newItem.IconSvg = "VideoCameraOutlined"; + // 防止重复添加 + if (!workstationItem.Sub.Cast().Any(m => m.Text == newItem.Text)) + { + workstationItem.Sub.Add(newItem); + CameraBase cameraBase = new CameraBase(); + cameraBase.CameraName = form.CubicleName; + ConfigModel.CameraBaseList.Add(cameraBase); + } + else + { + AntdUI.Message.warn(this, $"相机名称 '{form.CubicleName}' 已存在!", autoClose: 3); + } + } + } + break; + + case "工位设置": + // 查找工位设置项 + var workstationItem1 = FindMenuItem(menu1.Items, "工位设置"); + + if (workstationItem1 != null) + { + var form = new AddCubicleControl(this, "新增工位操作") { Size = new Size(300, 400) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + var newItem = new MenuItem(form.CubicleName); + newItem.IconSvg = "AppstoreOutlined"; + // 防止重复添加 + if (!workstationItem1.Sub.Cast().Any(m => m.Text == newItem.Text)) + { + workstationItem1.Sub.Add(newItem); + DetectionConfig detection = new DetectionConfig(); + detection.Name = form.CubicleName; + detection.DetectionType = form.DetectionType; + ConfigModel.DetectionList.Add(detection); + } + else + { + AntdUI.Message.warn(this, $"工位名称 '{form.CubicleName}' 已存在!", autoClose: 3); + } + } + } + break; + + case "运控设置": + var workstationItem2 = FindMenuItem(menu1.Items, "运控设置"); + + if (workstationItem2 != null) + { + var form = new AddMotionControl(this, "新增运动控制操作") { Size = new Size(300, 200) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + var newItem = new MenuItem(form.MotionName); + newItem.IconSvg = "ControlOutlined"; + // 防止重复添加 + if (!workstationItem2.Sub.Cast().Any(m => m.Text == newItem.Text)) + { + workstationItem2.Sub.Add(newItem); + PLCBase pLCBase = new PLCBase(); + pLCBase.PLCName = form.MotionName; + ConfigModel.PLCBaseList.Add(pLCBase); + } + else + { + AntdUI.Message.warn(this, $"运动控制名称 '{form.MotionName}' 已存在!", autoClose: 3); + } + } + } + break; + } } } -} - +} \ No newline at end of file diff --git a/DHSoftware/Views/SettingWindow1.Designer.cs b/DHSoftware/Views/SettingWindow1.Designer.cs deleted file mode 100644 index f3c27ec..0000000 --- a/DHSoftware/Views/SettingWindow1.Designer.cs +++ /dev/null @@ -1,201 +0,0 @@ -namespace DHSoftware.Views -{ - partial class SettingWindow1 - { - /// - /// 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() - { - AntdUI.MenuItem menuItem4 = new AntdUI.MenuItem(); - AntdUI.MenuItem menuItem5 = new AntdUI.MenuItem(); - AntdUI.MenuItem menuItem6 = new AntdUI.MenuItem(); - AntdUI.Tabs.StyleCard styleCard2 = new AntdUI.Tabs.StyleCard(); - pageHeader1 = new AntdUI.PageHeader(); - panel1 = new AntdUI.Panel(); - panel2 = new AntdUI.StackPanel(); - btnSave = new AntdUI.Dropdown(); - btnAdd = new AntdUI.Dropdown(); - menu1 = new AntdUI.Menu(); - panel3 = new AntdUI.Panel(); - tabs1 = new AntdUI.Tabs(); - divider1 = new AntdUI.Divider(); - panel1.SuspendLayout(); - panel2.SuspendLayout(); - panel3.SuspendLayout(); - SuspendLayout(); - // - // pageHeader1 - // - pageHeader1.BackColor = SystemColors.MenuHighlight; - 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(1042, 33); - pageHeader1.TabIndex = 1; - pageHeader1.Text = "设置"; - // - // panel1 - // - panel1.Controls.Add(panel2); - panel1.Controls.Add(menu1); - panel1.Dock = DockStyle.Left; - panel1.Location = new Point(0, 33); - panel1.Name = "panel1"; - panel1.Size = new Size(141, 666); - panel1.TabIndex = 2; - panel1.Text = "panel1"; - // - // panel2 - // - panel2.BackColor = SystemColors.Window; - panel2.Controls.Add(btnSave); - panel2.Controls.Add(btnAdd); - panel2.Dock = DockStyle.Fill; - panel2.Location = new Point(0, 632); - panel2.Name = "panel2"; - panel2.Size = new Size(141, 34); - panel2.TabIndex = 1; - panel2.Text = "panel2"; - // - // btnSave - // - btnSave.BackActive = SystemColors.Control; - btnSave.BackColor = SystemColors.Control; - btnSave.Dock = DockStyle.Right; - btnSave.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); - btnSave.ForeColor = Color.Black; - btnSave.IconSvg = "SaveOutlined"; - btnSave.Location = new Point(72, 3); - btnSave.Name = "btnSave"; - btnSave.Size = new Size(63, 28); - btnSave.TabIndex = 2; - btnSave.Text = "保存"; - // - // btnAdd - // - btnAdd.BackActive = SystemColors.Control; - btnAdd.BackColor = SystemColors.Control; - btnAdd.Dock = DockStyle.Left; - btnAdd.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); - btnAdd.ForeColor = Color.Black; - btnAdd.IconSvg = "AppstoreAddOutlined"; - btnAdd.Location = new Point(3, 3); - btnAdd.Name = "btnAdd"; - btnAdd.Placement = AntdUI.TAlignFrom.TL; - btnAdd.Size = new Size(63, 28); - btnAdd.TabIndex = 1; - btnAdd.Text = "新增"; - btnAdd.Trigger = AntdUI.Trigger.Hover; - // - // menu1 - // - menu1.BackColor = SystemColors.Window; - menu1.Dock = DockStyle.Top; - menuItem4.IconSvg = "VideoCameraOutlined"; - menuItem4.Text = "相机设置"; - menuItem5.IconSvg = "AppstoreOutlined"; - menuItem5.Text = "工位设置"; - menuItem6.IconSvg = "ControlOutlined"; - menuItem6.Text = "运控设置"; - menu1.Items.Add(menuItem4); - menu1.Items.Add(menuItem5); - menu1.Items.Add(menuItem6); - menu1.Location = new Point(0, 0); - menu1.Name = "menu1"; - menu1.Size = new Size(141, 632); - menu1.TabIndex = 0; - menu1.Text = "menu1"; - menu1.MouseDown += menu1_MouseDown; - // - // panel3 - // - panel3.Controls.Add(tabs1); - panel3.Controls.Add(divider1); - panel3.Controls.Add(panel1); - panel3.Controls.Add(pageHeader1); - panel3.Dock = DockStyle.Fill; - panel3.Location = new Point(0, 0); - panel3.Name = "panel3"; - panel3.Size = new Size(1042, 699); - panel3.TabIndex = 1; - panel3.Text = "panel3"; - // - // tabs1 - // - tabs1.BackColor = SystemColors.Window; - tabs1.Dock = DockStyle.Fill; - tabs1.Location = new Point(151, 33); - tabs1.Name = "tabs1"; - tabs1.Size = new Size(891, 666); - styleCard2.Closable = true; - tabs1.Style = styleCard2; - tabs1.TabIndex = 5; - tabs1.Text = "tabs1"; - tabs1.Type = AntdUI.TabType.Card; - // - // divider1 - // - divider1.BackColor = SystemColors.Window; - divider1.Dock = DockStyle.Left; - divider1.Location = new Point(141, 33); - divider1.Name = "divider1"; - divider1.OrientationMargin = 0F; - divider1.Size = new Size(10, 666); - divider1.TabIndex = 4; - divider1.Text = ""; - divider1.Vertical = true; - // - // SettingWindow1 - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1042, 699); - Controls.Add(panel3); - Name = "SettingWindow1"; - StartPosition = FormStartPosition.CenterScreen; - Text = "SettingWinform"; - Load += SettingWindow1_Load; - panel1.ResumeLayout(false); - panel2.ResumeLayout(false); - panel3.ResumeLayout(false); - ResumeLayout(false); - } - - #endregion - - private AntdUI.PageHeader pageHeader1; - private AntdUI.Panel panel1; - private AntdUI.StackPanel panel2; - private AntdUI.Menu menu1; - private AntdUI.Panel panel3; - private AntdUI.Tabs tabs1; - private AntdUI.Divider divider1; - private AntdUI.Dropdown btnAdd; - private AntdUI.Button btnSave; - } -} \ No newline at end of file diff --git a/DHSoftware/Views/SettingWindow1.cs b/DHSoftware/Views/SettingWindow1.cs deleted file mode 100644 index 419ddaf..0000000 --- a/DHSoftware/Views/SettingWindow1.cs +++ /dev/null @@ -1,496 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; -using System.Windows.Forms; -using AntdUI; -using AntdUI.Svg; -using DH.Commons.Enums; -using DH.Commons.Helper; -using DH.Devices.Devices; -using DH.Devices.PLC; -using DHSoftware.Utils; -namespace DHSoftware.Views -{ - public partial class SettingWindow1 : Window - { - private UserControl currControl; - - List CameraBaseList = new List(); - List PLCBaseList = new List(); - List DetectionList = new List(); - public SettingWindow1() - { - InitializeComponent(); - - BindEventHandler(); - InitData(); - - } - - private void BindEventHandler() - { - Resize += SettingWindow1_Resize; - btnAdd.SelectedValueChanged += btnAdd_SelectedValueChanged; - btnSave.Click += BtnSave_Click; - - } - private float x; //定义当前窗体的宽度 - private float y; //定义当前窗体的高度 - private void InitData() - { - btnAdd.Items.Clear(); - btnAdd.Items.Add("相机设置"); - btnAdd.Items.Add("工位设置"); - btnAdd.Items.Add("运控设置"); - - x = Width; - y = Height; - AdaptiveHelper.setTag(this); - - // 从文件加载配置 - var loadedConfig = ConfigManager.LoadConfig(); - if (loadedConfig != null) - { - // 更新当前列表 - CameraBaseList = loadedConfig.Cameras; - PLCBaseList = loadedConfig.PLCs; - DetectionList = loadedConfig.Detections; - if (CameraBaseList.Count > 0) - { - var workstationItem = FindMenuItem(menu1.Items, "相机设置"); - - if (workstationItem != null) - { - foreach (var item in CameraBaseList) - { - var newItem = new MenuItem(); - newItem.Text = item.CameraName; - newItem.IconSvg = "VideoCameraOutlined"; - workstationItem.Sub.Add(newItem); - - } - } - } - if (DetectionList.Count > 0) - { - var workstationItem = FindMenuItem(menu1.Items, "工位设置"); - - if (workstationItem != null) - { - foreach (var item in DetectionList) - { - var newItem = new MenuItem(); - newItem.Text = item.Name; - newItem.IconSvg = "AppstoreOutlined"; - workstationItem.Sub.Add(newItem); - - } - } - } - - if (PLCBaseList.Count > 0) - { - var workstationItem = FindMenuItem(menu1.Items, "运控设置"); - - if (workstationItem != null) - { - foreach (var item in PLCBaseList) - { - var newItem = new MenuItem(); - newItem.Text = item.PLCName; - newItem.IconSvg = "ControlOutlined"; - workstationItem.Sub.Add(newItem); - - } - } - } - } - } - - private void BtnSave_Click(object? sender, EventArgs e) - { - - var config = ConfigManager.CreateConfig(CameraBaseList, PLCBaseList, DetectionList); - ConfigManager.SaveConfig(config); - MessageBox.Show("保存成功!"); - - - } - - - private void SettingWindow1_Resize(object? sender, EventArgs e) - { - var newx = Width / x; - var newy = Height / y; - AdaptiveHelper.setControls(newx, newy, this); - } - - - - - - - - - // 递归查找菜单项 - private MenuItem FindMenuItem(MenuItemCollection items, string targetText) - { - foreach (MenuItem item in items) - { - if (item.Text == targetText) return item; - if (item.Sub != null) - { - var subResult = FindMenuItem(item.Sub, targetText); - if (subResult != null) return subResult; - } - } - return null; - } - - - - bool isUpdatingTabs = false; - - - } - - } - private void LoadMenu(string filter = "") - { - menu1.Items.Clear(); - Dictionary> Menu_decetion = new Dictionary>(); - - - - string lang = AntdUI.Localization.CurrentLanguage; - var menuItems = DataUtil.Menu_decetion; - //var menuIcons = DataUtil.MenuIcons_zhcn; - //if (lang.StartsWith("en")) - //{ - // menuItems = DataUtil.MenuItems_enus; - // menuIcons = DataUtil.MenuIcons_enus; - //} - - foreach (var rootItem in Menu_decetion) - { - var rootKey = rootItem.Key.ToLower(); - var rootMenu = new AntdUI.MenuItem - { - Text = rootItem.Key, - //IconSvg = menuIcons.TryGetValue(rootItem.Key, out var icon) ? icon : "UnorderedListOutlined", - }; - bool rootVisible = false; // 用于标记是否显示根节点 - - foreach (var item in rootItem.Value) - { - var childText = item.Text.ToLower(); - - // 如果子节点包含搜索文本 - if (childText.Contains(filter)) - { - var menuItem = new AntdUI.MenuItem - { - Text = item.Text, - IconSvg = item.IconSvg, - Tag = item.Tag, - }; - rootMenu.Sub.Add(menuItem); - rootVisible = true; // 如果有子节点包含,则显示根节点 - } - } - - // 如果根节点包含搜索文本,或有可见的子节点,则显示根节点 - if (rootKey.Contains(filter) || rootVisible) - { - menu1.Items.Add(rootMenu); - } - } - } - - - private void menu1_MouseDown(object sender, MouseEventArgs e) - { - - if (e.Button == MouseButtons.Left) - { - // 转换坐标到控件内部坐标系(考虑滚动条) - Point clickPoint = new Point(e.X, e.Y + menu1.ScrollBar.Value); - - // 递归查找命中的菜单项 - MenuItem clickedItem = FindClickedItem(menu1.Items, clickPoint); - - if (clickedItem != null) - { - if (clickedItem.PARENTITEM == null) - { - return; - } - - switch (clickedItem.PARENTITEM.Text) - { - case "相机设置": - foreach (var tab in tabs1.Pages) - { - if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") - { - isUpdatingTabs = true; - tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage - isUpdatingTabs = false; - currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; - return; - } - } - //先获取是否存在该名称的配置 - //如果没有新建项 - CameraBase? CameraBase= CameraBaseList.Where(c => c.CameraName == clickedItem.Text).FirstOrDefault(); - if (CameraBase == null) - { - CameraBase=new CameraBase(); - } - UserControl control = null; - control = new CameraControl(this, CameraBase); - if (control != null) - { - //容器添加控件,需要调整dpi - control.Dock = DockStyle.Fill; - AutoDpi(control); - AntdUI.TabPage tabPage = new AntdUI.TabPage() - { - Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", - ReadOnly = false, - - }; - tabPage.Controls.Add(control); - tabs1.Pages.Add(tabPage); - isUpdatingTabs = true; - tabs1.SelectedTab = tabPage; - isUpdatingTabs = false; - currControl = control; - } - break; - case "工位设置": - // 检查是否已存在同名 TabPage - foreach (var tab in tabs1.Pages) - { - if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") - { - isUpdatingTabs = true; - tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage - isUpdatingTabs = false; - currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; - return; - } - } - - UserControl control1 = null; - control1 = new DetectControl(this); - if (control1 != null) - { - //容器添加控件,需要调整dpi - control1.Dock = DockStyle.Fill; - AutoDpi(control1); - AntdUI.TabPage tabPage = new AntdUI.TabPage() - { - Text = $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}", - ReadOnly = false , - - }; - tabPage.Controls.Add(control1); - tabs1.Pages.Add(tabPage); - isUpdatingTabs = true; - tabs1.SelectedTab = tabPage; - isUpdatingTabs = false; - currControl = control1; - } - break; - - case "运控设置": - - break; - - - } - } - - } - else if (e.Button == MouseButtons.Right) - { - - // 转换坐标到控件内部坐标系(考虑滚动条) - Point clickPoint = new Point(e.X, e.Y + menu1.ScrollBar.Value); - - // 递归查找命中的菜单项 - MenuItem clickedItem = FindClickedItem(menu1.Items, clickPoint); - - if (clickedItem != null) - { - if (clickedItem.PARENTITEM == null) - { - return; - } - - switch (clickedItem.PARENTITEM.Text) - { - case "相机设置": - var menulist = new AntdUI.IContextMenuStripItem[] - { - new AntdUI.ContextMenuStripItem("删除相机", "") - { - IconSvg = "DeleteOutlined" - } - - }; - AntdUI.ContextMenuStrip.open(menu1, it => - { - menu1.Remove(clickedItem); - foreach (var tab in tabs1.Pages) - { - if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") - { - isUpdatingTabs = true; - tabs1.Pages.Remove(tab); - CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text); - isUpdatingTabs = false; - currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; - return; - } - } - CameraBaseList.RemoveAll(c => c.CameraName == clickedItem.Text); - }, menulist); - break; - case "工位设置": - var menulist1 = new AntdUI.IContextMenuStripItem[] - { - new AntdUI.ContextMenuStripItem("删除工位", "") - { - IconSvg = "DeleteOutlined" - } - - }; - AntdUI.ContextMenuStrip.open(menu1, it => - { - menu1.Remove(clickedItem); - foreach (var tab in tabs1.Pages) - { - if (tab is AntdUI.TabPage existingTab && existingTab.Text == $"{clickedItem.PARENTITEM.Text}-{clickedItem.Text}") - { - isUpdatingTabs = true; - //tabs1.SelectedTab = existingTab; // 直接跳转到已存在的 TabPage - tabs1.Pages.Remove(tab); - isUpdatingTabs = false; - currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; - return; - } - } - }, menulist1); - break; - - case "运控设置": - - break; - - - } - } - } - } - - - private MenuItem FindClickedItem(MenuItemCollection items, Point clickPoint) - { - foreach (MenuItem item in items) - { - // 检查当前项是否可见且包含点击坐标 - if (item.Visible && item.Rect.Contains(clickPoint)) - { - return item; - } - - // 递归检查子项(如果展开) - if (item.Expand && item.Sub != null) - { - var childResult = FindClickedItem(item.Sub, clickPoint); - if (childResult != null) return childResult; - } - } - return null; - } - - - - private void btnAdd_SelectedValueChanged(object sender, ObjectNEventArgs e) - { - string selectedValue = e.Value.ToString(); - switch (selectedValue) - { - case "相机设置": - var workstationItem = FindMenuItem(menu1.Items, "相机设置"); - - if (workstationItem != null) - { - - var form = new AddCameraControl(this) { Size = new Size(300, 200) }; - AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) - { - BtnHeight = 0, - }); - if (form.submit) - { - var newItem = new MenuItem(form.CubicleName); - newItem.IconSvg = "VideoCameraOutlined"; - // 防止重复添加 - if (!menu1.Items.Cast().Any(m => m.Text == newItem.Text)) - { - workstationItem.Sub.Add(newItem); - CameraBase cameraBase = new CameraBase(); - cameraBase.CameraName = form.CubicleName; - CameraBaseList.Add(cameraBase); - } - else - { - AntdUI.Notification.warn(this, "新增相机失败", $"{form.CubicleName}已存在!", autoClose: 3, align: TAlignFrom.TR); - } - } - } - break; - case "工位设置": - // 查找工位设置项 - var workstationItem1= FindMenuItem(menu1.Items, "工位设置"); - - if (workstationItem1 != null) - { - - var form = new AddCubicleControl(this) { Size = new Size(300, 200) }; - AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) - { - BtnHeight = 0, - }); - if (form.submit) - { - var newItem = new MenuItem(form.CubicleName); - newItem.IconSvg = "AppstoreOutlined"; - // 防止重复添加 - if (!menu1.Items.Cast().Any(m => m.Text == newItem.Text)) - { - workstationItem1.Sub.Add(newItem); - } - else - { - AntdUI.Notification.warn(this, "新增工位失败", $"{form.CubicleName}已存在!", autoClose: 3, align: TAlignFrom.TR); - } - } - } - break; - case "运控设置": - break; - } - } - } -} - diff --git a/DHSoftware/Views/SizeConfigControl.Designer.cs b/DHSoftware/Views/SizeConfigControl.Designer.cs deleted file mode 100644 index f0c0ba5..0000000 --- a/DHSoftware/Views/SizeConfigControl.Designer.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace DHSoftware.Views -{ - partial class SizeConfigControl - { - /// - /// 必需的设计器变量 - /// - 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() - { - panel2 = new Panel(); - label2 = new Label(); - btnDelSizeParm = new AntdUI.Button(); - tbSizeParm = new AntdUI.Table(); - btnAddSizeParm = new AntdUI.Button(); - panel2.SuspendLayout(); - SuspendLayout(); - // - // panel2 - // - panel2.Controls.Add(label2); - panel2.Controls.Add(btnDelSizeParm); - panel2.Controls.Add(tbSizeParm); - panel2.Controls.Add(btnAddSizeParm); - panel2.Location = new Point(3, 3); - panel2.Name = "panel2"; - panel2.Size = new Size(779, 286); - panel2.TabIndex = 36; - // - // label2 - // - label2.AutoSize = true; - label2.Location = new Point(3, 5); - label2.Name = "label2"; - label2.Size = new Size(56, 17); - label2.TabIndex = 25; - label2.Text = "尺寸参数"; - // - // btnDelSizeParm - // - btnDelSizeParm.Location = new Point(93, 25); - btnDelSizeParm.Name = "btnDelSizeParm"; - btnDelSizeParm.Size = new Size(84, 34); - btnDelSizeParm.TabIndex = 24; - btnDelSizeParm.Text = "删除"; - // - // tbSizeParm - // - tbSizeParm.Location = new Point(3, 65); - tbSizeParm.Name = "tbSizeParm"; - tbSizeParm.Size = new Size(773, 218); - tbSizeParm.TabIndex = 22; - tbSizeParm.Text = "table1"; - // - // btnAddSizeParm - // - btnAddSizeParm.Location = new Point(3, 25); - btnAddSizeParm.Name = "btnAddSizeParm"; - btnAddSizeParm.Size = new Size(84, 34); - btnAddSizeParm.TabIndex = 23; - btnAddSizeParm.Text = "新增"; - // - // SizeConfigControl - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - BorderStyle = BorderStyle.FixedSingle; - Controls.Add(panel2); - Name = "SizeConfigControl"; - Size = new Size(783, 290); - panel2.ResumeLayout(false); - panel2.PerformLayout(); - ResumeLayout(false); - } - - #endregion - - private Panel panel2; - private Label label2; - private AntdUI.Button btnDelSizeParm; - private AntdUI.Table tbSizeParm; - private AntdUI.Button btnAddSizeParm; - } -} diff --git a/DHSoftware/Views/SizeControl.Designer.cs b/DHSoftware/Views/SizeControl.Designer.cs new file mode 100644 index 0000000..5b25539 --- /dev/null +++ b/DHSoftware/Views/SizeControl.Designer.cs @@ -0,0 +1,223 @@ +namespace DHSoftware.Views +{ + partial class SizeControl + { + /// + /// 必需的设计器变量。 + /// + 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(SizeControl)); + AntdUI.Tabs.StyleLine styleLine1 = new AntdUI.Tabs.StyleLine(); + tabPage3 = new AntdUI.TabPage(); + tabPage4 = new AntdUI.TabPage(); + panel3 = new AntdUI.Panel(); + SizeTable = new AntdUI.Table(); + panel2 = new AntdUI.Panel(); + flowCameraPanel = new AntdUI.FlowPanel(); + btnCorrelatedCamera = new AntdUI.Button(); + label11 = new AntdUI.Label(); + panel1 = new AntdUI.Panel(); + btnSizeDel = new AntdUI.Button(); + btnSizeAdd = new AntdUI.Button(); + tabs1 = new AntdUI.Tabs(); + tabPage3.SuspendLayout(); + tabPage4.SuspendLayout(); + panel3.SuspendLayout(); + panel2.SuspendLayout(); + panel1.SuspendLayout(); + tabs1.SuspendLayout(); + SuspendLayout(); + // + // tabPage3 + // + tabPage3.Controls.Add(tabPage4); + tabPage3.Dock = DockStyle.None; + tabPage3.Location = new Point(3, 31); + tabPage3.Name = "tabPage3"; + tabPage3.Size = new Size(909, 575); + tabPage3.TabIndex = 3; + tabPage3.Text = "尺寸测量"; + // + // tabPage4 + // + tabPage4.Controls.Add(panel3); + tabPage4.Controls.Add(panel2); + tabPage4.Controls.Add(panel1); + tabPage4.Location = new Point(8, 8); + tabPage4.Name = "tabPage4"; + tabPage4.Size = new Size(909, 575); + tabPage4.TabIndex = 1; + tabPage4.Text = "预处理"; + // + // panel3 + // + panel3.Controls.Add(SizeTable); + panel3.Dock = DockStyle.Fill; + panel3.Location = new Point(0, 87); + panel3.Name = "panel3"; + panel3.Size = new Size(909, 488); + panel3.TabIndex = 11; + panel3.Text = "panel3"; + // + // SizeTable + // + SizeTable.Dock = DockStyle.Fill; + SizeTable.EmptyHeader = true; + SizeTable.Location = new Point(0, 0); + SizeTable.Name = "SizeTable"; + SizeTable.Size = new Size(909, 488); + SizeTable.TabIndex = 10; + SizeTable.Text = "table1"; + // + // panel2 + // + panel2.Controls.Add(flowCameraPanel); + panel2.Controls.Add(btnCorrelatedCamera); + panel2.Controls.Add(label11); + panel2.Dock = DockStyle.Top; + panel2.Location = new Point(0, 42); + panel2.Margin = new Padding(3, 3, 10, 3); + panel2.Name = "panel2"; + panel2.Size = new Size(909, 45); + panel2.TabIndex = 8; + panel2.Text = "panel2"; + // + // flowCameraPanel + // + flowCameraPanel.AutoScroll = true; + flowCameraPanel.BackColor = SystemColors.Window; + flowCameraPanel.Dock = DockStyle.Left; + flowCameraPanel.Location = new Point(74, 0); + flowCameraPanel.Name = "flowCameraPanel"; + flowCameraPanel.Size = new Size(645, 45); + flowCameraPanel.TabIndex = 36; + flowCameraPanel.Text = "flowPanel1"; + // + // btnCorrelatedCamera + // + btnCorrelatedCamera.BorderWidth = 2F; + btnCorrelatedCamera.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnCorrelatedCamera.Ghost = true; + btnCorrelatedCamera.IconRatio = 0.8F; + btnCorrelatedCamera.IconSvg = resources.GetString("btnCorrelatedCamera.IconSvg"); + btnCorrelatedCamera.Location = new Point(750, 2); + btnCorrelatedCamera.Name = "btnCorrelatedCamera"; + btnCorrelatedCamera.Size = new Size(110, 40); + btnCorrelatedCamera.TabIndex = 34; + btnCorrelatedCamera.Text = "关联"; + // + // label11 + // + label11.Dock = DockStyle.Left; + label11.Location = new Point(0, 0); + label11.Name = "label11"; + label11.Size = new Size(74, 45); + label11.TabIndex = 35; + label11.Text = "关联相机"; + // + // panel1 + // + panel1.Controls.Add(btnSizeDel); + panel1.Controls.Add(btnSizeAdd); + panel1.Dock = DockStyle.Top; + panel1.Location = new Point(0, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(909, 42); + panel1.TabIndex = 9; + panel1.Text = "panel1"; + // + // btnSizeDel + // + btnSizeDel.BorderWidth = 2F; + btnSizeDel.Dock = DockStyle.Left; + btnSizeDel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSizeDel.Ghost = true; + btnSizeDel.IconRatio = 0.8F; + btnSizeDel.IconSvg = resources.GetString("btnSizeDel.IconSvg"); + btnSizeDel.Location = new Point(80, 0); + btnSizeDel.Name = "btnSizeDel"; + btnSizeDel.Size = new Size(80, 42); + btnSizeDel.TabIndex = 12; + btnSizeDel.Text = "删除"; + // + // btnSizeAdd + // + btnSizeAdd.BorderWidth = 2F; + btnSizeAdd.Dock = DockStyle.Left; + btnSizeAdd.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSizeAdd.Ghost = true; + btnSizeAdd.IconRatio = 0.8F; + btnSizeAdd.IconSvg = resources.GetString("btnSizeAdd.IconSvg"); + btnSizeAdd.Location = new Point(0, 0); + btnSizeAdd.Name = "btnSizeAdd"; + btnSizeAdd.Size = new Size(80, 42); + btnSizeAdd.TabIndex = 11; + btnSizeAdd.Text = "新增"; + // + // tabs1 + // + tabs1.Centered = true; + tabs1.Dock = DockStyle.Fill; + tabs1.Font = new Font("Microsoft YaHei UI", 10.5F, FontStyle.Regular, GraphicsUnit.Point, 134); + tabs1.Location = new Point(0, 0); + tabs1.Name = "tabs1"; + tabs1.Pages.Add(tabPage3); + tabs1.Size = new Size(915, 609); + tabs1.Style = styleLine1; + tabs1.TabIndex = 1; + tabs1.Text = "tabs1"; + // + // SizeControl + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + Controls.Add(tabs1); + Name = "SizeControl"; + Size = new Size(915, 609); + tabPage3.ResumeLayout(false); + tabPage4.ResumeLayout(false); + panel3.ResumeLayout(false); + panel2.ResumeLayout(false); + panel1.ResumeLayout(false); + tabs1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.TabPage tabPage3; + private AntdUI.TabPage tabPage4; + private AntdUI.Tabs tabs1; + private AntdUI.Table SizeTable; + private AntdUI.Panel panel1; + private AntdUI.Button btnSizeDel; + private AntdUI.Button btnSizeAdd; + private AntdUI.FlowPanel flowCameraPanel; + private AntdUI.Label label11; + private AntdUI.Button btnCorrelatedCamera; + private AntdUI.Panel panel2; + private AntdUI.Panel panel3; + } +} diff --git a/DHSoftware/Views/SizeControl.cs b/DHSoftware/Views/SizeControl.cs new file mode 100644 index 0000000..626b866 --- /dev/null +++ b/DHSoftware/Views/SizeControl.cs @@ -0,0 +1,267 @@ +using System.ComponentModel; +using System.Data; +using System.Reflection; +using AntdUI; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Devices.PLC; +using XKRS.CanFly; +using static System.Windows.Forms.AxHost; +using static DH.Commons.Enums.EnumHelper; + +namespace DHSoftware.Views +{ + public partial class SizeControl : UserControl + { + Window window; + DetectionConfig detectionConfig; + public SizeControl(Window _window,DetectionConfig _detection) + { + window = _window; + detectionConfig = _detection; + InitializeComponent(); + //初始化表格列头 + InitTableColumns(); + InitData(); + BindEventHandler(); + } + + private void BindEventHandler() + { + + btnSizeAdd.Click += BtnSizeAdd_Click; + btnSizeDel.Click += BtnSizeDelete_Click; + SizeTable.CellButtonClick += SizeTable_CellButtonClick; + btnCorrelatedCamera.Click += BtnCorrelatedCamera_Click; + } + private void BtnCorrelatedCamera_Click(object? sender, EventArgs e) + { + + var form = new CorrelatedCameraEdit(window, detectionConfig.CameraCollects) { Size = new Size(500, 400) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(window, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + flowCameraPanel.Controls.Clear(); + if (detectionConfig.CameraCollects.Count > 0) + { + foreach (var item in detectionConfig.CameraCollects) + { + var control = new AntdUI.Tag() + { + Font = new System.Drawing.Font("Microsoft YaHei UI", 9F), + Size = new Size(90, 42), + Text = item.CameraSourceId, + CloseIcon = true + }; + control.CloseChanged += (sender, e) => + { + var tag = sender as Tag; + foreach (var item in detectionConfig.CameraCollects) + { + if (item.CameraSourceId.Equals(tag.Text)) + { + detectionConfig.CameraCollects.Remove(item); + break; + } + } + return true; + + }; + // 通过主窗口设置DPI控制添加控件保持缩放比例 + window.AutoDpi(control); + flowCameraPanel.Controls.Add(control); + control.BringToFront(); + } + } + } + } + + + private void SizeTable_CellButtonClick(object sender, TableButtonEventArgs e) + { + var buttontext = e.Btn.Text; + + if (e.Record is SizeTreatParam sizeTreat) + { + switch (buttontext) + { + //暂不支持进入整行编辑,只支持指定单元格编辑,推荐使用弹窗或抽屉编辑整行数据 + case "编辑": + var form = new SizeLabelEdit(window, sizeTreat) { Size = new Size(500, 300) }; + AntdUI.Drawer.open(new AntdUI.Drawer.Config(window, form) + { + OnLoad = () => + { + AntdUI.Message.info(window, "进入编辑", autoClose: 1); + }, + OnClose = () => + { + AntdUI.Message.info(window, "结束编辑", autoClose: 1); + } + }); + break; + case "删除": + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + detectionConfig.SizeTreatParamList.Remove(sizeTreat); + break; + case "进行测量": + var sizeType = ((int)sizeTreat.PreType).ToString(); + + // 根据测量类型打开不同的窗口 + switch (sizeType) + { + case "1": + case "2": + case "3": + case "4": + case "5": + FrmMainSize frmMain3 = new FrmMainSize(sizeType, detectionConfig); + frmMain3.ShowDialog(); + if (!string.IsNullOrEmpty(frmMain3.inputtext)) + { + + sizeTreat.ResultShow = frmMain3.inputtext; + } + if (!string.IsNullOrEmpty(frmMain3.outtext)) + { + + + sizeTreat.OutResultShow = frmMain3.outtext; + } + break; + default: + MessageBox.Show("未定义的测量类型!"); + break; + } + + //使用clone可以防止table中的image被修改 + //Preview.open(new Preview.Config(window, (Image)SizeParamLable.CellImages[0].Image.Clone())); + break; + + } + } + } + + + + + private void BtnSizeDelete_Click(object? sender, EventArgs e) + { + if (detectionConfig.SizeTreatParamList.Count == 0 || !detectionConfig.SizeTreatParamList.Any(x => x.Selected)) + { + AntdUI.Message.warn(window, "请选择要删除的行!", autoClose: 3); + return; + } + + var result = Modal.open(window, "删除警告!", "确认要删除选择的数据吗?", TType.Warn); + if (result == DialogResult.OK) + { + // 使用反转for循环删除主列表中选中的项 + for (int i = detectionConfig.SizeTreatParamList.Count - 1; i >= 0; i--) + { + // 删除选中的主列表项 + if (detectionConfig.SizeTreatParamList[i].Selected) + { + detectionConfig.SizeTreatParamList.RemoveAt(i); + } + } + // 提示删除完成 + AntdUI.Message.success(window, "删除成功!", autoClose: 3); + } + } + + private void BtnSizeAdd_Click(object? sender, EventArgs e) + { + SizeTreatParam SizeParamLable = new SizeTreatParam() + { + //CellBadge = new CellBadge(SizeEnum.Circle.GetEnumDescription()), + CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(),"编辑",TTypeMini.Primary), + + new CellButton(Guid.NewGuid().ToString(),"删除",TTypeMini.Error), + new CellButton(Guid.NewGuid().ToString(),"进行测量",TTypeMini.Primary) + } + + + }; + var form = new SizeLabelEdit(window, SizeParamLable) { Size = new Size(450, 500) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(window, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + detectionConfig.SizeTreatParamList.Add(SizeParamLable); + } + } + + + + + + + + + + + + + + + + + private void InitData() + { + + SizeTable.Binding(detectionConfig.SizeTreatParamList); + + + if (detectionConfig.SizeTreatParamList.Count > 0) + { + foreach (var item in detectionConfig.SizeTreatParamList) + { + + item.CellLinks = new CellLink[] { + new CellButton(Guid.NewGuid().ToString(), "编辑", TTypeMini.Primary) , + new CellButton(Guid.NewGuid().ToString(), "删除", TTypeMini.Error), + new CellButton(Guid.NewGuid().ToString(),"进行测量",TTypeMini.Primary) + }; + } + } + } + + private void InitTableColumns() + { + + + + SizeTable.Columns = new ColumnCollection() { + new ColumnCheck("Selected"){Fixed = true}, + new ColumnSwitch("IsEnable", "是否启用", ColumnAlign.Center), + new Column("PreName", "测量名称",ColumnAlign.Center), + new Column("PreType", "测量类型", ColumnAlign.Center), + new Column("PrePix", "阈值", ColumnAlign.Center), + new Column("ResultShow", "输入参数", ColumnAlign.Center), + new Column("OutResultShow", "输出参数", ColumnAlign.Center), + new Column("CellLinks", "操作", ColumnAlign.Center) + }; + } + + + + + + + + + + + + + } + +} diff --git a/DHSoftware/Views/SizeControl.resx b/DHSoftware/Views/SizeControl.resx new file mode 100644 index 0000000..4bdfd3a --- /dev/null +++ b/DHSoftware/Views/SizeControl.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + <svg t="1741939836774" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21349" width="200" height="200"><path d="M1003.153333 404.96a52.933333 52.933333 0 0 0-42.38-20.96H896V266.666667a53.393333 53.393333 0 0 0-53.333333-53.333334H461.253333a10.573333 10.573333 0 0 1-7.54-3.126666L344.46 100.953333A52.986667 52.986667 0 0 0 306.746667 85.333333H53.333333a53.393333 53.393333 0 0 0-53.333333 53.333334v704a53.393333 53.393333 0 0 0 53.333333 53.333333h796.893334a53.453333 53.453333 0 0 0 51.453333-39.333333l110.546667-405.333334a52.953333 52.953333 0 0 0-9.073334-46.373333zM53.333333 128h253.413334a10.573333 10.573333 0 0 1 7.54 3.126667l109.253333 109.253333A52.986667 52.986667 0 0 0 461.253333 256H842.666667a10.666667 10.666667 0 0 1 10.666666 10.666667v117.333333H173.773333a53.453333 53.453333 0 0 0-51.453333 39.333333L42.666667 715.366667V138.666667a10.666667 10.666667 0 0 1 10.666666-10.666667zm917.726667 312.14l-110.546667 405.333333a10.666667 10.666667 0 0 1-10.286666 7.86H63.226667a10.666667 10.666667 0 0 1-10.286667-13.473333l110.546667-405.333333A10.666667 10.666667 0 0 1 173.773333 426.666667h787a10.666667 10.666667 0 0 1 10.286667 13.473333z" fill="#5C5C66" p-id="21350"/></svg> + + + <svg t="1741939836774" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21349" width="200" height="200"><path d="M1003.153333 404.96a52.933333 52.933333 0 0 0-42.38-20.96H896V266.666667a53.393333 53.393333 0 0 0-53.333333-53.333334H461.253333a10.573333 10.573333 0 0 1-7.54-3.126666L344.46 100.953333A52.986667 52.986667 0 0 0 306.746667 85.333333H53.333333a53.393333 53.393333 0 0 0-53.333333 53.333334v704a53.393333 53.393333 0 0 0 53.333333 53.333333h796.893334a53.453333 53.453333 0 0 0 51.453333-39.333333l110.546667-405.333334a52.953333 52.953333 0 0 0-9.073334-46.373333zM53.333333 128h253.413334a10.573333 10.573333 0 0 1 7.54 3.126667l109.253333 109.253333A52.986667 52.986667 0 0 0 461.253333 256H842.666667a10.666667 10.666667 0 0 1 10.666666 10.666667v117.333333H173.773333a53.453333 53.453333 0 0 0-51.453333 39.333333L42.666667 715.366667V138.666667a10.666667 10.666667 0 0 1 10.666666-10.666667zm917.726667 312.14l-110.546667 405.333333a10.666667 10.666667 0 0 1-10.286666 7.86H63.226667a10.666667 10.666667 0 0 1-10.286667-13.473333l110.546667-405.333333A10.666667 10.666667 0 0 1 173.773333 426.666667h787a10.666667 10.666667 0 0 1 10.286667 13.473333z" fill="#5C5C66" p-id="21350"/></svg> + + + <svg t="1741939836774" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21349" width="200" height="200"><path d="M1003.153333 404.96a52.933333 52.933333 0 0 0-42.38-20.96H896V266.666667a53.393333 53.393333 0 0 0-53.333333-53.333334H461.253333a10.573333 10.573333 0 0 1-7.54-3.126666L344.46 100.953333A52.986667 52.986667 0 0 0 306.746667 85.333333H53.333333a53.393333 53.393333 0 0 0-53.333333 53.333334v704a53.393333 53.393333 0 0 0 53.333333 53.333333h796.893334a53.453333 53.453333 0 0 0 51.453333-39.333333l110.546667-405.333334a52.953333 52.953333 0 0 0-9.073334-46.373333zM53.333333 128h253.413334a10.573333 10.573333 0 0 1 7.54 3.126667l109.253333 109.253333A52.986667 52.986667 0 0 0 461.253333 256H842.666667a10.666667 10.666667 0 0 1 10.666666 10.666667v117.333333H173.773333a53.453333 53.453333 0 0 0-51.453333 39.333333L42.666667 715.366667V138.666667a10.666667 10.666667 0 0 1 10.666666-10.666667zm917.726667 312.14l-110.546667 405.333333a10.666667 10.666667 0 0 1-10.286666 7.86H63.226667a10.666667 10.666667 0 0 1-10.286667-13.473333l110.546667-405.333333A10.666667 10.666667 0 0 1 173.773333 426.666667h787a10.666667 10.666667 0 0 1 10.286667 13.473333z" fill="#5C5C66" p-id="21350"/></svg> + + \ No newline at end of file diff --git a/DHSoftware/Views/SizeLabelEdit.cs b/DHSoftware/Views/SizeLabelEdit.cs index 3b75e99..dbd981a 100644 --- a/DHSoftware/Views/SizeLabelEdit.cs +++ b/DHSoftware/Views/SizeLabelEdit.cs @@ -1,4 +1,5 @@ -using DH.Commons.Enums; +using DH.Commons.Base; +using DH.Commons.Enums; using System; using System.Collections.Generic; using System.ComponentModel; diff --git a/DHSoftware/Views/UserConfigFrm.Designer.cs b/DHSoftware/Views/UserConfigFrm.Designer.cs deleted file mode 100644 index fc7ec0e..0000000 --- a/DHSoftware/Views/UserConfigFrm.Designer.cs +++ /dev/null @@ -1,167 +0,0 @@ -namespace DHSoftware.Views -{ - partial class UserConfigFrm - { - /// - /// 必需的设计器变量 - /// - 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() - { - AntdUI.Tabs.StyleCard styleCard1 = new AntdUI.Tabs.StyleCard(); - pnlMenu = new AntdUI.Panel(); - panel3 = new AntdUI.Panel(); - btnSave = new AntdUI.Button(); - btnAdd = new AntdUI.Button(); - menu = new AntdUI.Menu(); - panel2 = new AntdUI.Panel(); - divider1 = new AntdUI.Divider(); - tabs = new AntdUI.Tabs(); - pnlMenu.SuspendLayout(); - panel3.SuspendLayout(); - panel2.SuspendLayout(); - SuspendLayout(); - // - // pnlMenu - // - pnlMenu.Controls.Add(panel3); - pnlMenu.Controls.Add(menu); - pnlMenu.Dock = DockStyle.Left; - pnlMenu.Location = new Point(0, 0); - pnlMenu.Name = "pnlMenu"; - pnlMenu.Size = new Size(135, 542); - pnlMenu.TabIndex = 0; - pnlMenu.Text = "panel1"; - // - // panel3 - // - panel3.Back = SystemColors.Window; - panel3.BackColor = SystemColors.Window; - panel3.Controls.Add(btnSave); - panel3.Controls.Add(btnAdd); - panel3.Dock = DockStyle.Bottom; - panel3.Location = new Point(0, 516); - panel3.Name = "panel3"; - panel3.Size = new Size(135, 26); - panel3.TabIndex = 2; - panel3.Text = "panel3"; - // - // btnSave - // - btnSave.BackActive = SystemColors.Control; - btnSave.BackColor = SystemColors.Control; - btnSave.Dock = DockStyle.Left; - btnSave.ForeColor = Color.Black; - btnSave.IconRatio = 1F; - btnSave.IconSvg = "AppstoreAddOutlined"; - btnSave.Location = new Point(35, 0); - btnSave.Name = "btnSave"; - btnSave.Size = new Size(35, 26); - btnSave.TabIndex = 2; - // - // btnAdd - // - btnAdd.BackActive = SystemColors.Control; - btnAdd.BackColor = SystemColors.Control; - btnAdd.Dock = DockStyle.Left; - btnAdd.ForeColor = Color.Black; - btnAdd.IconRatio = 1F; - btnAdd.IconSvg = "AppstoreAddOutlined"; - btnAdd.Location = new Point(0, 0); - btnAdd.Name = "btnAdd"; - btnAdd.Size = new Size(35, 26); - btnAdd.TabIndex = 1; - btnAdd.Click += btnAdd_Click; - // - // menu - // - menu.Dock = DockStyle.Fill; - menu.Location = new Point(0, 0); - menu.Name = "menu"; - menu.Size = new Size(135, 542); - menu.TabIndex = 0; - menu.Text = "menu1"; - menu.SelectChanged += Menu_SelectChanged; - menu.MouseDown += Menu_MouseDown; - // - // panel2 - // - panel2.Controls.Add(divider1); - panel2.Controls.Add(tabs); - panel2.Dock = DockStyle.Fill; - panel2.Location = new Point(135, 0); - panel2.Name = "panel2"; - panel2.Size = new Size(745, 542); - panel2.TabIndex = 1; - panel2.Text = "panel2"; - // - // divider1 - // - divider1.BackColor = SystemColors.ActiveCaption; - divider1.Dock = DockStyle.Left; - divider1.Location = new Point(0, 0); - divider1.Name = "divider1"; - divider1.Size = new Size(10, 542); - divider1.TabIndex = 1; - divider1.Text = ""; - divider1.Vertical = true; - // - // tabs - // - tabs.Dock = DockStyle.Fill; - tabs.Location = new Point(0, 0); - tabs.Name = "tabs"; - tabs.Size = new Size(745, 542); - tabs.Style = styleCard1; - tabs.TabIndex = 0; - tabs.Text = "tabs1"; - tabs.Type = AntdUI.TabType.Card; - tabs.SelectedIndexChanged += tabs_SelectedIndexChanged; - // - // UserConfigFrm - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - AutoSize = true; - Controls.Add(panel2); - Controls.Add(pnlMenu); - Name = "UserConfigFrm"; - Size = new Size(880, 542); - pnlMenu.ResumeLayout(false); - panel3.ResumeLayout(false); - panel2.ResumeLayout(false); - ResumeLayout(false); - } - - #endregion - private AntdUI.Tabs tabs; - private AntdUI.Panel pnlMenu; - private AntdUI.Panel panel2; - private AntdUI.Menu menu; - private AntdUI.Panel panel3; - private AntdUI.Button btnSave; - private AntdUI.Button btnAdd; - private AntdUI.Divider divider1; - // private AntdUI.Tabs tabs; - } -} diff --git a/DHSoftware/Views/UserConfigFrm.cs b/DHSoftware/Views/UserConfigFrm.cs deleted file mode 100644 index d729764..0000000 --- a/DHSoftware/Views/UserConfigFrm.cs +++ /dev/null @@ -1,258 +0,0 @@ -using AntdUI; -using AntdUIDemo.Models; -using DH.Commons.Enums; -using DH.Devices.Devices; -using DH.Devices.Vision; -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 static System.Windows.Forms.VisualStyles.VisualStyleElement; -using Window = AntdUI.Window; - -namespace DHSoftware.Views -{ - public partial class UserConfigFrm : UserControl - { - public List cameras = new List(); - public List detections = new List(); - private UserControl currControl; - private bool isUpdatingTabs = false;//用于阻止Tabs更新 - public Window Window; - public UserConfigFrm() - { - InitializeComponent(); - - LoadMenu(); - menu.Width = (int)(100 * Config.Dpi); - - } - private void LoadMenu(string filter = "") - { - menu.Items.Clear(); - - string lang = AntdUI.Localization.CurrentLanguage; - var menuItems = DataUtil.Menu_decetion; - //var menuIcons = DataUtil.MenuIcons_zhcn; - //if (lang.StartsWith("en")) - //{ - // menuItems = DataUtil.MenuItems_enus; - // menuIcons = DataUtil.MenuIcons_enus; - //} - - foreach (var rootItem in menuItems) - { - var rootKey = rootItem.Key.ToLower(); - var rootMenu = new AntdUI.MenuItem - { - Text = rootItem.Key, - //IconSvg = menuIcons.TryGetValue(rootItem.Key, out var icon) ? icon : "UnorderedListOutlined", - }; - bool rootVisible = false; // 用于标记是否显示根节点 - - foreach (var item in rootItem.Value) - { - var childText = item.Text.ToLower(); - - // 如果子节点包含搜索文本 - if (childText.Contains(filter)) - { - var menuItem = new AntdUI.MenuItem - { - Text = item.Text, - IconSvg = item.IconSvg, - Tag = item.Tag, - }; - rootMenu.Sub.Add(menuItem); - rootVisible = true; // 如果有子节点包含,则显示根节点 - } - } - - // 如果根节点包含搜索文本,或有可见的子节点,则显示根节点 - if (rootKey.Contains(filter) || rootVisible) - { - menu.Items.Add(rootMenu); - } - } - } - private void SelectMenu() - { - if (isUpdatingTabs) return; - var text = tabs.SelectedTab?.Text; // 使用安全导航操作符,防止 SelectedTab 为 null - if (string.IsNullOrEmpty(text)) // 检查 text 是否为 null 或空 - { - return; // 如果 text 为空,直接退出方法 - } - //首页 - if (text == AntdUI.Localization.Get("home", "主页")) - { - return; - } - var rootIndex = 0; - var subIndex = 0; - var menuItemsCopy = menu.Items.ToList(); // 创建副本 - for (int i = 0; i < menuItemsCopy.Count; i++) - { - for (int j = 0; j < menuItemsCopy[i].Sub.Count; j++) - { - if (menuItemsCopy[i].Sub[j].Tag.ToString() == text) - { - rootIndex = i; - subIndex = j; - break; - } - } - } - menu.SelectIndex(rootIndex, subIndex, true); - } - private void Menu_MouseDown(object sender, MouseEventArgs e) - { - if (e.Button == MouseButtons.Right) - { - // 转换坐标到控件内部坐标系(考虑滚动条) - Point clickPoint = new Point(e.X, e.Y + menu.ScrollBar.Value); - - // 递归查找命中的菜单项 - MenuItem clickedItem = FindClickedItem(menu.Items, clickPoint); - - if (clickedItem != null) - { - // 显示节点名称弹窗 - //MessageBox.Show($"右键点击的节点: {clickedItem.Text}"); - - var menulist = new AntdUI.IContextMenuStripItem[] - { - new AntdUI.ContextMenuStripItem("关联相机", "") - { - IconSvg = "VideoCameraAddOutlined" - } - }; - AntdUI.ContextMenuStrip.open(menu, it => - { - if (it.Text == "关联相机") - { - //using (var dlg = new AddCameraWindow(cameras)) - //{ - // if (dlg.ShowDialog() == DialogResult.OK) - // { - // var newItem = new MenuItem(dlg.CubicleName); - // newItem.IconSvg = "VideoCameraOutlined"; - // //// 防止重复添加 - // //if (!menu1.Items.Cast().Any(m => m.Text == newItem.Text)) - // //{ - // clickedItem.Sub.Add(newItem); - // //} - // //else - // //{ - // // AntdUI.Notification.warn(this, "新增失败", $"{dlg.CubicleName}已存在!", autoClose: 3, align: TAlignFrom.TR); - // //} - // } - //} - } - }, menulist); - } - } - } - - private MenuItem FindClickedItem(MenuItemCollection items, Point clickPoint) - { - foreach (MenuItem item in items) - { - // 检查当前项是否可见且包含点击坐标 - if (item.Visible && item.Rect.Contains(clickPoint)) - { - return item; - } - - - } - return null; - } - - private void Menu_SelectChanged(object sender, MenuSelectEventArgs e) - { - string name = (string)e.Value.Tag; - - //// 清理上一个浮动按钮窗体 - //if (currControl is FloatButtonDemo floatButtonDemo) - //{ - // floatButtonDemo.CloseFloatButtonForm(); - //} - - // 检查是否已存在同名 TabPage - foreach (var tab in tabs.Pages) - { - if (tab is AntdUI.TabPage existingTab && existingTab.Text == name) - { - isUpdatingTabs = true; - tabs.SelectedTab = existingTab; - isUpdatingTabs = false; - currControl = existingTab.Controls.Count > 0 ? existingTab.Controls[0] as UserControl : null; - return; - } - } - int width = tabs.Width; - int height = tabs.Height; - // 创建新 TabPage - UserDetetion control = new UserDetetion(Window,width, height); - // control._windows = Window; - switch (name) - { - case "工位1": - // control = - break; - } - - if (control != null) - { - control.Dock = DockStyle.Fill; - // AutoDpi(control); // 如果有 DPI 适配逻辑 - - var tabPage = new AntdUI.TabPage - { - Dock = DockStyle.Fill, - Text = name, - }; - tabPage.Controls.Add(control); - tabs.Pages.Add(tabPage); - - isUpdatingTabs = true; - tabs.SelectedTab = tabPage; - isUpdatingTabs = false; - currControl = control; - } - } - - - private void tabs_SelectedIndexChanged(object sender, IntEventArgs e) - { - SelectMenu(); - } - - private void btnAdd_Click(object sender, EventArgs e) - { - //using (var dlg = new AddCubicleWindow()) - //{ - // if (dlg.ShowDialog() == DialogResult.OK) - // { - // var newItem = new MenuItem(dlg.CubicleName); - // //newItem.IconSvg = "AppstoreOutlined"; - // // 防止重复添加 - // if (!menu.Items.Cast().Any(m => m.Text == newItem.Text)) - // { - // menu.Items.Add(newItem); - // } - // else - // { - // // AntdUI.Notification.warn(this, "新增工位失败", $"{dlg.CubicleName}已存在!", autoClose: 3, align: TAlignFrom.TR); - // } - // } - //} - } - } -} diff --git a/DHSoftware/Views/UserDetetion.Designer.cs b/DHSoftware/Views/UserDetetion.Designer.cs deleted file mode 100644 index d180c78..0000000 --- a/DHSoftware/Views/UserDetetion.Designer.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace DHSoftware.Views -{ - partial class UserDetetion - { - /// - /// 必需的设计器变量 - /// - 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() - { - collapse1 = new AntdUI.Collapse(); - panel1 = new Panel(); - SuspendLayout(); - // - // collapse1 - // - collapse1.Dock = DockStyle.Fill; - collapse1.Location = new Point(0, 0); - collapse1.Name = "collapse1"; - collapse1.Size = new Size(842, 568); - collapse1.TabIndex = 0; - collapse1.Text = "collapse1"; - // - // panel1 - // - panel1.BackColor = SystemColors.GradientActiveCaption; - panel1.Dock = DockStyle.Left; - panel1.Location = new Point(0, 0); - panel1.Name = "panel1"; - panel1.Size = new Size(2, 568); - panel1.TabIndex = 0; - // - // UserDetetion - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - Controls.Add(panel1); - Controls.Add(collapse1); - Name = "UserDetetion"; - Size = new Size(842, 568); - ResumeLayout(false); - } - - #endregion - - private AntdUI.Collapse collapse1; - private Panel panel1; - //private AntdUI.Button button1; - } -} diff --git a/DHSoftware/Views/UserDetetion.cs b/DHSoftware/Views/UserDetetion.cs deleted file mode 100644 index 4b6c3a2..0000000 --- a/DHSoftware/Views/UserDetetion.cs +++ /dev/null @@ -1,226 +0,0 @@ -using AntdUI; -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 Button = AntdUI.Button; - -namespace DHSoftware.Views -{ - public partial class UserDetetion : UserControl - { - private StackPanel panel, panel2, panel3, panel4; - public Window _windows; - //根据检测配置 将对应的相机配置、中处理预处理、尺寸测量 - public UserDetetion(Window windows,int parentWidth, int parentHeight) - { - InitializeComponent(); - _windows = windows; - AntdUI.CollapseItem group1 = new CollapseItem(); - group1.Height = parentHeight / 4; - group1.Text = "相机配置"; - AntdUI.CollapseItem group2 = new CollapseItem(); - group2.Text = "预处理"; - group2.Height = parentHeight/4; - - AntdUI.CollapseItem group3 = new CollapseItem(); - group3.Text = "中处理"; - group3.Height = parentHeight - 300; - - AntdUI.CollapseItem group4 = new CollapseItem(); - group4.Text = "尺寸测量"; - group4.Height = parentHeight / 4; - - - // 初始化内容面板 - panel = CreateScrollPanel(); - panel2 = CreateScrollPanel(); - panel3 = CreateScrollPanel(); - panel4 = CreateScrollPanel(); - - // 添加预处理控件 - var ptuc = new PreTreatUserControl { AutoScroll = true, Dock = DockStyle.Top }; - var detect = new DetectConfigControl { AutoScroll = true , Dock = DockStyle.Fill }; - detect._window = this._windows; - - // 添加尺寸测量控件 - var sizeFrm = new SizeConfigControl(); - - - CameraConfigControl camConfigFrm = new CameraConfigControl(); - camConfigFrm.Dock = DockStyle.Fill; - - - - //PreTreatUserControl ptuc = new PreTreatUserControl(); - //ptuc.AutoScroll = true; - //panel2.Controls.Add(ptuc); - //DetectConfigControl detect = new DetectConfigControl(); - //// detect.Dock = DockStyle.Fill; - //detect.AutoScroll = true; - //panel2.Controls.Add(detect); - - - //SizeConfigControl Sizefc = new SizeConfigControl(); - //Sizefc.Dock = DockStyle.Fill; - //panel3.Controls.Add(Sizefc); - - - - Button btnAddCam = new Button - { - Width = 100, - Height = 30, - Text = "添加相机配置", - //Dock=DockStyle.Bottom - }; - Button btnDelCam = new Button - { - Width = 100, - Height = 30, - Text = "删除相机配置", - // Dock = DockStyle.Bottom - }; - - - Button btnAddModel = new Button - { - Width = 100, - Height = 30, - Text = "添加模型配置", - //Dock=DockStyle.Bottom - }; - Button btnDelModel = new Button - { - Width = 100, - Height = 30, - Text = "删除模型配置", - // Dock = DockStyle.Bottom - }; - - FlowLayoutPanel flow = new FlowLayoutPanel(); - flow.Dock = DockStyle.Bottom; - flow.Controls.Add(btnAddCam); - flow.Controls.Add(btnDelCam); - - FlowLayoutPanel flowmodel = new FlowLayoutPanel(); - flowmodel.Dock = DockStyle.Bottom; - flowmodel.Controls.Add(btnAddModel); - flowmodel.Controls.Add(btnDelModel); - btnAddCam.Click += btnAddCam_Click; - btnDelCam.Click += btnDelCam_Click; - btnAddModel.Click += btnAddModel_Click; - btnDelModel.Click += btnDelModel_Click; - - panel.Controls.Add(flow); - panel.Controls.Add(camConfigFrm); - - panel2.Controls.Add(ptuc); - panel3.Controls.Add(flowmodel); - panel3.Controls.Add(detect); - panel4.Controls.Add(sizeFrm); - group1.Controls.Add(panel); - group2.Controls.Add(panel2); - group3.Controls.Add(panel3); - group4.Controls.Add(panel4); - - - //collapse1.Items.Add(group1); - collapse1.Items.Add(group1); - collapse1.Items.Add(group2); - collapse1.Items.Add(group3); - collapse1.Items.Add(group4); - - - } - - // 统一事件处理 - private void CameraOperation_Click(object sender, EventArgs e) - { - if (sender is Button btn) - { - switch (btn.Tag?.ToString()) - { - case "Add": - AddCameraConfig(); - break; - case "Delete": - DeleteCameraConfig(); - break; - } - } - } - - // 实际业务方法 - private void AddCameraConfig() - { - var newCamConfig = new CameraConfigControl { Dock = DockStyle.Top }; - panel.Controls.Add(newCamConfig); - panel.ScrollControlIntoView(newCamConfig); - } - - private void DeleteCameraConfig() - { - if (panel.Controls.Count > 1) - { - panel.Controls.RemoveAt(panel.Controls.Count - 2); - } - } - // 创建带滚动条的面板 - private StackPanel CreateScrollPanel() - { - return new StackPanel - { - Dock = DockStyle.Fill, - Vertical = true, - AutoScroll = true, - Padding = new Padding(5) // 添加内边距避免内容贴边 - }; - } - - private void btnAddCam_Click(object sender, EventArgs e) - { - CameraConfigControl camConfigFrm2 = new CameraConfigControl(); - camConfigFrm2.Dock = DockStyle.Fill; - - panel.Controls.Add(camConfigFrm2); - } - private void btnDelCam_Click(object sender, EventArgs e) - { - // 遍历 panel 的 Controls,找到最后一个 CameraConfigControl 并移除 - for (int i = panel.Controls.Count - 1; i >= 0; i--) - { - if (panel.Controls[i] is CameraConfigControl) - { - panel.Controls.RemoveAt(i); - break; // 只删除一个 - } - } - } - private void btnAddModel_Click(object sender, EventArgs e) - { - DetectConfigControl DetectFrm = new DetectConfigControl(); - DetectFrm._window = this._windows; - DetectFrm.Dock = DockStyle.Fill; - - panel3.Controls.Add(DetectFrm); - } - private void btnDelModel_Click(object sender, EventArgs e) - { - // 遍历 panel 的 Controls,找到最后一个 CameraConfigControl 并移除 - for (int i = panel3.Controls.Count - 1; i >= 0; i--) - { - if (panel3.Controls[i] is DetectConfigControl) - { - panel3.Controls.RemoveAt(i); - break; // 只删除一个 - } - } - } - } -} diff --git a/DHSoftware/Views/VisualLocalizationWindow.Designer.cs b/DHSoftware/Views/VisualLocalizationWindow.Designer.cs new file mode 100644 index 0000000..8317a24 --- /dev/null +++ b/DHSoftware/Views/VisualLocalizationWindow.Designer.cs @@ -0,0 +1,591 @@ +namespace DHSoftware.Views +{ + partial class VisualLocalizationWindow + { + /// + /// 必需的设计器变量。 + /// + 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() + { + titlebar = new AntdUI.PageHeader(); + panel1 = new AntdUI.Panel(); + iptThreshold = new AntdUI.InputNumber(); + label6 = new AntdUI.Label(); + btnSelectBackImg = new AntdUI.Button(); + btnSelectModel = new AntdUI.Button(); + iptBackImg = new AntdUI.Input(); + label3 = new AntdUI.Label(); + iptModel = new AntdUI.Input(); + label2 = new AntdUI.Label(); + sltCameraName = new AntdUI.Select(); + label1 = new AntdUI.Label(); + panel2 = new AntdUI.Panel(); + iptSpeed = new AntdUI.InputNumber(); + label7 = new AntdUI.Label(); + btnSaveImg = new AntdUI.Button(); + btnSavePos = new AntdUI.Button(); + btnReverse = new AntdUI.Button(); + btnForward = new AntdUI.Button(); + btnLocalization = new AntdUI.Button(); + btnAcquisition = new AntdUI.Button(); + iptPosition = new AntdUI.InputNumber(); + label5 = new AntdUI.Label(); + sltDirection = new AntdUI.Select(); + label4 = new AntdUI.Label(); + panelMotor = new AntdUI.Panel(); + btnSaveMotorPos = new AntdUI.Button(); + iptMotorPos = new AntdUI.InputNumber(); + label9 = new AntdUI.Label(); + btnMotorZero = new AntdUI.Button(); + btnMotorReverse = new AntdUI.Button(); + btnMotorForward = new AntdUI.Button(); + iptMotorSpeed = new AntdUI.InputNumber(); + label8 = new AntdUI.Label(); + panel3 = new AntdUI.Panel(); + btnSaveBarrierPos = new AntdUI.Button(); + iptBarrierPos = new AntdUI.InputNumber(); + label10 = new AntdUI.Label(); + btnBarrierZero = new AntdUI.Button(); + btnBarrier = new AntdUI.Button(); + iptBarrierSpeed = new AntdUI.InputNumber(); + label11 = new AntdUI.Label(); + imageViewerControl1 = new ImageViewerControl(); + panel1.SuspendLayout(); + panel2.SuspendLayout(); + panelMotor.SuspendLayout(); + panel3.SuspendLayout(); + SuspendLayout(); + // + // titlebar + // + titlebar.BackColor = Color.FromArgb(46, 108, 227); + titlebar.DividerShow = true; + titlebar.DividerThickness = 0F; + titlebar.Dock = DockStyle.Top; + titlebar.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + titlebar.ForeColor = Color.White; + titlebar.Location = new Point(0, 0); + titlebar.Mode = AntdUI.TAMode.Dark; + titlebar.Name = "titlebar"; + titlebar.ShowButton = true; + titlebar.ShowIcon = true; + titlebar.Size = new Size(1210, 37); + titlebar.SubText = "视觉定位系统"; + titlebar.TabIndex = 1; + titlebar.Text = "山东迭慧智能科技有限公司"; + // + // panel1 + // + panel1.Controls.Add(iptThreshold); + panel1.Controls.Add(label6); + panel1.Controls.Add(btnSelectBackImg); + panel1.Controls.Add(btnSelectModel); + panel1.Controls.Add(iptBackImg); + panel1.Controls.Add(label3); + panel1.Controls.Add(iptModel); + panel1.Controls.Add(label2); + panel1.Controls.Add(sltCameraName); + panel1.Controls.Add(label1); + panel1.Dock = DockStyle.Top; + panel1.Location = new Point(0, 37); + panel1.Name = "panel1"; + panel1.Size = new Size(1210, 56); + panel1.TabIndex = 2; + panel1.Text = "panel1"; + // + // iptThreshold + // + iptThreshold.Location = new Point(1094, 6); + iptThreshold.Name = "iptThreshold"; + iptThreshold.Size = new Size(107, 43); + iptThreshold.TabIndex = 15; + iptThreshold.Text = "0"; + // + // label6 + // + label6.BackColor = SystemColors.Window; + label6.Location = new Point(1044, 18); + label6.Name = "label6"; + label6.Size = new Size(57, 23); + label6.TabIndex = 14; + label6.Text = "定位阈值"; + // + // btnSelectBackImg + // + btnSelectBackImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSelectBackImg.Location = new Point(963, 11); + btnSelectBackImg.Name = "btnSelectBackImg"; + btnSelectBackImg.Size = new Size(75, 38); + btnSelectBackImg.TabIndex = 13; + btnSelectBackImg.Text = "打开"; + btnSelectBackImg.Type = AntdUI.TTypeMini.Primary; + // + // btnSelectModel + // + btnSelectModel.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSelectModel.Location = new Point(525, 9); + btnSelectModel.Name = "btnSelectModel"; + btnSelectModel.Size = new Size(75, 38); + btnSelectModel.TabIndex = 12; + btnSelectModel.Text = "打开"; + btnSelectModel.Type = AntdUI.TTypeMini.Primary; + // + // iptBackImg + // + iptBackImg.Location = new Point(694, 6); + iptBackImg.Name = "iptBackImg"; + iptBackImg.PlaceholderText = "请选择背景图片"; + iptBackImg.Size = new Size(263, 43); + iptBackImg.TabIndex = 10; + // + // label3 + // + label3.BackColor = SystemColors.Window; + label3.Location = new Point(606, 18); + label3.Name = "label3"; + label3.Size = new Size(82, 23); + label3.TabIndex = 9; + label3.Text = "背景图片路径"; + // + // iptModel + // + iptModel.Location = new Point(256, 6); + iptModel.Name = "iptModel"; + iptModel.PlaceholderText = "请选择算法"; + iptModel.Size = new Size(263, 43); + iptModel.TabIndex = 3; + // + // label2 + // + label2.BackColor = SystemColors.Window; + label2.Location = new Point(193, 18); + label2.Name = "label2"; + label2.Size = new Size(57, 23); + label2.TabIndex = 2; + label2.Text = "算法路径"; + // + // sltCameraName + // + sltCameraName.List = true; + sltCameraName.Location = new Point(72, 7); + sltCameraName.MaxCount = 10; + sltCameraName.Name = "sltCameraName"; + sltCameraName.PlaceholderText = "请选择相机"; + sltCameraName.Size = new Size(115, 43); + sltCameraName.TabIndex = 1; + // + // label1 + // + label1.BackColor = SystemColors.Window; + label1.Location = new Point(9, 18); + label1.Name = "label1"; + label1.Size = new Size(57, 23); + label1.TabIndex = 0; + label1.Text = "相机名称"; + // + // panel2 + // + panel2.Controls.Add(iptSpeed); + panel2.Controls.Add(label7); + panel2.Controls.Add(btnSaveImg); + panel2.Controls.Add(btnSavePos); + panel2.Controls.Add(btnReverse); + panel2.Controls.Add(btnForward); + panel2.Controls.Add(btnLocalization); + panel2.Controls.Add(btnAcquisition); + panel2.Controls.Add(iptPosition); + panel2.Controls.Add(label5); + panel2.Controls.Add(sltDirection); + panel2.Controls.Add(label4); + panel2.Dock = DockStyle.Top; + panel2.Location = new Point(0, 93); + panel2.Name = "panel2"; + panel2.Size = new Size(1210, 56); + panel2.TabIndex = 3; + panel2.Text = "panel2"; + // + // iptSpeed + // + iptSpeed.Location = new Point(256, 6); + iptSpeed.Name = "iptSpeed"; + iptSpeed.Size = new Size(107, 43); + iptSpeed.TabIndex = 20; + iptSpeed.Text = "0"; + // + // label7 + // + label7.BackColor = SystemColors.Window; + label7.Location = new Point(193, 18); + label7.Name = "label7"; + label7.Size = new Size(57, 23); + label7.TabIndex = 19; + label7.Text = "转盘速度"; + // + // btnSaveImg + // + btnSaveImg.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSaveImg.Location = new Point(1126, 11); + btnSaveImg.Name = "btnSaveImg"; + btnSaveImg.Size = new Size(75, 38); + btnSaveImg.TabIndex = 18; + btnSaveImg.Text = "保存图像"; + btnSaveImg.Type = AntdUI.TTypeMini.Primary; + // + // btnSavePos + // + btnSavePos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSavePos.Location = new Point(1013, 11); + btnSavePos.Name = "btnSavePos"; + btnSavePos.Size = new Size(75, 38); + btnSavePos.TabIndex = 17; + btnSavePos.Text = "保存定位"; + btnSavePos.Type = AntdUI.TTypeMini.Primary; + // + // btnReverse + // + btnReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnReverse.Location = new Point(904, 11); + btnReverse.Name = "btnReverse"; + btnReverse.Size = new Size(75, 38); + btnReverse.TabIndex = 16; + btnReverse.Text = "转盘反转"; + btnReverse.Type = AntdUI.TTypeMini.Primary; + // + // btnForward + // + btnForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnForward.Location = new Point(804, 11); + btnForward.Name = "btnForward"; + btnForward.Size = new Size(75, 38); + btnForward.TabIndex = 15; + btnForward.Text = "转盘正转"; + btnForward.Type = AntdUI.TTypeMini.Primary; + // + // btnLocalization + // + btnLocalization.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnLocalization.Location = new Point(704, 11); + btnLocalization.Name = "btnLocalization"; + btnLocalization.Size = new Size(75, 38); + btnLocalization.TabIndex = 14; + btnLocalization.Text = "开始定位"; + btnLocalization.Type = AntdUI.TTypeMini.Primary; + // + // btnAcquisition + // + btnAcquisition.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnAcquisition.Location = new Point(606, 11); + btnAcquisition.Name = "btnAcquisition"; + btnAcquisition.Size = new Size(75, 38); + btnAcquisition.TabIndex = 13; + btnAcquisition.Text = "开始采集"; + btnAcquisition.Type = AntdUI.TTypeMini.Primary; + // + // iptPosition + // + iptPosition.Location = new Point(425, 6); + iptPosition.Name = "iptPosition"; + iptPosition.ReadOnly = true; + iptPosition.Size = new Size(175, 43); + iptPosition.TabIndex = 7; + iptPosition.Text = "0"; + // + // label5 + // + label5.BackColor = SystemColors.Window; + label5.Location = new Point(369, 18); + label5.Name = "label5"; + label5.Size = new Size(59, 23); + label5.TabIndex = 6; + label5.Text = "当前位置"; + // + // sltDirection + // + sltDirection.Items.AddRange(new object[] { "正方向", "反方向" }); + sltDirection.List = true; + sltDirection.Location = new Point(72, 6); + sltDirection.MaxCount = 10; + sltDirection.Name = "sltDirection"; + sltDirection.PlaceholderText = "请选择方向"; + sltDirection.Size = new Size(115, 43); + sltDirection.TabIndex = 5; + // + // label4 + // + label4.BackColor = SystemColors.Window; + label4.Location = new Point(9, 18); + label4.Name = "label4"; + label4.Size = new Size(57, 23); + label4.TabIndex = 4; + label4.Text = "转盘方向"; + // + // panelMotor + // + panelMotor.Controls.Add(btnSaveMotorPos); + panelMotor.Controls.Add(iptMotorPos); + panelMotor.Controls.Add(label9); + panelMotor.Controls.Add(btnMotorZero); + panelMotor.Controls.Add(btnMotorReverse); + panelMotor.Controls.Add(btnMotorForward); + panelMotor.Controls.Add(iptMotorSpeed); + panelMotor.Controls.Add(label8); + panelMotor.Dock = DockStyle.Top; + panelMotor.Location = new Point(0, 149); + panelMotor.Name = "panelMotor"; + panelMotor.Size = new Size(1210, 46); + panelMotor.TabIndex = 4; + panelMotor.Text = "panel3"; + // + // btnSaveMotorPos + // + btnSaveMotorPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSaveMotorPos.Location = new Point(751, 5); + btnSaveMotorPos.Name = "btnSaveMotorPos"; + btnSaveMotorPos.Size = new Size(109, 38); + btnSaveMotorPos.TabIndex = 21; + btnSaveMotorPos.Text = "保存相机电机位置"; + btnSaveMotorPos.Type = AntdUI.TTypeMini.Primary; + // + // iptMotorPos + // + iptMotorPos.Location = new Point(284, 0); + iptMotorPos.Name = "iptMotorPos"; + iptMotorPos.ReadOnly = true; + iptMotorPos.Size = new Size(175, 43); + iptMotorPos.TabIndex = 20; + iptMotorPos.Text = "0"; + // + // label9 + // + label9.BackColor = SystemColors.Window; + label9.Location = new Point(203, 10); + label9.Name = "label9"; + label9.Size = new Size(81, 23); + label9.TabIndex = 19; + label9.Text = "变焦电机位置"; + // + // btnMotorZero + // + btnMotorZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnMotorZero.Location = new Point(465, 5); + btnMotorZero.Name = "btnMotorZero"; + btnMotorZero.Size = new Size(75, 38); + btnMotorZero.TabIndex = 18; + btnMotorZero.Text = "电机回原点"; + btnMotorZero.Type = AntdUI.TTypeMini.Primary; + // + // btnMotorReverse + // + btnMotorReverse.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnMotorReverse.Location = new Point(659, 5); + btnMotorReverse.Name = "btnMotorReverse"; + btnMotorReverse.Size = new Size(75, 38); + btnMotorReverse.TabIndex = 17; + btnMotorReverse.Text = "电机反转"; + btnMotorReverse.Type = AntdUI.TTypeMini.Primary; + // + // btnMotorForward + // + btnMotorForward.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnMotorForward.Location = new Point(563, 5); + btnMotorForward.Name = "btnMotorForward"; + btnMotorForward.Size = new Size(75, 38); + btnMotorForward.TabIndex = 16; + btnMotorForward.Text = "电机正转"; + btnMotorForward.Type = AntdUI.TTypeMini.Primary; + // + // iptMotorSpeed + // + iptMotorSpeed.Location = new Point(90, 0); + iptMotorSpeed.Name = "iptMotorSpeed"; + iptMotorSpeed.Size = new Size(107, 43); + iptMotorSpeed.TabIndex = 8; + iptMotorSpeed.Text = "0"; + // + // label8 + // + label8.BackColor = SystemColors.Window; + label8.Location = new Point(9, 10); + label8.Name = "label8"; + label8.Size = new Size(81, 23); + label8.TabIndex = 1; + label8.Text = "变焦电机速度"; + // + // panel3 + // + panel3.Controls.Add(btnSaveBarrierPos); + panel3.Controls.Add(iptBarrierPos); + panel3.Controls.Add(label10); + panel3.Controls.Add(btnBarrierZero); + panel3.Controls.Add(btnBarrier); + panel3.Controls.Add(iptBarrierSpeed); + panel3.Controls.Add(label11); + panel3.Dock = DockStyle.Top; + panel3.Location = new Point(0, 195); + panel3.Name = "panel3"; + panel3.Size = new Size(1210, 46); + panel3.TabIndex = 6; + panel3.Text = "panel3"; + // + // btnSaveBarrierPos + // + btnSaveBarrierPos.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnSaveBarrierPos.Location = new Point(681, 5); + btnSaveBarrierPos.Name = "btnSaveBarrierPos"; + btnSaveBarrierPos.Size = new Size(109, 38); + btnSaveBarrierPos.TabIndex = 21; + btnSaveBarrierPos.Text = "保存挡料电机位置"; + btnSaveBarrierPos.Type = AntdUI.TTypeMini.Primary; + // + // iptBarrierPos + // + iptBarrierPos.Location = new Point(284, 0); + iptBarrierPos.Name = "iptBarrierPos"; + iptBarrierPos.Size = new Size(175, 43); + iptBarrierPos.TabIndex = 20; + iptBarrierPos.Text = "0"; + // + // label10 + // + label10.BackColor = SystemColors.Window; + label10.Location = new Point(203, 10); + label10.Name = "label10"; + label10.Size = new Size(81, 23); + label10.TabIndex = 19; + label10.Text = "挡料电机位置"; + // + // btnBarrierZero + // + btnBarrierZero.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnBarrierZero.Location = new Point(465, 5); + btnBarrierZero.Name = "btnBarrierZero"; + btnBarrierZero.Size = new Size(75, 38); + btnBarrierZero.TabIndex = 18; + btnBarrierZero.Text = "电机回原点"; + btnBarrierZero.Type = AntdUI.TTypeMini.Primary; + // + // btnBarrier + // + btnBarrier.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular, GraphicsUnit.Point, 134); + btnBarrier.Location = new Point(563, 5); + btnBarrier.Name = "btnBarrier"; + btnBarrier.Size = new Size(101, 38); + btnBarrier.TabIndex = 16; + btnBarrier.Text = "挡料电机转动"; + btnBarrier.Type = AntdUI.TTypeMini.Primary; + // + // iptBarrierSpeed + // + iptBarrierSpeed.Location = new Point(90, 0); + iptBarrierSpeed.Name = "iptBarrierSpeed"; + iptBarrierSpeed.Size = new Size(107, 43); + iptBarrierSpeed.TabIndex = 8; + iptBarrierSpeed.Text = "0"; + // + // label11 + // + label11.BackColor = SystemColors.Window; + label11.Location = new Point(9, 10); + label11.Name = "label11"; + label11.Size = new Size(81, 23); + label11.TabIndex = 1; + label11.Text = "挡料电机速度"; + // + // imageViewerControl1 + // + imageViewerControl1.Dock = DockStyle.Fill; + imageViewerControl1.Image = null; + imageViewerControl1.Location = new Point(0, 241); + imageViewerControl1.Name = "imageViewerControl1"; + imageViewerControl1.Size = new Size(1210, 464); + imageViewerControl1.TabIndex = 7; + // + // VisualLocalizationWindow + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1210, 705); + Controls.Add(imageViewerControl1); + Controls.Add(panel3); + Controls.Add(panelMotor); + Controls.Add(panel2); + Controls.Add(panel1); + Controls.Add(titlebar); + Name = "VisualLocalizationWindow"; + Text = "CCD光学筛选定位系统"; + WindowState = FormWindowState.Maximized; + panel1.ResumeLayout(false); + panel2.ResumeLayout(false); + panelMotor.ResumeLayout(false); + panel3.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private AntdUI.PageHeader titlebar; + private AntdUI.Panel panel1; + private AntdUI.Select sltCameraName; + private AntdUI.Label label1; + private AntdUI.Input iptModel; + private AntdUI.Label label2; + private AntdUI.Input iptBackImg; + private AntdUI.Label label3; + private AntdUI.Panel panel2; + private AntdUI.Label label4; + private AntdUI.Select sltDirection; + private AntdUI.InputNumber iptPosition; + private AntdUI.Label label5; + private AntdUI.Button btnSelectBackImg; + private AntdUI.Button btnSelectModel; + private AntdUI.Button btnAcquisition; + private AntdUI.Button btnLocalization; + private AntdUI.Button btnReverse; + private AntdUI.Button btnForward; + private AntdUI.Button btnSaveImg; + private AntdUI.Button btnSavePos; + private AntdUI.InputNumber iptThreshold; + private AntdUI.Label label6; + private AntdUI.InputNumber iptSpeed; + private AntdUI.Label label7; + private AntdUI.Panel panelMotor; + private AntdUI.InputNumber iptMotorSpeed; + private AntdUI.Label label8; + private AntdUI.Button btnMotorReverse; + private AntdUI.Button btnMotorForward; + private AntdUI.InputNumber iptMotorPos; + private AntdUI.Label label9; + private AntdUI.Button btnMotorZero; + private AntdUI.Button btnSaveMotorPos; + private AntdUI.Panel panel3; + private AntdUI.Button btnSaveBarrierPos; + private AntdUI.InputNumber iptBarrierPos; + private AntdUI.Label label10; + private AntdUI.Button btnBarrierZero; + private AntdUI.Button btnBarrier; + private AntdUI.InputNumber iptBarrierSpeed; + private AntdUI.Label label11; + private ImageViewerControl imageViewerControl1; + } +} diff --git a/DHSoftware/Views/VisualLocalizationWindow.cs b/DHSoftware/Views/VisualLocalizationWindow.cs new file mode 100644 index 0000000..52e6959 --- /dev/null +++ b/DHSoftware/Views/VisualLocalizationWindow.cs @@ -0,0 +1,1020 @@ +using System.Data; +using System.Diagnostics; +using System.Drawing.Imaging; +using AntdUI; +using DH.Commons.Base; +using DH.Commons.Enums; +using DH.Commons.Helper; +using DH.Commons.Models; +using DH.Devices.Camera; +using HalconDotNet; +using OpenCvSharp.Extensions; + + +namespace DHSoftware.Views +{ + public partial class VisualLocalizationWindow : Window + { + //采集状态 + private volatile bool isCapturing=false; + //定位状态 + private volatile bool isLocationing = false; + //算法 + HDevEngine MyEngine = new HDevEngine(); + HDevProcedure Procedure; + HDevProcedureCall ProcCall; + //背景图 + HImage backImage = new HImage(); + //当前相机 + Do3ThinkCamera Do3ThinkCamera = new Do3ThinkCamera(); + //定时器 + private System.Threading.Timer Timer; + + List localizations = new List(); + #region 控件大小随窗体大小等比例缩放 + + private readonly float x; //定义当前窗体的宽度 + private readonly float y; //定义当前窗体的高度 + + private void setTag(Control cons) + { + foreach (Control con in cons.Controls) + { + con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size; + if (con.Controls.Count > 0) setTag(con); + } + } + + private void setControls(float newx, float newy, Control cons) + { + //遍历窗体中的控件,重新设置控件的值 + foreach (Control con in cons.Controls) + //获取控件的Tag属性值,并分割后存储字符串数组 + if (con.Tag != null) + { + var mytag = con.Tag.ToString().Split(';'); + //根据窗体缩放的比例确定控件的值 + con.Width = Convert.ToInt32(Convert.ToSingle(mytag[0]) * newx); //宽度 + con.Height = Convert.ToInt32(Convert.ToSingle(mytag[1]) * newy); //高度 + con.Left = Convert.ToInt32(Convert.ToSingle(mytag[2]) * newx); //左边距 + con.Top = Convert.ToInt32(Convert.ToSingle(mytag[3]) * newy); //顶边距 + var currentSize = Convert.ToSingle(mytag[4]) * newy; //字体大小 + if (currentSize > 0) con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); + con.Focus(); + if (con.Controls.Count > 0) setControls(newx, newy, con); + } + } + + + /// + /// 重置窗体布局 + /// + private void ReWinformLayout() + { + var newx = Width / x; + var newy = Height / y; + setControls(newx, newy, this); + + } + + #endregion + + public VisualLocalizationWindow() + { + InitializeComponent(); + Load += VisualLocalizationWindow_Load; + btnSelectModel.Click += BtnSelectModel_Click; + btnSelectBackImg.Click += BtnSelectBackImg_Click; + btnAcquisition.Click += BtnAcquisition_Click; + btnLocalization.Click += BtnLocalization_Click; + btnForward.MouseDown += BtnForward_MouseDown; + btnForward.MouseUp += BtnForward_MouseUp; + btnReverse.MouseDown += BtnReverse_MouseDown; + btnReverse.MouseUp += BtnReverse_MouseUp; + btnSaveImg.Click += BtnSaveImg_Click; + btnSavePos.Click += BtnSavePos_Click; + sltCameraName.SelectedIndexChanged += SltCameraName_SelectedIndexChanged; + btnMotorForward.MouseDown += BtnMotorForward_MouseDown; + btnMotorForward.MouseUp += MotorButton_MouseUp; + btnMotorReverse.MouseDown += BtnMotorReverse_MouseDown; + btnMotorReverse.MouseUp += MotorButton_MouseUp; + btnMotorZero.Click += BtnMotorZero_Click; + btnSaveMotorPos.Click += BtnSaveMotorPos_Click; + panelMotor.Visible = false; + Resize += VisualLocalizationWindow_Resize; + btnBarrierZero.Click += BtnBarrierZero_Click; + btnBarrier.Click += BtnBarrier_Click; + btnSaveBarrierPos.Click += BtnSaveBarrierPos_Click; + iptMotorSpeed.Value =1200; + iptBarrierSpeed.Value = 500; + AutoDpi(this); + + x = Width; + y = Height; + setTag(this); + + + } + + private void BtnSaveBarrierPos_Click(object? sender, EventArgs e) + { + try + { + //根据工位查找点位 + PLCItem? pLCItem = ConfigModel.PLCBaseList? + .FirstOrDefault()? + .PLCItemList? + .Where(it => it.Name == "挡料电机位置").FirstOrDefault(); + if (pLCItem == null) + { + AntdUI.Message.warn(this, $"未找到挡料电机位置地址,请检查该地址是否存在于点位表!", autoClose: 3); + return; + } + + PLCItem? pLCItem1 = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "挡料电机位置").FirstOrDefault(); + + if (pLCItem1 == null) + { + pLCItem1 = new PLCItem(); + pLCItem1.Name = pLCItem.Name; + pLCItem1.Address = pLCItem.Address; + pLCItem1.Value = iptBarrierPos.Text; + pLCItem1.Type = pLCItem.Type; + pLCItem1.StartExecute = true; + ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList?.Add(pLCItem1); + } + else + { + pLCItem1.Value = iptBarrierPos.Text; + } + + ConfigHelper.SaveConfig(); + AntdUI.Message.success(this, "保存成功!", autoClose: 3); + } + catch (Exception ex) + { + AntdUI.Message.error(this,ex.Message, autoClose: 3); + } + } + + private async void BtnBarrier_Click(object? sender, EventArgs e) + { + if (_isOperating) return; + _isOperating = true; + + try + { + // 获取并处理速度值 + if (!int.TryParse(iptBarrierSpeed.Text, out int speed) || speed == 0) + { + AntdUI.Message.warn(this, "挡料电机速度值无效"); + return; + } + if (!int.TryParse(iptBarrierPos.Text, out int barrierPos) || barrierPos == 0) + { + AntdUI.Message.warn(this, "挡料电机位置值无效"); + return; + } + btnBarrierZero.Enabled= false; + int actualSpeed = Math.Abs(speed); // 正转取绝对值 + + + MainWindow.Instance.PLC.BarrierSpeed(actualSpeed); + MainWindow.Instance.PLC.BarrierPos(barrierPos); + MainWindow.Instance.PLC.BarrierClockwise(true); + + // 实时更新循环 + while (barrierPos!=MainWindow.Instance.PLC.ReadBarrierRealPos()) + { + await Task.Delay(50); + } + } + catch (Exception ex) + { + _isOperating = false; + btnBarrierZero.Enabled = true; + AntdUI.Message.error(this, $"挡料电机转动异常: {ex.Message}"); + } + finally + { + MainWindow.Instance.PLC.BarrierClockwise(false); + _isOperating = false; + btnBarrierZero.Enabled = true; + } + } + + private CancellationTokenSource? _bCts; + private bool _isOperating; + + private async void BtnBarrierZero_Click(object? sender, EventArgs e) + { + if (_isOperating) return; + _isOperating = true; + btnBarrier.Enabled = false; + + try + { + + // 执行回零 + await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(true)); + + // 等待回零完成 + while (!MainWindow.Instance.PLC.ReadBarrierToZero()) + { + await Task.Delay(50); + } + + await Task.Run(() => MainWindow.Instance.PLC.BarrierToZero(false)); + } + catch (Exception ex) + { + btnBarrier.Enabled = true; + _isOperating = false; + AntdUI.Message.error(this, $"回零失败: {ex.Message}"); + } + finally + { + btnBarrier.Enabled = true; + _isOperating = false; + } + } + + private void VisualLocalizationWindow_Resize(object? sender, EventArgs e) + { + ReWinformLayout(); + } + + private void BtnSaveMotorPos_Click(object? sender, EventArgs e) + { + try + { + //根据工位查找点位 + PLCItem? pLCItem = ConfigModel.PLCBaseList? + .FirstOrDefault()? + .PLCItemList? + .Where(it => it.Name == "相机步进位置").FirstOrDefault(); + if (pLCItem == null) + { + AntdUI.Message.warn(this, $"未找到相机步进位置地址,请检查该地址是否存在于点位表!", autoClose: 3); + return; + } + + PLCItem? pLCItem1 = ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList? + .Where(it => it.Name == "相机步进位置").FirstOrDefault(); + + if (pLCItem1 == null) + { + pLCItem1 = new PLCItem(); + pLCItem1.Name = pLCItem.Name; + pLCItem1.Address = pLCItem.Address; + pLCItem1.Value = iptMotorPos.Text; + pLCItem1.Type = pLCItem.Type; + pLCItem1.StartExecute = true; + ConfigModel.GlobalList? + .FirstOrDefault()? + .StartProcessList?.Add(pLCItem1); + } + else + { + pLCItem1.Value = iptMotorPos.Text; + } + + ConfigHelper.SaveConfig(); + AntdUI.Message.success(this, "保存成功!", autoClose: 3); + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + + + + private CancellationTokenSource _cts; + private bool _isBusy; + + // 电机正转控制 + private async void BtnMotorForward_MouseDown(object sender, MouseEventArgs e) + { + if (_isBusy) return; + _isBusy = true; + + try + { + // 获取并处理速度值 + if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed == 0) + { + AntdUI.Message.warn(this, "速度值无效"); + return; + } + int actualSpeed = Math.Abs(speed); // 正转取绝对值 + + // 启动PLC控制 + _cts?.Dispose(); + _cts = new CancellationTokenSource(); + MainWindow.Instance.PLC.MotorSpeed(actualSpeed); + MainWindow.Instance.PLC.MotorTest(true); + + // 实时更新循环 + while (!_cts.IsCancellationRequested) + { + var pos = await Task.Run(() => MainWindow.Instance.PLC.ReadMotorRealPos()); + iptMotorPos.Text = pos.ToString(); + await Task.Delay(50); + } + } + catch (Exception ex) + { + _isBusy = false; + AntdUI.Message.error(this, $"正转异常: {ex.Message}"); + } + finally + { + MainWindow.Instance.PLC.MotorTest(false); + _isBusy = false; + } + } + + // 电机反转控制 + // 电机反转控制(带原点保护) + private async void BtnMotorReverse_MouseDown(object sender, MouseEventArgs e) + { + if (_isBusy) return; + _isBusy = true; + + try + { + // 获取并处理速度值 + if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed == 0) + { + AntdUI.Message.warn(this, "速度值无效"); + return; + } + int actualSpeed = -Math.Abs(speed); + + // 实时位置检查(启动前) + int currentPos = MainWindow.Instance.PLC.ReadMotorRealPos(); + if (currentPos <= 0) + { + AntdUI.Message.info(this, "已在原点位置"); + return; + } + + // 启动PLC控制 + _cts?.Dispose(); + _cts = new CancellationTokenSource(); + MainWindow.Instance.PLC.MotorSpeed(actualSpeed); + MainWindow.Instance.PLC.MotorTest(true); + + // 带保护的实时更新循环 + while (!_cts.IsCancellationRequested) + { + currentPos = await Task.Run(() => MainWindow.Instance.PLC.ReadMotorRealPos()); + + // 位置边界保护 + if (currentPos <= 0) + { + _cts.Cancel(); + + break; + } + + // 更新UI + this.Invoke((MethodInvoker)delegate { + iptMotorPos.Text = currentPos.ToString(); + }); + + await Task.Delay(50); + } + } + catch (Exception ex) + { + _isBusy = false; + AntdUI.Message.error(this, $"反转异常: {ex.Message}"); + } + finally + { + MainWindow.Instance.PLC.MotorTest(false); + _isBusy = false; + } + } + + // 停止控制(正反转共用) + private void MotorButton_MouseUp(object sender, MouseEventArgs e) { + _cts?.Cancel(); + iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString(); + } + + // 回零操作 + private async void BtnMotorZero_Click(object sender, EventArgs e) + { + if (_isBusy) return; + _isBusy = true; + btnMotorForward.Enabled = btnMotorReverse.Enabled = false; + + try + { + // 获取速度值 + if (!int.TryParse(iptMotorSpeed.Text, out int speed) || speed <= 0) + { + AntdUI.Message.warn(this, "速度值无效"); + return; + } + + // 执行回零 + MainWindow.Instance.PLC.MotorSpeed(speed); + await Task.Run(() => MainWindow.Instance.PLC.MotorToZero(true)); + + // 等待回零完成 + while (MainWindow.Instance.PLC.ReadMotorRealPos() != 0) + { + iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString(); + await Task.Delay(100); + } + + await Task.Run(() => MainWindow.Instance.PLC.MotorToZero(false)); + } + catch (Exception ex) + { + btnMotorForward.Enabled = btnMotorReverse.Enabled = true; + _isBusy = false; + AntdUI.Message.error(this, $"回零失败: {ex.Message}"); + } + finally + { + btnMotorForward.Enabled = btnMotorReverse.Enabled = true; + _isBusy = false; + iptMotorPos.Text = MainWindow.Instance.PLC.ReadMotorRealPos().ToString(); + } + } + + private void SltCameraName_SelectedIndexChanged(object sender, IntEventArgs e) + { + try + { + try + { + localizations = VisualLocalization.LoadAll(); + + } + catch + { + + } + string cameraName = sltCameraName.Text; + Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == cameraName).FirstOrDefault() ?? new Do3ThinkCamera(); + VisualLocalization? visual = localizations.Where(it => it.CameraName == cameraName).FirstOrDefault(); + if (visual != null) + { + iptModel.Text = visual.ModelPath; + iptBackImg.Text = visual.ImgPath; + iptThreshold.Text = visual.Threshold; + sltDirection.SelectedIndex = visual.Direction == "正方向" ? 0 : 1; + iptSpeed.Text = visual.Speed; + } + if (Do3ThinkCamera.IsZoomCamera) + { + panelMotor.Visible = true; + } + else + { + panelMotor.Visible = false; + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + private void BtnSavePos_Click(object? sender, EventArgs e) + { + try + { + var form = new SavePositionControl(this, Convert.ToInt32(iptPosition.Text)) { Size = new Size(300, 300) }; + AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) + { + BtnHeight = 0, + }); + if (form.submit) + { + VisualLocalization visualLocalization = new VisualLocalization(); + //保存用户操作到文件 + visualLocalization.CameraName = sltCameraName.Text; + visualLocalization.ModelPath = iptModel.Text; + visualLocalization.ImgPath = iptBackImg.Text; + visualLocalization.Threshold = iptThreshold.Text; + visualLocalization.Direction = sltDirection.Text; + visualLocalization.Speed = iptSpeed.Text; + visualLocalization.Save(); + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + /// + /// 保存图像 + /// + /// + /// + private void BtnSaveImg_Click(object? sender, EventArgs e) + { + try + { + if (!isCapturing) + { + AntdUI.Message.warn(this, $"未开始采集,无法保存图像!", autoClose: 3); + return; + } + Bitmap bitmap = imageViewerControl1.GetCurrentSnapshot(); + using (SaveFileDialog saveDialog = new SaveFileDialog()) + { + saveDialog.Title = "保存图像文件"; + saveDialog.Filter = "JPEG 图像|*.jpg"; + saveDialog.FilterIndex = 0; + saveDialog.AddExtension = true; + saveDialog.OverwritePrompt = true; + + if (saveDialog.ShowDialog() == DialogResult.OK) + { + bitmap.Save(saveDialog.FileName, ImageFormat.Jpeg); + AntdUI.Message.success(this, $"图像保存成功!", autoClose: 3); + } + else + { + AntdUI.Message.warn(this, $"取消图像保存操作!", autoClose: 3); + } + } + + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + /// + /// 定位 + /// + /// + /// + private void BtnLocalization_Click(object? sender, EventArgs e) + { + try + { + if (!isCapturing) + { + AntdUI.Message.warn(this, $"未开始采集,无法开始定位!", autoClose: 3); + return; + } + if (!isLocationing) + { + bool direction = sltDirection.SelectedIndex == 0 ? true : false; + if (string.IsNullOrEmpty(iptSpeed.Text)) + { + AntdUI.Message.warn(this, $"请输入速度!", autoClose: 3); + return; + } + int speed = 0; + + try + { + bool isValid = int.TryParse(iptSpeed.Text, out speed); + if (!isValid) + { + AntdUI.Message.warn(this, $"输入的速度不是有效值!", autoClose: 3); + return; + } + } + catch (Exception ex) { } + MainWindow.Instance.PLC.TurnSpeed(speed); + MainWindow.Instance.PLC.TurnDirection(direction); + MainWindow.Instance.PLC.TurnStart(true); + isLocationing = true; + btnLocalization.Text = "结束定位"; + btnLocalization.Type = TTypeMini.Warn; + } + else + { + MainWindow.Instance.PLC.TurnStart(false); + iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString(); + isLocationing = false; + btnLocalization.Text = "开始定位"; + btnLocalization.Type = TTypeMini.Primary; + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + + } + + /// + /// 采集 + /// + /// + /// + private void BtnAcquisition_Click(object? sender, EventArgs e) + { + try + { + if (!isCapturing) + { + if (string.IsNullOrWhiteSpace(sltCameraName.Text)) + { + AntdUI.Message.warn(this, $"请选择相机!", autoClose: 3); + return; + } + if (string.IsNullOrWhiteSpace(iptModel.Text)) + { + AntdUI.Message.warn(this, $"请选择算法!", autoClose: 3); + return; + } + if (string.IsNullOrWhiteSpace(iptBackImg.Text)) + { + AntdUI.Message.warn(this, $"请选择背景图片!", autoClose: 3); + return; + } + + // 加载HALCON模型 + if (!File.Exists(iptModel.Text)) + { + AntdUI.Message.warn(this, $"算法文件不存在!", autoClose: 3); + return; + } + if (!File.Exists(iptBackImg.Text)) + { + AntdUI.Message.warn(this, $"图片文件不存在!", autoClose: 3); + return; + } + + //获取背景图 + backImage = new HImage(); + backImage.ReadImage(iptBackImg.Text); + // 从完整路径获取过程名称 + string procedureName = Path.GetFileNameWithoutExtension(iptModel.Text); + string procedureDir = Path.GetDirectoryName(iptModel.Text); + + // 重新初始化HALCON引擎 + MyEngine.SetProcedurePath(procedureDir); + Procedure = new HDevProcedure(procedureName); + ProcCall = new HDevProcedureCall(Procedure); + + if (MainWindow.Instance.PLC.Connected) + { + //启用视觉定位 + MainWindow.Instance.PLC.VisionPos(true); + } + else + { + AntdUI.Message.warn(this, $"未连接PLC,无法视觉定位!", autoClose: 3); + return; + } + Do3ThinkCamera = MainWindow.Instance.Cameras.Where(it => it.CameraName == sltCameraName.Text).FirstOrDefault() ?? new Do3ThinkCamera(); + Do3ThinkCamera.OnHImageOutput += OnCameraHImageOutput; + Timer = new System.Threading.Timer(CaptureLoop, null, 0, 50); + isCapturing = true; + btnAcquisition.Text = "结束采集"; + btnAcquisition.Type = TTypeMini.Warn; + } + else + { + if (isLocationing) + { + AntdUI.Message.warn(this, $"定位未结束,不能结束采集!", autoClose: 3); + return; + } + + MainWindow.Instance.PLC.VisionPos(false); + Do3ThinkCamera.OnHImageOutput -= OnCameraHImageOutput; + Timer?.Dispose(); + isCapturing = false; + btnAcquisition.Text = "开始采集"; + btnAcquisition.Type = TTypeMini.Primary; + } + + } + catch (Exception ex) + { + + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + + + + } + + /// + /// 触发 + /// + /// + private void CaptureLoop(object? state) + { + try + { + Do3ThinkCamera.Snapshot(); + } + catch(Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + private CancellationTokenSource? _rotateCts; + private bool _isRotating; + /// + /// 统一旋转控制方法 + /// + private async Task RotateControlAsync(bool direction) + { + try + { + // 防止重复启动 + if (_isRotating) return; + _isRotating = true; + + try + { + if (!MainWindow.Instance.PLC.Connected) + { + this.Invoke(() => AntdUI.Message.warn(this, "未连接PLC!", autoClose: 3)); + return; + } + + // 输入验证 + if (string.IsNullOrEmpty(iptSpeed.Text)) + { + this.Invoke(() => AntdUI.Message.warn(this, "请输入速度!", autoClose: 3)); + return; + } + + if (!int.TryParse(iptSpeed.Text, out int speed) || speed <= 0) + { + this.Invoke(() => AntdUI.Message.warn(this, "速度必须为正整数!", autoClose: 3)); + return; + } + + // 初始化取消令牌 + _rotateCts?.Dispose(); + _rotateCts = new CancellationTokenSource(); + + // 设置PLC参数 + MainWindow.Instance.PLC.TurnSpeed(speed); + MainWindow.Instance.PLC.TurnDirection(direction); + MainWindow.Instance.PLC.TurnStart(true); + + // 异步更新循环 + while (!_rotateCts.IsCancellationRequested) + { + var position = MainWindow.Instance.PLC.ReadVisionPos(); + Debug.WriteLine(position.ToString()); + this.BeginInvoke(() => iptPosition.Text = position.ToString()); + await Task.Delay(100, _rotateCts.Token); + } + } + catch (OperationCanceledException) + { + // 正常取消不处理 + } + catch (Exception ex) + { + this.Invoke(() => AntdUI.Message.error(this, $"操作异常:{ex.Message}")); + } + finally + { + // 确保停止转动 + MainWindow.Instance.PLC.TurnStart(false); + var finalPos = MainWindow.Instance.PLC.ReadVisionPos(); + this.Invoke(() => iptPosition.Text = finalPos.ToString()); + + _isRotating = false; + _rotateCts?.Dispose(); + _rotateCts = null; + } + } + catch (Exception ex) { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + + } + + + /// + /// 反转抬起 + /// + /// + /// + private void BtnReverse_MouseUp(object? sender, MouseEventArgs e) + { + _rotateCts?.Cancel(); + } + + /// + /// 反转按下 + /// + /// + /// + private async void BtnReverse_MouseDown(object? sender, MouseEventArgs e) + { + await RotateControlAsync(false); + } + + /// + /// 正转抬起 + /// + /// + /// + private void BtnForward_MouseUp(object? sender, MouseEventArgs e) + { + _rotateCts?.Cancel(); + } + + /// + /// 正转按下 + /// + /// + /// + private async void BtnForward_MouseDown(object? sender, MouseEventArgs e) + { + await RotateControlAsync(true); + } + + /// + /// 选择背景图 + /// + /// + /// + private void BtnSelectBackImg_Click(object? sender, EventArgs e) + { + try + { + using (OpenFileDialog openFileDialog = new OpenFileDialog()) + { + // 设置对话框标题 + openFileDialog.Title = "选择背景图片"; + // 限制文件后缀为 .hdvp + openFileDialog.Filter = "图片文件|*.jpg;*.jpeg;*.png;*.bmp"; + // 禁止多选 + openFileDialog.Multiselect = false; + + // 显示对话框并等待用户操作 + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + string filePath = openFileDialog.FileName; + + iptBackImg.Text = filePath; + + } + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + + } + + /// + /// 选择算法 + /// + /// + /// + private void BtnSelectModel_Click(object? sender, EventArgs e) + { + try + { + using (OpenFileDialog openFileDialog = new OpenFileDialog()) + { + // 设置对话框标题 + openFileDialog.Title = "选择算法文件"; + // 限制文件后缀为 .hdvp + openFileDialog.Filter = "算法文件 (*.hdvp)|*.hdvp"; + // 禁止多选 + openFileDialog.Multiselect = false; + + // 显示对话框并等待用户操作 + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + string filePath = openFileDialog.FileName; + + iptModel.Text = filePath; + + } + } + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + } + + /// + /// 加载事件 + /// + /// + /// + private void VisualLocalizationWindow_Load(object? sender, EventArgs e) + { + try + { + sltDirection.SelectedIndex = 0; + sltCameraName.Items.Clear(); + if (MainWindow.Instance.Cameras?.Count > 0) + { + foreach (var cam in MainWindow.Instance.Cameras) + { + sltCameraName.Items.Add(cam.CameraName); + } + } + else + { + AntdUI.Message.warn(this, $"未找到启用相机!", autoClose: 3); + } + + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + + } + + + } + + /// + /// 窗体对象实例 + /// + private static VisualLocalizationWindow _instance; + + internal static VisualLocalizationWindow Instance + { + get + { + if (_instance == null || _instance.IsDisposed) + _instance = new VisualLocalizationWindow(); + return _instance; + } + } + + /// + /// 相机回调 + /// + /// + /// + /// + private void OnCameraHImageOutput(DateTime dt, CameraBase camera, MatSet imageSet) + { + + try + { + + this.BeginInvoke(new MethodInvoker(delegate () + { + + imageViewerControl1.Image = imageSet._mat.ToBitmap(); + if (isLocationing) + { + HObject obj = OpenCVHelper.MatToHImage(imageSet._mat); + HImage hImage = HalconHelper.ConvertHObjectToHImage(obj); + // 调用 ProcCall 的方法 + ProcCall.SetInputIconicParamObject("INPUT_Image", hImage); // 将图像输入Proc + + ProcCall.SetInputIconicParamObject("BackGroundPic", backImage); + + ProcCall.SetInputCtrlParamTuple("DistThreshold", Convert.ToInt32(iptThreshold.Text)); + ProcCall.Execute(); + double nNUm = ProcCall.GetOutputCtrlParamTuple("OUTPUT_Flag"); + + if (nNUm == 0) + { + MainWindow.Instance.PLC.TurnStart(false); + iptPosition.Text = MainWindow.Instance.PLC.ReadVisionPos().ToString(); + isLocationing = false; + btnLocalization.Text = "开始定位"; + btnLocalization.Type = TTypeMini.Primary; + } + } + })); + + } + catch (Exception ex) + { + AntdUI.Message.error(this, ex.Message, autoClose: 3); + } + + } + } + + } diff --git a/DHSoftware/Views/VisualLocalizationWindow.resx b/DHSoftware/Views/VisualLocalizationWindow.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/DHSoftware/Views/VisualLocalizationWindow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/DHSoftware/Views/WelcomeWindow.Designer.cs b/DHSoftware/Views/WelcomeWindow.Designer.cs index 5f1c7c2..c73290b 100644 --- a/DHSoftware/Views/WelcomeWindow.Designer.cs +++ b/DHSoftware/Views/WelcomeWindow.Designer.cs @@ -34,8 +34,8 @@ namespace DHSoftware.Views panel2 = new AntdUI.Panel(); spin1 = new AntdUI.Spin(); panel3 = new AntdUI.Panel(); - progressBar1 = new ProgressBar(); - label1 = new AntdUI.Label(); + bar_step = new ProgressBar(); + lbl_step = new AntdUI.Label(); titlebar = new AntdUI.PageHeader(); panel1.SuspendLayout(); panel2.SuspendLayout(); @@ -81,8 +81,8 @@ namespace DHSoftware.Views // panel3 // panel3.Back = Color.Transparent; - panel3.Controls.Add(progressBar1); - panel3.Controls.Add(label1); + panel3.Controls.Add(bar_step); + panel3.Controls.Add(lbl_step); panel3.Dock = DockStyle.Bottom; panel3.Location = new Point(0, 309); panel3.Name = "panel3"; @@ -91,27 +91,27 @@ namespace DHSoftware.Views panel3.TabIndex = 3; panel3.Text = "panel3"; // - // progressBar1 + // bar_step // - progressBar1.Dock = DockStyle.Bottom; - progressBar1.Location = new Point(0, 54); - progressBar1.Name = "progressBar1"; - progressBar1.Size = new Size(646, 12); - progressBar1.TabIndex = 1; + bar_step.Dock = DockStyle.Bottom; + bar_step.Location = new Point(0, 54); + bar_step.Name = "bar_step"; + bar_step.Size = new Size(646, 12); + bar_step.TabIndex = 1; // - // label1 + // lbl_step // - label1.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - label1.ForeColor = SystemColors.Window; - label1.Location = new Point(24, 15); - label1.Name = "label1"; - label1.Size = new Size(590, 33); - label1.TabIndex = 0; - label1.Text = "正在初始化..."; + lbl_step.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); + lbl_step.ForeColor = SystemColors.Window; + lbl_step.Location = new Point(24, 15); + lbl_step.Name = "lbl_step"; + lbl_step.Size = new Size(590, 33); + lbl_step.TabIndex = 0; + lbl_step.Text = "正在初始化..."; // // titlebar // - titlebar.BackColor = SystemColors.MenuHighlight; + titlebar.BackColor = Color.FromArgb(46, 108, 227); titlebar.DividerShow = true; titlebar.DividerThickness = 0F; titlebar.Dock = DockStyle.Top; @@ -132,7 +132,7 @@ namespace DHSoftware.Views // AutoScaleDimensions = new SizeF(7F, 17F); AutoScaleMode = AutoScaleMode.Font; - BackColor = SystemColors.MenuHighlight; + BackColor = Color.FromArgb(46, 108, 227); ClientSize = new Size(646, 375); ControlBox = false; Controls.Add(panel1); @@ -158,7 +158,7 @@ namespace DHSoftware.Views private AntdUI.Panel panel3; private AntdUI.Panel panel2; private AntdUI.Spin spin1; - private AntdUI.Label label1; - private ProgressBar progressBar1; + public AntdUI.Label lbl_step; + public ProgressBar bar_step; } } \ No newline at end of file diff --git a/DHSoftware/Views/WelcomeWindow.cs b/DHSoftware/Views/WelcomeWindow.cs index cfd7dbd..6bea70f 100644 --- a/DHSoftware/Views/WelcomeWindow.cs +++ b/DHSoftware/Views/WelcomeWindow.cs @@ -15,9 +15,22 @@ namespace DHSoftware.Views public WelcomeWindow() { InitializeComponent(); - - - + Control.CheckForIllegalCrossThreadCalls = false; } + + /// + /// 窗体对象实例 + /// + private static WelcomeWindow _instance; + internal static WelcomeWindow Instance + { + get + { + if (_instance == null) + _instance = new WelcomeWindow(); + return _instance; + } + } + } } diff --git a/DHSoftware/Views/WelcomeWindow.resx b/DHSoftware/Views/WelcomeWindow.resx index 97a5e62..aa59fb8 100644 --- a/DHSoftware/Views/WelcomeWindow.resx +++ b/DHSoftware/Views/WelcomeWindow.resx @@ -120,254 +120,7 @@ - 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 - AAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9ivI//s6kr/7yn - H/+8px//vKcf/7ynH/+rqzT/T8Co/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9cvZj/sKot/7ynH/+8px//vKcf/7ynH/+xqi7/UcCm/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9bvZj/sKou/7ynH/+8px//vKcf/7ynH/+xqi3/UcCl/0DEu/9AxLv/QMS7/0DE - u/9AxLv/QMS7/0DEu/9AxLv/QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px/NuqcdGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDEu/9AxLv/QMS7/z/E - u7E/w7qNP8O6jT/Duo0/w7qNP8O6jT/Duo1wuH2wtqgm+LynH/+8px//vKcf/7ynH/+0qSntWb6cmj/D - uo0/w7qNP8O6jT/Duo0/w7qNP8O6jT/Eu5Y/xLvhQMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px/NuqcdGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+w7t4QMS7/EDE - u/9AxLv/QMS7/0HEvlIzzMwFM8zMBTPMzAUzzMwFM8zMBTPMzAW4qCRku6cf9bynH/+8px//vKcf/7yn - H/+8pyDKp6c1HTPMzAUzzMwFM8zMBTPMzAUzzMwFM8zMBUDKvxhAxbu8QMS7/0DEu/9AxLv/QMS837yn - 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 - H/+8px/NuqcdGgAAAAD/gAACwqoYFbqoHUa9pR+DvaYewbyoH+G9qB/yvKcf/rynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/rumH5q7qiIegIAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H/+8px//vKcf/7ynH/+7px/tu6gftbunH8i9px/nu6cf/bynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7yoH/i8px/OvqcdTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/6vKgfx7ymH3K7qhoeAAAAAQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/ - vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px//vKgf/ryoH828pR9buqcdGv+AAAIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px/8vKgf8LynH927px+muaYfQv//AAEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837ynH/+8px//vKcf/7yn - H/+8px//vKcf/7ynH/+8px//vKcf/7ynH/+8px70u6cf1rymH6+9px+DvKceVL+nICD/gAACAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DEu/9AxLv/QMS837yn - H+y8px/3u6Yf+bymH++8px7kvacf172nH8C8px6jvqcffb2qH1G3piEuuacaHb+fIBC/vwAEAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEC/vxQ/w7u7QMS7/0DE - u/9AxLv/QMS83wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -376,7 +129,159 @@ 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA/////AD/ + AAD8B//4AH8AAPwB//gAPwAA/AB/8AA/AAD8AH/wAD8AAPwAP/AAPwAA/AAf8AA/AAD8AB/wAD8AAPwA + D/AAPwAA/AAP8AA/AAD8AA/wAD8AAPwAD/AAPwAA/AAP8AA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/ + AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAD+AA/AAD8AAf4AD8AAPwAB/gAPwAA/AAP+AA/ + AAD8AA/4AD8AAPwAD/gAPwAA/AAP+AA/AAD8AA/8AD8AAPwAD/4APwAA/AAP/4A/AAD+AA//8D8AAP4A + H////wAA/wA/////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAA= \ No newline at end of file diff --git a/DHSoftware/Views/​MotionControl.Designer.cs b/DHSoftware/Views/​MotionControl.Designer.cs deleted file mode 100644 index c957731..0000000 --- a/DHSoftware/Views/​MotionControl.Designer.cs +++ /dev/null @@ -1,44 +0,0 @@ -namespace DHSoftware.Views -{ - partial class _​MotionControl - { - /// - /// 必需的设计器变量 - /// - 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() - { - SuspendLayout(); - // - // _MotionControl - // - AutoScaleDimensions = new SizeF(7F, 17F); - AutoScaleMode = AutoScaleMode.Font; - Name = "_MotionControl"; - Size = new Size(782, 481); - ResumeLayout(false); - } - - #endregion - } -} diff --git a/DHSoftware/assets/loginimg.jpg b/DHSoftware/assets/loginimg.jpg new file mode 100644 index 0000000..22955aa Binary files /dev/null and b/DHSoftware/assets/loginimg.jpg differ diff --git a/DHSoftware/assets/logo.ico b/DHSoftware/assets/logo.ico new file mode 100644 index 0000000..1e08069 Binary files /dev/null and b/DHSoftware/assets/logo.ico differ diff --git a/DHSoftware/assets/logo.png b/DHSoftware/assets/logo.png deleted file mode 100644 index 6f6d1dc..0000000 Binary files a/DHSoftware/assets/logo.png and /dev/null differ diff --git a/DHSoftware/assets/screenshots/favicon.ico b/DHSoftware/assets/screenshots/favicon.ico new file mode 100644 index 0000000..51eba17 Binary files /dev/null and b/DHSoftware/assets/screenshots/favicon.ico differ diff --git a/DHSoftware/db/config.json b/DHSoftware/db/config.json new file mode 100644 index 0000000..caebe74 Binary files /dev/null and b/DHSoftware/db/config.json differ diff --git a/DHSoftware/db/db.sqlite b/DHSoftware/db/db.sqlite new file mode 100644 index 0000000..8cff70a Binary files /dev/null and b/DHSoftware/db/db.sqlite differ diff --git a/DHSoftware/productModel.cs b/DHSoftware/productModel.cs index cae60b3..9484d1a 100644 --- a/DHSoftware/productModel.cs +++ b/DHSoftware/productModel.cs @@ -1,4 +1,5 @@ -using DH.Commons.Enums; +using DH.Commons.Base; +using DH.Commons.Enums; using DH.Devices.Vision; using System; using System.Collections.Generic; @@ -72,32 +73,48 @@ namespace DHSoftware public ProductData( string batchNO, uint pieceNumber, int inferenceLeft = -1) : this(pieceNumber) { InferenceLeft = inferenceLeft; - _countdownEvent = new CountdownEvent(inferenceLeft); + //_countdownEvent = new CountdownEvent(inferenceLeft); BatchNO = batchNO; } - public void InferenceOne() - { - //lock (_inferenceLock) - //{ - // Interlocked.Decrement(ref InferenceLeft); - //} + //public void InferenceOne() + //{ + // //lock (_inferenceLock) + // //{ + // // Interlocked.Decrement(ref InferenceLeft); + // //} - _countdownEvent.Signal(); + // _countdownEvent.Signal(); + //} + + //public bool InferenceFinished() + //{ + // //lock (_inferenceLock) + // //{ + // // return 0 == InferenceLeft; + // //} + // return _countdownEvent.CurrentCount == 0; // 判断计数器是否为 0 + //} + public void InferenceOne() + { + lock (_inferenceLock) + { + Interlocked.Decrement(ref InferenceLeft); + + } } public bool InferenceFinished() { - //lock (_inferenceLock) - //{ - // return 0 == InferenceLeft; - //} - return _countdownEvent.CurrentCount == 0; // 判断计数器是否为 0 + lock (_inferenceLock) + { + return 0 == InferenceLeft; + } }