feat:文件导出

master
sunhonglei 7 months ago
parent 20eae961e9
commit 0d8ee5355b
  1. 7
      SparkClient.csproj
  2. 386
      ViewModel/Grading/GradingResultVM.cs
  3. 85
      Views/Dialog/SaveDialog.xaml
  4. 90
      Views/Dialog/SaveDialog.xaml.cs
  5. 25
      Views/Grading/GradingResult.xaml

@ -19,6 +19,7 @@
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NPOI" Version="2.7.2" />
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="2.1.10" />
</ItemGroup>
@ -140,4 +141,10 @@
<Compile Remove="Resource\Images\Temp\**" />
</ItemGroup>
<ItemGroup>
<Compile Update="Views\Dialog\SaveDialog.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
</Project>

@ -1,19 +1,21 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Reflection;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Shapes;
using HandyControl.Controls;
using log4net.Appender;
using Newtonsoft.Json;
using SparkClient.Model.Entity.ApiEntity;
using SparkClient.Model.Helper;
using SparkClient.Views.UserControl.ViewportData;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
using Microsoft.Win32;
using SaveFileDialog = Microsoft.Win32.SaveFileDialog;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using SparkClient.Views.Dialog;
using NPOI.HPSF;
namespace SparkClient.ViewModel.Grading;
public class GradingResultVM : BaseViewModel
@ -32,8 +34,8 @@ public class GradingResultVM : BaseViewModel
private string _wight;
private string _cutLevelTotal;
private string _symLevelTotal;
public ICommand ChangeSymCommand { get; }
private string _ds;
public ICommand SaveFileCommand { get; }
public ICommand SaveAsCommand { get; }
public List<DataInfo> DtResults { get { return _dtResults; } set { _dtResults = value; OnPropertyChanged(nameof(DtResults)); } }
public ViewportData ViewportData { get { return _viewportData; } set { _viewportData = value; OnPropertyChanged(nameof(ViewportData)); } }
@ -45,27 +47,64 @@ public class GradingResultVM : BaseViewModel
public string CutLevelTotal { get { return _cutLevelTotal; } set { _cutLevelTotal = value; OnPropertyChanged(nameof(CutLevelTotal)); } }
public string SymLevelTotal { get { return _symLevelTotal; } set { _symLevelTotal = value; OnPropertyChanged(nameof(SymLevelTotal)); } }
public DataTable DSList { get { return _dsList; } set { _dsList = value; OnPropertyChanged(nameof(DSList)); } }
public string DS { get { return _ds; } set { _ds = value; OnPropertyChanged(nameof(DS)); } }
public DataTable GradeList { get { return _gradeList; } set { _gradeList = value; OnPropertyChanged(nameof(GradeList)); } }
private readonly static string digitsFormat = "f1";
private int totalCutGrade = 0;
private int totalSymGrade = 0;
private AlgorithmResultEntity algorithmResult;
private string username = "Lavanda";
private string machine = "71953";
/// <summary>
/// 构造
/// </summary>
/// <param name="result">检测结果</param>
public GradingResultVM(object result)
{
SaveAsCommand = new RelayCommand(SaveAs);
SaveFileCommand = new RelayCommand(SaveFile);
if (result != null)
{
InitView(result as AlgorithmResultEntity);
algorithmResult = result as AlgorithmResultEntity?? new AlgorithmResultEntity();
InitView(algorithmResult);
machine = "71953";
}
InitCombobox();
AutoSave();
}
#region 画面初始化相关操作
private void InitCombobox()
{
// DS下拉列表初始化
InitDSlist();
// 等级下拉列表初始化
InitGradeList();
}
private void InitDSlist()
{
DSList = new DataTable();
DSList.Columns.Add("Key");
DSList.Columns.Add("Value");
DSList.Rows.Add("NA", "NA");
DSList.Rows.Add("pass", "pass");
DSList.Rows.Add("refer", "refer");
}
private void InitGradeList()
{
GradeList = new DataTable();
GradeList.Columns.Add("Key");
GradeList.Columns.Add("Value");
GradeList.Rows.Add("极好", "Exc");
GradeList.Rows.Add("很好", "VG");
GradeList.Rows.Add("好", "G");
GradeList.Rows.Add("一般", "F");
GradeList.Rows.Add("差", "P");
}
private void InitView(AlgorithmResultEntity result)
{
string data = JsonConvert.SerializeObject(result);
ViewportData = new ViewportData(result.DiamondCode, data);
ViewportData.LoadData();
@ -96,6 +135,7 @@ public class GradingResultVM : BaseViewModel
}
CutLevelTotal = GetGradeName(totalCutGrade);
}
#endregion
/// <summary>
/// 参数列表测试内容获取
/// </summary>
@ -255,8 +295,9 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "TOTAL_DEPTH";
info.TestItemName = GetName("TOTAL_DEPTH");
info.Avg = Math.Floor(result.measurements.TOTAL_DEPTH*100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.TOTAL_DEPTH*1000)/100).ToString(digitsFormat);
info.CutLevel = calGrade_TOTAL_DEPTH(result.measurements.TOTAL_DEPTH * 100);
info.isEnabled = false;
return info;
}
@ -265,10 +306,11 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "TABLE";
info.TestItemName = GetName("TABLE");
info.Avg = Math.Floor(result.measurements.TABLE * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.TABLE_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.TABLE_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.TABLE * 1000) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.TABLE_MIN * 1000) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.TABLE_MAX * 1000) / 100).ToString(digitsFormat);
info.CutLevel = calGrade_TABLE(result.measurements.TABLE_MIN, result.measurements.TABLE_MAX);
info.isEnabled = false;
return info;
}
@ -290,11 +332,11 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "CROWN_HEIGHT";
info.TestItemName = GetName("CROWN_HEIGHT");
info.Avg = Math.Floor(result.measurements.CROWN_HEIGHT * 100).ToString(digitsFormat);
info.Dev = Math.Floor(result.measurements.CROWN_H_DEV * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.CROWN_H_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.CROWN_H_MAX * 100).ToString(digitsFormat);
info.CutLevel = calGrade_CROWN_HEIGHT(result.measurements.CROWN_H_MIN, result.measurements.CROWN_H_MAX);
info.Avg = (Math.Floor(result.measurements.CROWN_HEIGHT * 1000) / 100).ToString(digitsFormat);
info.Dev = (Math.Floor(result.measurements.CROWN_H_DEV * 1000) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.CROWN_H_MIN * 1000) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.CROWN_H_MAX * 1000) / 100).ToString(digitsFormat);
info.CutLevel = calGrade_CROWN_HEIGHT(result.measurements.CROWN_H_MIN * 100, result.measurements.CROWN_H_MAX * 100);
return info;
}
@ -303,10 +345,10 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "GIRDLE_BEZEL";
info.TestItemName = GetName("GIRDLE_BEZEL");
info.Avg = Math.Floor(result.measurements.GIRDLE_BEZEL * 100).ToString(digitsFormat);
info.Dev = Math.Floor(result.measurements.GIRDLE_BEZEL_DEV * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.GIRDLE_BEZEL_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.GIRDLE_BEZEL_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.GIRDLE_BEZEL * 1000) / 100).ToString(digitsFormat);
info.Dev = (Math.Floor(result.measurements.GIRDLE_BEZEL_DEV * 1000) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.GIRDLE_BEZEL_MIN * 1000) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.GIRDLE_BEZEL_MAX * 1000) / 100).ToString(digitsFormat);
return info;
}
@ -315,9 +357,10 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "GIRDLE_BONE";
info.TestItemName = GetName("GIRDLE_BONE");
info.Avg = Math.Floor(result.measurements.GIRDLE_BONE * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.GIRDLE_BONE_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.GIRDLE_BONE_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.GIRDLE_BONE * 1000) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.GIRDLE_BONE_MIN * 1000) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.GIRDLE_BONE_MAX * 1000) / 100).ToString(digitsFormat);
info.isEnabled = false;
return info;
}
@ -326,11 +369,11 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "GIRDLE";
info.TestItemName = GetName("GIRDLE");
info.Avg = Math.Floor(result.measurements.GIRDLE * 100).ToString(digitsFormat);
info.Dev = Math.Floor(result.measurements.GIRDLE_DEV * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.GIRDLE_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.GIRDLE_MAX * 100).ToString(digitsFormat);
info.CutLevel = calGrade_GIRDLE(result.measurements.GIRDLE_MIN, result.measurements.GIRDLE_MAX);
info.Avg = (Math.Floor(result.measurements.GIRDLE * 1000) / 100).ToString(digitsFormat);
info.Dev = (Math.Floor(result.measurements.GIRDLE_DEV * 1000) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.GIRDLE_MIN * 1000) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.GIRDLE_MAX * 1000) / 100).ToString(digitsFormat);
info.CutLevel = calGrade_GIRDLE(result.measurements.GIRDLE_MIN*100, result.measurements.GIRDLE_MAX * 100);
return info;
}
@ -343,7 +386,7 @@ public class GradingResultVM : BaseViewModel
info.Dev = result.measurements.PAV_ANGLE_DEV.ToString(digitsFormat);
info.Min = result.measurements.PAV_ANGLE_MIN.ToString(digitsFormat);
info.Max = result.measurements.PAV_ANGLE_MAX.ToString(digitsFormat);
info.CutLevel = calGrade_PAV_ANGLE(result.measurements.PAV_ANGLE_MIN, result.measurements.PAV_ANGLE_MAX);
info.CutLevel = calGrade_PAV_ANGLE(result.measurements.PAV_ANGLE_MIN, result.measurements.PAV_ANGLE_MAX * 100);
return info;
}
@ -352,11 +395,11 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "PAV_DEPTH";
info.TestItemName = GetName("PAV_DEPTH");
info.Avg = Math.Floor(result.measurements.PAV_DEPTH * 100).ToString(digitsFormat);
info.Dev = Math.Floor(result.measurements.PAV_DEPTH_DEV * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.PAV_DEPTH_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.PAV_DEPTH_MAX * 100).ToString(digitsFormat);
info.CutLevel = calGrade_PAV_DEPTH(result.measurements.PAV_DEPTH_MIN, result.measurements.PAV_DEPTH_MAX);
info.Avg = (Math.Floor(result.measurements.PAV_DEPTH * 1000) / 10).ToString(digitsFormat);
info.Dev = (Math.Floor(result.measurements.PAV_DEPTH_DEV * 1000) / 10).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.PAV_DEPTH_MIN * 1000) / 10).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.PAV_DEPTH_MAX * 1000) / 10).ToString(digitsFormat);
info.CutLevel = calGrade_PAV_DEPTH(result.measurements.PAV_DEPTH_MIN*100, result.measurements.PAV_DEPTH_MAX * 100);
return info;
}
@ -365,9 +408,10 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "STAR";
info.TestItemName = GetName("STAR");
info.Avg = Math.Floor(result.measurements.STAR * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.STAR_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.STAR_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.STAR * 1000) / 10).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.STAR_MIN * 1000) / 10).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.STAR_MAX * 1000) / 10).ToString(digitsFormat);
info.isEnabled = false;
return info;
}
@ -376,9 +420,10 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "LOWER_HALVES_RATIO";
info.TestItemName = GetName("LOWER_HALVES_RATIO");
info.Avg = Math.Floor(result.measurements.LOWER_HALVES_RATIO * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.LOWER_HALVES_RATIO_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.LOWER_HALVES_RATIO_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.LOWER_HALVES_RATIO * 1000) / 10).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.LOWER_HALVES_RATIO_MIN * 1000) / 10).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.LOWER_HALVES_RATIO_MAX * 1000) / 10).ToString(digitsFormat);
info.isEnabled = false;
return info;
}
@ -387,7 +432,8 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "CULET";
info.TestItemName = GetName("CULET");
info.Avg = Math.Floor(result.measurements.CULET * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.CULET * 1000) / 10).ToString(digitsFormat);
info.isEnabled = false;
return info;
}
@ -396,7 +442,7 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "TOC";
info.TestItemName = GetName("TOC");
info.Avg = Math.Floor(result.measurements.TOC * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.TOC * 1000) / 10).ToString(digitsFormat);
return info;
}
@ -405,7 +451,7 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "COC";
info.TestItemName = GetName("COC");
info.Avg = Math.Floor(result.measurements.COC * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.COC * 1000)/10).ToString(digitsFormat);
return info;
}
@ -414,10 +460,10 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "TWIST";
info.TestItemName = GetName("TWIST");
info.Avg = Math.Floor(result.measurements.TWIST * 100).ToString(digitsFormat);
info.Dev = Math.Floor(result.measurements.TWIST_DEV * 100).ToString(digitsFormat);
info.Min = Math.Floor(result.measurements.TWIST_MIN * 100).ToString(digitsFormat);
info.Max = Math.Floor(result.measurements.TWIST_MAX * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.TWIST*100)/100).ToString(digitsFormat);
info.Dev = (Math.Floor(result.measurements.TWIST_DEV * 100) / 100).ToString(digitsFormat);
info.Min = (Math.Floor(result.measurements.TWIST_MIN * 100) / 100).ToString(digitsFormat);
info.Max = (Math.Floor(result.measurements.TWIST_MAX * 100) / 100).ToString(digitsFormat);
return info;
}
@ -426,7 +472,7 @@ public class GradingResultVM : BaseViewModel
DataInfo info = new DataInfo();
info.TestItemId = "CULET_TO_TABLE";
info.TestItemName = GetName("CULET_TO_TABLE");
info.Avg = Math.Floor(result.measurements.CULET_TO_TABLE * 100).ToString(digitsFormat);
info.Avg = (Math.Floor(result.measurements.CULET_TO_TABLE * 1000)/10).ToString(digitsFormat);
return info;
}
#endregion
@ -444,16 +490,82 @@ public class GradingResultVM : BaseViewModel
{
return m*m;
}
public void SaveAs()
private void AutoSave()
{
if (string.IsNullOrEmpty(DiamondCode))
{
return;
}
else
{
string ts = DateTime.Now.ToString("yyyyMMddHHmmss");
string fullPath = Path.Combine(getFilePath(), ts + "_" + this.DiamondCode);
ExportFile(fullPath);
}
}
public void SaveFile(object param)
{
string filePath = "";
if (string.IsNullOrEmpty(DiamondCode))
{
SaveDialog startDialog = new SaveDialog();
bool? a = startDialog.ShowDialog();
if (startDialog.DiamondCode.Text.Length > 0)
{
this.DiamondCode = startDialog.DiamondCode.Text;
}
else
{
return;
}
}
string ts = DateTime.Now.ToString("yyyyMMddHHmmss");
string fullPath = Path.Combine(getFilePath(), ts+ "_" + this.DiamondCode);
ExportFile(fullPath);
}
private string getFilePath()
{
string defultFilePath = "D://DTest//";
if( File.Exists(defultFilePath)){
return defultFilePath;
}
else
{
Directory.CreateDirectory(defultFilePath);
return defultFilePath;
}
}
#region 文件导出相关
public void SaveAs(object param)
{
if (string.IsNullOrEmpty(DiamondCode))
{
SaveDialog startDialog = new SaveDialog();
bool? a = startDialog.ShowDialog();
if (startDialog.DiamondCode.Text.Length > 0)
{
this.DiamondCode = startDialog.DiamondCode.Text;
}
else
{
return;
}
}
using (var folderBrowserDlg = new FolderBrowserDialog())
{
DialogResult result = folderBrowserDlg.ShowDialog();
// 创建SaveFileDialog实例
SaveFileDialog saveFileDialog = new()
{
Filter = "所有文件 (*.*)|*.*", // 文件类型过滤器
FileName = this.DiamondCode // 默认文件名
};
if (result == DialogResult.OK)
// 显示对话框并检查结果
bool? result = saveFileDialog.ShowDialog();
if (result == true)
{
filePath = folderBrowserDlg.SelectedPath;
// 获取用户选择的文件路径
string filePath = saveFileDialog.FileName;
ExportFile(filePath);
}
}
@ -468,21 +580,126 @@ public class GradingResultVM : BaseViewModel
private void TxtFile(string filePath)
{
string fileName = filePath + ".txt";
using (var file = File.Create(fileName))
{
Measurements info = algorithmResult.measurements;
StreamWriter stream = new StreamWriter(file);
stream.WriteLine($"IGI REPORT NUMBER={DiamondCode}");
stream.WriteLine($"SARIN WEIGHT={Wight}");
stream.WriteLine($"M1={info.M1}");
stream.WriteLine($"M2={info.M2}");
stream.WriteLine($"M3={info.M3}");
stream.WriteLine($"TABLE={info.TABLE*100}");
stream.WriteLine($"TABLE MIN={info.TABLE_MIN * 100}");
stream.WriteLine($"TABLE MAX={info.TABLE_MAX * 100}");
stream.WriteLine($"CROWN HEIGHT={info.CROWN_HEIGHT * 100}");
stream.WriteLine($"CROWN H MIN={info.CROWN_H_MIN * 100}");
stream.WriteLine($"CROWN H MAX={info.CROWN_H_MAX * 100}");
stream.WriteLine($"CROWN ANGLE={info.CROWN_ANGLE}");
stream.WriteLine($"CROWN ANGLE MIN={info.CROWN_ANGLE_MIN}");
stream.WriteLine($"CROWN ANGLE MAX={info.CROWN_ANGLE_MAX}");
stream.WriteLine($"PAV DEPTH={info.PAV_DEPTH * 100}");
stream.WriteLine($"PAV DEPTH MIN={info.PAV_DEPTH_MIN * 100}");
stream.WriteLine($"PAV DEPTH MAX={info.PAV_DEPTH_MAX * 100}");
stream.WriteLine($"PAV ANGLE={info.PAV_ANGLE}");
stream.WriteLine($"PAV ANGLE MIN={info.PAV_ANGLE_MIN}");
stream.WriteLine($"PAV ANGLE MAX={info.PAV_ANGLE_MAX}");
stream.WriteLine($"GIRDLE={info.GIRDLE * 100}");
stream.WriteLine($"GIRDLE MIN={info.GIRDLE_MIN * 100}");
stream.WriteLine($"GIRDLE MAX={info.GIRDLE_MAX * 100}");
stream.WriteLine($"TOTAL DEPTH={info.TOTAL_DEPTH * 100}");
stream.WriteLine($"CULET={info.CULET*100}");
stream.WriteLine($"MACHINE={machine}");
stream.WriteLine($"CUTGRADE={GetGradeEnName(totalCutGrade)}");
stream.WriteLine($"LW RATIO={info.LW_RATIO}");
stream.WriteLine($"DS={DS}");
stream.WriteLine($"COC={info.COC * 100}");
stream.WriteLine($"USER={username}");
string TABLE_GRADE = DtResults.Where(x => "TABLE".Equals(x.TestItemId)).Select(x=>x.CutLevel).First()??"";
stream.WriteLine($"TABLE GRADE={GetGradeEnName(GetGradeOrder(TABLE_GRADE))}");
string CROWN_H_GRADE = DtResults.Where(x => "CROWN_HEIGHT".Equals(x.TestItemId)).Select(x => x.CutLevel).First() ?? "";
stream.WriteLine($"CROWN H GRADE={GetGradeEnName(GetGradeOrder(CROWN_H_GRADE))}");
string CROWN_ANGLE_GRADE = DtResults.Where(x => "CROWN_ANGLE".Equals(x.TestItemId)).Select(x => x.CutLevel).First() ?? "";
stream.WriteLine($"CROWN ANGLE GRADE={GetGradeEnName(GetGradeOrder(CROWN_ANGLE_GRADE))}");
string PAV_DEPTH_GRADE = DtResults.Where(x => "PAV_DEPTH".Equals(x.TestItemId)).Select(x => x.CutLevel).First() ?? "";
stream.WriteLine($"PAV DEPTH GRADE={GetGradeEnName(GetGradeOrder(PAV_DEPTH_GRADE))}");
string PAV_ANGLE_GRADE = DtResults.Where(x => "PAV_ANGLE".Equals(x.TestItemId)).Select(x => x.CutLevel).First() ?? "";
stream.WriteLine($"PAV ANGLE GRADE={GetGradeEnName(GetGradeOrder(PAV_ANGLE_GRADE))}");
string TD_GRADE = DtResults.Where(x => "TOTAL_DEPTH".Equals(x.TestItemId)).Select(x => x.CutLevel).First() ?? "";
stream.WriteLine($"TD GRADE={GetGradeEnName(GetGradeOrder(TD_GRADE))}");
stream.WriteLine($"TA={info.TA}");
stream.WriteLine($"LGF={info.LGF * 100}");
stream.WriteLine($"STAR={info.STAR * 100}");
}
}
private void ExcelFile(string filePath)
{
string fileName = filePath + ".xlsx";
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");
int col = 0;
int row = 0;
var dataRow = sheet.CreateRow(row);
dataRow.CreateCell(col++).SetCellValue("Measurement1");
dataRow.CreateCell(col++).SetCellValue("Measurement2");
dataRow.CreateCell(col++).SetCellValue("Measurement3");
dataRow.CreateCell(col++).SetCellValue("Table");
dataRow.CreateCell(col++).SetCellValue("Crown Height");
dataRow.CreateCell(col++).SetCellValue("Pavilion Depth");
dataRow.CreateCell(col++).SetCellValue("Total Depth");
dataRow.CreateCell(col++).SetCellValue("Crown Angle");
dataRow.CreateCell(col++).SetCellValue("Pavilion Angle");
dataRow.CreateCell(col++).SetCellValue("Culet Size");
dataRow.CreateCell(col++).SetCellValue("Girdle Percent");
dataRow.CreateCell(col++).SetCellValue("Girdle Name");
dataRow.CreateCell(col++).SetCellValue("POL or Pol/Sym");
dataRow.CreateCell(col++).SetCellValue("SYM");
dataRow.CreateCell(col++).SetCellValue("CUT-PROP");
row++;
col = 0;
dataRow = sheet.CreateRow(row);
Measurements info = algorithmResult.measurements;
dataRow.CreateCell(col++).SetCellValue($"{info.M1}(mm)");
dataRow.CreateCell(col++).SetCellValue($"{info.M2}(mm)");
dataRow.CreateCell(col++).SetCellValue($"{info.M3}(mm)");
dataRow.CreateCell(col++).SetCellValue($"{info.TABLE*100}%");
dataRow.CreateCell(col++).SetCellValue($"{info.CROWN_HEIGHT * 100}%");
dataRow.CreateCell(col++).SetCellValue($"{info.PAV_DEPTH * 100}%");
dataRow.CreateCell(col++).SetCellValue($"{info.TOTAL_DEPTH * 100}%");
dataRow.CreateCell(col++).SetCellValue($"{info.CROWN_ANGLE}°");
dataRow.CreateCell(col++).SetCellValue($"{info.PAV_ANGLE}°");
dataRow.CreateCell(col++).SetCellValue($"{info.CULET}(mm)");
dataRow.CreateCell(col++).SetCellValue($"{info.GIRDLE * 100}%");
dataRow.CreateCell(col++).SetCellValue($"{info.M1}");
dataRow.CreateCell(col++).SetCellValue($"");
string sysmlevel = "";
if (!string.IsNullOrEmpty(SymLevelTotal))
{
sysmlevel = GetGradeEnName(GetGradeOrder(SymLevelTotal ?? ""));
}
dataRow.CreateCell(col++).SetCellValue($"{sysmlevel}");
dataRow.CreateCell(col++).SetCellValue($"{GetGradeEnName(GetGradeOrder(CutLevelTotal))}");
// 保存Excel文件
using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
workbook.Write(stream);
}
}
private void DatFile(string filePath)
{
File.Create(filePath + ".dat").Close();
}
private void STLFile(string filePath)
{
File.Create(filePath + ".stl").Close();
}
#endregion
#region 各类名称取得
private string GetName(string id)
{
// TODO DB没关联
@ -504,6 +721,7 @@ public class GradingResultVM : BaseViewModel
dictionary.Add("COC", "底尖偏心比");
dictionary.Add("TWIST", "扭曲度");
dictionary.Add("CULET_TO_TABLE", "底尖到台面偏心比");
dictionary.Add("round", "圆形");
return dictionary[id];
}
private string GetGradeName(int order)
@ -517,6 +735,30 @@ public class GradingResultVM : BaseViewModel
dictionary.Add(5, "差");
return dictionary[order];
}
private int GetGradeOrder(string Grade)
{
// TODO DB没关联
Dictionary<string, int> dictionary = new();
dictionary.Add("极好", 1);
dictionary.Add("很好", 2);
dictionary.Add("好", 3);
dictionary.Add("一般", 4);
dictionary.Add("差", 5);
return dictionary[Grade];
}
private string GetGradeEnName(int order)
{
// TODO DB没关联
Dictionary<int, string> dictionary = new();
dictionary.Add(1, "EXCELLENT-Ideal");
dictionary.Add(2, "EXCELLENT");
dictionary.Add(3, "VERY GOOD");
dictionary.Add(4, "GOOD");
dictionary.Add(5, "FAIR-POOR");
return dictionary[order];
}
#endregion
/// <summary>
/// 修改对称性等级
/// </summary>
@ -526,6 +768,7 @@ public class GradingResultVM : BaseViewModel
int? order = this.DtResults.Select(x => x.SymLevel).Max();
if (order.HasValue)
{
totalSymGrade = order.Value;
SymLevelTotal = GetGradeName((int)order.Value);
}
else
@ -534,32 +777,6 @@ public class GradingResultVM : BaseViewModel
}
}
private void InitCombobox()
{
// DS下拉列表初始化
InitDSlist();
// 等级下拉列表初始化
InitGradeList();
}
private void InitDSlist()
{
DSList = new DataTable();
DSList.Columns.Add("Key");
DSList.Columns.Add("Value");
DSList.Rows.Add("pass", "pass");
DSList.Rows.Add("refer", "refer");
}
private void InitGradeList()
{
GradeList = new DataTable();
GradeList.Columns.Add("Key");
GradeList.Columns.Add("Value");
GradeList.Rows.Add("极好", "Exc");
GradeList.Rows.Add("很好", "VG");
GradeList.Rows.Add("好", "G");
GradeList.Rows.Add("一般", "F");
GradeList.Rows.Add("差", "P");
}
#region 钻石操作相关
//暂略
//部分代码(直接操作控件)需要在xaml.cs里边写
@ -596,6 +813,7 @@ public class DataInfo
}
}
}
public bool isEnabled { get; set; } = true;
private DataTable? _gradeList;
public DataTable GradeList {
get

@ -0,0 +1,85 @@
<Window x:Class="SparkClient.Views.Dialog.SaveDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SparkClient.Views.Dialog"
xmlns:hc="https://handyorg.github.io/handycontrol"
mc:Ignorable="d"
d:DesignHeight="222" d:DesignWidth="562"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
WindowStyle="None" AllowsTransparency="True" Background="Transparent">
<Border CornerRadius="15" Background="White" x:Name="Border" >
<Grid ClipToBounds="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<!-- 模拟顶部标题栏 -->
<Grid Grid.Row="0" Background="#795C2A" Height="40">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- 关闭按钮 -->
<Border Grid.Column="2"
Width="40" Height="30"
Margin=" 0 0 10 0"
HorizontalAlignment="Right" VerticalAlignment="Center"
Background="Transparent"
MouseEnter="Border_Close_MouseEnter"
MouseLeave="Border_MouseLeave">
<Button Background="Transparent" BorderBrush="Transparent" Click="Close_Click">
<Viewbox Stretch="Uniform">
<Path Data="{StaticResource CloseGeometry}"
Fill="Azure"
Stroke="Azure"
StrokeThickness="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="20 0 0 0"
Width="30" />
</Viewbox>
</Button>
</Border>
</Grid>
<StackPanel Grid.Row="1" VerticalAlignment="Center" >
<Grid Height="30" Margin="0 10 0 10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="5*" />
<ColumnDefinition Width="9*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Column="1" HorizontalAlignment="Center" Content="{DynamicResource UpdateDiamondCode}" Background="Transparent"
BorderBrush="Transparent"
FontSize="16" FontFamily="AlibabaPuHui-regular" />
<TextBox TextWrapping="Wrap" Name ="DiamondCode" Grid.Column="2" Text="{Binding InputText}" />
<TextBlock Text="{DynamicResource Please enter}" Grid.Column="2" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Text, ElementName=Id}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="2" Content="{DynamicResource ok}" HorizontalAlignment="Center" Click="Ok_Click" />
<Button Grid.Column="3" Content="{DynamicResource Cancel}" HorizontalAlignment="Center" Click="Close_Click" />
</Grid>
</StackPanel>
</Grid>
</Border>
</Window>

@ -0,0 +1,90 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SparkClient.Views.Dialog
{
/// <summary>
/// StartDialog.xaml 的交互逻辑
/// </summary>
public partial class SaveDialog
{
public SaveDialog()
{
WindowStartupLocation = WindowStartupLocation.CenterScreen;
InitializeComponent();
// 动态设置圆角裁剪
this.Loaded += (s, e) => ApplyCornerRadiusClip();
this.SizeChanged += (s, e) => ApplyCornerRadiusClip(); // 保证在大小改变时也裁剪
this.Width = 562;
this.Height = 222;
}
#region 重写窗体操作按钮
private void Border_Minimize_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 255, 255));
}
}
private void Border_Close_MouseEnter(object sender, MouseEventArgs e)
{
// 鼠标进入时更改背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Color.FromArgb(50, 255, 0, 0));
}
}
private void Border_MouseLeave(object sender, MouseEventArgs e)
{
// 鼠标离开时恢复背景色
if (sender is Border border)
{
border.Background = new SolidColorBrush(Colors.Transparent);
}
}
private void Minimize_Click(object sender, MouseButtonEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
try
{
this.DragMove();
}
catch (InvalidOperationException ex)
{
}
}
}
#endregion
private void Close_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Ok_Click(object sender, RoutedEventArgs e)
{
if(DiamondCode.Text.Trim().Length>0) { this.Close(); }
}
private void ApplyCornerRadiusClip()
{
// 使用矩形几何生成圆角裁剪
this.Border.Clip = new RectangleGeometry
{
Rect = new Rect(0, 0, this.Border.ActualWidth, this.Border.ActualHeight),
RadiusX = this.Border.CornerRadius.TopLeft, // 使用 Border 的 CornerRadius
RadiusY = this.Border.CornerRadius.TopLeft
};
}
}
}

@ -35,9 +35,9 @@
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
</Grid.RowDefinitions>
<Button Content="{DynamicResource SaveAs}" Foreground="#ffffff" Background="#A7896F" Width="70"/>
<Button Grid.Column="1" Content="{DynamicResource Export}" Foreground="#ffffff" Background="#A7896F" Width="70"/>
<Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="#6E6A6A">
<Button Content="{DynamicResource SaveAs}" Foreground="#ffffff" Background="#A7896F" Width="70" Command="{Binding SaveFileCommand}"/>
<Button Grid.Column="1" Content="{DynamicResource Export}" Foreground="#ffffff" Background="#A7896F" Width="70" Command="{Binding SaveAsCommand}"/>
<Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" BorderThickness="1" BorderBrush="#bbbbbb" Margin="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
@ -45,7 +45,7 @@
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="DS" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ComboBox Grid.Column="1" ItemsSource="{Binding DSList}"
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding DS, Mode=TwoWay}"/>
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding DS, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Border>
<Border Grid.Column="2" Grid.Row="0" Background="#E7E7E7" BorderBrush="#BBBBBB" CornerRadius="3" BorderThickness="1">
@ -120,6 +120,11 @@
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Margin" Value="0,0,0,0"/>
</Style>
</DataGrid.RowStyle>
<DataGrid.Resources>
<Style x:Key="CenteredTextBlockStyle" TargetType="TextBlock">
<Setter Property="TextAlignment" Value="Center"/>
@ -128,7 +133,15 @@
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Width="*" IsReadOnly="True" Header="" Binding="{Binding TestItemName}" ElementStyle="{StaticResource CenteredTextBlockStyle}"/>
<DataGridTextColumn Width="*" IsReadOnly="True" Header="" Binding="{Binding TestItemName}" ElementStyle="{StaticResource CenteredTextBlockStyle}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="#ededed"/>
<Setter Property="BorderThickness" Value="1,1,1,1"/>
<Setter Property="BorderBrush" Value="#BBBBBB"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" IsReadOnly="True" Header="{DynamicResource resAvg}" Binding="{Binding Avg}" ElementStyle="{StaticResource CenteredTextBlockStyle}"/>
<DataGridTextColumn Width="*" IsReadOnly="True" Header="{DynamicResource resDev}" Binding="{Binding Dev}" ElementStyle="{StaticResource CenteredTextBlockStyle}"/>
<DataGridTextColumn Width="*" IsReadOnly="True" Header="{DynamicResource resMin}" Binding="{Binding Min}" ElementStyle="{StaticResource CenteredTextBlockStyle}"/>
@ -137,7 +150,7 @@
<DataGridTemplateColumn Width="*" Header="{DynamicResource resLevel}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding GradeList}"
<ComboBox ItemsSource="{Binding GradeList}" IsEnabled="{Binding isEnabled}"
DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding SymLevel, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectionChanged="ChangSymLevel"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Loading…
Cancel
Save