From cc97863e6093946c9a1ccc972988a24557e5c91c Mon Sep 17 00:00:00 2001 From: Tongg Date: Wed, 11 Dec 2024 15:13:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:3d=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resource/Images/UserControl/Bottom@3x.png | Bin 0 -> 4682 bytes Resource/Images/UserControl/Top@3x.png | Bin 0 -> 4427 bytes Resource/Images/UserControl/arrow.png | Bin 0 -> 22439 bytes Resource/Images/UserControl/biaochi1@3x.png | Bin 0 -> 3509 bytes Resource/Images/UserControl/biaochi2@3x.png | Bin 0 -> 1151 bytes Resource/Images/UserControl/zuanshi@1x.png | Bin 0 -> 731 bytes Resource/Images/UserControl/zuanshi@3x.png | Bin 0 -> 2683 bytes SparkClient.csproj | 15 ++ Views/Grading/GradingResult.xaml | 61 +++---- Views/Grading/GradingResult.xaml.cs | 172 ++++++++++---------- Views/UserControl/Viewport3D.xaml | 112 +++++++++++++ Views/UserControl/Viewport3D.xaml.cs | 12 ++ 12 files changed, 256 insertions(+), 116 deletions(-) create mode 100644 Resource/Images/UserControl/Bottom@3x.png create mode 100644 Resource/Images/UserControl/Top@3x.png create mode 100644 Resource/Images/UserControl/arrow.png create mode 100644 Resource/Images/UserControl/biaochi1@3x.png create mode 100644 Resource/Images/UserControl/biaochi2@3x.png create mode 100644 Resource/Images/UserControl/zuanshi@1x.png create mode 100644 Resource/Images/UserControl/zuanshi@3x.png create mode 100644 Views/UserControl/Viewport3D.xaml create mode 100644 Views/UserControl/Viewport3D.xaml.cs diff --git a/Resource/Images/UserControl/Bottom@3x.png b/Resource/Images/UserControl/Bottom@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..90231de69049503ab72d9e30905e7b0761888d23 GIT binary patch literal 4682 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 M07*qoM6N<$f_kFwr2qf` literal 0 HcmV?d00001 diff --git a/Resource/Images/UserControl/Top@3x.png b/Resource/Images/UserControl/Top@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc8fee45bca248c0bb603ef43262e4adf1b482d GIT binary patch literal 4427 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 literal 0 HcmV?d00001 diff --git a/Resource/Images/UserControl/biaochi2@3x.png b/Resource/Images/UserControl/biaochi2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3291b3e7751d5075fcc68300651ba18cdaf56fa3 GIT binary patch literal 1151 zcmV-_1c3XAP)Px(IY~r8RA@u(nNNruMHI%rucm9(g9k7EIYm8c{n1VvG@Q4~EINMO5rgMuD{ z|A-{UY)mq%aSe$|BvCvFN~WtT-bvbA@0^}J=3$!vTSUwyCYRlgywun(^=UKGH2SG-WTP&j8RP=s{O1YLkrC|oFp zI%k3whgK2NtwMTp^{-odl&Szya!|jL@I>HIM3c&sdf%-DxL#4c5c#FU|Hti-S>gT@ z7gspzT|oVfQc_tIv8(FqLtPEr7t8fZY7+!b!C|jZtSX^4<4_Z7Tbh}wIq(T8wFAOU zCiG6`1ehaH;B9FJ6GV15h#?Y>M85tc7r-L&6GTQDFmZoRrSUz8>>dyY1b8?O^ryK1 z{x^gP^xQe%8~YN0S4cb*`TDb508=;yk--K`)UU_pDZCHFpa2iXf&M%nz-YaPePj1u zlDnda2dcjQA{W3yOcEGxz!+a|oTu<0hQRYY&q*Qas;%#@H0 zB6|SD9sxGQf&Q}Vf$8i7fRbC*w?4?0i3>v4}sVTk-JS;{w5c|X=y1m_OJju1aem#l+WY>c#*X9 z27%`xa;FK)-{t~1EiHw{zA3wy=$c=%@eD8Z*o^wu2r`9s$O&z5*nDjueG43MWFZnX(}e#`|hfN^o| zqh=Kk-%P(laGRrd$FR@2H>!?;i*WM@)a}=Tnx1aeJN$0Fy2 zbc6^<2WirR?w=a)f;L$N0h|CrU_;% z<5}kJXh>&q*vT6zy+*%L;G5rXH8!zd zs%;R-ZD4I2;JYU9wk->Av$W(_rz%uxKOHtE4;{pI6oTGH2{$lSK#V2zuLM{WM#Z_o zq^8}DZC^aKT8a9e;ISz1p2QOp3B*f29Y5;;&5Z6C@nyM<2-<=zxV3jB};G8?Dh>zQ`6~Rp;D4u*Y00001b5ch_0Itp) z=>Px%l}SWFR5(wSl1qqAVHn5%|M$G-`+T`exkNJMwj~K=vT+O9VCJ0fvyhd`!et{R zBUU6S3t|@IoHH~b79&b(l&}$!T(UrvYc83Y@0|1g^^JxPW8qmnJ@5Pcp4*?OvvpB* zV{S}~qz8naOYSr1y_Iu=349~HDKKs##90CkC!xQqKb`$fm}EyFw-RzGXbixH`Xc?l zsK)oBw+^R!eQ#*T8dmFJ<)pen4wblE zXson#Pj;T|0QfQv?JAbr^GA~Fj01mbEh&tu>j5l|%Z0UncGR3`v{Cjn4(v#fYHIy9 z(G>lY1}HI%(j34AKwWXUaJU?&7af=+p*=m&Xknb*ro;BA;$IKq^bnzi0H?7Mr3anC z5&<5C*8pY{*eAos$dSsTe((t}zhf(#6h&RURh75N? z90!Bz5PT9toZu+4i|fS}rsa$G$ohoLZ-5AZ91a{}fhp}%M#ef<;k zV=q}Jq#hVOgSgbOyRkhO_U^wyt519yRUA~hBXBgWofkFn?m&=Q>^s_TCWaNo^9%q0 N002ovPDHLkV1l_IQe^-D literal 0 HcmV?d00001 diff --git a/Resource/Images/UserControl/zuanshi@3x.png b/Resource/Images/UserControl/zuanshi@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e51dbfd3f801a7865a2de4fdced0d7af7bdc97d7 GIT binary patch literal 2683 zcmV->3WW8EP)PxGSpDJC6=w7_HsseM-=Cm~kwC=>T>g#_$n|60nY$)&ji7bL1n< zDxqctl^f0g@o4~^Kg5`~33!qj>xiJ6)y+)%g7~ul4h2xhCf*2^U-BG!tr@*d0dqV( zhrufVl!!TEA`6HOe-2DfFyRR+(vQ0xV_s}#(t0wjt9kqwt&fa=Xsocw!7{EV^%!{Oz0)ft!UHM4Zsky~25@r!vE(k# zDcgD3Dlo?jE@aTn01V@q))NtCb=h)lEn^)oT+F}^;y%JXo-JEP3Mw0?yzq4Z`^CQ* z$JO&&ix;!CadNl1Ud=S8wbI8~B zNpW)iY!{W!?%F=F6p8<&--GlRZr@p8jvpS+j6bA$UiXx&-t&689WVGMgO>I?c6wEp z^cM}Vm=Ka9MJqg8oZZMk<%Zt|;l@<%eox6$8jWeDzjZa2%AtM-zz2+cMA4_a>=tt} zhHSQ{ze>O=fMqJ!n+MiQgljnx%RPrS52eZR!oMq z99Q~EUNh9#m`t?37!fW5VQh7e2JBe!)i}amF~rTjqL+(G=iJ46RfK*s-TF!(#fQ7w z$gJ|HG{@I%%rP^Y_LQgOQS}rnH#i4GS5*loCphpZ4%AQ~;6AeWhR*i#Gg+7I1!oiJ zj`a5*JtdDH6-22L6EBuSy(QBbk@!%TO>gDrX!rFg7W0n*9FqS|j4ez_#zD%}OF?`= zB4DmtjbMcF7!%#(+oj(qU;no1LzvI?obs~K1ZH$8FEmll%)}&~?>XgPnm;?bf+m?+N*)(k`e{%KhVceK3qfog zV6t-c+p`3iAhltO0CT)UFfvDi9vVzN}QGMbiXy`40A+lcdSNBdgC6RyiuIEcrit@yZ9p|))#{@|NSTl z488{F)|Oths(rVYOkWzSJ_cZ13gpo~DQ0BxsI$HNWM;#et9jor(Ccyu?nbbflJ~zg^RWQ|ZXGAwaTg!JLT|`+7mTYtM z2wEDZZ7?9yV>QQDqO+*V@Bx?fV+W*|SHRU^q@S2&?@!{MNCm@8GCnJ)N-+1JCqK5Xb!fB#=Jp)|vYyZ4F(Uqk zYnPWd0yTd*%WdPs4FF9{WNDeF#DGFkk=A$Qj*pMqDyHAQfWn;yW)vttxBwg{bjhIv z7W+z?$U1J0r*F$uuXXmhq?l;3-%Pd^tuw??zM`H+ zi`LYRWlC&MuORTe?05e1+8$3J=uH47q`;T>N-nHtK@evLIA>!76~hmPqm|enAQhJ zIKu(8Q%AAhor%kVgcHYZ5r5t`K70|N1CkTTT_6)SWzHB&JtZ%!LFo1}wQF#ef;FMI;U<)_$%~loAFm@f>;6 z;AnmHimy9G9>tZc6)=}7(Y&Z+{Vhu%0e*ShRyk?w`0(okiZJF4PRUD0vOBfLj4H5N zlnvm15Y~f{JkBw-lEuBus1{+2jAx5k&1MA6fFE^WF{Qh~LJ-~3&y?{4##{zAMHDTt z*s2y`46TP!9NXPSJN;Ud2fRywC2n9~zznvQv5fAe5S_UqOneWECG2K)q>;=n16B-} zVG5-%j~skpYE;aeowHlkH!^Z0{ksfUawOw`*_6$yFa1^LOql7~^5Kyf-OQL>3d|Ug p2F%ZZ`ClM1|E*}$-_&XW{U69nqm}MMKra9Q002ovPDHLkV1gkn_jmvR literal 0 HcmV?d00001 diff --git a/SparkClient.csproj b/SparkClient.csproj index a920f72..abc6cc5 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -95,6 +95,21 @@ + + + + + + + + + + + + + + + diff --git a/Views/Grading/GradingResult.xaml b/Views/Grading/GradingResult.xaml index 7e0d8df..f0925a1 100644 --- a/Views/Grading/GradingResult.xaml +++ b/Views/Grading/GradingResult.xaml @@ -6,6 +6,7 @@ xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:local="clr-namespace:SparkClient.Views.Grading" xmlns:hx="http://helix-toolkit.org/wpf/SharpDX" + xmlns:userControl="clr-namespace:SparkClient.Views.UserControl" mc:Ignorable="d" d:DesignWidth="1000" d:DesignHeight="600" @@ -134,39 +135,39 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Views/Grading/GradingResult.xaml.cs b/Views/Grading/GradingResult.xaml.cs index 63db910..0487d9a 100644 --- a/Views/Grading/GradingResult.xaml.cs +++ b/Views/Grading/GradingResult.xaml.cs @@ -22,21 +22,21 @@ public partial class GradingResult DataContext = new GradingResultVM(null); - this.Viewport3Dx.EffectsManager = new DefaultEffectsManager(); - this.Viewport3Dx.Camera = new PerspectiveCamera() - { - Position = new Point3D(0, 0, 5), - LookDirection = new Vector3D(0, 0, -1), - UpDirection = new Vector3D(0, 1, 0), - FarPlaneDistance = 1000, - NearPlaneDistance = 0.1 - }; - - Loaded += (sender, args) => - { - var entities = Viewport3DHelper.InitDemo(Viewport3Dx); - triangles.AddRange(entities); - }; + // this.Viewport3Dx.EffectsManager = new DefaultEffectsManager(); + // this.Viewport3Dx.Camera = new PerspectiveCamera() + // { + // Position = new Point3D(0, 0, 5), + // LookDirection = new Vector3D(0, 0, -1), + // UpDirection = new Vector3D(0, 1, 0), + // FarPlaneDistance = 1000, + // NearPlaneDistance = 0.1 + // }; + + // Loaded += (sender, args) => + // { + // var entities = Viewport3DHelper.InitDemo(Viewport3Dx); + // triangles.AddRange(entities); + // }; } @@ -47,77 +47,77 @@ public partial class GradingResult /// private void Viewport3Dx_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { - // 获取鼠标点击位置 - var mousePosition = e.GetPosition(Viewport3Dx); - - // 查找鼠标点击的 3D 对象 - var hits = Viewport3Dx.FindHits(mousePosition); - - // 如果没有命中任何 3D 对象 - if (hits == null || hits.Count == 0) - { - Console.WriteLine("未点击到任何模型"); - foreach (var item in mouseAddModels) - { - Viewport3Dx.Items.Remove(item); - } - mouseAddModels.Clear(); - return; - } - - // 获取第一个命中的对象 - var hit = hits[0]; - - // 检查是否是 MeshGeometryModel3D - if (hit.ModelHit is MeshGeometryModel3D modelHit) - { - foreach (var item in mouseAddModels) - { - Viewport3Dx.Items.Remove(item); - } - mouseAddModels.Clear(); - // 获取几何信息 - var geometry = modelHit.Geometry as MeshGeometry3D; - if (geometry != null) - { - // 获取命中的三角形索引 - var triangleIndex = hit.TriangleIndices; - - // 获取三角形顶点 - var vertex1 = geometry.Positions[triangleIndex.Item1]; - var vertex2 = geometry.Positions[triangleIndex.Item2]; - var vertex3 = geometry.Positions[triangleIndex.Item3]; - - string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z; - string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint); - - //命中实体 - Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode)); - - if (res == null) - return; - - //命中面 - List facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList(); - var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f); - var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet); - mouseAddModels.AddRange(data1); - //命中面标线 - var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet); - mouseAddModels.AddRange(data2); - //命中同类面 - List facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList(); - //排除自己 - facet.ForEach(e=>facetType.Remove(e)); - var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f); - var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType); - mouseAddModels.AddRange(data3); - } - } - else - { - Console.WriteLine("点击的对象不是 MeshGeometryModel3D"); - } + // // 获取鼠标点击位置 + // var mousePosition = e.GetPosition(Viewport3Dx); + // + // // 查找鼠标点击的 3D 对象 + // var hits = Viewport3Dx.FindHits(mousePosition); + // + // // 如果没有命中任何 3D 对象 + // if (hits == null || hits.Count == 0) + // { + // Console.WriteLine("未点击到任何模型"); + // foreach (var item in mouseAddModels) + // { + // Viewport3Dx.Items.Remove(item); + // } + // mouseAddModels.Clear(); + // return; + // } + // + // // 获取第一个命中的对象 + // var hit = hits[0]; + // + // // 检查是否是 MeshGeometryModel3D + // if (hit.ModelHit is MeshGeometryModel3D modelHit) + // { + // foreach (var item in mouseAddModels) + // { + // Viewport3Dx.Items.Remove(item); + // } + // mouseAddModels.Clear(); + // // 获取几何信息 + // var geometry = modelHit.Geometry as MeshGeometry3D; + // if (geometry != null) + // { + // // 获取命中的三角形索引 + // var triangleIndex = hit.TriangleIndices; + // + // // 获取三角形顶点 + // var vertex1 = geometry.Positions[triangleIndex.Item1]; + // var vertex2 = geometry.Positions[triangleIndex.Item2]; + // var vertex3 = geometry.Positions[triangleIndex.Item3]; + // + // string strPoint = vertex1.X + ","+ vertex1.Y+","+ vertex1.Z + ";"+ vertex2.X + ","+ vertex2.Y + ","+ vertex2.Z+";"+vertex3.X + ","+ vertex3.Y + ","+ vertex3.Z; + // string triangleCode = Viewport3DTriangleEntity.GenerateMD5Hash(strPoint); + // + // //命中实体 + // Viewport3DTriangleEntity res = triangles.Find(e => triangleCode.Equals(e.TriangleCode)); + // + // if (res == null) + // return; + // + // //命中面 + // List facet = triangles.Where(e => res.PlaneCode.Equals(e.PlaneCode)).ToList(); + // var colorFacet = new Color4(1.0f, 1.0f, 0.0f, 1.0f); + // var data1 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facet,colorFacet); + // mouseAddModels.AddRange(data1); + // //命中面标线 + // var data2 = Viewport3DHelper.GenerateLineTextModelByEntity(Viewport3Dx, facet); + // mouseAddModels.AddRange(data2); + // //命中同类面 + // List facetType = triangles.Where(e => res.PlaneType.Equals(e.PlaneType)).ToList(); + // //排除自己 + // facet.ForEach(e=>facetType.Remove(e)); + // var colorFacetType = new Color4(0.9f, 0.9f, 0.7f, 1.0f); + // var data3 = Viewport3DHelper.GenerateEmissiveModelByEntity(Viewport3Dx,facetType,colorFacetType); + // mouseAddModels.AddRange(data3); + // } + // } + // else + // { + // Console.WriteLine("点击的对象不是 MeshGeometryModel3D"); + // } } private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) diff --git a/Views/UserControl/Viewport3D.xaml b/Views/UserControl/Viewport3D.xaml new file mode 100644 index 0000000..c7e5dec --- /dev/null +++ b/Views/UserControl/Viewport3D.xaml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs new file mode 100644 index 0000000..c4372eb --- /dev/null +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows.Controls; + +namespace SparkClient.Views.UserControl; + +public partial class Viewport3D +{ + public Viewport3D() + { + InitializeComponent(); + DataContext = this; + } +} \ No newline at end of file