diff --git a/Resource/Images/UserControl/03-8-3.png b/Resource/Images/UserControl/03-8-3.png new file mode 100644 index 0000000..b2c78f5 Binary files /dev/null and b/Resource/Images/UserControl/03-8-3.png differ diff --git a/SparkClient.csproj b/SparkClient.csproj index 76c0cdc..dfac916 100644 --- a/SparkClient.csproj +++ b/SparkClient.csproj @@ -190,6 +190,8 @@ + + diff --git a/ViewModel/Grading/GradingResultVM.cs b/ViewModel/Grading/GradingResultVM.cs index f3cd760..7531fa6 100644 --- a/ViewModel/Grading/GradingResultVM.cs +++ b/ViewModel/Grading/GradingResultVM.cs @@ -749,6 +749,11 @@ public class GradingResultVM : BaseViewModel } else { + if (!File.Exists(getFilePath())) + { + new MessageBox().Show(MultilingualHelper.getString("SavePathIsnotExists")); + return; + } string fullPath = Path.Combine(getFilePath(), this.DiamondCode); if (FileSaveEnabled("Txt")) { @@ -803,7 +808,14 @@ public class GradingResultVM : BaseViewModel } else { - Directory.CreateDirectory(defultFilePath); + try { + Directory.CreateDirectory(defultFilePath); + } + catch (Exception ex) + { + new MessageBox().Show(MultilingualHelper.getString("SavePathIsnotExists")); + Logger.Error($"全局异常捕获:{ex.Message}", ex); + } return defultFilePath; } } diff --git a/Views/UserControl/Viewport3D.xaml b/Views/UserControl/Viewport3D.xaml index 2c2ccfc..532b5eb 100644 --- a/Views/UserControl/Viewport3D.xaml +++ b/Views/UserControl/Viewport3D.xaml @@ -45,6 +45,10 @@ x:Name="BtnFcuntion3View" Click="BtnFunction_OnClick"> + diff --git a/Views/UserControl/Viewport3D.xaml.cs b/Views/UserControl/Viewport3D.xaml.cs index 7ec18d9..797a4f2 100644 --- a/Views/UserControl/Viewport3D.xaml.cs +++ b/Views/UserControl/Viewport3D.xaml.cs @@ -42,7 +42,12 @@ public partial class Viewport3D private void Viewport3D_OnLoaded(object sender, RoutedEventArgs e) { ViewportManager.SetViewport3D(Viewport3Dx); + ViewportManager.SetViewport(this); ViewportManager.LoadModelByEntities(new List()); + #if DEBUG + #else + BtnShow3DView.Visibility = Visibility.Hidden; + #endif //选项初始化 显示-后端-管理类 一致 ViewportRightMenuSelectFaceFrame.IsEnabled = ViewportRightMenuSelectFace.IsChecked ; @@ -189,17 +194,31 @@ public partial class Viewport3D break; case "BtnFcuntion3View": //低 + //var center = ViewportManager.ModelBounds.Center; + //var maxDimension = ViewportManager.ModelBounds.Size.Length(); + //var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内 + //var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera; + //camera.Position = new Point3D(center.X, center.Y, center.Z); // 从前面看,Z轴正方向 + //camera.Width = ViewportManager.calCameraWidth(); + //camera.UpDirection = new Vector3D(0, -1, 0); + //camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); var center = ViewportManager.ModelBounds.Center; + ViewportManager.ClearMeshLines(ViewportRightMenuShowMeshLines); var maxDimension = ViewportManager.ModelBounds.Size.Length(); - var distance = maxDimension *1.2; // 调整相机到模型的距离,保证视野范围内 + var distance = maxDimension * 1.2; // 调整相机到模型的距离,保证视野范围内 var camera = Viewport3Dx.Camera as HelixToolkit.Wpf.SharpDX.OrthographicCamera; - camera.Position = new Point3D(center.X, center.Y, center.Z); // 从前面看,Z轴正方向 - camera.Width = ViewportManager.calCameraWidth(); - camera.UpDirection = new Vector3D(0, -1, 0); - camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); + camera.Position = new Point3D(center.X, center.Y, center.Z + distance); // 从前面看,Z轴正方向 + camera.UpDirection = new Vector3D(0, -1, 0); + camera.LookDirection = new Vector3D(center.X - camera.Position.X, center.Y - camera.Position.Y, center.Z - camera.Position.Z); + await Task.Delay(100); ViewportHelperPro.RotateModel(new Vector3D(0,-1,0)); - await Task.Delay(5000); + await Task.Delay(7000); ViewportHelperPro.RotateModel(new Vector3D(-1,0,0)); + await Task.Delay(7000); + ViewportManager.DoubleClickSelect = !false; + break; + case "BtnShow3DView": + break; } diff --git a/Views/UserControl/ViewportData/Helper/UnityHelper.cs b/Views/UserControl/ViewportData/Helper/UnityHelper.cs new file mode 100644 index 0000000..10dc8fd --- /dev/null +++ b/Views/UserControl/ViewportData/Helper/UnityHelper.cs @@ -0,0 +1,18 @@ +namespace SparkClient.Views.UserControl.ViewportData.Helper; + +public class UnityHelper +{ + private static string _image_path = AppDomain.CurrentDomain.BaseDirectory + "/temp/image/"; + + /*** + * 1、根据模型信息和钻石编码生成签名作为stl文件名(导出:ViewportHelperPro.ExportModelsToStl(null, path+filename)) + * 2、判断同名STL文件是否存在 存在跳到 7 + * 3、 清理temp下,image、stl两个目录 + * 4、导出模型stl文件,记录完整的路径paramA + * 5、执行导出命令 xx.exe --model=_stl_path+paramA --output=_image_path --type=0/1 0:心图(0.png) 1:箭图(1.png) + * 6、等待命令结束 + * 7、判断图片文件是否存在 --->>不存在:提示生成失败,请重试, --->>不存在并且从2过来的,跳到1 + * 8、展示图片弹窗,并注以说明:心箭图为模拟渲染,实际请以切工镜观测为准。 + * 9、关闭 + */ +} \ No newline at end of file diff --git a/Views/UserControl/ViewportData/Helper/VideoHelper.cs b/Views/UserControl/ViewportData/Helper/VideoHelper.cs index 645e1b3..9696ecd 100644 --- a/Views/UserControl/ViewportData/Helper/VideoHelper.cs +++ b/Views/UserControl/ViewportData/Helper/VideoHelper.cs @@ -212,7 +212,8 @@ public class VideoHelper { ViewportHelperPro.RotateModel(new Vector3D(-1, 0, 0)); }); - + ViewportManager.DoubleClickSelect = !false; + } public static PngBitmapEncoder CutPng(Viewport3DX viewport) diff --git a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs index e742caf..5984b47 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportHelperPro.cs @@ -178,7 +178,7 @@ public class ViewportHelperPro { if (viewport == null) viewport = ViewportManager.GetViewport3D(); - + var generationTask = VideoHelper.StartGenerationAndRotation(viewport); List pngList = await generationTask; @@ -899,7 +899,10 @@ public class ViewportHelperPro /// 旋转时间 秒 public static void RotateModel(Vector3D axis, bool hasLine = true, int speed = 7, int to = 360) { + ViewportManager.GetViewport().ViewportRightMenuShowModelFaceByType.IsChecked = false; ViewportManager.ClearDicModels(); + ViewportManager.DoubleClickSelect = false; + // 设置旋转的中心点和旋转轴 var rotateTransform = new RotateTransform3D(); var rotation = new AxisAngleRotation3D(axis, 0); @@ -1284,7 +1287,7 @@ public class ViewportHelperPro /// /// /// - public static List ShowMeshLines(List entities, bool isCrown = true, double thickness = 1.0) + public static List ShowMeshLines(bool isCrown = true, double thickness = 0.2) { if (isCrown) { @@ -1298,7 +1301,7 @@ public class ViewportHelperPro } var center = ViewportManager.CenterVector; center.Y = Y; - Viewport3DTriangleEntity firstPoint = entities.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault(); + Viewport3DTriangleEntity firstPoint = ViewportManager.ViewportTriangle.Where(x => x.PlaneType == PlaneType.TableFacet).FirstOrDefault(); //var b = ((center.Z * firstPoint.Point1.X) - (firstPoint.Point1.Z * center.X)) / (firstPoint.Point1.X - center.X); //var a = (firstPoint.Point1.Z - b) / firstPoint.Point1.X; @@ -1321,27 +1324,27 @@ public class ViewportHelperPro edgeLines = new List>(); var XLine = lineCal.calXline(r); edgeLines.Add(XLine); - lines.Add(DisplayLineModel3D(edgeLines, XlineColor)); + lines.Add(DisplayLineModel3D(edgeLines, XlineColor, thickness)); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(XLine, 2)); - var lineA = DisplayLineModel3D(edgeLines, XlineColor); + var lineA = DisplayLineModel3D(edgeLines, XlineColor, thickness); lines.Add(lineA); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(XLine, -2)); - var lineB = DisplayLineModel3D(edgeLines, XlineColor); + var lineB = DisplayLineModel3D(edgeLines, XlineColor, thickness); lines.Add(lineB); bindingMoveLine(lineA, lineB); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(XLine, 4)); - var lineE = DisplayLineModel3D(edgeLines, XlineColor); + var lineE = DisplayLineModel3D(edgeLines, XlineColor, thickness); lines.Add(lineE); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(XLine, -4)); - var lineF = DisplayLineModel3D(edgeLines, XlineColor); + var lineF = DisplayLineModel3D(edgeLines, XlineColor, thickness); lines.Add(lineF); bindingMoveLine(lineE, lineF); @@ -1358,31 +1361,32 @@ public class ViewportHelperPro edgeLines = new List>(); var YLine = lineCal.calYline(r); edgeLines.Add(YLine); - lines.Add(DisplayLineModel3D(edgeLines, YlineColor)); + lines.Add(DisplayLineModel3D(edgeLines, YlineColor, thickness)); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(YLine, 2)); - var lineC = DisplayLineModel3D(edgeLines, YlineColor); + var lineC = DisplayLineModel3D(edgeLines, YlineColor, thickness); lines.Add(lineC); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(YLine, -2)); - var lineD = DisplayLineModel3D(edgeLines, YlineColor); + var lineD = DisplayLineModel3D(edgeLines, YlineColor, thickness); lines.Add(lineD); bindingMoveLine(lineC, lineD); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(YLine, 4)); - var lineG = DisplayLineModel3D(edgeLines, YlineColor); + var lineG = DisplayLineModel3D(edgeLines, YlineColor, thickness); lines.Add(lineG); edgeLines = new List>(); edgeLines.Add(lineCal.calLineOfOffset(YLine, -4)); - var lineH = DisplayLineModel3D(edgeLines, YlineColor); + var lineH = DisplayLineModel3D(edgeLines, YlineColor, thickness); lines.Add(lineH); bindingMoveLine(lineG, lineH); return lines; } + private static readonly double HitTestThickness = 5; /// /// 网状参考线 对向移动绑定 /// @@ -1390,10 +1394,12 @@ public class ViewportHelperPro /// private static void bindingMoveLine(LineGeometryModel3D lineA, LineGeometryModel3D lineB) { + lineA.HitTestThickness = HitTestThickness; lineA.MouseDown3D += LineA_MouseDown3D; lineA.MouseUp3D += LineA_MouseUp3D; lineA.MouseMove3D += LineA_MouseMove3D; moveLines.Add(lineA.GUID, lineB.GUID); + lineB.HitTestThickness = HitTestThickness; lineB.MouseDown3D += LineA_MouseDown3D; lineB.MouseUp3D += LineA_MouseUp3D; lineB.MouseMove3D += LineA_MouseMove3D; @@ -1648,7 +1654,7 @@ public class ViewportHelperPro /// /// /// - public static LineGeometryModel3D ShowCircleLine(bool isCrown = true, double radius = 1.0, double thickness = 1.0) + public static LineGeometryModel3D ShowCircleLine(bool isCrown = true, double radius = 1.0, double thickness = 0.2) { var Y = -0.01F; if (!isCrown) @@ -1657,9 +1663,9 @@ public class ViewportHelperPro } var center = ViewportManager.CenterVector; center.Y = Y; - return UpdateCircleGeometry(center, initialRadius); + return UpdateCircleGeometry(center, initialRadius, thickness); } - private static LineGeometryModel3D UpdateCircleGeometry(Vector3 center, double radius = 1.0) + private static LineGeometryModel3D UpdateCircleGeometry(Vector3 center, double radius = 1.0, double thickness = 1.0) { // 生成圆形线的点 int segments = 100; // 圆的细分段数 @@ -1677,7 +1683,8 @@ public class ViewportHelperPro indices.Add(i); indices.Add((i + 1) % segments); } - var Circle = DisplayLineModel3D(positions, Color4.Black); + var Circle = DisplayLineModel3D(positions, Colors.Orange.ToColor4(),thickness); + Circle.HitTestThickness = HitTestThickness; Circle.MouseDown3D += Circle_MouseDown3D; Circle.MouseUp3D += Circle_MouseUp3D; Circle.MouseMove3D += Circle_MouseMove3D; diff --git a/Views/UserControl/ViewportData/Helper/ViewportManager.cs b/Views/UserControl/ViewportData/Helper/ViewportManager.cs index e8280c9..d9ac7b4 100644 --- a/Views/UserControl/ViewportData/Helper/ViewportManager.cs +++ b/Views/UserControl/ViewportData/Helper/ViewportManager.cs @@ -63,6 +63,8 @@ public class ViewportManager /// 网格线(圈) /// public static LineGeometryModel3D MainModelCircleLine_P = new LineGeometryModel3D(); + + /// /// 腰垂直线 /// @@ -88,6 +90,9 @@ public class ViewportManager /// 模型控件对象映射 /// private static Viewport3DX _viewport; + + //模型 + private static Viewport3D _viewport3D = null; public static void SetViewport3D(Viewport3DX viewport3D) { if (_viewport != null) @@ -105,6 +110,24 @@ public class ViewportManager throw new Exception("Viewport is not set"); return _viewport; + } + public static void SetViewport(Viewport3D viewport3D) + { + if (_viewport != null) + { + ClearDicModels(); + _viewport.Items.Clear(); + + } + + _viewport3D = viewport3D; + } + public static Viewport3D GetViewport() + { + if (_viewport3D == null) + throw new Exception("Viewport is not set"); + return _viewport3D; + } #region 模型选中交互管理 //是否双击选中 @@ -156,6 +179,15 @@ public class ViewportManager ChooseAddModels.Clear(); } + public static void ResetMeshLines() + { + MainModelMeshLines_C.Clear(); + MainModelMeshLines_C.AddRange(ViewportHelperPro.ShowMeshLines()); + MainModelCircleLine_C = ViewportHelperPro.ShowCircleLine(); + MainModelMeshLines_P.Clear(); + MainModelMeshLines_P.AddRange(ViewportHelperPro.ShowMeshLines(false)); + MainModelCircleLine_P = ViewportHelperPro.ShowCircleLine(false); + } /// /// 模拟面选中 /// @@ -289,12 +321,7 @@ public class ViewportManager _viewport.Camera.UpDirection = new Vector3D(0, -1, 0); _viewport.RenderHost.MSAA = MSAALevel.Maximum; // TODO: - MainModelMeshLines_C.Clear(); - MainModelMeshLines_C.AddRange(ViewportHelperPro.ShowMeshLines(entities)); - MainModelCircleLine_C = ViewportHelperPro.ShowCircleLine(); - MainModelMeshLines_P.Clear(); - MainModelMeshLines_P.AddRange(ViewportHelperPro.ShowMeshLines(entities, false)); - MainModelCircleLine_P = ViewportHelperPro.ShowCircleLine(false); + ResetMeshLines(); } /// @@ -470,12 +497,20 @@ public class ViewportManager _viewport.Items.Remove(MainModelCircleLine_C); MainModelMeshLines_P.ForEach(e => _viewport.Items.Remove(e)); _viewport.Items.Remove(MainModelCircleLine_P); + ResetMeshLines(); } } + + public static void ClearMeshLines(MenuItem menuItem) + { + ViewportManager.ShowMeshLines(false, true); + ViewportManager.ShowMeshLines(false, false); + menuItem.IsChecked = false; + } #endregion - - - #region 预制颜色 + + + #region 预制颜色 /// /// 材质:半透明蓝 ///