From 9eb84c6265de361cc8bb58befec5b3cdac3fd449 Mon Sep 17 00:00:00 2001 From: "liu.wenjie" <783789228@qq.com> Date: Thu, 14 Apr 2022 16:05:10 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=9B=B4=E6=94=B9=E6=89=80=E6=9C=89?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=98=BE=E7=A4=BA=E7=AA=97=E4=BD=93=E4=B8=BA?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=AA=97=E4=BD=93=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=9D=90=E6=A0=87=E5=8F=8A=E7=81=B0=E5=BA=A6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=202=E3=80=81=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=8A=9F=E8=83=BD=203=E3=80=81PMA=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=B7=BB=E5=8A=A0=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=92=8C=E5=AE=9A=E4=B9=89=E6=90=9C=E7=B4=A2=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/VisionEdit/v14/.suo | Bin 690688 -> 640512 bytes CaliperTool/Caliper.cs | 18 +- CaliperTool/CaliperToolRun.cs | 2 +- CaliperTool/FormCaliper.cs | 5 +- FindCircle/FindCircle.cs | 3 +- FindLine/FindLine.cs | 42 +-- FindLine/FindLineToolRun.cs | 2 +- FindLine/FormFindLine.cs | 2 + HalconTool/HalconTool.cs | 3 +- HalconTool/HalconToolRun.cs | 2 +- ImageWindow/HWindowTool_Smart.Designer.cs | 62 ++-- ImageWindow/HWindowTool_Smart.cs | 118 +++++++- ImageWindow/HWindowTool_Smart.resx | 8 +- ImageWindow/HWindow_Final.resx | 12 +- ImageWindow/HWindow_Tool.csproj | 3 + PMAlignTool/FormPMAlignTool.Designer.cs | 272 +++++++++--------- PMAlignTool/FormPMAlignTool.cs | 83 ++++-- PMAlignTool/FormPMAlignTool.resx | 10 +- PMAlignTool/PMAlign.cs | 66 +++-- PMAlignTool/PMAlignTool.csproj | 8 +- PMAlignTool/PMAlignToolRun.cs | 3 +- ToolBase/IToolBase.cs | 3 +- ToolBase/ToolBase.csproj | 4 + ToolLib.VisionJob/ToolLib.VisionJob.csproj | 2 +- ToolLib.VisionJob/VisionJob.cs | 121 ++++---- VisionEdit/FormMain.Designer.cs | 45 +-- VisionEdit/FormMain.cs | 9 + VisionEdit/FormMain.resx | 2 +- VisionEdit/VisionEdit.csproj | 2 +- .../Debug/WeifenLuo.WinFormsUI.Docking.dll | Bin 443904 -> 443904 bytes 30 files changed, 580 insertions(+), 332 deletions(-) diff --git a/.vs/VisionEdit/v14/.suo b/.vs/VisionEdit/v14/.suo index 33a5d4378ba115cb4830e66a3020122ba0a2dce4..d98717b2a944323354770925d02814435fc66ae6 100644 GIT binary patch delta 22515 zcmeHv3tUyj+V`4u+iPtRHj03Nuth{fR8UmBZxHdWc*)dI5ycBCAmZHw%}aR&x9-Q( zyhU3xuV^g06PlV?VVQNx49hxQJSXk0$MXBn-WyV@^V;{G-tRl-ZS(v4%sew|*32`{ z%slhVEDP5~7p`nl6x&@CJU@#dyv+omHljb>ym^yzCBO^F2LB-NHSi7a63`521w0HK zqJbC0$p?$9Y^~Urb+9)S!^~HDALw&#z&q@FW}m4p5bMbH@6<)?75f}%Ucp{j5Yk8T zHweN`;77c#`qv!sdjKBi{4Y>`J;e6{FCxtOdqEE%{sIsQTms$#?^95Jz!wMr=Hflc zppB3=37C%f8-ie;E;oqe<@g{i6#SN;&47=Awm=`C9Q=I2UM5Gg9Q#E%CukTLTrk6t zI1ESwdH|(@Jxd7{-x2J~^&qbwkn1J~e)a=OU_Bm~gKP@05}1uTylj783Gh0ESOHK7 z{4BSkq{DY5H(oCP-6}sWH!eSS%FUZxZamE8#${P8H_rRNl^gF5{``L_x6s;oczsV` z7jQQ+YgXv2%C#YI3h60@n0fD65c8Go z{e4eNdbr}M_Se)M=R>E0b);=iC2$0-)Vu26$hET9hW zh|f^{&A=X@M5dHeEV9+#AlM6tHv!!SS`0i6i~x!NUZ*#a7KZS4;5C7^puGABjt1L~ zhHXMP5aZg$QBH}vzc#5?vIE`#igLMR~0f4Ji(6himpcYUCY(pL{FDLRp zhj;|yV}PxQ$AEqaUIWmMptHbh4C(~<^zm0&#_w_8E2eQh2G@(0){nQ?ik=hUO?@GkeL~ zVLIcrH&7U*Co(^Ky2Veq4>@MIa!|w}(W;dp^_g39s9lhwK%lvY#9q8ibvfcI1pD=R z$5}u7i~b!8c(bR0nFR1~vWKRC_V9#zd1xQdzMgP@&;dXyFc2673 z7XJ%v zi4fr|n$v(aTVDdz;uT7Q7T3sF9gGaig!R|mnx%}Y$xkH=59~up&+^i$wY8Q5IaYv! zpZ(^NMo{Vy`}2`)59NpNV-!A24A=M)_Zr}Nrcpf^j}*8Sykw+gwI}<=DyzVIfUXS_ zd%H%-6-3w2wNySz8iXmVfXgbmOcU)>JZyrC+r9?fXL252_CAhBBXRMmh5iWtIk8%5b8 z0x<&mf7rm&ePIwtD=xDCPQP&txUJt5SHB&)Hr3Q+t+^+=Y42rz2LCFx{!v`ybI51k z)d0sHbdA+o<=D$2D5ATVs&qporqi`OtQnPbhgx;v)#sgJ?v4~bb92d_5G`x{%m3Xc zBI}NKy{NDOZ@LV<=RI{0&8txpQ=-=lBrXJp|8`V~j&v!?m5UEjicOdNiWmFQuypC0pSeTENJD;(9T+2} z?zkN5^&l#{7~sn^c^ziMVtD8gaCTwvgn>Q^$Up_~4DbZ-9$vd2l!^|skb>RF`B%g? z1IK^^Kmfoi)6hd-0WAYsc;e?h^j(y6#1rQEtAAI)n}xLZP&Vg%ia4*?zFYEgAqQct z6)5IOW{vVj^c<2u0euJb3(&uSz6-nuybqKDl>a1)8Oaxje;~#S{~S3v{Rs3+@U8%S zZocT@^A~gQ-%wsSYf(geQW94=d-rh!UlcXfA8E!_Sml``005$S@SbH zq`*%QQiUA9 z7MbgrGGW)Y7sk*{Ob3=J#s`6xrtgHkek9}Vw_Y3d2(hkGK&?qIe`g82`ZIZHNo0Lg zwb13U=6ZBKNxT%q9P6ZfH4Jh&WCbi~a z*kISgf5y$N45NaNuafDKRqo11l*=gViBfW0iy@UHqc6BHYKF4X8>tU_Qpe-DQl9F1 z&W04XnMWnBGH&U_dA$nWQ1lf4Ii1X_`h8)F@LMl*J^1@x<9q9CppRH7l`__m3XW>Y ztb$SxX&tHjtT@o(_$GL+z=kM}BkR-&`iL??cZ1xx|T=tJzT>IVag@_HtEWF8w zA|h@uyEQ06JAt&5z|R6*1`*jk)^U)__E5KgwNa$&sbaJ}BG_%&cdME4__p#?%|jG% znz?fvy|q~L6Ugzft0KlvuQ1WPHZ;QSd?3i^GDWIjj(jPd7UxTTM*exWk~!aHx33o! zLBrRHZ}=_WGo;pc8QU%WZ*TX%V7<7&Waml7SUN3SDs?5>%dFgaiG?^0Xyt4?C9akR zQF>og=Z3{m&>*6m@Gqe*R{ztV(8D%A{;6>?<|priDMn+RP!AZS`K33;G-^@4n%n^ZTq_ z4xUqtg&f}!+fsSBIkx@>_rCr>y8!|BPHi!u<@Z~kMkNv0MX zrSSNAi2DNpKp;>b2m*qE5TF4N3WNbxpdmnuhe=i{Nf$#J#v$4YXbr>zZGg5wJ0JmQ zPZxVi_cj`UU@9;W7z7Lkh5+{fe8Rm~7U;e)V&j4_h-3g`fpI`4FdmoyOa%BC$O4@V zOaZ0>*+2_OCl_=YkOu@Ko)0<$mtX<;>o2LtW$1G&Yhs*NWD%JZ#kHjoGTzvfvqK$EEWRZVWgd z&HTC-cef`d2H3wzs6*)nlWEIzExgt#FF}C84sX>{e70N2s39Y%$9SL;tgqGrqX~y%5EgytXh~ucX z!V8A~RBTM9j>#S~ffnx5Vnj<8HztPCl?|dFbzLUabABRPf3FxK|Ct!J)QEv9I!Rk@ zYk2#g8?H$)%0ftLDLCS(Y$gf{q#!~QBxXou}s zD`A`vkH2;}_Gu@K5fZTfibZHF!u;P@q_-7XBS$OHG{pE*nfS{<-f>77hcK7XEkE-4 zN{ge5v-JRM&&*yi-K<^S3{P6gzK^fUZ$ELAYm-!+eb{}NVX#lHj?;5lc(!n?bgyNC zHSJoutwrgy52pnig~ktj;gY8cIRcfxA&s;&q;a41`$1Z$jCgQz@Wqcdaj7__Xzej> ztV4xKR5*@B7!e($^Q>tm>Ysob^Hz;ROU9t}ZC$)rSIfp?TN=mPLfaF~bv?W1X3P4# z_r$W^w0q_1Yoi~Y8e}hu3AAVB1saRGNDJ8So?vW}T&uc~ptSX6J&e-Y=>Bd&9T=+z zQqCGFA|SqPyZHMpJ;zKLo0H9l?VuUi7@TeS;Pj`$H>E;Hh7=GDpF%zKc=azDflfg3 z9+uo87Ju`)#dV8Kh-=?wv8(F?f2-@ADUw(=Q7UIPx0@AqvfvN3%u{hH2>Q865H!3j z%IuCWsfFQz_zO7acm*$f5q-yJr*Mn2x8z-L_nMS|ei#pJYJ+~sz`tA%c^}0?=Q3S= z)EXh)U%dC?k)t(I+k$ePje{;G!|O5@N0gJG64}U^C(H?Oxelfa&mBqoI5+yiFSiOk z29N#1aoAqDC9t3v)m@LO@~u2y6R`vfPl1M^IYDUVSn!{L|79F#FEsaC@OPk@?LnJZ zARh30*1^aIore{OkKVV@38zrbF@N}f5WgOP17pyH`WTI%{#eDv@b?De$YmQCV;bO$ z1oXpD9PxnqS_NSpULZAs0f+b}5qK%+{zw>lpnId-C%vCFbsK;mp{HSE2nEgD<=lu7 zgzm`qHkMEBaBdlg$r=h~pHdgJ8|*$^I|lF51r+c`d+b3$SHcUm1P}Cu z`tW5Xwu>OtK|!l+g77`k_a(w@i-JbNB27U030S06;9FpcRv9;kOH3^ggbqkqkD7QA6{y6C6M6`V_GHi^6qYd;5WWZ1C*R~d1n?A9P`?P)(WRVO0 z5AECzxJ?kj4K(Fc2c!H$W@BXwG{(BR4E9-&26rr`LmC@E!)=fPvYrJk1YMr!J_Y

6?8{(aYy6;v5-wT@;@tL4d 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 HBf diff --git a/HalconTool/HalconTool.cs b/HalconTool/HalconTool.cs index ae0d42e..9c9aa27 100644 --- a/HalconTool/HalconTool.cs +++ b/HalconTool/HalconTool.cs @@ -9,6 +9,7 @@ using CommonMethods; using HalconDotNet; using ToolBase; using System.Diagnostics; +using ViewROI; namespace HalconTool { @@ -159,7 +160,7 @@ namespace HalconTool } } - public override void DispMainWindow(HWindow window) + public override void DispMainWindow(HWindowTool_Smart window) { throw new NotImplementedException(); } diff --git a/HalconTool/HalconToolRun.cs b/HalconTool/HalconToolRun.cs index 68d12dc..cd3dc4a 100644 --- a/HalconTool/HalconToolRun.cs +++ b/HalconTool/HalconToolRun.cs @@ -40,7 +40,7 @@ namespace HalconTool else { myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myHalconTool.runTime}", Color.Green, selectNode); - FormImageWindow.Instance.myHWindow.DispHWindow.DispObj(myHalconTool.outputImage); + FormImageWindow.Instance.myHWindow.DispImage(myHalconTool.outputImage); L_toolList[toolIndex].toolOutput[0] = new ToolIO("OutputImage", myHalconTool.outputImage, DataType.Image); } } diff --git a/ImageWindow/HWindowTool_Smart.Designer.cs b/ImageWindow/HWindowTool_Smart.Designer.cs index e191e0f..0275386 100644 --- a/ImageWindow/HWindowTool_Smart.Designer.cs +++ b/ImageWindow/HWindowTool_Smart.Designer.cs @@ -29,15 +29,17 @@ namespace ViewROI private void InitializeComponent() { this.SmartWindow = new HalconDotNet.HSmartWindowControl(); - this.statusStrip = new System.Windows.Forms.StatusStrip(); - this.lb_Status = new System.Windows.Forms.ToolStripStatusLabel(); - this.statusStrip.SuspendLayout(); + this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip(); + this.tsmiDispCorr = new System.Windows.Forms.ToolStripMenuItem(); + this.grayValueLable = new Sunny.UI.UISymbolLabel(); + this.uiContextMenuStrip1.SuspendLayout(); this.SuspendLayout(); // // SmartWindow // this.SmartWindow.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.SmartWindow.AutoValidate = System.Windows.Forms.AutoValidate.EnableAllowFocusChange; + this.SmartWindow.ContextMenuStrip = this.uiContextMenuStrip1; this.SmartWindow.Dock = System.Windows.Forms.DockStyle.Fill; this.SmartWindow.HDoubleClickToFitContent = true; this.SmartWindow.HDrawingObjectsModifier = HalconDotNet.HSmartWindowControl.DrawingObjectsModifier.None; @@ -53,45 +55,57 @@ namespace ViewROI this.SmartWindow.WindowSize = new System.Drawing.Size(576, 457); this.SmartWindow.HMouseMove += new HalconDotNet.HMouseEventHandler(this.SmartWindow_HMouseMove); // - // statusStrip + // uiContextMenuStrip1 // - this.statusStrip.BackColor = System.Drawing.Color.White; - this.statusStrip.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.lb_Status}); - this.statusStrip.Location = new System.Drawing.Point(0, 435); - this.statusStrip.Name = "statusStrip"; - this.statusStrip.Size = new System.Drawing.Size(576, 22); - this.statusStrip.TabIndex = 1; - this.statusStrip.Text = "statusStrip1"; - this.statusStrip.Visible = false; + this.uiContextMenuStrip1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.uiContextMenuStrip1.IsScaled = false; + this.uiContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiDispCorr}); + this.uiContextMenuStrip1.Name = "uiContextMenuStrip1"; + this.uiContextMenuStrip1.Size = new System.Drawing.Size(145, 30); // - // lb_Status + // tsmiDispCorr // - this.lb_Status.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.lb_Status.Name = "lb_Status"; - this.lb_Status.Size = new System.Drawing.Size(0, 17); + this.tsmiDispCorr.Name = "tsmiDispCorr"; + this.tsmiDispCorr.Size = new System.Drawing.Size(144, 26); + this.tsmiDispCorr.Text = "显示坐标"; + this.tsmiDispCorr.Click += new System.EventHandler(this.tsmiDispCorr_Click); + // + // grayValueLable + // + this.grayValueLable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.grayValueLable.BackColor = System.Drawing.Color.Transparent; + this.grayValueLable.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.grayValueLable.IsScaled = false; + this.grayValueLable.Location = new System.Drawing.Point(3, 430); + this.grayValueLable.MinimumSize = new System.Drawing.Size(1, 1); + this.grayValueLable.Name = "grayValueLable"; + this.grayValueLable.Padding = new System.Windows.Forms.Padding(28, 0, 0, 0); + this.grayValueLable.Size = new System.Drawing.Size(260, 26); + this.grayValueLable.Symbol = 61483; + this.grayValueLable.TabIndex = 4; + this.grayValueLable.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.grayValueLable.Visible = false; // // HWindowTool_Smart // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.statusStrip); + this.Controls.Add(this.grayValueLable); this.Controls.Add(this.SmartWindow); this.Name = "HWindowTool_Smart"; this.Size = new System.Drawing.Size(576, 457); this.Load += new System.EventHandler(this.HWindowTool_Smart_Load); this.SizeChanged += new System.EventHandler(this.HWindowTool_Smart_SizeChanged); - this.statusStrip.ResumeLayout(false); - this.statusStrip.PerformLayout(); + this.uiContextMenuStrip1.ResumeLayout(false); this.ResumeLayout(false); - this.PerformLayout(); } #endregion - private System.Windows.Forms.StatusStrip statusStrip; - private System.Windows.Forms.ToolStripStatusLabel lb_Status; public HalconDotNet.HSmartWindowControl SmartWindow; + private Sunny.UI.UIContextMenuStrip uiContextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem tsmiDispCorr; + private Sunny.UI.UISymbolLabel grayValueLable; } } diff --git a/ImageWindow/HWindowTool_Smart.cs b/ImageWindow/HWindowTool_Smart.cs index 74aa01a..8392466 100644 --- a/ImageWindow/HWindowTool_Smart.cs +++ b/ImageWindow/HWindowTool_Smart.cs @@ -14,6 +14,8 @@ namespace ViewROI { public bool DispStatus { get; set; } public HImage hv_Image { get; set; } + HTuple hv_Width = new HTuple(); + HTuple hv_Height = new HTuple(); public HWindow DispHWindow { get @@ -27,22 +29,112 @@ namespace ViewROI } public void DispImage(HObject inputImage) { - statusStrip.BackColor = Color.White; if (inputImage == null || !inputImage.IsInitialized()) { - this.lb_Status.Text = "输入图像为空,请检查!"; - statusStrip.BackColor = Color.Red; return; } - this.SmartWindow.HalconWindow.DispImage(new HImage(inputImage)); + + + #region 缩放图像,适应窗口 + //获取图像大小及纵横比 + HOperatorSet.GetImageSize(inputImage, out hv_Width, out hv_Height); + int im_width = int.Parse(hv_Width.ToString()); + int im_height = int.Parse(hv_Height.ToString()); + double im_AspectRatio = (double)(im_width) / (double)(im_height); + //获取窗口大小及纵横比 + int w_width = SmartWindow.Size.Width; + int w_height = SmartWindow.Size.Height; + double w_AspectRatio = (double)(w_width) / (double)(w_height); + + HOperatorSet.SetSystem("int_zooming", "false");//图像缩放之前最好将此参数设置为false. + HTuple para = new HTuple("constant"); + HObject ho_zoomImage; + HOperatorSet.GenEmptyObj(out ho_zoomImage); + + ho_zoomImage.Dispose(); + if (w_width < im_width && im_AspectRatio > w_AspectRatio) + { + //超宽图像 + HOperatorSet.ZoomImageSize(inputImage, out ho_zoomImage, w_width, w_width / im_AspectRatio, para); + } + else if (w_height < im_height && im_AspectRatio < w_AspectRatio) + { + //超高图像 + HOperatorSet.ZoomImageSize(inputImage, out ho_zoomImage, w_height * im_AspectRatio, w_height, para); + } + #endregion + SmartWindow.HalconWindow.SetPart(0, 0,-2, -2); + hv_Image = new HImage(inputImage); + SmartWindow.HalconWindow.DispImage(hv_Image); + ho_zoomImage.Dispose(); + hv_Width.Dispose(); + hv_Height.Dispose(); } private void SmartWindow_HMouseMove(object sender, HalconDotNet.HMouseEventArgs e) { - this.Cursor = e.Button == MouseButtons.Left ? Cursors.Hand : Cursors.Default; + // this.Cursor = e.Button == MouseButtons.Left ? Cursors.Hand : Cursors.Default; if(DispStatus) { + if (hv_Image != null && hv_Image.IsInitialized()) + { + try + { + int button_state; + double positionX, positionY; + string str_value; + string str_position; + bool _isXOut = true, _isYOut = true; + HTuple channel_count; + HOperatorSet.CountChannels(hv_Image, out channel_count); + + SmartWindow.HalconWindow.GetMpositionSubPix(out positionY, out positionX, out button_state); + str_position = String.Format("RC: {0:0},{1:0}", positionY, positionX); + + _isXOut = (positionX < 0 || positionX >= hv_Width); + _isYOut = (positionY < 0 || positionY >= hv_Height); + + if (!_isXOut && !_isYOut) + { + if ((int)channel_count == 1) + { + double grayVal; + grayVal = hv_Image.GetGrayval((int)positionY, (int)positionX); + str_value = String.Format("Val: {0:000}", grayVal); + } + else if ((int)channel_count == 3) + { + double grayValRed, grayValGreen, grayValBlue; + + HImage _RedChannel, _GreenChannel, _BlueChannel; + + _RedChannel = hv_Image.AccessChannel(1); + _GreenChannel = hv_Image.AccessChannel(2); + _BlueChannel = hv_Image.AccessChannel(3); + + grayValRed = _RedChannel.GetGrayval((int)positionY, (int)positionX); + grayValGreen = _GreenChannel.GetGrayval((int)positionY, (int)positionX); + grayValBlue = _BlueChannel.GetGrayval((int)positionY, (int)positionX); + + _RedChannel.Dispose(); + _GreenChannel.Dispose(); + _BlueChannel.Dispose(); + + str_value = String.Format("Gray: ({0:000}, {1:000}, {2:000})", grayValRed, grayValGreen, grayValBlue); + } + else + { + str_value = ""; + } + grayValueLable.Text = $"Ch{channel_count.D }, {str_position}: {str_value}"; + } + } + catch (Exception ex) + { + //不处理 + } + } } } @@ -64,5 +156,21 @@ namespace ViewROI //Point pt2 = SmartWindow.PointToScreen(pt); //this.SmartWindow.HalconWindow.SendMouseDoubleClickEvent(pt2.X+20, pt2.Y+30,(int)MouseButtons.Left); } + + private void tsmiDispCorr_Click(object sender, EventArgs e) + { + if(tsmiDispCorr.Checked) + { + tsmiDispCorr.Checked = false; + DispStatus = false; + grayValueLable.Visible = false; + } + else + { + tsmiDispCorr.Checked = true; + DispStatus = true; + grayValueLable.Visible = true; + } + } } } diff --git a/ImageWindow/HWindowTool_Smart.resx b/ImageWindow/HWindowTool_Smart.resx index 648e4b5..a0f97ba 100644 --- a/ImageWindow/HWindowTool_Smart.resx +++ b/ImageWindow/HWindowTool_Smart.resx @@ -112,12 +112,12 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 + + 16, 14 \ No newline at end of file diff --git a/ImageWindow/HWindow_Final.resx b/ImageWindow/HWindow_Final.resx index adf7c83..589e3e9 100644 --- a/ImageWindow/HWindow_Final.resx +++ b/ImageWindow/HWindow_Final.resx @@ -112,20 +112,20 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk - CAAAAk1TRnQBSQFMAgEBAgEAARABAQEQAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -166,7 +166,7 @@ Cw== - + \ No newline at end of file diff --git a/ImageWindow/HWindow_Tool.csproj b/ImageWindow/HWindow_Tool.csproj index 60ad7a2..b5caeb7 100644 --- a/ImageWindow/HWindow_Tool.csproj +++ b/ImageWindow/HWindow_Tool.csproj @@ -84,6 +84,9 @@ False C:\Program Files\MVTec\HALCON-19.05-Progress\bin\dotnet20\halcondotnet.dll + + ..\VisionEdit\bin\Debug\ThirdLib\SunnyUI.dll + diff --git a/PMAlignTool/FormPMAlignTool.Designer.cs b/PMAlignTool/FormPMAlignTool.Designer.cs index 47a065f..87ecad1 100644 --- a/PMAlignTool/FormPMAlignTool.Designer.cs +++ b/PMAlignTool/FormPMAlignTool.Designer.cs @@ -29,6 +29,10 @@ namespace PMAlignTool private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormPMAlignTool)); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.lb_RunStatus = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); @@ -77,7 +81,7 @@ namespace PMAlignTool this.cbCErosion1 = new System.Windows.Forms.CheckBox(); this.cbCErosion2 = new System.Windows.Forms.CheckBox(); this.btnCreateModel = new System.Windows.Forms.Button(); - this.btnAcqNewModelImage = new System.Windows.Forms.Button(); + this.btnChangeModel = new System.Windows.Forms.Button(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); this.panel4 = new System.Windows.Forms.Panel(); @@ -118,14 +122,13 @@ namespace PMAlignTool this.cbx_showTemplate = new System.Windows.Forms.CheckBox(); this.ckb_showFeature = new System.Windows.Forms.CheckBox(); this.ckb_showCross = new System.Windows.Forms.CheckBox(); - this.tabPage5 = new System.Windows.Forms.TabPage(); - this.panel7 = new System.Windows.Forms.Panel(); - this.dgv_matchResult = new System.Windows.Forms.DataGridView(); - this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Column9 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Column10 = new System.Windows.Forms.DataGridViewTextBoxColumn(); - this.Column12 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.dgv_matchResult = new Sunny.UI.UIDataGridView(); + this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.statusStrip.SuspendLayout(); this.toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); @@ -152,8 +155,7 @@ namespace PMAlignTool this.panel5.SuspendLayout(); this.tabPage4.SuspendLayout(); this.panel6.SuspendLayout(); - this.tabPage5.SuspendLayout(); - this.panel7.SuspendLayout(); + this.tabPage3.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dgv_matchResult)).BeginInit(); this.SuspendLayout(); // @@ -166,7 +168,7 @@ namespace PMAlignTool this.lb_RunTime}); this.statusStrip.Location = new System.Drawing.Point(0, 633); this.statusStrip.Name = "statusStrip"; - this.statusStrip.Size = new System.Drawing.Size(999, 22); + this.statusStrip.Size = new System.Drawing.Size(1007, 22); this.statusStrip.TabIndex = 0; // // lb_RunStatus @@ -192,7 +194,7 @@ namespace PMAlignTool this.tsbtRunTool}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(999, 32); + this.toolStrip1.Size = new System.Drawing.Size(1007, 32); this.toolStrip1.TabIndex = 1; this.toolStrip1.Text = "toolStrip1"; // @@ -218,8 +220,8 @@ namespace PMAlignTool // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.tabControl1); - this.splitContainer1.Size = new System.Drawing.Size(999, 601); - this.splitContainer1.SplitterDistance = 599; + this.splitContainer1.Size = new System.Drawing.Size(1007, 601); + this.splitContainer1.SplitterDistance = 603; this.splitContainer1.TabIndex = 2; // // panel1 @@ -228,7 +230,7 @@ namespace PMAlignTool 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(599, 601); + this.panel1.Size = new System.Drawing.Size(603, 601); this.panel1.TabIndex = 0; // // tabControl1 @@ -236,13 +238,13 @@ namespace PMAlignTool this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage4); - this.tabControl1.Controls.Add(this.tabPage5); + this.tabControl1.Controls.Add(this.tabPage3); this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; this.tabControl1.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.tabControl1.Location = new System.Drawing.Point(0, 0); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(396, 601); + this.tabControl1.Size = new System.Drawing.Size(400, 601); this.tabControl1.TabIndex = 0; // // tabPage1 @@ -251,7 +253,7 @@ namespace PMAlignTool this.tabPage1.Location = new System.Drawing.Point(4, 29); this.tabPage1.Name = "tabPage1"; this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(388, 568); + this.tabPage1.Size = new System.Drawing.Size(392, 568); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "模板"; this.tabPage1.UseVisualStyleBackColor = true; @@ -278,7 +280,7 @@ namespace PMAlignTool this.tableLayoutPanel1.Controls.Add(this.panel10, 0, 6); this.tableLayoutPanel1.Controls.Add(this.panel14, 0, 8); this.tableLayoutPanel1.Controls.Add(this.btnCreateModel, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.btnAcqNewModelImage, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.btnChangeModel, 1, 1); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; @@ -293,7 +295,7 @@ namespace PMAlignTool this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 6.405694F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 11.20996F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15.12456F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(382, 562); + this.tableLayoutPanel1.Size = new System.Drawing.Size(386, 562); this.tableLayoutPanel1.TabIndex = 0; // // panel13 @@ -304,7 +306,7 @@ namespace PMAlignTool this.panel13.Dock = System.Windows.Forms.DockStyle.Fill; this.panel13.Location = new System.Drawing.Point(3, 382); this.panel13.Name = "panel13"; - this.panel13.Size = new System.Drawing.Size(376, 29); + this.panel13.Size = new System.Drawing.Size(380, 29); this.panel13.TabIndex = 126; // // label4 @@ -326,7 +328,7 @@ namespace PMAlignTool this.panel9.Dock = System.Windows.Forms.DockStyle.Fill; this.panel9.Location = new System.Drawing.Point(3, 254); this.panel9.Name = "panel9"; - this.panel9.Size = new System.Drawing.Size(376, 23); + this.panel9.Size = new System.Drawing.Size(380, 23); this.panel9.TabIndex = 124; // // label3 @@ -349,7 +351,7 @@ namespace PMAlignTool this.hWindowTool_Smart1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); this.hWindowTool_Smart1.Name = "hWindowTool_Smart1"; this.tableLayoutPanel1.SetRowSpan(this.hWindowTool_Smart1, 3); - this.hWindowTool_Smart1.Size = new System.Drawing.Size(226, 169); + this.hWindowTool_Smart1.Size = new System.Drawing.Size(228, 169); this.hWindowTool_Smart1.TabIndex = 0; // // panel3 @@ -360,7 +362,7 @@ namespace PMAlignTool this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; this.panel3.Location = new System.Drawing.Point(3, 182); this.panel3.Name = "panel3"; - this.panel3.Size = new System.Drawing.Size(376, 22); + this.panel3.Size = new System.Drawing.Size(380, 22); this.panel3.TabIndex = 121; // // label1 @@ -382,7 +384,7 @@ namespace PMAlignTool this.panel8.Dock = System.Windows.Forms.DockStyle.Fill; this.panel8.Location = new System.Drawing.Point(3, 210); this.panel8.Name = "panel8"; - this.panel8.Size = new System.Drawing.Size(376, 38); + this.panel8.Size = new System.Drawing.Size(380, 38); this.panel8.TabIndex = 122; // // panel18 @@ -392,7 +394,7 @@ namespace PMAlignTool this.panel18.Dock = System.Windows.Forms.DockStyle.Fill; this.panel18.Location = new System.Drawing.Point(0, 0); this.panel18.Name = "panel18"; - this.panel18.Size = new System.Drawing.Size(376, 38); + this.panel18.Size = new System.Drawing.Size(380, 38); this.panel18.TabIndex = 147; // // rabGray @@ -430,9 +432,9 @@ namespace PMAlignTool this.groupBox1.Controls.Add(this.rabFormLocal); this.groupBox1.Controls.Add(this.rabFormFlow); this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBox1.Location = new System.Drawing.Point(237, 3); + this.groupBox1.Location = new System.Drawing.Point(239, 3); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(142, 79); + this.groupBox1.Size = new System.Drawing.Size(144, 79); this.groupBox1.TabIndex = 123; this.groupBox1.TabStop = false; this.groupBox1.Text = "模板图像来源"; @@ -478,7 +480,7 @@ namespace PMAlignTool this.panel10.Dock = System.Windows.Forms.DockStyle.Fill; this.panel10.Location = new System.Drawing.Point(3, 283); this.panel10.Name = "panel10"; - this.panel10.Size = new System.Drawing.Size(376, 93); + this.panel10.Size = new System.Drawing.Size(380, 93); this.panel10.TabIndex = 125; // // panel12 @@ -633,7 +635,7 @@ namespace PMAlignTool this.panel14.Location = new System.Drawing.Point(3, 417); this.panel14.Name = "panel14"; this.tableLayoutPanel1.SetRowSpan(this.panel14, 2); - this.panel14.Size = new System.Drawing.Size(376, 142); + this.panel14.Size = new System.Drawing.Size(380, 142); this.panel14.TabIndex = 127; // // label8 @@ -854,34 +856,34 @@ namespace PMAlignTool this.btnCreateModel.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; this.btnCreateModel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnCreateModel.ForeColor = System.Drawing.Color.White; - this.btnCreateModel.Location = new System.Drawing.Point(237, 134); + this.btnCreateModel.Location = new System.Drawing.Point(239, 134); this.btnCreateModel.Name = "btnCreateModel"; - this.btnCreateModel.Size = new System.Drawing.Size(142, 42); + this.btnCreateModel.Size = new System.Drawing.Size(144, 42); this.btnCreateModel.TabIndex = 129; this.btnCreateModel.TabStop = false; this.btnCreateModel.Text = "创建模板"; this.btnCreateModel.UseVisualStyleBackColor = false; this.btnCreateModel.Click += new System.EventHandler(this.btnCreateModel_Click); // - // btnAcqNewModelImage + // btnChangeModel // - this.btnAcqNewModelImage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(150)))), ((int)(((byte)(219))))); - this.btnAcqNewModelImage.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btnAcqNewModelImage.Cursor = System.Windows.Forms.Cursors.Hand; - this.btnAcqNewModelImage.Dock = System.Windows.Forms.DockStyle.Fill; - this.btnAcqNewModelImage.FlatAppearance.BorderSize = 0; - this.btnAcqNewModelImage.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DarkGray; - this.btnAcqNewModelImage.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; - this.btnAcqNewModelImage.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnAcqNewModelImage.ForeColor = System.Drawing.Color.White; - this.btnAcqNewModelImage.Location = new System.Drawing.Point(237, 88); - this.btnAcqNewModelImage.Name = "btnAcqNewModelImage"; - this.btnAcqNewModelImage.Size = new System.Drawing.Size(142, 40); - this.btnAcqNewModelImage.TabIndex = 129; - this.btnAcqNewModelImage.TabStop = false; - this.btnAcqNewModelImage.Text = "获取图像"; - this.btnAcqNewModelImage.UseVisualStyleBackColor = false; - this.btnAcqNewModelImage.Click += new System.EventHandler(this.btnAcqNewModelImage_Click); + this.btnChangeModel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(150)))), ((int)(((byte)(219))))); + this.btnChangeModel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btnChangeModel.Cursor = System.Windows.Forms.Cursors.Hand; + this.btnChangeModel.Dock = System.Windows.Forms.DockStyle.Fill; + this.btnChangeModel.FlatAppearance.BorderSize = 0; + this.btnChangeModel.FlatAppearance.MouseDownBackColor = System.Drawing.Color.DarkGray; + this.btnChangeModel.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; + this.btnChangeModel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnChangeModel.ForeColor = System.Drawing.Color.White; + this.btnChangeModel.Location = new System.Drawing.Point(239, 88); + this.btnChangeModel.Name = "btnChangeModel"; + this.btnChangeModel.Size = new System.Drawing.Size(144, 40); + this.btnChangeModel.TabIndex = 129; + this.btnChangeModel.TabStop = false; + this.btnChangeModel.Text = "修改模板"; + this.btnChangeModel.UseVisualStyleBackColor = false; + this.btnChangeModel.Click += new System.EventHandler(this.btnChangeModel_Click); // // tabPage2 // @@ -889,7 +891,7 @@ namespace PMAlignTool this.tabPage2.Location = new System.Drawing.Point(4, 29); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(388, 568); + this.tabPage2.Size = new System.Drawing.Size(392, 568); this.tabPage2.TabIndex = 1; this.tabPage2.Text = "参数"; this.tabPage2.UseVisualStyleBackColor = true; @@ -919,7 +921,7 @@ namespace PMAlignTool this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel2.Size = new System.Drawing.Size(382, 562); + this.tableLayoutPanel2.Size = new System.Drawing.Size(386, 562); this.tableLayoutPanel2.TabIndex = 0; // // panel4 @@ -929,7 +931,7 @@ namespace PMAlignTool this.panel4.Dock = System.Windows.Forms.DockStyle.Fill; this.panel4.Location = new System.Drawing.Point(3, 344); this.panel4.Name = "panel4"; - this.panel4.Size = new System.Drawing.Size(376, 28); + this.panel4.Size = new System.Drawing.Size(380, 28); this.panel4.TabIndex = 150; // // label2 @@ -953,7 +955,7 @@ namespace PMAlignTool this.panel11.Dock = System.Windows.Forms.DockStyle.Fill; this.panel11.Location = new System.Drawing.Point(3, 3); this.panel11.Name = "panel11"; - this.panel11.Size = new System.Drawing.Size(376, 28); + this.panel11.Size = new System.Drawing.Size(380, 28); this.panel11.TabIndex = 148; // // label11 @@ -999,7 +1001,7 @@ namespace PMAlignTool this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; this.panel2.Location = new System.Drawing.Point(3, 37); this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(376, 301); + this.panel2.Size = new System.Drawing.Size(380, 301); this.panel2.TabIndex = 149; // // nud_angleRange @@ -1419,7 +1421,7 @@ namespace PMAlignTool this.panel5.Dock = System.Windows.Forms.DockStyle.Fill; this.panel5.Location = new System.Drawing.Point(3, 378); this.panel5.Name = "panel5"; - this.panel5.Size = new System.Drawing.Size(376, 181); + this.panel5.Size = new System.Drawing.Size(380, 181); this.panel5.TabIndex = 151; // // cbx_searchRegionType @@ -1440,6 +1442,7 @@ namespace PMAlignTool this.cbx_searchRegionType.Size = new System.Drawing.Size(172, 26); this.cbx_searchRegionType.TabIndex = 122; this.cbx_searchRegionType.TextStr = "整幅图像"; + this.cbx_searchRegionType.SelectedIndexChanged += new Controls.DSelectedIndexChanged(this.cbx_searchRegionType_SelectedIndexChanged); // // label5 // @@ -1456,7 +1459,7 @@ namespace PMAlignTool this.tabPage4.Controls.Add(this.panel6); this.tabPage4.Location = new System.Drawing.Point(4, 29); this.tabPage4.Name = "tabPage4"; - this.tabPage4.Size = new System.Drawing.Size(388, 568); + this.tabPage4.Size = new System.Drawing.Size(392, 568); this.tabPage4.TabIndex = 3; this.tabPage4.Text = "图形"; this.tabPage4.UseVisualStyleBackColor = true; @@ -1471,7 +1474,7 @@ namespace PMAlignTool this.panel6.Dock = System.Windows.Forms.DockStyle.Fill; this.panel6.Location = new System.Drawing.Point(0, 0); this.panel6.Name = "panel6"; - this.panel6.Size = new System.Drawing.Size(388, 568); + this.panel6.Size = new System.Drawing.Size(392, 568); this.panel6.TabIndex = 0; // // checkBox2 @@ -1535,89 +1538,102 @@ namespace PMAlignTool this.ckb_showCross.Text = "显示参考点"; this.ckb_showCross.UseVisualStyleBackColor = true; // - // tabPage5 + // tabPage3 // - this.tabPage5.Controls.Add(this.panel7); - this.tabPage5.Location = new System.Drawing.Point(4, 29); - this.tabPage5.Name = "tabPage5"; - this.tabPage5.Size = new System.Drawing.Size(388, 568); - this.tabPage5.TabIndex = 4; - this.tabPage5.Text = "结果"; - this.tabPage5.UseVisualStyleBackColor = true; - // - // panel7 - // - this.panel7.Controls.Add(this.dgv_matchResult); - this.panel7.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel7.Location = new System.Drawing.Point(0, 0); - this.panel7.Name = "panel7"; - this.panel7.Size = new System.Drawing.Size(388, 568); - this.panel7.TabIndex = 0; + this.tabPage3.Controls.Add(this.dgv_matchResult); + this.tabPage3.Location = new System.Drawing.Point(4, 29); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Size = new System.Drawing.Size(392, 568); + this.tabPage3.TabIndex = 5; + this.tabPage3.Text = "结果"; + this.tabPage3.UseVisualStyleBackColor = true; // // dgv_matchResult // - this.dgv_matchResult.AllowDrop = true; - this.dgv_matchResult.AllowUserToAddRows = false; - this.dgv_matchResult.AllowUserToDeleteRows = false; - this.dgv_matchResult.AllowUserToResizeRows = false; - this.dgv_matchResult.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.dgv_matchResult.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1; + this.dgv_matchResult.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells; + this.dgv_matchResult.BackgroundColor = System.Drawing.Color.White; + this.dgv_matchResult.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + dataGridViewCellStyle2.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle2.ForeColor = System.Drawing.Color.White; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_matchResult.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle2; + this.dgv_matchResult.ColumnHeadersHeight = 32; + this.dgv_matchResult.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; this.dgv_matchResult.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.Column7, - this.Column8, - this.Column9, - this.Column10, - this.Column12}); + this.Column1, + this.Column2, + this.Column3, + this.Column4, + this.Column5}); this.dgv_matchResult.Dock = System.Windows.Forms.DockStyle.Fill; + this.dgv_matchResult.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter; + this.dgv_matchResult.EnableHeadersVisualStyles = false; + this.dgv_matchResult.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.dgv_matchResult.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); this.dgv_matchResult.Location = new System.Drawing.Point(0, 0); - this.dgv_matchResult.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.dgv_matchResult.Name = "dgv_matchResult"; - this.dgv_matchResult.ReadOnly = true; - this.dgv_matchResult.RowHeadersVisible = false; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + dataGridViewCellStyle3.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + dataGridViewCellStyle3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(48)))), ((int)(((byte)(48))))); + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255))))); + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.Color.White; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dgv_matchResult.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + this.dgv_matchResult.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader; + dataGridViewCellStyle4.BackColor = System.Drawing.Color.White; + this.dgv_matchResult.RowsDefaultCellStyle = dataGridViewCellStyle4; this.dgv_matchResult.RowTemplate.Height = 23; - this.dgv_matchResult.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; - this.dgv_matchResult.Size = new System.Drawing.Size(388, 568); - this.dgv_matchResult.TabIndex = 13; + this.dgv_matchResult.SelectedIndex = -1; + this.dgv_matchResult.ShowGridLine = true; + this.dgv_matchResult.Size = new System.Drawing.Size(392, 568); + this.dgv_matchResult.TabIndex = 0; // - // Column7 + // Column1 // - this.Column7.HeaderText = "编号"; - this.Column7.Name = "Column7"; - this.Column7.ReadOnly = true; - this.Column7.Width = 70; + this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.Column1.HeaderText = "编号"; + this.Column1.Name = "Column1"; + this.Column1.Width = 66; // - // Column8 + // Column2 // - this.Column8.HeaderText = "分数"; - this.Column8.Name = "Column8"; - this.Column8.ReadOnly = true; - this.Column8.Width = 75; + this.Column2.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Column2.HeaderText = "分值"; + this.Column2.Name = "Column2"; // - // Column9 + // Column3 // - this.Column9.HeaderText = "行"; - this.Column9.Name = "Column9"; - this.Column9.ReadOnly = true; - this.Column9.Width = 70; + this.Column3.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.Column3.HeaderText = "行"; + this.Column3.Name = "Column3"; + this.Column3.Width = 50; // - // Column10 + // Column4 // - this.Column10.HeaderText = "列"; - this.Column10.Name = "Column10"; - this.Column10.ReadOnly = true; - this.Column10.Width = 70; + this.Column4.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.Column4.HeaderText = "列"; + this.Column4.Name = "Column4"; + this.Column4.Width = 50; // - // Column12 + // Column5 // - this.Column12.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; - this.Column12.HeaderText = "角度(°)"; - this.Column12.Name = "Column12"; - this.Column12.ReadOnly = true; + this.Column5.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader; + this.Column5.HeaderText = "角度"; + this.Column5.Name = "Column5"; + this.Column5.Width = 66; // // FormPMAlignTool // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(999, 655); + this.ClientSize = new System.Drawing.Size(1007, 655); this.Controls.Add(this.splitContainer1); this.Controls.Add(this.toolStrip1); this.Controls.Add(this.statusStrip); @@ -1668,8 +1684,7 @@ namespace PMAlignTool this.tabPage4.ResumeLayout(false); this.panel6.ResumeLayout(false); this.panel6.PerformLayout(); - this.tabPage5.ResumeLayout(false); - this.panel7.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.dgv_matchResult)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -1687,7 +1702,6 @@ namespace PMAlignTool private System.Windows.Forms.TabPage tabPage1; private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.TabPage tabPage4; - private System.Windows.Forms.TabPage tabPage5; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private ViewROI.HWindowTool_Smart hWindowTool_Smart1; private System.Windows.Forms.Panel panel3; @@ -1728,13 +1742,6 @@ namespace PMAlignTool public System.Windows.Forms.CheckBox cbx_showTemplate; public System.Windows.Forms.CheckBox ckb_showFeature; public System.Windows.Forms.CheckBox ckb_showCross; - private System.Windows.Forms.Panel panel7; - internal System.Windows.Forms.DataGridView dgv_matchResult; - private System.Windows.Forms.DataGridViewTextBoxColumn Column7; - private System.Windows.Forms.DataGridViewTextBoxColumn Column8; - private System.Windows.Forms.DataGridViewTextBoxColumn Column9; - private System.Windows.Forms.DataGridViewTextBoxColumn Column10; - private System.Windows.Forms.DataGridViewTextBoxColumn Column12; private System.Windows.Forms.Panel panel8; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.RadioButton rabFormLocal; @@ -1763,7 +1770,7 @@ namespace PMAlignTool private System.Windows.Forms.CheckBox cbCErosion1; private System.Windows.Forms.CheckBox cbCErosion2; internal System.Windows.Forms.Button btnCreateModel; - internal System.Windows.Forms.Button btnAcqNewModelImage; + internal System.Windows.Forms.Button btnChangeModel; public Controls.CNumericUpDown nud_angleRange; public Controls.CNumericUpDown nud_angleStart; public Controls.CComboBox cmbErsion1; @@ -1775,5 +1782,12 @@ namespace PMAlignTool private System.Windows.Forms.ToolStripStatusLabel lb_RunStatus; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; private System.Windows.Forms.ToolStripStatusLabel lb_RunTime; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.DataGridViewTextBoxColumn Column1; + private System.Windows.Forms.DataGridViewTextBoxColumn Column2; + private System.Windows.Forms.DataGridViewTextBoxColumn Column3; + private System.Windows.Forms.DataGridViewTextBoxColumn Column4; + private System.Windows.Forms.DataGridViewTextBoxColumn Column5; + public Sunny.UI.UIDataGridView dgv_matchResult; } } \ No newline at end of file diff --git a/PMAlignTool/FormPMAlignTool.cs b/PMAlignTool/FormPMAlignTool.cs index a032cba..27e3768 100644 --- a/PMAlignTool/FormPMAlignTool.cs +++ b/PMAlignTool/FormPMAlignTool.cs @@ -7,6 +7,7 @@ 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; @@ -20,10 +21,10 @@ namespace PMAlignTool private PMAlign myPMAlign = new PMAlign(); public IToolInfo myToolInfo = new IToolInfo(); public HWindowTool_Smart myHwindow = new HWindowTool_Smart(); - private HDrawingObject selected_drawing_object = new HDrawingObject(); + private HDrawingObject serachRegion_drawing_object = new HDrawingObject(); public List templateModelListAdd = new List() { }; public List templateModelListSub = new List() { }; - + public List templateModelList = new List() { }; public FormPMAlignTool(ref object pmalign) { InitializeComponent(); @@ -100,17 +101,14 @@ namespace PMAlignTool nud_ScaleStart.Value = myPMAlign.minScale; nud_ScaleRange.Value = myPMAlign.maxScale; tkb_contrast.Value = myPMAlign.contrast; - #endregion - isInitTool = false; - } - - private void btnAcqNewModelImage_Click(object sender, EventArgs e) - { - if (myPMAlign.inputImage != null) + if(myPMAlign.modelPartImage != null) { - myPMAlign.oldTrainImage = myPMAlign.inputImage; + hWindowTool_Smart1.DispImage(myPMAlign.modelPartImage); } + // myHwindow.DispHWindow.AttachDrawingObjectToWindow(serachRegion_drawing_object); + tsbtRunTool_Click(null, null); + isInitTool = false; } private ShapeMode selectType; private void btnOperateROI_Click(object sender, EventArgs e) @@ -182,6 +180,12 @@ namespace PMAlignTool selectObj.Dispose(); } + private void OnSerchRegionDrawingObject(HDrawingObject dobj, HWindow hwin, string type) + { + HObject selectObj = dobj.GetDrawingObjectIconic(); + myPMAlign.SearchRegion = selectObj.Clone(); + } + public HObject contour; private void btnCreateModel_Click(object sender, EventArgs e) { @@ -206,19 +210,11 @@ namespace PMAlignTool HTuple row1, col1, row2, col2; HOperatorSet.SmallestRectangle1(myPMAlign.templateRegion, out row1, out col1, out row2, out col2); HObject outRectangle1; - HOperatorSet.GenRectangle1(out outRectangle1, row1 - 20, col1 - 20, row2 + 20, col2 + 20); - HObject imageReduced, imagePart; + HOperatorSet.GenRectangle1(out outRectangle1, row1, col1, row2, col2); + HObject imageReduced; HOperatorSet.ReduceDomain(myPMAlign.inputImage, outRectangle1, out imageReduced); - HObject outBoundary, inBoundary; - HOperatorSet.Boundary(myPMAlign.templateRegion, out outBoundary, "inner_filled"); - HOperatorSet.Boundary(myPMAlign.templateRegion, out inBoundary, "outer"); - HOperatorSet.CropDomain(imageReduced, out imagePart); HOperatorSet.SetSystem("flush_graphic", "true"); - hWindowTool_Smart1.DispImage(imagePart); - hWindowTool_Smart1.DispHWindow.SetColor("green"); - hWindowTool_Smart1.DispHWindow.SetDraw("margin"); - hWindowTool_Smart1.DispHWindow.DispObj(outBoundary); - hWindowTool_Smart1.DispHWindow.DispObj(inBoundary); + hWindowTool_Smart1.DispImage(myPMAlign.modelPartImage); if (myPMAlign.matchMode == MatchMode.BasedShape) { HOperatorSet.SetLineStyle(myHwindow.DispHWindow, new HTuple()); @@ -322,5 +318,50 @@ namespace PMAlignTool } } + private void btnChangeModel_Click(object sender, EventArgs e) + { + if(!File.Exists(myPMAlign.pmaModelName + ".ShapeModel")) + { + MessageBox.Show("还未创建过模板,请先进行创建!"); + return; + } + myPMAlign.inputImage = myPMAlign.oldTrainImage; + myPMAlign.Run(SoftwareRunState.Debug); + + } + + private void cbx_searchRegionType_SelectedIndexChanged() + { + serachRegion_drawing_object.ClearDrawingObject(); + string selectRegion = cbx_searchRegionType.TextStr; + switch (selectRegion) + { + case "整幅图像": + myPMAlign.searchRegionType = RegionType.AllImage; + return; + case "矩形": + myPMAlign.searchRegionType = RegionType.Rectangle1; + serachRegion_drawing_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, new HTuple[] { 100, 100, 300, 400 }); + break; + case "圆": + myPMAlign.searchRegionType = RegionType.Circle; + serachRegion_drawing_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 200, 200, 100 }); + break; + case "多点": + myPMAlign.searchRegionType = RegionType.MultPoint; + break; + default: + break; + } + GC.KeepAlive(serachRegion_drawing_object); + serachRegion_drawing_object.OnSelect(OnSerchRegionDrawingObject); + serachRegion_drawing_object.OnAttach(OnSerchRegionDrawingObject); + serachRegion_drawing_object.OnResize(OnSerchRegionDrawingObject); + serachRegion_drawing_object.OnDrag(OnSerchRegionDrawingObject); + serachRegion_drawing_object.SetDrawingObjectParams("color", "yellow"); + myHwindow.DispHWindow.AttachDrawingObjectToWindow(serachRegion_drawing_object); + + } + } } diff --git a/PMAlignTool/FormPMAlignTool.resx b/PMAlignTool/FormPMAlignTool.resx index 836d7e6..ae9539c 100644 --- a/PMAlignTool/FormPMAlignTool.resx +++ b/PMAlignTool/FormPMAlignTool.resx @@ -196,19 +196,19 @@ n4H40MZzWKY2esaEIAiCIAiCIKrhy5f/A2/46JDXUARZAAAAAElFTkSuQmCC - + True - + True - + True - + True - + True diff --git a/PMAlignTool/PMAlign.cs b/PMAlignTool/PMAlign.cs index 2e15b7a..ff05c4e 100644 --- a/PMAlignTool/PMAlign.cs +++ b/PMAlignTool/PMAlign.cs @@ -24,6 +24,7 @@ using System.Windows.Forms; using Logger; using System.Diagnostics; using System.IO; +using ViewROI; namespace PMAlignTool { @@ -118,11 +119,15 @@ namespace PMAlignTool public bool isCreateModel { get; set; } internal string pmaModelName { get; set; } = Guid.NewGuid().ToString(); /// + /// 剪出的模板图像 + /// + public HObject modelPartImage = new HObject(); + /// /// 模板位置和实际位置的姿态差异 /// internal HTuple posHomMat2D = new HTuple(); - public override void DispMainWindow(HWindow dispHWindow) + public override void DispMainWindow(HWindowTool_Smart dispHWindow) { if (showFeature) { @@ -158,8 +163,7 @@ namespace PMAlignTool public bool isAutoConstants { get; set; } public string modelFilePath { get; set; } public RegionType searchRegionType { get; set; } - public HObject SearchRegion { get; private set; } - + public HObject SearchRegion { get; set; } public override void Run(SoftwareRunState softwareState) { Stopwatch sw = new Stopwatch(); @@ -167,7 +171,9 @@ namespace PMAlignTool softwareRunState = softwareState; if (inputImage == null) { - FormPMAlignTool.Instance.SetToolStatus("工具输入图像为空", ToolRunStatu.Not_Input_Image); + toolRunStatu = ToolRunStatu.Lack_Of_Input_Image; + runMessage = "工具输入图像为空"; + FormPMAlignTool.Instance.SetToolStatus(runMessage, toolRunStatu); return; } try @@ -192,21 +198,36 @@ namespace PMAlignTool // UpdateParamsFromUI(); // 操作前先将UI中参数写入类 HObject findModelImg = ProcessImage(inputImage); int ret = FindModelTemplate(findModelImg); + UpdateResultDataGridview(); ToolRunStatu myState = ret == 0 ? ToolRunStatu.Succeed : ToolRunStatu.Model_UnFound; - string retMsg = ret == 0 ? "工具运行成功,已找到匹配项!" : "未找到匹配项"; + toolRunStatu = myState; + string retMsg = ret == 0 ? $"{toolName}工具运行成功,已找到匹配项!" : $"{toolName}未找到匹配项"; + runMessage = retMsg; sw.Stop(); runTime = $"运行时间: {sw.ElapsedMilliseconds} ms"; FormPMAlignTool.Instance.SetToolStatus(retMsg, myState); } catch (Exception ex) { - FormPMAlignTool.Instance.SetToolStatus($"工具运行异常,异常原因: {ex}", ToolRunStatu.Tool_Run_Error); + FormPMAlignTool.Instance.SetToolStatus($"{toolName}工具运行异常,异常原因: {ex}", ToolRunStatu.Tool_Run_Error); } finally { } } + + public void UpdateResultDataGridview() + { + FormPMAlignTool.Instance.dgv_matchResult.Rows.Clear(); + int count = 0; + foreach (var item in L_resultList) + { + FormPMAlignTool.Instance.dgv_matchResult.AddRow(++count, item.Socre, item.Row, item.Col, item.Angle); + } + + } + public void UpdateParamsFromUI() { minScore = FormPMAlignTool.Instance.nud_minScore.Value; @@ -261,7 +282,7 @@ namespace PMAlignTool oldTrainImage = inputImage; if (FormPMAlignTool.Instance.templateModelListAdd.Count == 0) { - LoggerClass.WriteLog("未划定模板建立区域", MsgLevel.Exception); + LoggerClass.WriteLog($"{toolName}未划定模板建立区域", MsgLevel.Exception); isCreateModel = false; return -1; } @@ -270,6 +291,7 @@ namespace PMAlignTool HOperatorSet.GenEmptyObj(out createModelImg); createModelImg = ProcessImage(inputImage); HOperatorSet.ReduceDomain(createModelImg, templateRegion, out template); + HOperatorSet.CropDomain(template, out modelPartImage); //SetParamsFromUI(); try { @@ -327,6 +349,7 @@ namespace PMAlignTool isCreateModel = true; HOperatorSet.WriteRegion(templateRegion, FormPMAlignTool.Instance.myToolInfo.FormToolName + ".hobj"); HOperatorSet.WriteShapeModel(modelID, pmaModelName + ".ShapeModel"); + if (scores != null && scores.Type != HTupleType.EMPTY) { templatePose = new PosXYU { X = rows[0].D, Y = cols[0].D , U = angles[0].D }; @@ -335,28 +358,23 @@ namespace PMAlignTool } catch (Exception ex) { - Logger.LoggerClass.WriteLog("创建模板时出现异常", ex); + Logger.LoggerClass.WriteLog($"{toolName}创建模板时出现异常", ex); isCreateModel = false; return -1; } finally { - FormPMAlignTool.Instance.templateModelListAdd.Clear(); - FormPMAlignTool.Instance.templateModelListSub.Clear(); + // FormPMAlignTool.Instance.templateModelListAdd.Clear(); + // FormPMAlignTool.Instance.templateModelListSub.Clear(); } return 0; } public int FindModelTemplate(HObject findModelImage) { - if (!isCreateModel) - { - LoggerClass.WriteLog("未创建或加载模板", MsgLevel.Exception); - return -1; - } if (!File.Exists(pmaModelName + ".ShapeModel")) { - LoggerClass.WriteLog("未创建或加载模板", MsgLevel.Exception); + LoggerClass.WriteLog($"{toolName}未创建或加载模板", MsgLevel.Exception); return -1; } HOperatorSet.ReadShapeModel(pmaModelName + ".ShapeModel", out modelID); @@ -466,14 +484,14 @@ namespace PMAlignTool toolRunStatu = ToolRunStatu.Succeed; if (softwareRunState == SoftwareRunState.Debug) { - ShowTemplate(FormPMAlignTool.Instance.myHwindow.DispHWindow); + ShowTemplate(FormPMAlignTool.Instance.myHwindow); } return 0; } } catch (Exception ex) { - LoggerClass.WriteLog("寻找模板时出现异常!", ex); + LoggerClass.WriteLog($"{toolName}寻找模板时出现异常!", ex); toolRunStatu = ToolRunStatu.Not_Succeed; } return -1; @@ -483,7 +501,7 @@ namespace PMAlignTool /// /// 显示模板 /// - internal void ShowTemplate(HWindow dispHWindow, bool clearImg = false) + internal void ShowTemplate(HWindowTool_Smart dispHWindow, bool clearImg = false) { try { @@ -493,8 +511,8 @@ namespace PMAlignTool } if(clearImg) { - dispHWindow.ClearWindow(); - dispHWindow.DispObj(inputImage); + dispHWindow.DispHWindow.ClearWindow(); + dispHWindow.DispImage(inputImage); } if(L_resultList.Count > 0) { @@ -504,15 +522,15 @@ namespace PMAlignTool HOperatorSet.GetShapeModelContours(out contour, modelID, new HTuple(1)); HOperatorSet.VectorAngleToRigid(0, 0, 0, item.Row, item.Col, item.Angle,out homMat2D); HOperatorSet.AffineTransContourXld(contour, out contour, homMat2D); - dispHWindow.SetColor("green"); - dispHWindow.DispObj(contour); + dispHWindow.DispHWindow.SetColor("green"); + dispHWindow.DispHWindow.DispObj(contour); } } } catch (Exception ex) { - Logger.LoggerClass.WriteLog("显示模板时出现错误", ex); + Logger.LoggerClass.WriteLog($"{toolName}显示模板时出现错误", ex); } } diff --git a/PMAlignTool/PMAlignTool.csproj b/PMAlignTool/PMAlignTool.csproj index c1227f8..f76ce52 100644 --- a/PMAlignTool/PMAlignTool.csproj +++ b/PMAlignTool/PMAlignTool.csproj @@ -37,11 +37,17 @@ C:\Program Files\MVTec\HALCON-19.05-Progress\bin\dotnet20\halcondotnet.dll + + False + ..\VisionEdit\bin\Debug\ThirdLib\SunnyUI.dll + + + @@ -97,7 +103,7 @@ ToolBase - {D4E052B9-E541-4B67-A1F9-273073EF1D4B} + {d4e052b9-e541-4b67-a1f9-273073ef1d4b} Logger diff --git a/PMAlignTool/PMAlignToolRun.cs b/PMAlignTool/PMAlignToolRun.cs index 08a072e..fa0f4cb 100644 --- a/PMAlignTool/PMAlignToolRun.cs +++ b/PMAlignTool/PMAlignToolRun.cs @@ -41,6 +41,7 @@ namespace PMAlignTool if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null) { selectNode.ForeColor = Color.Red; + myPMAlign.inputImage = null; LoggerClass.WriteLog(L_toolList[toolIndex].toolName + " 无输入图像", MsgLevel.Exception); } else @@ -63,7 +64,7 @@ namespace PMAlignTool else { myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myPMAlign.runTime}", Color.Green, selectNode); - myPMAlign.DispMainWindow(FormImageWindow.Instance.myHWindow.DispHWindow); + myPMAlign.DispMainWindow(FormImageWindow.Instance.myHWindow); // 将输出值赋值到界面输出中 if (myPMAlign.L_resultList.Count > 0) { diff --git a/ToolBase/IToolBase.cs b/ToolBase/IToolBase.cs index d1a425f..c028604 100644 --- a/ToolBase/IToolBase.cs +++ b/ToolBase/IToolBase.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using CommonMethods; using HalconDotNet; +using ViewROI; namespace ToolBase { @@ -18,6 +19,6 @@ namespace ToolBase public abstract void Run(SoftwareRunState softwareRunState); public HObject inputImage { get; set; } public abstract void DispImage(); - public abstract void DispMainWindow(HWindow window); + public abstract void DispMainWindow(HWindowTool_Smart window); } } diff --git a/ToolBase/ToolBase.csproj b/ToolBase/ToolBase.csproj index 5e60034..46e5731 100644 --- a/ToolBase/ToolBase.csproj +++ b/ToolBase/ToolBase.csproj @@ -52,6 +52,10 @@ {1C8D0DDC-2086-48A9-9586-F2B643E2FC54} CommonHelper + + {9baa53fd-89b5-43e2-ac59-a27b006debb6} + HWindow_Tool +