Merge remote-tracking branch 'origin/master'

master
handefeng 4 months ago
commit 1aba94127d
  1. 5
      Language/en_US.xaml
  2. 5
      Language/zh_CN.xaml
  3. 10
      Model/Entity/JsonEntity.cs
  4. BIN
      Resource/Document/Helper.pdf
  5. BIN
      Resource/Document/Helper_en.pdf
  6. 4
      SparkClient.csproj
  7. 4
      SparkClient.sln.DotSettings.user
  8. BIN
      SparkDB.db
  9. 4
      ViewModel/Configuration/CutConfigVM.cs
  10. 7
      ViewModel/Configuration/LevelConfigVM.cs
  11. 6
      Views/Configuration/CutConfigPage.xaml
  12. 51
      Views/HelperPage.xaml.cs
  13. 6
      Views/UserControl/Viewport3D.xaml.cs
  14. 161
      Views/UserControl/ViewportData/Helper/ObjExporter.cs

@ -71,6 +71,11 @@
<!-- Grading Configuration Report -->
<sys:String x:Key="Demo2">Button</sys:String>
<!-- Cutter Configuration Report -->
<sys:String x:Key="CutConfigItemName">Item Name</sys:String>
<sys:String x:Key="CutConfigOperation">Operation</sys:String>
<sys:String x:Key="CutConfigDel">Del</sys:String>
<!-- Algorithm Configuration Report -->
<sys:String x:Key="Demo1">Button</sys:String>

@ -72,6 +72,11 @@
<!--定级配置 报表-->
<sys:String x:Key="Demo2">按钮</sys:String>
<!-- 切工仪配置画面 -->
<sys:String x:Key="CutConfigItemName">项目名称</sys:String>
<sys:String x:Key="CutConfigOperation">操作</sys:String>
<sys:String x:Key="CutConfigDel">删除</sys:String>
<!--算法配置 报表-->
<sys:String x:Key="Demo1">按钮</sys:String>
<!-- 系统配置 -->

@ -1,4 +1,5 @@
using System;
using SparkClient.ViewModel.Grading;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
@ -80,7 +81,7 @@ namespace EncryptFileTool.Entity
public string TEST_ITEM_ID { get; set; }
public string STANDARD_ID { get; set; }
public string STANDARD_NAME { get; set; }
public string STANDARD_EN_NAME { get; set; }
public string STANDARD_EN_NAME { get{ return getStandEnName(); } set { } }
public string STANDARD_MIN { get; set; }
public string STANDARD_MAX { get; set; }
public string IS_MIN_EXIST { get; set; } = "0";
@ -93,6 +94,11 @@ namespace EncryptFileTool.Entity
public string MIN_NULL_REPALCE { get; set; } = "←";
public string MAX_NULL_REPALCE { get; set; } = "→";
public int SORT { get; set; }
private string getStandEnName()
{
return Name.getNameById(TEST_ITEM_ID).Trim();
}
}
public class GradeConfigInfo
{

Binary file not shown.

Binary file not shown.

@ -29,6 +29,7 @@
<ItemGroup>
<None Remove="ffmpeg.exe" />
<None Remove="Resource\Document\Helper_en.pdf" />
<None Remove="Resource\Images\IGILogo.png" />
<None Remove="Resource\Images\round_P8-P8.png" />
<None Remove="Resource\Images\Setting%403x.png" />
@ -98,6 +99,9 @@
<Content Include="Resource\Document\Helper.pdf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Resource\Document\Helper_en.pdf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Remove="Resource\Other\Json-Mode-Default.xshd" />
<EmbeddedResource Include="Resource\Other\Json-Mode-Default.xshd" />
<None Remove="Resource\DimDemo.txt" />

@ -15,6 +15,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AColor_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc45597e5b7ab42d99b3882b94d97e64034a00_003Ffb_003F5b076364_003FColor_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AConfigurationManager_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4855f825db5f4f469faf36f45940559e106918_003Fff_003Fb357c8b2_003FConfigurationManager_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AContentControl_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F27bb3fae2c21cbe9a2565477feaa7a5b3a19cd779b4a91a98edfff9cd468972_003FContentControl_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACulturePreservingExecutionContext_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fbc9a074a2f204631bd77a8b9ba934b50226928_003Fd3_003Fb047e8cb_003FCulturePreservingExecutionContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADependencyObject_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F60b63c019ead4a238340b47a1c0010d5226910_003Fca_003F09e9dbc0_003FDependencyObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADispatcherOperation_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F60b63c019ead4a238340b47a1c0010d5226910_003Fd8_003F13c94a2a_003FDispatcherOperation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADispatcherOperation_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F60b63c019ead4a238340b47a1c0010d5226910_003Fd8_003F13c94a2a_003FDispatcherOperation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@ -28,6 +29,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventToCommand_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F436b6c3e323d68842c9e251322f5d42b47569f7c925e63aa245dc65465d2843_003FEventToCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventTriggerBase_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffdc001c928464b80ad45ffa09b838a3a15e200_003Faf_003F9abbeb44_003FEventTriggerBase_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8a03fcac5714437e83949a44ecf2e771c90920_003F6e_003F464f2557_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExecutionContext_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F35_003F053c62c1_003FExecutionContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileSystem_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F4c69bf2d25bb4f2497b2dbd14727a7811308b0_003F9b_003F7ca26691_003FFileSystem_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@ -68,6 +70,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcca5cfb955e146648d91eb22ffe4627a84930_003F7a_003F2d86be72_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fc7da56581ee7b20208f09e80b735961e4d5d7b9e5562bfdec94a75c57b391_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fcca5cfb955e146648d91eb22ffe4627a84930_003F7a_003F2d86be72_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fdad8a84eb59b44ebb2ed26202283a85984920_003F4b_003F3f166652_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F2c8e7ca976f350cba9836d5565dac56b11e0b56656fa786460eb1395857a6fa_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATriggerAction_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F95b2fd5cb826a0d61aff88f87b258644cfe6df15959e521eb9d6cc8da70dc52_003FTriggerAction_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUIElement_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F96a561fe76144633acef44f09d0dcb8a825920_003F3e_003Fdefca5b2_003FUIElement_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
@ -77,6 +80,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AUnwrapPromise_00601_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F211e6f3b24fa438a92f1815153647ce2c8f908_003F9d_003F0ea6b8e2_003FUnwrapPromise_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindowChromeWorker_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6412d4331611499aab4eb63809a2a83bf60910_003Ff9_003F2f1adeba_003FWindowChromeWorker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003AC_0021_003FUsers_003FAdministrator_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AXamlReader_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fc82ad29b96d5485f88fa4f2ce6e6c019f60908_003F0b_003Fbba3a168_003FXamlReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AXamlReader_002Ecs_002Fl_003AC_0021_003FUsers_003Ftongg_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F38ad98c9d60c1739a82dce92fa559af31b833496d8d3fba4a86361ff05bf017_003FXamlReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

Binary file not shown.

@ -167,11 +167,11 @@ public class CutConfigVM: BaseViewModel
}
if (insertCount>=0)
{
Growl.Info("保存成功");
Growl.Info(MultilingualHelper.getString("ViewportSaveSucceed"));
}
else
{
Growl.Error("保存失败");
Growl.Error(MultilingualHelper.getString("ViewportSaveFail"));
}
}
catch (Exception ex)

@ -368,19 +368,20 @@ public class LevelConfigVM : BaseViewModel
string ta = ruleId.Substring(ruleId.Length - 2);
// 国标场合 按照规则id中涵盖信息不同 对测试项目有不同描述
string itemName = Name.getNameById("TABLE").Trim();
if (ruleId.StartsWith("GB"))
{
if ("49".Equals(ta))
{
prefix = "[台宽比<" + ruleId.Substring(ruleId.Length - 2) + "] ";
prefix = $"[{itemName}<" + ruleId.Substring(ruleId.Length - 2) + "] ";
}
else if ("71".Equals(ta))
{
prefix = "[台宽比>" + ruleId.Substring(ruleId.Length - 2) + "] ";
prefix = $"[{itemName}>" + ruleId.Substring(ruleId.Length - 2) + "] ";
}
else
{
prefix = "[台宽比=" + ruleId.Substring(ruleId.Length - 2) + "] ";
prefix = $"[{itemName}=" + ruleId.Substring(ruleId.Length - 2) + "] ";
}
}
}

@ -101,7 +101,7 @@
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTemplateColumn Header="项目名称" Width="2*" >
<DataGridTemplateColumn Header="{StaticResource CutConfigItemName}" Width="2*" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ItemName}"
@ -150,10 +150,10 @@
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="操作" Width="*">
<DataGridTemplateColumn Header="{StaticResource CutConfigOperation}" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="删除" Style="{StaticResource ButtonDanger}" Command="{Binding DataContext.DelCutRowCommand,RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding}">
<Button Content="{StaticResource CutConfigDel}" Style="{StaticResource ButtonDanger}" Command="{Binding DataContext.DelCutRowCommand,RelativeSource={RelativeSource AncestorType=DataGrid}}" CommandParameter="{Binding}">
</Button>
</DataTemplate>

@ -1,21 +1,62 @@
using System.Windows;
using System.Windows.Controls;
using log4net;
using Microsoft.Web.WebView2.Core;
using SparkClient.Model.Helper;
using SparkClient.ViewModel.Configuration;
namespace SparkClient.Views;
public partial class HelperPage
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(HelperPage));
public HelperPage()
{
InitializeComponent();
PdfWebViewer.Source = new Uri(AppDomain.CurrentDomain.BaseDirectory + @"Resource\Document\Helper.pdf");
InitializeWebView();
}
private async void InitializeWebView()
{
try
{
string language = "";
if ("zh-cn".Equals(MultilingualHelper.getLangType()))
{
language = "zh-CN";
}
else
{
language = "en-US";
}
string userDataFolder = AppDomain.CurrentDomain.BaseDirectory + @"UserData\pdf_"+language;
// 设置语言
var environment = await CoreWebView2Environment.CreateAsync(
browserExecutableFolder: null, // 使用默认的WebView2运行时
userDataFolder: userDataFolder, // 使用默认的用户数据文件夹
options: new CoreWebView2EnvironmentOptions
{
Language = language // 设置语言
});
// 初始化WebView2控件
await PdfWebViewer.EnsureCoreWebView2Async(environment);
if ("zh-CN".Equals(language))
{
PdfWebViewer.Source = new Uri(AppDomain.CurrentDomain.BaseDirectory + @"Resource\Document\Helper.pdf");
}
else
{
PdfWebViewer.Source = new Uri(AppDomain.CurrentDomain.BaseDirectory + @"Resource\Document\Helper_en.pdf");
}
}
catch (Exception ex)
{
Logger.Error($"全局异常捕获:{ex.Message}", ex);
}
}
}

@ -17,6 +17,7 @@ using SharpDX.Direct3D11;
using SharpDX.DXGI;
using MathNet.Numerics;
using System.Windows.Media;
using ObjExporter = SparkClient.Views.UserControl.ViewportData.Helper.ObjExporter;
namespace SparkClient.Views.UserControl;
@ -46,7 +47,7 @@ public partial class Viewport3D
ViewportManager.LoadModelByEntities(new List<Viewport3DTriangleEntity>());
#if DEBUG
#else
BtnShow3DView.Visibility = Visibility.Hidden;
// BtnShow3DView.Visibility = Visibility.Hidden;
#endif
//选项初始化 显示-后端-管理类 一致
@ -218,7 +219,8 @@ public partial class Viewport3D
ViewportManager.DoubleClickSelect = !false;
break;
case "BtnShow3DView":
UnityHelper.GenerateRender(ViewportManager.ViewportTriangle.First().TriangleCode, "123");
ObjExporter.ExportToObj2(ViewportManager.ViewportTriangle, @"D:\id03.obj");
//UnityHelper.GenerateRender(ViewportManager.ViewportTriangle.First().TriangleCode, "123");
break;
}

@ -0,0 +1,161 @@
using System.IO;
using System.Text;
using SharpDX;
using SparkClient.Views.UserControl.ViewportData.Entity;
using SparkClient.Views.UserControl.ViewportData.Enum;
namespace SparkClient.Views.UserControl.ViewportData.Helper;
public class ObjExporter
{
public static void ExportToObj2(List<Viewport3DTriangleEntity> entities, string outputPath)
{
//分组
Dictionary<string, List<Viewport3DTriangleEntity>> feactList = entities
.Where(entity => entity.PlaneType != PlaneType.Girdle)
.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
//腰 单组
// List<Viewport3DTriangleEntity> waistList = entities
// .Where(entity => entity.PlaneType == PlaneType.Girdle)
// .ToList();
Dictionary<string, List<Viewport3DTriangleEntity>> gridleList = entities
.Where(entity => entity.PlaneType == PlaneType.Girdle)
.GroupBy(entity => entity.PlaneCode)
.ToDictionary(group => group.Key, group => group.ToList());
//同一个面只保留外边框(除了腰)
Dictionary<string, List<Vector3>> resultPoints = new Dictionary<string, List<Vector3>>();
foreach (var dic in feactList)
{
List<Vector3> tempPoints = new List<Vector3>();
foreach (var entity in dic.Value)
{
tempPoints.Add(entity.Point1);
tempPoints.Add(entity.Point2);
tempPoints.Add(entity.Point3);
}
resultPoints.Add(dic.Key, ViewportHelperPro.VectorClockwiseSort(new HashSet<Vector3>(tempPoints).ToList()));
}
foreach (var dic in gridleList)
{
List<Vector3> tempPoints = new List<Vector3>();
foreach (var entity in dic.Value)
{
tempPoints.Add(entity.Point1);
tempPoints.Add(entity.Point2);
tempPoints.Add(entity.Point3);
}
resultPoints.Add(dic.Key, ViewportHelperPro.VectorClockwiseSort(new HashSet<Vector3>(tempPoints).ToList()));
}
// List<Vector3> selFaceVector = new List<Vector3>();
// if (waistList.Count > 0)
// {
// foreach (var entity in waistList)
// {
// selFaceVector.Add(entity.Point1);
// selFaceVector.Add(entity.Point2);
// selFaceVector.Add(entity.Point3);
// }
// }
// resultPoints.Add("yao", selFaceVector);
StringBuilder sb = new StringBuilder();
// 顶点列表
List<Vector3> uniqueVertices = new List<Vector3>();
Dictionary<Vector3, int> vertexIndexMap = new Dictionary<Vector3, int>();
// 1. 对每个面生成顶点和面
foreach (var face in resultPoints)
{
// 对每个面,获取它的顶点列表
List<Vector3> faceVertices = face.Value;
// 去重顶点
foreach (var vertex in faceVertices)
{
if (!vertexIndexMap.ContainsKey(vertex))
{
vertexIndexMap[vertex] = uniqueVertices.Count;
uniqueVertices.Add(vertex);
}
}
}
// 2. 写入顶点数据
foreach (var vertex in uniqueVertices)
{
sb.AppendLine($"v {vertex.X} {vertex.Y} {vertex.Z}");
}
// 3. 写入每个面(f行),包括正面和反面
foreach (var face in resultPoints)
{
sb.AppendLine($"# Face: {face.Key}");
// 获取面上的所有顶点并排序
List<Vector3> faceVertices = face.Value;
if (!face.Key.StartsWith("11_"))
{
Vector3 center = GetCenterOfVertices(faceVertices);
faceVertices.Sort((v1, v2) => GetAngle(v1, center).CompareTo(GetAngle(v2, center)));
}
// 正面:按顺时针顺序输出
sb.Append("f");
foreach (var vertex in faceVertices)
{
sb.Append($" {vertexIndexMap[vertex] + 1}");
}
sb.AppendLine();
// 反面:按逆时针顺序输出(反转顶点顺序)
sb.Append("f");
for (int i = faceVertices.Count - 1; i >= 0; i--)
{
sb.Append($" {vertexIndexMap[faceVertices[i]] + 1}");
}
sb.AppendLine();
}
// 4. 写入文件
File.WriteAllText(outputPath, sb.ToString());
}
// 计算一组顶点的中心点(用于排序)
private static Vector3 GetCenterOfVertices(List<Vector3> vertices)
{
float centerX = 0, centerY = 0, centerZ = 0;
foreach (var vertex in vertices)
{
centerX += vertex.X;
centerY += vertex.Y;
centerZ += vertex.Z;
}
return new Vector3(centerX / vertices.Count, centerY / vertices.Count, centerZ / vertices.Count);
}
private static float GetAngle(Vector3 vertex, Vector3 center)
{
// 计算顶点与中心的方向向量
Vector3 direction = vertex - center;
// 在XY平面上计算角度
float angle = (float)Math.Atan2(direction.Y, direction.X); // 返回的是弧度,[-π, π]
// 如果你想要角度范围 [0, 2π],可以做如下处理
if (angle < 0)
{
angle += MathF.PI * 2;
}
return angle;
}
}
Loading…
Cancel
Save