Browse Source

modify: login + UI

main
gudae 1 month ago
parent
commit
f30f785c91
  1. BIN
      .vs/Housing/DesignTimeBuild/.dtbcache.v2
  2. 10
      Database.ini
  3. 6
      Hardware.ini
  4. 3
      Housing.csproj
  5. 30
      Housing.sln
  6. BIN
      Login.zip
  7. 177
      Login/StartupLoginWindow.xaml
  8. 212
      Login/StartupLoginWindow.xaml.cs
  9. 23
      LoginOptions.json
  10. 149
      MainWindow.xaml
  11. 327
      MainWindow.xaml.cs
  12. 4
      Models/HousingAssemblyRecord.cs
  13. 113
      Services/HousingAssemblyRepository.cs
  14. 174
      Services/LoginSelectionOptions.cs
  15. BIN
      Setup/Release (2).zip
  16. BIN
      Setup/Release (3).zip
  17. BIN
      Setup/Release.zip
  18. BIN
      Setup/Release/Setup.msi
  19. BIN
      Setup/Release/setup.exe
  20. 733
      Setup/Setup.vdproj
  21. BIN
      Setup0/Release/Setup0.msi
  22. BIN
      Setup0/Release/setup.exe
  23. 749
      Setup0/Setup0.vdproj
  24. BIN
      Setup1/Release/SETUP.CAB
  25. BIN
      Setup1/Release/Setup1.msi
  26. 41306
      Setup1/Setup1.vdproj
  27. 71
      Setup1/setup-build.log
  28. BIN
      Setup2/Release/Setup2.msi
  29. BIN
      Setup2/Release/setup.exe
  30. 723
      Setup2/Setup2.vdproj
  31. 274
      UpgradeLog.htm
  32. 274
      UpgradeLog2.htm
  33. 274
      UpgradeLog3.htm
  34. 40
      init.sql
  35. 575
      installer/HousingSetup.sed
  36. BIN
      installer/output/HousingSetup.exe
  37. BIN
      installer/staging/Accessibility.dll
  38. BIN
      installer/staging/Azure.Core.dll
  39. BIN
      installer/staging/Azure.Identity.dll
  40. BIN
      installer/staging/D3DCompiler_47_cor3.dll
  41. 13
      installer/staging/Database.ini
  42. BIN
      installer/staging/DirectWriteForwarder.dll
  43. 78
      installer/staging/Hardware.ini
  44. 1453
      installer/staging/Housing.deps.json
  45. BIN
      installer/staging/Housing.dll
  46. BIN
      installer/staging/Housing.exe
  47. BIN
      installer/staging/Housing.pdb
  48. 20
      installer/staging/Housing.runtimeconfig.json
  49. BIN
      installer/staging/Housing_voltage_current_icon.ico
  50. 5
      installer/staging/InspectionSettings.ini
  51. BIN
      installer/staging/Microsoft.Bcl.AsyncInterfaces.dll
  52. BIN
      installer/staging/Microsoft.Bcl.Cryptography.dll
  53. BIN
      installer/staging/Microsoft.CSharp.dll
  54. BIN
      installer/staging/Microsoft.Data.SqlClient.SNI.dll
  55. BIN
      installer/staging/Microsoft.Data.SqlClient.dll
  56. BIN
      installer/staging/Microsoft.DiaSymReader.Native.amd64.dll
  57. BIN
      installer/staging/Microsoft.Extensions.Caching.Abstractions.dll
  58. BIN
      installer/staging/Microsoft.Extensions.Caching.Memory.dll
  59. BIN
      installer/staging/Microsoft.Extensions.DependencyInjection.Abstractions.dll
  60. BIN
      installer/staging/Microsoft.Extensions.Logging.Abstractions.dll
  61. BIN
      installer/staging/Microsoft.Extensions.Options.dll
  62. BIN
      installer/staging/Microsoft.Extensions.Primitives.dll
  63. BIN
      installer/staging/Microsoft.Identity.Client.Extensions.Msal.dll
  64. BIN
      installer/staging/Microsoft.Identity.Client.dll
  65. BIN
      installer/staging/Microsoft.IdentityModel.Abstractions.dll
  66. BIN
      installer/staging/Microsoft.IdentityModel.JsonWebTokens.dll
  67. BIN
      installer/staging/Microsoft.IdentityModel.Logging.dll
  68. BIN
      installer/staging/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
  69. BIN
      installer/staging/Microsoft.IdentityModel.Protocols.dll
  70. BIN
      installer/staging/Microsoft.IdentityModel.Tokens.dll
  71. BIN
      installer/staging/Microsoft.SqlServer.Server.dll
  72. BIN
      installer/staging/Microsoft.VisualBasic.Core.dll
  73. BIN
      installer/staging/Microsoft.VisualBasic.dll
  74. BIN
      installer/staging/Microsoft.Win32.Primitives.dll
  75. BIN
      installer/staging/Microsoft.Win32.Registry.AccessControl.dll
  76. BIN
      installer/staging/Microsoft.Win32.Registry.dll
  77. BIN
      installer/staging/Microsoft.Win32.SystemEvents.dll
  78. BIN
      installer/staging/PenImc_cor3.dll
  79. BIN
      installer/staging/PresentationCore.dll
  80. BIN
      installer/staging/PresentationFramework-SystemCore.dll
  81. BIN
      installer/staging/PresentationFramework-SystemData.dll
  82. BIN
      installer/staging/PresentationFramework-SystemDrawing.dll
  83. BIN
      installer/staging/PresentationFramework-SystemXml.dll
  84. BIN
      installer/staging/PresentationFramework-SystemXmlLinq.dll
  85. BIN
      installer/staging/PresentationFramework.Aero.dll
  86. BIN
      installer/staging/PresentationFramework.Aero2.dll
  87. BIN
      installer/staging/PresentationFramework.AeroLite.dll
  88. BIN
      installer/staging/PresentationFramework.Classic.dll
  89. BIN
      installer/staging/PresentationFramework.Fluent.dll
  90. BIN
      installer/staging/PresentationFramework.Luna.dll
  91. BIN
      installer/staging/PresentationFramework.Royale.dll
  92. BIN
      installer/staging/PresentationFramework.dll
  93. BIN
      installer/staging/PresentationNative_cor3.dll
  94. BIN
      installer/staging/PresentationUI.dll
  95. BIN
      installer/staging/ReachFramework.dll
  96. BIN
      installer/staging/System.AppContext.dll
  97. BIN
      installer/staging/System.Buffers.dll
  98. BIN
      installer/staging/System.ClientModel.dll
  99. BIN
      installer/staging/System.CodeDom.dll
  100. BIN
      installer/staging/System.Collections.Concurrent.dll

BIN
.vs/Housing/DesignTimeBuild/.dtbcache.v2

Binary file not shown.

10
Database.ini

@ -1,8 +1,8 @@
[Database] [Database]
IP=127.0.0.1 IP=192.168.10.10,1433
Database=Housing Database=NE1aW_PT_Sensor
DbId=sa DbId=su_user
DbPw=your_password DbPw=amotech821
Encrypt=True Encrypt=True
TrustServerCertificate=True TrustServerCertificate=True
Timeout=5 Timeout=5
@ -10,4 +10,4 @@ Timeout=5
[Login] [Login]
Procedure=dbo.CheckOperator Procedure=dbo.CheckOperator
ProcessName=Housing ProcessName=Housing
OfflinePreview=true OfflinePreview=True

6
Hardware.ini

@ -25,7 +25,7 @@ RtsEnable=true
Enabled=true Enabled=true
Connection=Ni6501 Connection=Ni6501
PhysicalChannel=Dev1/port0/line0 PhysicalChannel=Dev1/port0/line0
ActiveState=High ActiveState=Low
PollIntervalMilliseconds=50 PollIntervalMilliseconds=50
TimeoutMilliseconds=30000 TimeoutMilliseconds=30000
PostSignalDelayMilliseconds=2000 PostSignalDelayMilliseconds=2000
@ -45,7 +45,7 @@ LogoutCommand=OUTP OFF, (@1);OUTP OFF, (@2)
VoltageConnection=LAN VoltageConnection=LAN
VoltageResource= VoltageResource=
VoltageIdnMatch=34465A VoltageIdnMatch=34465A
VoltageHost=192.168.200.3 VoltageHost=192.168.10.13
VoltagePort=5025 VoltagePort=5025
VoltageSetupCommand= VoltageSetupCommand=
VoltageReadCommand=MEAS:VOLT:DC? VoltageReadCommand=MEAS:VOLT:DC?
@ -55,7 +55,7 @@ CurrentConnection=LAN
CurrentResource= CurrentResource=
CurrentIdnMatch=E36233A CurrentIdnMatch=E36233A
; Change this to the E36233A LAN IP if the instrument uses a different address. ; Change this to the E36233A LAN IP if the instrument uses a different address.
CurrentHost=192.168.200.111 CurrentHost=192.168.10.12
CurrentPort=5025 CurrentPort=5025
CurrentPortName= CurrentPortName=
CurrentBaudRate=9600 CurrentBaudRate=9600

3
Housing.csproj

@ -26,6 +26,9 @@
<None Update="InspectionSettings.ini"> <None Update="InspectionSettings.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Update="LoginOptions.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="init.sql"> <None Update="init.sql">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>

30
Housing.sln

@ -5,7 +5,11 @@ VisualStudioVersion = 18.3.11520.95
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Housing", "Housing.csproj", "{7364A567-F115-4ACE-9207-C6FDEEF0A394}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Housing", "Housing.csproj", "{7364A567-F115-4ACE-9207-C6FDEEF0A394}"
EndProject EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup1", "Setup1\Setup1.vdproj", "{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}" Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup2", "Setup2\Setup2.vdproj", "{657E2043-FDBC-F1DC-4CD9-351906DA97D6}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup0", "Setup0\Setup0.vdproj", "{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup", "Setup\Setup.vdproj", "{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -29,12 +33,24 @@ Global
{7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x64.Build.0 = Release|Any CPU {7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x64.Build.0 = Release|Any CPU
{7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x86.ActiveCfg = Release|Any CPU {7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x86.ActiveCfg = Release|Any CPU
{7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x86.Build.0 = Release|Any CPU {7364A567-F115-4ACE-9207-C6FDEEF0A394}.Release|x86.Build.0 = Release|Any CPU
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Debug|Any CPU.ActiveCfg = Debug {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Debug|Any CPU.ActiveCfg = Debug
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Debug|x64.ActiveCfg = Debug {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Debug|x64.ActiveCfg = Debug
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Debug|x86.ActiveCfg = Debug {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Debug|x86.ActiveCfg = Debug
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Release|Any CPU.ActiveCfg = Release {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Release|Any CPU.ActiveCfg = Release
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Release|x64.ActiveCfg = Release {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Release|x64.ActiveCfg = Release
{F5D91FD6-F519-3AC5-2EF1-6ADD62B256F6}.Release|x86.ActiveCfg = Release {657E2043-FDBC-F1DC-4CD9-351906DA97D6}.Release|x86.ActiveCfg = Release
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Debug|Any CPU.ActiveCfg = Debug
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Debug|x64.ActiveCfg = Debug
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Debug|x86.ActiveCfg = Debug
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Release|Any CPU.ActiveCfg = Release
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Release|x64.ActiveCfg = Release
{D033B6A7-0F31-F7F9-F1EF-33C2D9A63ED1}.Release|x86.ActiveCfg = Release
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Debug|Any CPU.ActiveCfg = Debug
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Debug|x64.ActiveCfg = Debug
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Debug|x86.ActiveCfg = Debug
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Release|Any CPU.ActiveCfg = Release
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Release|x64.ActiveCfg = Release
{DBE9999D-346E-CA63-6964-F3B7FC1D42B4}.Release|x86.ActiveCfg = Release
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

BIN
Login.zip

Binary file not shown.

177
Login/StartupLoginWindow.xaml

@ -126,6 +126,159 @@
</Setter> </Setter>
</Style> </Style>
<Style x:Key="ComboInputItemStyle" TargetType="{x:Type ComboBoxItem}">
<Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/>
<Setter Property="Background" Value="{StaticResource HmiInputBrush}"/>
<Setter Property="FontSize" Value="17"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Padding" Value="10,8"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Border x:Name="ItemChrome"
Background="{TemplateBinding Background}"
BorderBrush="#263D4F"
BorderThickness="0,0,0,1"
Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsHighlighted" Value="True">
<Setter TargetName="ItemChrome" Property="Background" Value="{StaticResource HmiButtonHoverBrush}"/>
<Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="ItemChrome" Property="Background" Value="#163A4A"/>
<Setter Property="Foreground" Value="{StaticResource HmiAccentBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="ItemChrome" Property="Opacity" Value="0.55"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ComboInputStyle" TargetType="{x:Type ComboBox}">
<Setter Property="Height" Value="42"/>
<Setter Property="MinWidth" Value="0"/>
<Setter Property="Background" Value="{StaticResource HmiInputBrush}"/>
<Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/>
<Setter Property="BorderBrush" Value="#3F6178"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="FontSize" Value="19"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="8,0,34,0"/>
<Setter Property="IsTextSearchEnabled" Value="True"/>
<Setter Property="MaxDropDownHeight" Value="220"/>
<Setter Property="ItemContainerStyle" Value="{StaticResource ComboInputItemStyle}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBox}">
<Grid>
<Border x:Name="FieldChrome"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="3"
SnapsToDevicePixels="True">
<Grid>
<Rectangle Height="2"
VerticalAlignment="Top"
Fill="{StaticResource HmiAccentBrush}"
Opacity="0.42"/>
<ContentPresenter x:Name="ContentSite"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Content="{TemplateBinding SelectionBoxItem}"
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
RecognizesAccessKey="True"
IsHitTestVisible="False"/>
<ToggleButton x:Name="DropDownToggle"
Background="Transparent"
BorderThickness="0"
ClickMode="Press"
Focusable="False"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Background="Transparent">
<Path x:Name="Arrow"
Width="12"
Height="7"
Margin="0,0,12,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Data="M 0 0 L 6 7 L 12 0 Z"
Fill="{StaticResource HmiAccentBrush}"
Stretch="Fill"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Arrow" Property="Fill" Value="#76EAFF"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Arrow" Property="Fill" Value="{StaticResource HmiRunBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
</Grid>
</Border>
<Popup x:Name="PART_Popup"
AllowsTransparency="True"
Focusable="False"
IsOpen="{TemplateBinding IsDropDownOpen}"
Placement="Bottom"
PopupAnimation="Slide">
<Border Width="{Binding ActualWidth, RelativeSource={RelativeSource TemplatedParent}}"
MaxHeight="{TemplateBinding MaxDropDownHeight}"
Background="#07111C"
BorderBrush="{StaticResource HmiAccentBrush}"
BorderThickness="1">
<ScrollViewer MaxHeight="{TemplateBinding MaxDropDownHeight}"
SnapsToDevicePixels="True"
VerticalScrollBarVisibility="Auto">
<ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained"/>
</ScrollViewer>
</Border>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="FieldChrome" Property="BorderBrush" Value="#76EAFF"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter TargetName="FieldChrome" Property="BorderBrush" Value="{StaticResource HmiAccentBrush}"/>
<Setter TargetName="FieldChrome" Property="BorderThickness" Value="2"/>
</Trigger>
<Trigger Property="IsDropDownOpen" Value="True">
<Setter TargetName="FieldChrome" Property="BorderBrush" Value="{StaticResource HmiRunBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="FieldChrome" Property="Opacity" Value="0.55"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="CommandButtonStyle" TargetType="Button"> <Style x:Key="CommandButtonStyle" TargetType="Button">
<Setter Property="Height" Value="58"/> <Setter Property="Height" Value="58"/>
<Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/> <Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/>
@ -349,9 +502,9 @@
<TextBlock Text="Maker" <TextBlock Text="Maker"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="MakerTextBox" <ComboBox x:Name="MakerComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
@ -366,9 +519,9 @@
<TextBlock Text="Model" <TextBlock Text="Model"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="ModelTextBox" <ComboBox x:Name="ModelComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
@ -383,9 +536,9 @@
<TextBlock Text="Variant 1" <TextBlock Text="Variant 1"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="Variant1TextBox" <ComboBox x:Name="Variant1ComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
@ -400,9 +553,9 @@
<TextBlock Text="Variant 2" <TextBlock Text="Variant 2"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="Variant2TextBox" <ComboBox x:Name="Variant2ComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>
@ -474,9 +627,9 @@
<TextBlock Text="Line" <TextBlock Text="Line"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="LineNoTextBox" <ComboBox x:Name="LineNoComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
@ -506,9 +659,9 @@
<TextBlock Text="Jig No" <TextBlock Text="Jig No"
Style="{StaticResource FieldLabelStyle}"/> Style="{StaticResource FieldLabelStyle}"/>
<TextBox x:Name="JigNoTextBox" <ComboBox x:Name="JigNoComboBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource InputStyle}"/> Style="{StaticResource ComboInputStyle}"/>
</Grid> </Grid>
</Border> </Border>
</Grid> </Grid>

212
Login/StartupLoginWindow.xaml.cs

@ -25,6 +25,7 @@ public partial class StartupLoginWindow : Window
private const string OperatorHistoryFieldName = "Operator"; private const string OperatorHistoryFieldName = "Operator";
private const string SuppressedOperatorHistoryValue = "su"; private const string SuppressedOperatorHistoryValue = "su";
private readonly LoginHistoryStore _loginHistoryStore; private readonly LoginHistoryStore _loginHistoryStore;
private readonly LoginSelectionOptions _loginOptions;
private Popup? _openHistoryPopup; private Popup? _openHistoryPopup;
public StartupLoginWindowResult Result { get; private set; } = new(); public StartupLoginWindowResult Result { get; private set; } = new();
@ -32,12 +33,15 @@ public partial class StartupLoginWindow : Window
public StartupLoginWindow() public StartupLoginWindow()
{ {
_loginHistoryStore = LoginHistoryStore.Load(GetLoginHistoryPath()); _loginHistoryStore = LoginHistoryStore.Load(GetLoginHistoryPath());
_loginOptions = LoginSelectionOptions.Load(GetLoginOptionsPath());
RemoveSuppressedOperatorHistory(); RemoveSuppressedOperatorHistory();
InitializeComponent(); InitializeComponent();
ApplyLoginOptions();
AttachLoginHistoryMenus(); AttachLoginHistoryMenus();
AttachSelectionDropDowns();
PasswordBox.GotKeyboardFocus += (_, _) => CloseHistoryPopup(); PasswordBox.GotKeyboardFocus += (_, _) => CloseHistoryPopup();
LoginButton.GotKeyboardFocus += (_, _) => CloseHistoryPopup(); LoginButton.GotKeyboardFocus += (_, _) => CloseHistoryPopup();
OperatorTextBox.Focus(); MakerComboBox.Focus();
} }
private async void LogInButton_Click(object sender, RoutedEventArgs e) private async void LogInButton_Click(object sender, RoutedEventArgs e)
@ -56,23 +60,9 @@ public partial class StartupLoginWindow : Window
try try
{ {
var loginSettings = LoginSettings.Load(GetDatabaseIniPath()); if (!await IsValidLoginAsync(loginResult.Operator, password))
if (loginSettings.OfflinePreview)
{
Result = loginResult;
SaveLoginHistory(loginResult);
DialogResult = true;
Close();
return;
}
var repository = new LoginAccountRepository(
DatabaseSettings.Load(GetDatabaseIniPath()),
loginSettings);
if (!await repository.ExistsAsync(loginResult.Operator, password))
{ {
MessageBox.Show(this, "DB에 등록된 ID/PW가 아닙니다.", "Login", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(this, "등록되지 않은 ID/PW입니다.", "Login", MessageBoxButton.OK, MessageBoxImage.Error);
PasswordBox.Clear(); PasswordBox.Clear();
PasswordBox.Focus(); PasswordBox.Focus();
return; return;
@ -85,7 +75,7 @@ public partial class StartupLoginWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, $"로그인 DB 확인 실패: {ex.Message}", "Login", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(this, $"로그인 확인 실패: {ex.Message}", "Login", MessageBoxButton.OK, MessageBoxImage.Error);
OperatorTextBox.Focus(); OperatorTextBox.Focus();
OperatorTextBox.SelectAll(); OperatorTextBox.SelectAll();
} }
@ -98,24 +88,47 @@ public partial class StartupLoginWindow : Window
} }
} }
private async Task<bool> IsValidLoginAsync(string loginId, string password)
{
if (_loginOptions.LoginAccounts.Count > 0)
{
return _loginOptions.LoginAccounts.Any(account =>
string.Equals(account.Id, loginId, StringComparison.OrdinalIgnoreCase) &&
string.Equals(account.Password, password, StringComparison.Ordinal));
}
var loginSettings = LoginSettings.Load(GetDatabaseIniPath());
if (loginSettings.OfflinePreview)
{
return true;
}
var repository = new LoginAccountRepository(
DatabaseSettings.Load(GetDatabaseIniPath()),
loginSettings);
return await repository.ExistsAsync(loginId, password);
}
private bool TryReadRequiredFields(out StartupLoginWindowResult result, out string password) private bool TryReadRequiredFields(out StartupLoginWindowResult result, out string password)
{ {
result = new StartupLoginWindowResult(); result = new StartupLoginWindowResult();
password = string.Empty; password = string.Empty;
if (!TryReadTextBox(MakerTextBox, "Maker", out var maker) || if (!TryReadRequiredComboBox(MakerComboBox, "Maker", out var maker) ||
!TryReadTextBox(ModelTextBox, "Model", out var model) || !TryReadRequiredComboBox(ModelComboBox, "Model", out var model) ||
!TryReadTextBox(Variant1TextBox, "Variant 1", out var variant1) ||
!TryReadTextBox(Variant2TextBox, "Variant 2", out var variant2) ||
!TryReadTextBox(OperatorTextBox, "ID", out var loginId) || !TryReadTextBox(OperatorTextBox, "ID", out var loginId) ||
!TryReadPasswordBox(PasswordBox, "PW", out password) || !TryReadPasswordBox(PasswordBox, "PW", out password) ||
!TryReadTextBox(LineNoTextBox, "Line", out var lineNo) || !TryReadRequiredComboBox(LineNoComboBox, "Line", out var lineNo) ||
!TryReadTextBox(LotNoTextBox, "Lot No", out var lotNo) || !TryReadTextBox(LotNoTextBox, "Lot No", out var lotNo) ||
!TryReadTextBox(JigNoTextBox, "Jig No", out var jigNo)) !TryReadRequiredComboBox(JigNoComboBox, "Jig No", out var jigNo))
{ {
return false; return false;
} }
var variant1 = ReadOptionalComboBox(Variant1ComboBox);
var variant2 = ReadOptionalComboBox(Variant2ComboBox);
result = new StartupLoginWindowResult result = new StartupLoginWindowResult
{ {
Maker = maker, Maker = maker,
@ -131,16 +144,94 @@ public partial class StartupLoginWindow : Window
return true; return true;
} }
private void ApplyLoginOptions()
{
SetComboBoxOptions(MakerComboBox, _loginOptions.Makers, allowBlank: false, historyFieldName: "Maker");
SetComboBoxOptions(ModelComboBox, _loginOptions.Models, allowBlank: false, historyFieldName: "Model");
SetComboBoxOptions(Variant1ComboBox, _loginOptions.Variant1Values, allowBlank: true, historyFieldName: "Variant1");
SetComboBoxOptions(Variant2ComboBox, _loginOptions.Variant2Values, allowBlank: true, historyFieldName: "Variant2");
SetComboBoxOptions(LineNoComboBox, _loginOptions.LineValues, allowBlank: false, historyFieldName: "LineNo");
SetComboBoxOptions(JigNoComboBox, _loginOptions.JigNoValues, allowBlank: false, historyFieldName: "JigNo");
}
private void SetComboBoxOptions(
ComboBox comboBox,
IReadOnlyList<string> values,
bool allowBlank,
string historyFieldName)
{
var items = new List<LoginOptionItem>();
if (allowBlank)
{
items.Add(new LoginOptionItem("(None)", string.Empty));
}
foreach (var value in values.Where(value => !string.IsNullOrWhiteSpace(value)))
{
if (items.Any(item => string.Equals(item.Value, value, StringComparison.OrdinalIgnoreCase)))
{
continue;
}
items.Add(new LoginOptionItem(value, value));
}
comboBox.ItemsSource = items;
comboBox.DisplayMemberPath = nameof(LoginOptionItem.DisplayText);
var rememberedValue = _loginHistoryStore.GetValues(historyFieldName).FirstOrDefault();
if (!string.IsNullOrWhiteSpace(rememberedValue) &&
TrySelectComboBoxValue(comboBox, rememberedValue))
{
return;
}
if (allowBlank)
{
comboBox.SelectedIndex = 0;
}
else if (items.Count == 1)
{
comboBox.SelectedIndex = 0;
}
}
private static bool TrySelectComboBoxValue(ComboBox comboBox, string value)
{
for (var index = 0; index < comboBox.Items.Count; index++)
{
if (comboBox.Items[index] is LoginOptionItem item &&
string.Equals(item.Value, value, StringComparison.OrdinalIgnoreCase))
{
comboBox.SelectedIndex = index;
return true;
}
}
return false;
}
private void AttachSelectionDropDowns()
{
foreach (var comboBox in new[]
{
MakerComboBox,
ModelComboBox,
Variant1ComboBox,
Variant2ComboBox,
LineNoComboBox,
JigNoComboBox
})
{
comboBox.GotKeyboardFocus += (_, _) => CloseHistoryPopup();
comboBox.DropDownOpened += (_, _) => CloseHistoryPopup();
}
}
private void AttachLoginHistoryMenus() private void AttachLoginHistoryMenus()
{ {
AttachHistoryMenu(MakerTextBox, "Maker", ModelTextBox);
AttachHistoryMenu(ModelTextBox, "Model", Variant1TextBox);
AttachHistoryMenu(Variant1TextBox, "Variant1", Variant2TextBox);
AttachHistoryMenu(Variant2TextBox, "Variant2", OperatorTextBox);
AttachHistoryMenu(OperatorTextBox, OperatorHistoryFieldName, PasswordBox); AttachHistoryMenu(OperatorTextBox, OperatorHistoryFieldName, PasswordBox);
AttachHistoryMenu(LineNoTextBox, "LineNo", LotNoTextBox); AttachHistoryMenu(LotNoTextBox, "LotNo", JigNoComboBox);
AttachHistoryMenu(LotNoTextBox, "LotNo", JigNoTextBox);
AttachHistoryMenu(JigNoTextBox, "JigNo", LoginButton);
} }
private void AttachHistoryMenu(TextBox textBox, string fieldName, Control nextFocusControl) private void AttachHistoryMenu(TextBox textBox, string fieldName, Control nextFocusControl)
@ -289,6 +380,37 @@ public partial class StartupLoginWindow : Window
return string.Equals(value.Trim(), SuppressedOperatorHistoryValue, StringComparison.OrdinalIgnoreCase); return string.Equals(value.Trim(), SuppressedOperatorHistoryValue, StringComparison.OrdinalIgnoreCase);
} }
private bool TryReadRequiredComboBox(ComboBox comboBox, string fieldName, out string value)
{
value = ReadComboBoxValue(comboBox);
if (!string.IsNullOrWhiteSpace(value))
{
return true;
}
MessageBox.Show(
this,
$"{fieldName} value is required. Edit LoginOptions.json and select a value.",
"Login",
MessageBoxButton.OK,
MessageBoxImage.Warning);
comboBox.Focus();
comboBox.IsDropDownOpen = true;
return false;
}
private static string ReadOptionalComboBox(ComboBox comboBox)
{
return ReadComboBoxValue(comboBox);
}
private static string ReadComboBoxValue(ComboBox comboBox)
{
return comboBox.SelectedItem is LoginOptionItem item
? item.Value.Trim()
: comboBox.Text.Trim();
}
private bool TryReadTextBox(TextBox textBox, string fieldName, out string value) private bool TryReadTextBox(TextBox textBox, string fieldName, out string value)
{ {
value = textBox.Text.Trim(); value = textBox.Text.Trim();
@ -322,6 +444,32 @@ public partial class StartupLoginWindow : Window
return Path.Combine(AppContext.BaseDirectory, "Database.ini"); return Path.Combine(AppContext.BaseDirectory, "Database.ini");
} }
private static string GetLoginOptionsPath()
{
var directory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"Housing");
var filePath = Path.Combine(directory, "LoginOptions.json");
if (File.Exists(filePath))
{
return filePath;
}
Directory.CreateDirectory(directory);
var bundledPath = Path.Combine(AppContext.BaseDirectory, "LoginOptions.json");
if (File.Exists(bundledPath))
{
File.Copy(bundledPath, filePath);
}
else
{
LoginSelectionOptions.CreateDefaultFile(filePath);
}
return filePath;
}
private static string GetLoginHistoryPath() private static string GetLoginHistoryPath()
{ {
return Path.Combine( return Path.Combine(
@ -329,4 +477,6 @@ public partial class StartupLoginWindow : Window
"Housing", "Housing",
"LoginHistory.json"); "LoginHistory.json");
} }
private sealed record LoginOptionItem(string DisplayText, string Value);
} }

23
LoginOptions.json

@ -0,0 +1,23 @@
{
"loginAccounts": [
{
"id": "su",
"password": "su"
}
],
"makers": [
"AMO",
"ABC"
],
"models": [
"MODEL-1"
],
"variant1Values": [],
"variant2Values": [],
"lineValues": [
"LINE-1"
],
"jigNoValues": [
"JIG-1"
]
}

149
MainWindow.xaml

@ -13,6 +13,9 @@
UseLayoutRounding="True" UseLayoutRounding="True"
SnapsToDevicePixels="True"> SnapsToDevicePixels="True">
<Window.Resources> <Window.Resources>
<SolidColorBrush x:Key="ProcessStepInactiveBrush" Color="#244253"/>
<SolidColorBrush x:Key="ProcessStepActiveBackgroundBrush" Color="#0D2632"/>
<Style x:Key="LabelStyle" TargetType="TextBlock"> <Style x:Key="LabelStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/> <Setter Property="Foreground" Value="{StaticResource HmiTextBrush}"/>
<Setter Property="FontSize" Value="18"/> <Setter Property="FontSize" Value="18"/>
@ -239,6 +242,26 @@
<Setter Property="FontWeight" Value="SemiBold"/> <Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
</Style> </Style>
<Style x:Key="ProcessStepFrameStyle" TargetType="Border">
<Setter Property="Height" Value="26"/>
<Setter Property="MinWidth" Value="74"/>
<Setter Property="Background" Value="#0B161F"/>
<Setter Property="BorderBrush" Value="{StaticResource ProcessStepInactiveBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="9,0"/>
<Setter Property="Margin" Value="0,0,6,0"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="ProcessStepTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource HmiMutedTextBrush}"/>
<Setter Property="FontSize" Value="11"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
</Style>
</Window.Resources> </Window.Resources>
<ScrollViewer VerticalScrollBarVisibility="Auto" <ScrollViewer VerticalScrollBarVisibility="Auto"
@ -330,28 +353,92 @@
<Border Grid.Row="1" <Border Grid.Row="1"
Background="#081019" Background="#081019"
Padding="18,8"> Padding="18,8">
<Grid> <ScrollViewer HorizontalScrollBarVisibility="Auto"
<Grid.ColumnDefinitions> VerticalScrollBarVisibility="Disabled">
<ColumnDefinition Width="Auto"/> <StackPanel Orientation="Horizontal"
<ColumnDefinition Width="24"/> VerticalAlignment="Center">
<ColumnDefinition Width="Auto"/> <TextBlock Text="PROCESS"
<ColumnDefinition Width="24"/> Foreground="{StaticResource HmiMutedTextBrush}"
<ColumnDefinition Width="Auto"/> FontSize="11"
<ColumnDefinition Width="*"/> FontWeight="Bold"
</Grid.ColumnDefinitions> Margin="0,0,10,0"
<StackPanel Orientation="Horizontal"> VerticalAlignment="Center"/>
<Ellipse Width="10" Height="10" Fill="{StaticResource HmiRunBrush}" Margin="0,0,8,0"/> <TextBlock x:Name="CurrentProcessTextBlock"
<TextBlock Text="PLC LINK" Style="{StaticResource SmallStatusTextStyle}"/> Text="WAITING BARCODE"
</StackPanel> Foreground="{StaticResource HmiAccentBrush}"
<StackPanel Grid.Column="2" Orientation="Horizontal"> FontSize="11"
<Ellipse Width="10" Height="10" Fill="{StaticResource HmiAccentBrush}" Margin="0,0,8,0"/> FontWeight="Bold"
<TextBlock Text="SCAN READY" Style="{StaticResource SmallStatusTextStyle}"/> Margin="0,0,12,0"
</StackPanel> VerticalAlignment="Center"
<StackPanel Grid.Column="4" Orientation="Horizontal"> TextTrimming="CharacterEllipsis"/>
<Ellipse Width="10" Height="10" Fill="{StaticResource HmiWarningBrush}" Margin="0,0,8,0"/>
<TextBlock Text="DB STANDBY" Style="{StaticResource SmallStatusTextStyle}"/> <Border x:Name="ProcessStepBarcodeBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="BARCODE" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepStartBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="START" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepBoardBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="BOARD" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepIcSnBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="IC_SN" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepMeasureBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="MEASURE" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepDbBorder"
Style="{StaticResource ProcessStepFrameStyle}">
<TextBlock Text="DB SAVE" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
<TextBlock Text="&gt;"
Foreground="{StaticResource HmiAccentBrush}"
FontSize="13"
FontWeight="Bold"
Margin="0,0,6,0"
VerticalAlignment="Center"/>
<Border x:Name="ProcessStepResultBorder"
Style="{StaticResource ProcessStepFrameStyle}"
Margin="0">
<TextBlock Text="RESULT" Style="{StaticResource ProcessStepTextStyle}"/>
</Border>
</StackPanel> </StackPanel>
</Grid> </ScrollViewer>
</Border> </Border>
</Grid> </Grid>
</Border> </Border>
@ -446,11 +533,11 @@
<Grid Grid.Row="1" Margin="18"> <Grid Grid.Row="1" Margin="18">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="1*"/>
<ColumnDefinition Width="18"/> <ColumnDefinition Width="14"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="1.08*"/>
<ColumnDefinition Width="18"/> <ColumnDefinition Width="14"/>
<ColumnDefinition Width="1.15*"/> <ColumnDefinition Width="1.27*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Border Grid.Column="0" Style="{StaticResource FieldPanelStyle}"> <Border Grid.Column="0" Style="{StaticResource FieldPanelStyle}">
@ -464,7 +551,9 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="PT_VOL_1 / V OUTPUT" Style="{StaticResource LabelStyle}"/> <TextBlock Text="V OUTPUT"
Style="{StaticResource LabelStyle}"
TextWrapping="NoWrap"/>
<StackPanel Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBox x:Name="VMinTextBox" Style="{StaticResource RangeBoxStyle}"/> <TextBox x:Name="VMinTextBox" Style="{StaticResource RangeBoxStyle}"/>
<TextBlock Text="~" <TextBlock Text="~"
@ -494,7 +583,9 @@
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="PT_CURRENT_1 / mA OUTPUT" Style="{StaticResource LabelStyle}"/> <TextBlock Text="mA OUTPUT"
Style="{StaticResource LabelStyle}"
TextWrapping="NoWrap"/>
<StackPanel Grid.Column="1" Orientation="Horizontal"> <StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBox x:Name="AMinTextBox" Style="{StaticResource RangeBoxStyle}"/> <TextBox x:Name="AMinTextBox" Style="{StaticResource RangeBoxStyle}"/>
<TextBlock Text="~" <TextBlock Text="~"
@ -519,7 +610,7 @@
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="RESULT / INSPECTION LOG" Style="{StaticResource LabelStyle}"/> <TextBlock Text="RESULT" Style="{StaticResource LabelStyle}"/>
<TextBox x:Name="ResultOutputTextBox" <TextBox x:Name="ResultOutputTextBox"
Grid.Row="1" Grid.Row="1"
Style="{StaticResource OutputBoxStyle}" Style="{StaticResource OutputBoxStyle}"

327
MainWindow.xaml.cs

@ -5,6 +5,7 @@ using System.Text.RegularExpressions;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
using Housing.Login; using Housing.Login;
using Housing.Models; using Housing.Models;
@ -19,6 +20,8 @@ public partial class MainWindow : Window
private const string BarcodeInvalidMessage = "스캔 형식이 올바르지 않습니다. PCBA S/N 바코드를 스캔해주세요."; private const string BarcodeInvalidMessage = "스캔 형식이 올바르지 않습니다. PCBA S/N 바코드를 스캔해주세요.";
private const string DefaultOutputValue = "0.00"; private const string DefaultOutputValue = "0.00";
private const int ScannerInputMinimumLength = 4; private const int ScannerInputMinimumLength = 4;
private const double ResultStatusFontSize = 22;
private const double InspectionResultFontSize = 96;
private const decimal MilliampsPerAmp = 1000m; private const decimal MilliampsPerAmp = 1000m;
private static readonly TimeSpan ScannerInputMaxGap = TimeSpan.FromMilliseconds(80); private static readonly TimeSpan ScannerInputMaxGap = TimeSpan.FromMilliseconds(80);
private static readonly TimeSpan ScannerInputIdleCommitDelay = TimeSpan.FromMilliseconds(250); private static readonly TimeSpan ScannerInputIdleCommitDelay = TimeSpan.FromMilliseconds(250);
@ -32,6 +35,18 @@ public partial class MainWindow : Window
private InspectionJudgementSettings _inspectionSettings; private InspectionJudgementSettings _inspectionSettings;
private bool _isStartupLoginShown; private bool _isStartupLoginShown;
private bool _isBoardTestRunning; private bool _isBoardTestRunning;
private bool _suppressBarcodeStatusUpdate;
private enum ProcessStep
{
Barcode,
Start,
Board,
IcSn,
Measure,
Db,
Result
}
public MainWindow() public MainWindow()
{ {
@ -74,14 +89,21 @@ public partial class MainWindow : Window
private void BarcodeTextBox_TextChanged(object sender, TextChangedEventArgs e) private void BarcodeTextBox_TextChanged(object sender, TextChangedEventArgs e)
{ {
if (_suppressBarcodeStatusUpdate)
{
return;
}
if (string.IsNullOrWhiteSpace(BarcodeTextBox.Text)) if (string.IsNullOrWhiteSpace(BarcodeTextBox.Text))
{ {
IcSnOutputTextBox.Clear(); IcSnOutputTextBox.Clear();
ResultOutputTextBox.Text = BarcodeRequiredMessage; SetProcessStatus("WAITING BARCODE", "HmiAccentBrush");
ShowResultStatusMessage(BarcodeRequiredMessage);
return; return;
} }
ResultOutputTextBox.Text = BoardReadyMessage; SetProcessStatus("BARCODE SCANNED", "HmiRunBrush");
ShowResultStatusMessage(BoardReadyMessage);
} }
private void BarcodeTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) private void BarcodeTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
@ -158,7 +180,8 @@ public partial class MainWindow : Window
else if (showInvalidInput && hasPendingScannerInput && scannerText.Length >= ScannerInputMinimumLength) else if (showInvalidInput && hasPendingScannerInput && scannerText.Length >= ScannerInputMinimumLength)
{ {
BarcodeTextBox.Clear(); BarcodeTextBox.Clear();
ResultOutputTextBox.Text = BarcodeInvalidMessage; SetProcessStatus("SCAN ERROR", "HmiDangerBrush");
ShowResultStatusMessage(BarcodeInvalidMessage);
FocusBarcodeInput(); FocusBarcodeInput();
} }
@ -203,7 +226,8 @@ public partial class MainWindow : Window
barcodeScanner?.Dispose(); barcodeScanner?.Dispose();
_barcodeScanner?.Dispose(); _barcodeScanner?.Dispose();
_barcodeScanner = null; _barcodeScanner = null;
ResultOutputTextBox.Text = $"{BarcodeRequiredMessage}\r\nBarcode scanner COM: {ex.Message}"; SetProcessStatus("SCANNER ERROR", "HmiDangerBrush");
ShowResultStatusMessage($"{BarcodeRequiredMessage}\r\nBarcode scanner COM: {ex.Message}");
} }
} }
@ -223,7 +247,8 @@ public partial class MainWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
ResultOutputTextBox.Text = $"Barcode scanner input failed: {ex.Message}"; SetProcessStatus("SCAN ERROR", "HmiDangerBrush");
ShowResultStatusMessage($"Barcode scanner input failed: {ex.Message}");
} }
}), DispatcherPriority.Input); }), DispatcherPriority.Input);
} }
@ -297,13 +322,15 @@ public partial class MainWindow : Window
if (string.IsNullOrWhiteSpace(BarcodeTextBox.Text)) if (string.IsNullOrWhiteSpace(BarcodeTextBox.Text))
{ {
ResultOutputTextBox.Text = BarcodeRequiredMessage; SetProcessStatus("WAITING BARCODE", "HmiAccentBrush");
ShowResultStatusMessage(BarcodeRequiredMessage);
FocusBarcodeInput(); FocusBarcodeInput();
return; return;
} }
if (!TryApplyInspectionSettingsFromTextBoxes()) if (!TryApplyInspectionSettingsFromTextBoxes())
{ {
SetProcessStatus("RANGE SETTING ERROR", "HmiDangerBrush");
return; return;
} }
@ -311,6 +338,7 @@ public partial class MainWindow : Window
{ {
_isBoardTestRunning = true; _isBoardTestRunning = true;
SetInputEnabled(false); SetInputEnabled(false);
SetProcessStatus("INSPECTION START", "HmiAccentBrush");
var boardSettings = BoardHardwareSettings.Load(GetHardwareIniPath()); var boardSettings = BoardHardwareSettings.Load(GetHardwareIniPath());
var equipmentSettings = EquipmentMeasurementSettings.Load(GetHardwareIniPath()); var equipmentSettings = EquipmentMeasurementSettings.Load(GetHardwareIniPath());
@ -319,37 +347,61 @@ public partial class MainWindow : Window
var startSignalReceivedAt = await WaitForEquipmentStartSignalAsync(startSignalSettings); var startSignalReceivedAt = await WaitForEquipmentStartSignalAsync(startSignalSettings);
var measurementNotBeforeUtc = startSignalReceivedAt?.AddMilliseconds(startSignalSettings.PostSignalDelayMilliseconds); var measurementNotBeforeUtc = startSignalReceivedAt?.AddMilliseconds(startSignalSettings.PostSignalDelayMilliseconds);
ResultOutputTextBox.Text = ShowResultStatusMessage(
"보드 테스트 시작\r\n" + "보드 테스트 시작\r\n" +
"1. 시료 연결 확인\r\n" + "1. 시료 연결 확인\r\n" +
"2. IC_SN 읽기\r\n" + "2. IC_SN 읽기\r\n" +
"3. CAL DEFAULT 조건 설정\r\n" + "3. CAL DEFAULT 조건 설정\r\n" +
"4. 시작 신호 기준 지연 후 계측 장비에서 V/A 읽기"; "4. 시작 신호 기준 지연 후 계측 장비에서 V/A 읽기");
var service = new BoardTestService(boardSettings, equipmentSettings); var service = new BoardTestService(boardSettings, equipmentSettings);
string? dbHeaderSaveError = null; SetProcessStatus("BOARD TEST", "HmiWarningBrush");
var measurement = await service.RunAsync( var measurement = await service.RunAsync(
async icSn => icSn =>
{ {
IcSnOutputTextBox.Text = icSn; IcSnOutputTextBox.Text = icSn;
dbHeaderSaveError = await SaveHeaderStatusAsync(icSn); SetProcessStatus("IC_SN READ", "HmiAccentBrush");
return Task.CompletedTask;
}, },
measurementNotBeforeUtc); measurementNotBeforeUtc);
SetProcessStatus("MEASUREMENT DONE", "HmiAccentBrush");
IcSnOutputTextBox.Text = measurement.IcSn; IcSnOutputTextBox.Text = measurement.IcSn;
_lastMeasuredVoltage = measurement.Voltage; _lastMeasuredVoltage = measurement.Voltage;
VOutputTextBox.Text = FormatDecimal(measurement.Voltage); VOutputTextBox.Text = FormatDecimal(measurement.Voltage);
AOutputTextBox.Text = FormatCurrent(measurement.Current); AOutputTextBox.Text = FormatCurrent(measurement.Current);
var resultCode = _inspectionSettings.IsPass(measurement.Voltage, measurement.Current) ? "OK" : "NG"; var voltagePass = IsVoltagePass(measurement.Voltage);
ResultOutputTextBox.Text = resultCode; var currentPass = IsCurrentPass(measurement.Current);
var inspectionPass = voltagePass && currentPass;
ApplyMeasurementOutputState(VOutputTextBox, voltagePass);
ApplyMeasurementOutputState(AOutputTextBox, currentPass);
ShowInspectionResult(inspectionPass);
var resultCode = inspectionPass ? "OK" : "NG";
SetProcessStatus("DB SAVING", "HmiWarningBrush");
var dbMeasurementSaveError = await SaveMeasurementStatusAsync(resultCode); var dbMeasurementSaveError = await SaveMeasurementStatusAsync(resultCode);
ResultOutputTextBox.Text = $"{resultCode}\r\n{BuildDbSaveMessage(dbHeaderSaveError, dbMeasurementSaveError)}"; if (!string.IsNullOrWhiteSpace(dbMeasurementSaveError))
{
SetProcessStatus("DB SAVE ERROR", "HmiDangerBrush");
MessageBox.Show(this, $"DB 저장 실패: {dbMeasurementSaveError}", "DB", MessageBoxButton.OK, MessageBoxImage.Warning);
}
else
{
SetProcessStatus(inspectionPass ? "COMPLETE OK" : "COMPLETE NG", inspectionPass ? "HmiRunBrush" : "HmiDangerBrush");
}
if (!inspectionPass)
{
ShowInspectionFailurePopup(measurement.Voltage, measurement.Current, voltagePass, currentPass);
}
ClearTraceabilityForNextScan();
} }
catch (Exception ex) catch (Exception ex)
{ {
ResultOutputTextBox.Text = $"보드 테스트 실패: {ex.Message}"; SetProcessStatus("ERROR", "HmiDangerBrush");
ShowResultStatusMessage($"보드 테스트 실패: {ex.Message}");
} }
finally finally
{ {
@ -366,23 +418,26 @@ public partial class MainWindow : Window
return null; return null;
} }
ResultOutputTextBox.Text = SetProcessStatus("WAIT START SIGNAL", "HmiWarningBrush");
ShowResultStatusMessage(
"장비 시작 신호 대기\r\n" + "장비 시작 신호 대기\r\n" +
$"{StartSignalWatcher.Describe(settings)}\r\n" + $"{StartSignalWatcher.Describe(settings)}\r\n" +
"시료를 넣고 Housing 장비 시작 버튼을 눌러주세요."; "시료를 넣고 Housing 장비 시작 버튼을 눌러주세요.");
await StartSignalWatcher.WaitForStartAsync(settings); await StartSignalWatcher.WaitForStartAsync(settings);
var receivedAt = DateTime.UtcNow; var receivedAt = DateTime.UtcNow;
if (settings.PostSignalDelayMilliseconds <= 0) if (settings.PostSignalDelayMilliseconds <= 0)
{ {
ResultOutputTextBox.Text = "장비 시작 신호 수신 완료"; SetProcessStatus("START SIGNAL", "HmiRunBrush");
ShowResultStatusMessage("장비 시작 신호 수신 완료");
return receivedAt; return receivedAt;
} }
ResultOutputTextBox.Text = SetProcessStatus("START DELAY", "HmiWarningBrush");
ShowResultStatusMessage(
"장비 시작 신호 수신 완료\r\n" + "장비 시작 신호 수신 완료\r\n" +
$"전압 측정은 신호 수신 후 {settings.PostSignalDelayMilliseconds / 1000.0:0.###}초 이후 시작합니다."; $"전압 측정은 신호 수신 후 {settings.PostSignalDelayMilliseconds / 1000.0:0.###}초 이후 시작합니다.");
return receivedAt; return receivedAt;
} }
@ -447,12 +502,14 @@ public partial class MainWindow : Window
private void ResetScreen() private void ResetScreen()
{ {
BarcodeTextBox.Clear(); ClearTraceabilityForNextScan();
IcSnOutputTextBox.Clear();
_lastMeasuredVoltage = null; _lastMeasuredVoltage = null;
VOutputTextBox.Text = DefaultOutputValue; VOutputTextBox.Text = DefaultOutputValue;
AOutputTextBox.Text = FormatCurrent(0m); AOutputTextBox.Text = FormatCurrent(0m);
ResultOutputTextBox.Text = BarcodeRequiredMessage; ClearOutputState(VOutputTextBox);
ClearOutputState(AOutputTextBox);
SetProcessStatus("WAITING BARCODE", "HmiAccentBrush");
ShowResultStatusMessage(BarcodeRequiredMessage);
FocusBarcodeInput(); FocusBarcodeInput();
} }
@ -476,52 +533,183 @@ public partial class MainWindow : Window
}), DispatcherPriority.Input); }), DispatcherPriority.Input);
} }
private async Task<string?> SaveHeaderStatusAsync(string icSn) private void SetProcessStatus(string status, string brushResourceKey)
{ {
try var brush = (Brush)FindResource(brushResourceKey);
CurrentProcessTextBlock.Text = status;
CurrentProcessTextBlock.Foreground = brush;
HighlightProcessStep(GetProcessStep(status), brush);
}
private ProcessStep GetProcessStep(string status)
{ {
var repository = new HousingAssemblyRepository(DatabaseSettings.Load(GetDatabaseIniPath())); return status switch
var record = CreateHeaderRecord(icSn); {
await repository.UpsertHeaderAsync(record); "WAIT START SIGNAL" or
"START SIGNAL" or
"START DELAY" or
"INSPECTION START" => ProcessStep.Start,
return null; "BOARD TEST" or
"RANGE SETTING ERROR" => ProcessStep.Board,
"IC_SN READ" => ProcessStep.IcSn,
"MEASUREMENT DONE" => ProcessStep.Measure,
"DB SAVING" or
"DB SAVE ERROR" => ProcessStep.Db,
"COMPLETE OK" or
"COMPLETE NG" or
"ERROR" => ProcessStep.Result,
_ => ProcessStep.Barcode
};
} }
catch (Exception ex)
private void HighlightProcessStep(ProcessStep activeStep, Brush activeBrush)
{ {
return ex.Message; var inactiveBrush = (Brush)FindResource("ProcessStepInactiveBrush");
var activeBackground = (Brush)FindResource("ProcessStepActiveBackgroundBrush");
var inactiveBackground = (Brush)new BrushConverter().ConvertFromString("#0B161F")!;
var activeTextBrush = (Brush)FindResource("HmiTextBrush");
var inactiveTextBrush = (Brush)FindResource("HmiMutedTextBrush");
foreach (var (step, border) in GetProcessStepBorders())
{
var isActive = step == activeStep;
border.BorderBrush = isActive ? activeBrush : inactiveBrush;
border.BorderThickness = isActive ? new Thickness(2) : new Thickness(1);
border.Background = isActive ? activeBackground : inactiveBackground;
if (border.Child is TextBlock textBlock)
{
textBlock.Foreground = isActive ? activeTextBrush : inactiveTextBrush;
}
} }
} }
private async Task<string?> SaveMeasurementStatusAsync(string resultCode) private IEnumerable<(ProcessStep Step, Border Border)> GetProcessStepBorders()
{ {
try yield return (ProcessStep.Barcode, ProcessStepBarcodeBorder);
yield return (ProcessStep.Start, ProcessStepStartBorder);
yield return (ProcessStep.Board, ProcessStepBoardBorder);
yield return (ProcessStep.IcSn, ProcessStepIcSnBorder);
yield return (ProcessStep.Measure, ProcessStepMeasureBorder);
yield return (ProcessStep.Db, ProcessStepDbBorder);
yield return (ProcessStep.Result, ProcessStepResultBorder);
}
private void ShowResultStatusMessage(string message)
{ {
var repository = new HousingAssemblyRepository(DatabaseSettings.Load(GetDatabaseIniPath())); ResultOutputTextBox.FontSize = ResultStatusFontSize;
var record = CreateMeasurementRecord(resultCode); ResultOutputTextBox.FontWeight = FontWeights.SemiBold;
await repository.UpdateMeasurementAsync(record); ResultOutputTextBox.TextWrapping = TextWrapping.Wrap;
ClearOutputState(ResultOutputTextBox);
ResultOutputTextBox.Text = message;
}
return null; private void ShowInspectionResult(bool isPass)
{
ResultOutputTextBox.FontSize = InspectionResultFontSize;
ResultOutputTextBox.FontWeight = FontWeights.Black;
ResultOutputTextBox.TextWrapping = TextWrapping.NoWrap;
ResultOutputTextBox.Text = isPass ? "OK" : "NG";
ApplyMeasurementOutputState(ResultOutputTextBox, isPass);
} }
catch (Exception ex)
private void ApplyMeasurementOutputState(TextBox textBox, bool isPass)
{ {
return ex.Message; var brush = GetJudgementBrush(isPass);
textBox.Foreground = brush;
textBox.BorderBrush = brush;
} }
private void ClearOutputState(TextBox textBox)
{
textBox.ClearValue(Control.ForegroundProperty);
textBox.ClearValue(Control.BorderBrushProperty);
} }
private static string BuildDbSaveMessage(params string?[] errors) private Brush GetJudgementBrush(bool isPass)
{ {
var failureMessages = new List<string>(); return (Brush)FindResource(isPass ? "HmiRunBrush" : "HmiDangerBrush");
foreach (var error in errors) }
private bool IsVoltagePass(decimal voltage)
{ {
if (!string.IsNullOrWhiteSpace(error)) return voltage >= _inspectionSettings.VMin &&
voltage <= _inspectionSettings.VMax;
}
private bool IsCurrentPass(decimal current)
{ {
failureMessages.Add(error); return current >= _inspectionSettings.AMin &&
current <= _inspectionSettings.AMax;
} }
private void ShowInspectionFailurePopup(
decimal voltage,
decimal current,
bool voltagePass,
bool currentPass)
{
var messages = new List<string>();
if (!voltagePass)
{
messages.Add(
$"PT_VOL_1: {FormatDecimal(voltage)} V (기준 {FormatDecimal(_inspectionSettings.VMin)} ~ {FormatDecimal(_inspectionSettings.VMax)} V)");
}
if (!currentPass)
{
messages.Add(
$"PT_CURRENT_1: {FormatCurrent(current)} mA (기준 {FormatCurrentLimit(_inspectionSettings.AMin)} ~ {FormatCurrentLimit(_inspectionSettings.AMax)} mA)");
}
var detail = messages.Count == 0
? "알 수 없는 판정 오류입니다."
: string.Join("\r\n", messages);
MessageBox.Show(
this,
$"NG 판정입니다.\r\n\r\n{detail}",
"Inspection NG",
MessageBoxButton.OK,
MessageBoxImage.Warning);
} }
return failureMessages.Count == 0 private void ClearTraceabilityForNextScan()
? "DB 저장 완료" {
: $"DB 저장 실패 ({string.Join("; ", failureMessages)})"; _suppressBarcodeStatusUpdate = true;
try
{
BarcodeTextBox.Clear();
IcSnOutputTextBox.Clear();
}
finally
{
_suppressBarcodeStatusUpdate = false;
}
ClearPendingScannerInput();
}
private async Task<string?> SaveMeasurementStatusAsync(string resultCode)
{
try
{
var repository = new HousingAssemblyRepository(DatabaseSettings.Load(GetDatabaseIniPath()));
var record = CreateMeasurementRecord(resultCode);
await repository.UpsertInspectionAsync(record);
return null;
}
catch (Exception ex)
{
return ex.Message;
}
} }
private HousingAssemblyRecord CreateHeaderRecord(string icSn) private HousingAssemblyRecord CreateHeaderRecord(string icSn)
@ -537,7 +725,7 @@ public partial class MainWindow : Window
Variant1 = _loginResult.Variant1, Variant1 = _loginResult.Variant1,
Variant2 = _loginResult.Variant2, Variant2 = _loginResult.Variant2,
Operator = _loginResult.Operator, Operator = _loginResult.Operator,
ProductionDate = DateTime.Now, ProductionDate = GetProductionDateSecond(),
Line = _loginResult.LineNo, Line = _loginResult.LineNo,
LotNo = _loginResult.LotNo, LotNo = _loginResult.LotNo,
JigNo = _loginResult.JigNo JigNo = _loginResult.JigNo
@ -559,16 +747,27 @@ public partial class MainWindow : Window
{ {
IcSn = icSn, IcSn = icSn,
PcbBarcode = barcode, PcbBarcode = barcode,
Maker = _loginResult.Maker,
Model = _loginResult.Model,
Variant1 = _loginResult.Variant1,
Variant2 = _loginResult.Variant2,
Operator = _loginResult.Operator,
ProductionDate = GetProductionDateSecond(),
Line = _loginResult.LineNo,
LotNo = _loginResult.LotNo,
JigNo = _loginResult.JigNo,
PtVol1 = _lastMeasuredVoltage ?? ParseDecimal(VOutputTextBox.Text), PtVol1 = _lastMeasuredVoltage ?? ParseDecimal(VOutputTextBox.Text),
PtCurrent1 = ParseDecimal(AOutputTextBox.Text), PtCurrent1 = ParseDecimal(AOutputTextBox.Text),
Result = resultCode, Result = resultCode
Spare1 = null,
Spare2 = null,
Spare3 = null,
Spare4 = null
}; };
} }
private static DateTime GetProductionDateSecond()
{
var now = DateTime.Now;
return new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);
}
private void ApplyInspectionSettingsToTextBoxes() private void ApplyInspectionSettingsToTextBoxes()
{ {
VMinTextBox.Text = FormatDecimal(_inspectionSettings.VMin); VMinTextBox.Text = FormatDecimal(_inspectionSettings.VMin);
@ -708,6 +907,26 @@ public partial class MainWindow : Window
private static string GetInspectionSettingsIniPath() private static string GetInspectionSettingsIniPath()
{ {
return Path.Combine(AppContext.BaseDirectory, "InspectionSettings.ini"); return GetWritableSettingsPath("InspectionSettings.ini");
}
private static string GetWritableSettingsPath(string fileName)
{
var settingsDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"AMO Housing");
Directory.CreateDirectory(settingsDirectory);
var writablePath = Path.Combine(settingsDirectory, fileName);
if (!File.Exists(writablePath))
{
var bundledPath = Path.Combine(AppContext.BaseDirectory, fileName);
if (File.Exists(bundledPath))
{
File.Copy(bundledPath, writablePath);
}
}
return writablePath;
} }
} }

4
Models/HousingAssemblyRecord.cs

@ -18,8 +18,4 @@ public sealed class HousingAssemblyRecord
public decimal PtVol1 { get; set; } public decimal PtVol1 { get; set; }
public decimal PtCurrent1 { get; set; } public decimal PtCurrent1 { get; set; }
public string Result { get; set; } = string.Empty; public string Result { get; set; } = string.Empty;
public string? Spare1 { get; set; }
public string? Spare2 { get; set; }
public string? Spare3 { get; set; }
public string? Spare4 { get; set; }
} }

113
Services/HousingAssemblyRepository.cs

@ -52,8 +52,8 @@ VALUES
AddNVarChar(command, "@PCB_Barcode", 50, record.PcbBarcode); AddNVarChar(command, "@PCB_Barcode", 50, record.PcbBarcode);
AddNVarChar(command, "@Maker", 10, record.Maker); AddNVarChar(command, "@Maker", 10, record.Maker);
AddNVarChar(command, "@Model", 10, record.Model); AddNVarChar(command, "@Model", 10, record.Model);
AddNVarChar(command, "@Variant_1", 10, record.Variant1); AddNullableNVarChar(command, "@Variant_1", 10, record.Variant1);
AddNVarChar(command, "@Variant_2", 10, record.Variant2); AddNullableNVarChar(command, "@Variant_2", 10, record.Variant2);
AddNVarChar(command, "@Operator", 10, record.Operator); AddNVarChar(command, "@Operator", 10, record.Operator);
command.Parameters.Add(new SqlParameter("@Production_Date", SqlDbType.DateTime2) { Value = record.ProductionDate }); command.Parameters.Add(new SqlParameter("@Production_Date", SqlDbType.DateTime2) { Value = record.ProductionDate });
AddNVarChar(command, "@Line", 5, record.Line); AddNVarChar(command, "@Line", 5, record.Line);
@ -127,8 +127,8 @@ COMMIT TRANSACTION;";
AddNVarChar(command, "@PCB_Barcode", 50, record.PcbBarcode); AddNVarChar(command, "@PCB_Barcode", 50, record.PcbBarcode);
AddNVarChar(command, "@Maker", 10, record.Maker); AddNVarChar(command, "@Maker", 10, record.Maker);
AddNVarChar(command, "@Model", 10, record.Model); AddNVarChar(command, "@Model", 10, record.Model);
AddNVarChar(command, "@Variant_1", 10, record.Variant1); AddNullableNVarChar(command, "@Variant_1", 10, record.Variant1);
AddNVarChar(command, "@Variant_2", 10, record.Variant2); AddNullableNVarChar(command, "@Variant_2", 10, record.Variant2);
AddNVarChar(command, "@Operator", 10, record.Operator); AddNVarChar(command, "@Operator", 10, record.Operator);
command.Parameters.Add(new SqlParameter("@Production_Date", SqlDbType.DateTime2) { Value = record.ProductionDate }); command.Parameters.Add(new SqlParameter("@Production_Date", SqlDbType.DateTime2) { Value = record.ProductionDate });
AddNVarChar(command, "@Line", 5, record.Line); AddNVarChar(command, "@Line", 5, record.Line);
@ -149,11 +149,7 @@ UPDATE dbo.Housing_Assembly
SET SET
[PT_Vol_1] = @PT_Vol_1, [PT_Vol_1] = @PT_Vol_1,
[PT_Current_1] = @PT_Current_1, [PT_Current_1] = @PT_Current_1,
[Result] = @Result, [Result] = @Result
[Spare_1] = @Spare_1,
[Spare_2] = @Spare_2,
[Spare_3] = @Spare_3,
[Spare_4] = @Spare_4
WHERE WHERE
[IC_SN] = @IC_SN;"; [IC_SN] = @IC_SN;";
@ -161,10 +157,6 @@ WHERE
AddDecimal(command, "@PT_Vol_1", record.PtVol1); AddDecimal(command, "@PT_Vol_1", record.PtVol1);
AddDecimal(command, "@PT_Current_1", record.PtCurrent1); AddDecimal(command, "@PT_Current_1", record.PtCurrent1);
AddNVarChar(command, "@Result", 5, record.Result); AddNVarChar(command, "@Result", 5, record.Result);
AddNullableNVarChar(command, "@Spare_1", 30, record.Spare1);
AddNullableNVarChar(command, "@Spare_2", 30, record.Spare2);
AddNullableNVarChar(command, "@Spare_3", 30, record.Spare3);
AddNullableNVarChar(command, "@Spare_4", 30, record.Spare4);
await connection.OpenAsync(); await connection.OpenAsync();
var affectedRows = await command.ExecuteNonQueryAsync(); var affectedRows = await command.ExecuteNonQueryAsync();
@ -174,10 +166,101 @@ WHERE
} }
} }
public async Task UpsertInspectionAsync(HousingAssemblyRecord record)
{
if (string.IsNullOrWhiteSpace(record.Result))
{
throw new InvalidOperationException("DB result value is required.");
}
using var connection = new SqlConnection(CreateConnectionString());
using var command = connection.CreateCommand();
command.CommandText = @"
SET XACT_ABORT ON;
BEGIN TRANSACTION;
UPDATE dbo.Housing_Assembly WITH (UPDLOCK, HOLDLOCK)
SET
[PCB_Barcode] = @PCB_Barcode,
[Maker] = @Maker,
[Model] = @Model,
[Variant_1] = @Variant_1,
[Variant_2] = @Variant_2,
[Operator] = @Operator,
[Production_Date] = @Production_Date,
[Line] = @Line,
[Lot_No] = @Lot_No,
[Jig_No] = @Jig_No,
[PT_Vol_1] = @PT_Vol_1,
[PT_Current_1] = @PT_Current_1,
[Result] = @Result
WHERE
[IC_SN] = @IC_SN;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.Housing_Assembly
(
[IC_SN],
[PCB_Barcode],
[Maker],
[Model],
[Variant_1],
[Variant_2],
[Operator],
[Production_Date],
[Line],
[Lot_No],
[Jig_No],
[PT_Vol_1],
[PT_Current_1],
[Result]
)
VALUES
(
@IC_SN,
@PCB_Barcode,
@Maker,
@Model,
@Variant_1,
@Variant_2,
@Operator,
@Production_Date,
@Line,
@Lot_No,
@Jig_No,
@PT_Vol_1,
@PT_Current_1,
@Result
);
END;
COMMIT TRANSACTION;";
AddNVarChar(command, "@IC_SN", 50, record.IcSn);
AddNVarChar(command, "@PCB_Barcode", 50, record.PcbBarcode);
AddNVarChar(command, "@Maker", 10, record.Maker);
AddNVarChar(command, "@Model", 10, record.Model);
AddNullableNVarChar(command, "@Variant_1", 10, record.Variant1);
AddNullableNVarChar(command, "@Variant_2", 10, record.Variant2);
AddNVarChar(command, "@Operator", 10, record.Operator);
command.Parameters.Add(new SqlParameter("@Production_Date", SqlDbType.DateTime2) { Value = record.ProductionDate });
AddNVarChar(command, "@Line", 5, record.Line);
AddNVarChar(command, "@Lot_No", 8, record.LotNo);
AddNVarChar(command, "@Jig_No", 10, record.JigNo);
AddDecimal(command, "@PT_Vol_1", record.PtVol1);
AddDecimal(command, "@PT_Current_1", record.PtCurrent1);
AddNVarChar(command, "@Result", 5, record.Result);
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();
}
public async Task InsertAsync(HousingAssemblyRecord record) public async Task InsertAsync(HousingAssemblyRecord record)
{ {
await UpsertHeaderAsync(record); await UpsertInspectionAsync(record);
await UpdateMeasurementAsync(record);
} }
private string CreateConnectionString() private string CreateConnectionString()

174
Services/LoginSelectionOptions.cs

@ -0,0 +1,174 @@
using System.IO;
using System.Text.Json;
namespace Housing.Services;
public sealed class LoginSelectionOptions
{
private const string DefaultContent = """
{
"loginAccounts": [
{
"id": "su",
"password": "su"
}
],
"makers": [
"AMO",
"ABC"
],
"models": [
"MODEL-1"
],
"variant1Values": [],
"variant2Values": [],
"lineValues": [
"LINE-1"
],
"jigNoValues": [
"JIG-1"
]
}
""";
public IReadOnlyList<string> Makers { get; init; } = Array.Empty<string>();
public IReadOnlyList<string> Models { get; init; } = Array.Empty<string>();
public IReadOnlyList<string> Variant1Values { get; init; } = Array.Empty<string>();
public IReadOnlyList<string> Variant2Values { get; init; } = Array.Empty<string>();
public IReadOnlyList<string> LineValues { get; init; } = Array.Empty<string>();
public IReadOnlyList<string> JigNoValues { get; init; } = Array.Empty<string>();
public IReadOnlyList<LoginAccountOption> LoginAccounts { get; init; } = Array.Empty<LoginAccountOption>();
public static LoginSelectionOptions Load(string filePath)
{
EnsureFileExists(filePath);
try
{
var json = File.ReadAllText(filePath);
var data = JsonSerializer.Deserialize<LoginSelectionOptionsData>(
json,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? new LoginSelectionOptionsData();
return new LoginSelectionOptions
{
LoginAccounts = NormalizeLoginAccounts(data.LoginAccounts),
Makers = NormalizeValues(data.Makers),
Models = NormalizeValues(data.Models),
Variant1Values = NormalizeValues(data.Variant1Values, includeBlank: true),
Variant2Values = NormalizeValues(data.Variant2Values, includeBlank: true),
LineValues = NormalizeValues(data.LineValues),
JigNoValues = NormalizeValues(data.JigNoValues)
};
}
catch
{
return new LoginSelectionOptions
{
Variant1Values = new[] { string.Empty },
Variant2Values = new[] { string.Empty }
};
}
}
public static void CreateDefaultFile(string filePath)
{
var directory = Path.GetDirectoryName(filePath);
if (!string.IsNullOrWhiteSpace(directory))
{
Directory.CreateDirectory(directory);
}
File.WriteAllText(filePath, DefaultContent);
}
private static void EnsureFileExists(string filePath)
{
if (File.Exists(filePath))
{
return;
}
CreateDefaultFile(filePath);
}
private static IReadOnlyList<string> NormalizeValues(
IReadOnlyList<string>? source,
bool includeBlank = false)
{
var values = new List<string>();
if (includeBlank)
{
values.Add(string.Empty);
}
if (source is null)
{
return values;
}
foreach (var rawValue in source)
{
var value = rawValue.Trim();
if (string.IsNullOrWhiteSpace(value))
{
continue;
}
if (!values.Any(existing => string.Equals(existing, value, StringComparison.OrdinalIgnoreCase)))
{
values.Add(value);
}
}
return values;
}
private static IReadOnlyList<LoginAccountOption> NormalizeLoginAccounts(
IReadOnlyList<LoginAccountOptionData>? source)
{
if (source is null)
{
return Array.Empty<LoginAccountOption>();
}
var accounts = new List<LoginAccountOption>();
foreach (var account in source)
{
var id = account.Id?.Trim() ?? string.Empty;
var password = account.Password ?? string.Empty;
if (string.IsNullOrWhiteSpace(id) || string.IsNullOrWhiteSpace(password))
{
continue;
}
if (accounts.Any(existing => string.Equals(existing.Id, id, StringComparison.OrdinalIgnoreCase)))
{
continue;
}
accounts.Add(new LoginAccountOption(id, password));
}
return accounts;
}
private sealed class LoginSelectionOptionsData
{
public List<LoginAccountOptionData>? LoginAccounts { get; set; }
public List<string>? Makers { get; set; }
public List<string>? Models { get; set; }
public List<string>? Variant1Values { get; set; }
public List<string>? Variant2Values { get; set; }
public List<string>? LineValues { get; set; }
public List<string>? JigNoValues { get; set; }
}
private sealed class LoginAccountOptionData
{
public string? Id { get; set; }
public string? Password { get; set; }
}
}
public sealed record LoginAccountOption(string Id, string Password);

BIN
Setup/Release (2).zip

Binary file not shown.

BIN
Setup/Release (3).zip

Binary file not shown.

BIN
Setup/Release.zip

Binary file not shown.

BIN
Setup/Release/Setup.msi

Binary file not shown.

BIN
Setup/Release/setup.exe

Binary file not shown.

733
Setup/Setup.vdproj

@ -0,0 +1,733 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:Setup"
"LanguageId" = "3:1042"
"CodePage" = "3:949"
"UILanguageId" = "3:1042"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_B05EA6D34BC647ADBF218BE1B8FCDE4D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_E2F37A4BC6354FB28BFCC9A4786246D0"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:Debug\\Setup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Release\\Setup.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_1EA44D4AD7B64DECBEC398188D1A8E86"
{
"Name" = "8:.NET Core"
"Message" = "8:[VSDNETCOREMSG]"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
"IsNETCore" = "11:TRUE"
"Architecture" = "2:0"
"Runtime" = "2:0"
}
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E2F37A4BC6354FB28BFCC9A4786246D0"
{
"SourcePath" = "8:..\\Resources\\Housing_voltage_current_icon_msi_noborder.ico"
"TargetName" = "8:Housing_voltage_current_icon_msi_noborder.ico"
"Tag" = "8:"
"Folder" = "8:_D1B18B734F744E38AAC1B814D1609120"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{1525181F-901A-416C-8A58-119130FE478E}:_7AA32E0E3C454FC5AE5D2F20D5E9A9BE"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_AB97DCF656734884A73E483FB1F98088"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_D1B18B734F744E38AAC1B814D1609120"
{
"DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1042"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:Setup"
"ProductCode" = "8:{59CFE036-FC7A-432D-88B0-DE253B9D4022}"
"PackageCode" = "8:{D60BF56F-7CF2-4A4F-87FE-0BB29FB58ECC}"
"UpgradeCode" = "8:{65BCDEBD-E3E8-40A9-A181-EA41129C1134}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:FALSE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.0.0"
"Manufacturer" = "8:temp"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:Setup"
"Subject" = "8:"
"ARPCONTACT" = "8:temp"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:"
"ARPURLINFOABOUT" = "8:"
"ARPPRODUCTICON" = "8:"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:1"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EE45E62DF5B84D4A93E5255661DB5D0E"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D4657C5E58B84999857BFBADE1752F69"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_48E03E6D1A3F416BB3747EF1B122433D"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5F1C850494C2414598950A3C6B9B16B8"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_FDF6144C1D234CE7AA0AE2D35F31D2A7"
{
"Name" = "8:Housing"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_B05EA6D34BC647ADBF218BE1B8FCDE4D"
"Folder" = "8:_AB97DCF656734884A73E483FB1F98088"
"WorkingFolder" = "8:_D1B18B734F744E38AAC1B814D1609120"
"Icon" = "8:_E2F37A4BC6354FB28BFCC9A4786246D0"
"Feature" = "8:"
}
}
"UserInterface"
{
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_2CE267B0AF6D4709AC2464E025F6D332"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_52CE5C290ADF4814A6DC85143B2E6689"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5627981C096E45A29905FC82514AC401"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E4E1E3479A6140B19497DA05ACC9EF64"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_686E2C35485646398A6B2D9F70EA18ED"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_54A9BE10EBC54476A2F5615C385EB1F2"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7EE41D7AF3BA4607BA0E7CACF93E4EC7"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6FB8A21AAC2E4784989448AA82667ACC"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_73318FE50646462C9CBC5BF7BA540039"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E99396E69C664EFC946B8ECD2FB6F6F6"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B25DC8F29DE9440FBE4BD4CAA9767FD5"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9C8888B785AA4761BF124F8606D31E6C"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D0A972F52A4A4DE8933FA8538FA5DC4B"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1C340B9D1004471B925E3D52F341771A"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_EC390C86553A4343B0B40839C1787ED1"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_038130C95F4C4D1E9488A9C607D2CCE0"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_266A6388DE9E414892BAFF9C9D7BFB0E"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F33F56913EA4489584DD5B4324093F32"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_B05EA6D34BC647ADBF218BE1B8FCDE4D"
{
"SourcePath" = "8:..\\obj\\Release\\net9.0-windows\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_D1B18B734F744E38AAC1B814D1609120"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItemsOutputGroup"
"OutputProjectGuid" = "8:{7364A567-F115-4ACE-9207-C6FDEEF0A394}"
"ShowKeyOutput" = "11:TRUE"
"ExcludeFilters"
{
}
}
}
}
}

BIN
Setup0/Release/Setup0.msi

Binary file not shown.

BIN
Setup1/Release/setup.exe → Setup0/Release/setup.exe

Binary file not shown.

749
Setup0/Setup0.vdproj

@ -0,0 +1,749 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:Setup0"
"LanguageId" = "3:1042"
"CodePage" = "3:949"
"UILanguageId" = "3:1042"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_0356B9E189FC48958DB6A71E03326AF3"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_8F52211F237449009A75530A338B4CB0"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:Debug\\Setup0.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Release\\Setup0.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
{
"Enabled" = "11:TRUE"
"PromptEnabled" = "11:TRUE"
"PrerequisitesLocation" = "2:1"
"Url" = "8:"
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.DesktopRuntime.9.0.x64"
{
"Name" = "8:.NET 데스크톱 런타임 9.0.17 (x64)"
"ProductCode" = "8:Microsoft.NetCore.DesktopRuntime.9.0.x64"
}
}
}
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_F3D35B98B3DB4A58B0692C9FD539F0A0"
{
"Name" = "8:.NET Core"
"Message" = "8:[VSDNETCOREMSG]"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
"IsNETCore" = "11:TRUE"
"Architecture" = "2:0"
"Runtime" = "2:0"
}
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8F52211F237449009A75530A338B4CB0"
{
"SourcePath" = "8:..\\Resources\\Housing_voltage_current_icon_msi_noborder.ico"
"TargetName" = "8:Housing_voltage_current_icon_msi_noborder.ico"
"Tag" = "8:"
"Folder" = "8:_013D33A454C9466FB82296324DBB53B8"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_013D33A454C9466FB82296324DBB53B8"
{
"DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_091DD05DD8644FA1BA44E2300981BE58"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_26C078B1B70540838549456AC7CE8155"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1042"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:Setup0"
"ProductCode" = "8:{60609614-BCCD-43FB-8C48-9BADBB63C426}"
"PackageCode" = "8:{9ACA7875-C1EC-4578-9613-C3CD9D21F360}"
"UpgradeCode" = "8:{64F83A71-ED9B-404A-A410-ED7575DA0155}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:FALSE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.0.0"
"Manufacturer" = "8:temp"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:Setup0"
"Subject" = "8:"
"ARPCONTACT" = "8:temp"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:"
"ARPURLINFOABOUT" = "8:"
"ARPPRODUCTICON" = "8:"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:1"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9A0354E9A602418DA91297D6BFB3D8D0"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BABE07CCC9A14A4BBDB2F14725E75E61"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_897CD2C4666B40DCB3D8DFBA883F0BC1"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_72C979E796D84C5BA33B45B041079E6F"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_54B2F4640F744238B5D2D06E339EC3EB"
{
"Name" = "8:Housing"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_0356B9E189FC48958DB6A71E03326AF3"
"Folder" = "8:_091DD05DD8644FA1BA44E2300981BE58"
"WorkingFolder" = "8:_013D33A454C9466FB82296324DBB53B8"
"Icon" = "8:_8F52211F237449009A75530A338B4CB0"
"Feature" = "8:"
}
}
"UserInterface"
{
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_0128DBAB7D05422D8ADED2AF3F04D398"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_234C4C12660940C6904E8B89E89C6F27"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1E77A9D2BDDB4160B20D8C8F3379900D"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_202D3DE4863D450BA52E86E13E7489C8"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7E1B5B42BB494FA39690EED72E5308FA"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_73B6C02C18AF41B7AE9F84F6FF55EF62"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_961C63DE87ED4BC9BC2FF5BE3F2E7B16"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_019C3C3AA22C4232B19B01973DBE521B"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5FC09D47977C4B109E34E99901A5E102"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D2B56A8FA8B448DF958CF92ABC704EDB"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_9979D02AD45042B5B2D7B4D208732090"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8EE4502C484C47AAA4F99A3A6830C628"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C4D7376B12CD45D28C400452A3092C02"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FECE2B90E23A420494E6AAD73A4EF9CD"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F0FBD58D6604406DB74448C1F830B940"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1701D9ADDAC9447D812C1E8C7E2F568B"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1D5A294B9EBC472EA8B0C7E760914B72"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A9E745FEFEEC46868D6B0D2776C20697"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_0356B9E189FC48958DB6A71E03326AF3"
{
"SourcePath" = "8:..\\obj\\Release\\net9.0-windows\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_013D33A454C9466FB82296324DBB53B8"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItemsOutputGroup"
"OutputProjectGuid" = "8:{7364A567-F115-4ACE-9207-C6FDEEF0A394}"
"ShowKeyOutput" = "11:TRUE"
"ExcludeFilters"
{
}
}
}
}
}

BIN
Setup1/Release/SETUP.CAB

Binary file not shown.

BIN
Setup1/Release/Setup1.msi

Binary file not shown.

41306
Setup1/Setup1.vdproj

File diff suppressed because it is too large

71
Setup1/setup-build.log

@ -1,71 +0,0 @@
잘못된 프로젝트
사용법:
devenv [solutionfile | projectfile | folder | anyfile.ext] [switches]
devenv의 첫 번째 인수는 일반적으로 솔루션 파일, 프로젝트 파일 또는 폴더입니다.
다음을 사용할 수도 있습니다. 다른 파일이 자동으로 열리게 하려면 해당 파일을 첫째 인수로
사용할 수도 있습니다. 프로젝트 파일을 입력하면 IDE에서
프로젝트 파일의 부모 디렉터리에서 프로젝트 파일과
기본 이름이 같은 .sln 파일을 찾습니다. 그러한 .sln 파일이 없으면
IDE는 프로젝트를 참조하는 단일 .sln 파일을 찾습니다.
단일 .sln 파일도 없으면 IDE는 프로젝트 파일과 기본 이름이 같은 기본 .sln
파일 이름을 사용하여 저장되지 않은 솔루션을 만듭니다.
명령줄 빌드:
devenv solutionfile.sln /build [ solutionconfig ] [ /project projectnameorfile [ /projectconfig name ] ]
사용 가능한 명령줄 스위치:
/Build 지정한 솔루션 구성으로 솔루션이나 프로젝트를
빌드합니다. "Debug"를 예로 들 수 있습니다. 여러 플랫폼을
사용할 수 있으면 구성 이름에 플랫폼 이름을 명시하고
따옴표로 묶어야 합니다(예: "Debug|Win32").
/Clean 빌드 출력을 삭제합니다.
/Command IDE를 시작하고 명령을 실행합니다.
/Deploy 지정한 빌드 구성을 빌드하여 배포합니다.
/DoNotLoadProjects 모든 프로젝트를 로드하지 않고 지정된 솔루션을 엽니다.
/Edit 이 애플리케이션의 실행 중인 인스턴스에서 지정한 파일을 엽니다.
실행 중인 인스턴스가 없으면 단순화된 창 레이아웃을 사용하여
새 인스턴스를 시작합니다.
/LCID IDE에서 UI에 대한 기본 언어를 설정합니다.
/Log 문제 해결을 위해 IDE 동작을 지정한 파일에 기록합니다.
/NoVSIP VSIP 테스트용 VSIP 개발자 라이선스 키를 사용할 수 없게 합니다.
/Out 빌드 로그를 지정한 파일에 추가합니다.
/Project 빌드, 정리 또는 배포할 프로젝트를 지정합니다.
/Build, /Rebuild, /Clean 또는 /Deploy와 함께 사용해야 합니다.
/ProjectConfig 솔루션 구성에 지정된 프로젝트 구성을
재정의합니다. "Debug"를 예로 들 수 있습니다. 여러 플랫폼을
사용할 수 있으면 구성 이름에 플랫폼 이름을 명시하고
따옴표로 묶어야 합니다(예: "Debug|Win32").
/Project와 함께 사용해야 합니다.
/Rebuild 지정한 구성으로 솔루션이나 프로젝트를
정리하고 빌드합니다.
/ResetSettings IDE의 기본 설정을 복원합니다. 필요한 경우 사용자가 지정한
VSSettings 파일로 다시 설정할 수 있습니다.
/ResetSkipPkgs VSPackages에 추가된 모든 SkipLoading 태그를 지웁니다.
/Run 지정한 솔루션을 컴파일하고 실행합니다.
/RunExit 지정한 솔루션을 컴파일하고 실행한 다음, IDE를 닫습니다.
/SafeMode 최소 창을 로드하는 안전 모드에서 IDE를 시작합니다.
/Upgrade 프로젝트 또는 솔루션과 그 안에 포함된 모든 프로젝트를 업그레이드합니다.
이러한 파일의 백업은 적절히 만들어집니다.
백업 프로세스에 대한 자세한 내용은 'Visual Studio 변환 마법사'
도움말을 참조하세요.
제품별 스위치:
/debugexe 지정한 실행 파일을 디버깅하도록 엽니다. 명령줄의 나머지
가 이 실행 파일에 인수로 전달됩니다.
/diff 두 파일을 비교합니다. 4개의 매개 변수 사용:
SourceFile, TargetFile, SourceDisplayName(선택 사항),
TargetDisplayName(선택 사항)
/TfsLink 팀 탐색기를 열고 입력한 아티팩트 URI에 대해
뷰어를 시작합니다(등록된 경우).
명령줄에서 디버거를 연결하려면 다음 명령을 사용하세요.
VsJITDebugger.exe -p <pid>
오후 8:47에 빌드를 시작함...
========== 빌드: 0 성공 또는 최신 버전, 0 실패, 0 건너뛰기 ==========
========== 빌드이(가) 오후 8:47에 완료되었으며, 00.059 초이(가) 걸림 ==========

BIN
Setup2/Release/Setup2.msi

Binary file not shown.

BIN
Setup2/Release/setup.exe

Binary file not shown.

723
Setup2/Setup2.vdproj

@ -0,0 +1,723 @@
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:Setup2"
"LanguageId" = "3:1042"
"CodePage" = "3:949"
"UILanguageId" = "3:1042"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
"Hierarchy"
{
"Entry"
{
"MsmKey" = "8:_02533EBA1FAC4DEB9B107EA61601BC14"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_D1BD1D2B7BD645FEAEE6F42B6F9A36DB"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
"Debug"
{
"DisplayName" = "8:Debug"
"IsDebugOnly" = "11:TRUE"
"IsReleaseOnly" = "11:FALSE"
"OutputFilename" = "8:Debug\\Setup2.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
}
"Release"
{
"DisplayName" = "8:Release"
"IsDebugOnly" = "11:FALSE"
"IsReleaseOnly" = "11:TRUE"
"OutputFilename" = "8:Release\\Setup2.msi"
"PackageFilesAs" = "3:2"
"PackageFileSize" = "3:-2147483648"
"CabType" = "3:1"
"Compression" = "3:2"
"SignOutput" = "11:FALSE"
"CertificateFile" = "8:"
"PrivateKeyFile" = "8:"
"TimeStampServer" = "8:"
"InstallerBootstrapper" = "3:2"
}
}
"Deployable"
{
"CustomAction"
{
}
"DefaultFeature"
{
"Name" = "8:DefaultFeature"
"Title" = "8:"
"Description" = "8:"
}
"ExternalPersistence"
{
"LaunchCondition"
{
}
}
"File"
{
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D1BD1D2B7BD645FEAEE6F42B6F9A36DB"
{
"SourcePath" = "8:..\\Resources\\Housing_voltage_current_icon_msi_noborder.ico"
"TargetName" = "8:Housing_voltage_current_icon_msi_noborder.ico"
"Tag" = "8:"
"Folder" = "8:_F82D7765A32648BAB39C4326E85541B0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
}
"Folder"
{
"{1525181F-901A-416C-8A58-119130FE478E}:_6EAA3B0EDA49429A95C308384DD1F375"
{
"Name" = "8:#1919"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:ProgramMenuFolder"
"Folders"
{
}
}
"{1525181F-901A-416C-8A58-119130FE478E}:_AEB95872DEDB4E87900A8932BA2CE852"
{
"Name" = "8:#1916"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:DesktopFolder"
"Folders"
{
}
}
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_F82D7765A32648BAB39C4326E85541B0"
{
"DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
"Name" = "8:#1925"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:TARGETDIR"
"Folders"
{
}
}
}
"LaunchCondition"
{
}
"Locator"
{
}
"MsiBootstrapper"
{
"LangId" = "3:1042"
"RequiresElevation" = "11:FALSE"
}
"Product"
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:Setup2"
"ProductCode" = "8:{15C4FC7E-976D-4684-80EA-8E2140B9A859}"
"PackageCode" = "8:{5299D5E8-DDAD-4326-B37F-53B18D5A8F07}"
"UpgradeCode" = "8:{147A3BAE-A279-4BA7-BE9F-83CC41CAA202}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:FALSE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.0.0"
"Manufacturer" = "8:temp"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:Setup2"
"Subject" = "8:"
"ARPCONTACT" = "8:temp"
"Keywords" = "8:"
"ARPCOMMENTS" = "8:"
"ARPURLINFOABOUT" = "8:"
"ARPPRODUCTICON" = "8:"
"ARPIconIndex" = "3:0"
"SearchPath" = "8:"
"UseSystemSearchPath" = "11:TRUE"
"TargetPlatform" = "3:0"
"PreBuildEvent" = "8:"
"PostBuildEvent" = "8:"
"RunPostBuildEvent" = "3:0"
}
"Registry"
{
"HKLM"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_650F554768E54370AD8CAD83DA943E23"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F45EC95F67EE4456B770CCC67971D294"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCU"
{
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F219A7BE6D6D465CAED0DDA58901D72A"
{
"Name" = "8:Software"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_98E9B206313243DDB32D4B046B00658A"
{
"Name" = "8:[Manufacturer]"
"Condition" = "8:"
"AlwaysCreate" = "11:FALSE"
"DeleteAtUninstall" = "11:FALSE"
"Transitive" = "11:FALSE"
"Keys"
{
}
"Values"
{
}
}
}
"Values"
{
}
}
}
}
"HKCR"
{
"Keys"
{
}
}
"HKU"
{
"Keys"
{
}
}
"HKPU"
{
"Keys"
{
}
}
}
"Sequences"
{
}
"Shortcut"
{
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_CB68EC0F73A042A385D52F688E6162D7"
{
"Name" = "8:Housing"
"Arguments" = "8:"
"Description" = "8:"
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_02533EBA1FAC4DEB9B107EA61601BC14"
"Folder" = "8:_AEB95872DEDB4E87900A8932BA2CE852"
"WorkingFolder" = "8:_F82D7765A32648BAB39C4326E85541B0"
"Icon" = "8:_D1BD1D2B7BD645FEAEE6F42B6F9A36DB"
"Feature" = "8:"
}
}
"UserInterface"
{
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_0B308C5E38B142E587684AEB482014EC"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_14A4EC7EA7D342C3BC6831E78BD4E435"
{
"Name" = "8:#1900"
"Sequence" = "3:1"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_34E38E05FECA465998D5B6F665639996"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"InstallAllUsersVisible"
{
"Name" = "8:InstallAllUsersVisible"
"DisplayName" = "8:#1059"
"Description" = "8:#1159"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4342B581903E4629AAD13C053607B2E1"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F7AB385A6F0C43BB8A2AFEBFED5B4A2D"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2E60A233285B4446BA6CE06913DA816E"
{
"Name" = "8:#1901"
"Sequence" = "3:1"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2CC95F9D59B144F9A708F7B909DE7767"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_67523E01A08C451CB71F5637D9BE5A80"
{
"Name" = "8:#1901"
"Sequence" = "3:2"
"Attributes" = "3:2"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_DD92AE63ACC9474C985852554FADD227"
{
"Sequence" = "3:100"
"DisplayName" = "8:진행률"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"ShowProgress"
{
"Name" = "8:ShowProgress"
"DisplayName" = "8:#1009"
"Description" = "8:#1109"
"Type" = "3:5"
"ContextData" = "8:1;True=1;False=0"
"Attributes" = "3:0"
"Setting" = "3:0"
"Value" = "3:1"
"DefaultValue" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_70480CFE59AE447EAEAAE11CEACD8C4C"
{
"Name" = "8:#1900"
"Sequence" = "3:2"
"Attributes" = "3:1"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_87A39E2855FD405BA7F8B2FA0A93326F"
{
"Sequence" = "3:300"
"DisplayName" = "8:설치 확인"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A7AA70FC792A4D3BA6B72ABACEF5456E"
{
"Sequence" = "3:200"
"DisplayName" = "8:설치 폴더"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D842F368CCB04DAD9C7714A50279AC8D"
{
"Sequence" = "3:100"
"DisplayName" = "8:환영"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"CopyrightWarning"
{
"Name" = "8:CopyrightWarning"
"DisplayName" = "8:#1002"
"Description" = "8:#1102"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1202"
"DefaultValue" = "8:#1202"
"UsePlugInResources" = "11:TRUE"
}
"Welcome"
{
"Name" = "8:Welcome"
"DisplayName" = "8:#1003"
"Description" = "8:#1103"
"Type" = "3:3"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1203"
"DefaultValue" = "8:#1203"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B264422F16F64C4FA6522010FA79020E"
{
"Name" = "8:#1902"
"Sequence" = "3:2"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D94354F2E87E40138E5EFD6E59235372"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_BACE15851713489DBEE682AFD3118C00"
{
"UseDynamicProperties" = "11:FALSE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
}
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E52EC45DF84545E9AD1463E1C3105822"
{
"Name" = "8:#1902"
"Sequence" = "3:1"
"Attributes" = "3:3"
"Dialogs"
{
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_33721C89DAEE4AA3B67B01E45BD0DD0C"
{
"Sequence" = "3:100"
"DisplayName" = "8:마침"
"UseDynamicProperties" = "11:TRUE"
"IsDependency" = "11:FALSE"
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
"Properties"
{
"BannerBitmap"
{
"Name" = "8:BannerBitmap"
"DisplayName" = "8:#1001"
"Description" = "8:#1101"
"Type" = "3:8"
"ContextData" = "8:Bitmap"
"Attributes" = "3:4"
"Setting" = "3:1"
"UsePlugInResources" = "11:TRUE"
}
"UpdateText"
{
"Name" = "8:UpdateText"
"DisplayName" = "8:#1058"
"Description" = "8:#1158"
"Type" = "3:15"
"ContextData" = "8:"
"Attributes" = "3:0"
"Setting" = "3:1"
"Value" = "8:#1258"
"DefaultValue" = "8:#1258"
"UsePlugInResources" = "11:TRUE"
}
}
}
}
}
}
"MergeModule"
{
}
"ProjectOutput"
{
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_02533EBA1FAC4DEB9B107EA61601BC14"
{
"SourcePath" = "8:..\\obj\\Release\\net9.0-windows\\apphost.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_F82D7765A32648BAB39C4326E85541B0"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
"ProjectOutputGroupRegister" = "3:1"
"OutputConfiguration" = "8:"
"OutputGroupCanonicalName" = "8:PublishItemsOutputGroup"
"OutputProjectGuid" = "8:{7364A567-F115-4ACE-9207-C6FDEEF0A394}"
"ShowKeyOutput" = "11:TRUE"
"ExcludeFilters"
{
}
}
}
}
}

274
UpgradeLog.htm

@ -1,274 +0,0 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
마이그레이션 보고서
</title><style>
/* Body style, for the entire document */
body
{
background: #F3F3F4;
color: #1E1E1F;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
padding: 0;
margin: 0;
}
/* Header1 style, used for the main title */
h1
{
padding: 10px 0px 10px 10px;
font-size: 21pt;
background-color: #E2E2E2;
border-bottom: 1px #C1C1C2 solid;
color: #201F20;
margin: 0;
font-weight: normal;
}
/* Header2 style, used for "Overview" and other sections */
h2
{
font-size: 18pt;
font-weight: normal;
padding: 15px 0 5px 0;
margin: 0;
}
/* Header3 style, used for sub-sections, such as project name */
h3
{
font-weight: normal;
font-size: 15pt;
margin: 0;
padding: 15px 0 5px 0;
background-color: transparent;
}
/* Color all hyperlinks one color */
a
{
color: #1382CE;
}
/* Table styles */
table
{
border-spacing: 0 0;
border-collapse: collapse;
font-size: 10pt;
}
table th
{
background: #E7E7E8;
text-align: left;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
table td
{
vertical-align: top;
padding: 3px 6px 5px 5px;
margin: 0px;
border: 1px solid #E7E7E8;
background: #F7F7F8;
}
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
.localLink
{
color: #1E1E1F;
background: #EEEEED;
text-decoration: none;
}
.localLink:hover
{
color: #1382CE;
background: #FFFF99;
text-decoration: none;
}
/* Center text, used in the over views cells that contain message level counts */
.textCentered
{
text-align: center;
}
/* The message cells in message tables should take up all avaliable space */
.messageCell
{
width: 100%;
}
/* Padding around the content after the h1 */
#content
{
padding: 0px 12px 12px 12px;
}
/* The overview table expands to width, with a max width of 97% */
#overview table
{
width: auto;
max-width: 75%;
}
/* The messages tables are always 97% width */
#messages table
{
width: 97%;
}
/* All Icons */
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
{
min-width:18px;
min-height:18px;
background-repeat:no-repeat;
background-position:center;
}
/* Success icon encoded */
.IconSuccessEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
}
/* Information icon encoded */
.IconInfoEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
}
/* Warning icon encoded */
.IconWarningEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
}
/* Error icon encoded */
.IconErrorEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
}
</style><script type="text/javascript" language="javascript">
// Startup
// Hook up the the loaded event for the document/window, to linkify the document content
var startupFunction = function() { linkifyElement("messages"); };
if(window.attachEvent)
{
window.attachEvent('onload', startupFunction);
}
else if (window.addEventListener)
{
window.addEventListener('load', startupFunction, false);
}
else
{
document.addEventListener('load', startupFunction, false);
}
// Toggles the visibility of table rows with the specified name
function toggleTableRowsByName(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
if(!!currentName && currentName.indexOf(name) == 0)
{
var isVisible = allRows[i].style.display == '';
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
}
}
}
function scrollToFirstVisibleRow(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
var isVisible = allRows[i].style.display == '';
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
{
allRows[i].scrollIntoView(true);
return true;
}
}
return false;
}
// Linkifies the specified text content, replaces candidate links with html links
function linkify(text)
{
if(!text || 0 === text.length)
{
return text;
}
// Find http, https and ftp links and replace them with hyper links
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
return text.replace(urlLink, '<a href="$&">$&</a>') ;
}
// Linkifies the specified element by ID
function linkifyElement(id)
{
var element = document.getElementById(id);
if(!!element)
{
element.innerHTML = linkify(element.innerHTML);
}
}
function ToggleMessageVisibility(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
toggleTableRowsByName("MessageRowClass" + projectName);
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
}
function ScrollToFirstVisibleMessage(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
// First try the 'Show messages' row
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
{
// Failed to find a visible row for 'Show messages', try an actual message row
scrollToFirstVisibleRow('MessageRowClass' + projectName);
}
}
</script></head><body><h1 _locID="ConversionReport">
마이그레이션 보고서 - </h1><div id="content"><h2 _locID="OverviewTitle">개요</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">프로젝트</th><th _locID="PathTableHeader">경로</th><th _locID="ErrorsTableHeader">오류</th><th _locID="WarningsTableHeader">경고</th><th _locID="MessagesTableHeader">메시지</th></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#Setup1">Setup1</a></strong></td><td>Setup1\Setup1.vdproj</td><td class="textCentered"><a href="#Setup1Error">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Housing">Housing</a></strong></td><td>Housing.csproj</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">솔루션</span></a></strong></td><td>Housing.sln</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">1</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">솔루션 및 프로젝트</h2><div id="messages"><a name="Setup1" /><h3>Setup1</h3><table><tr id="Setup1HeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassSetup1"><td class="IconErrorEncoded"><a name="Setup1Error" /></td><td class="messageCell"><strong>Setup1\Setup1.vdproj:
</strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 54435603-dbb4-11d2-8724-00a0c9a8b90c</span></td></tr></table><a name="Housing" /><h3>Housing</h3><table><tr id="HousingHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr><td class="IconInfoEncoded" /><td class="messageCell" _locID="NoMessagesRow">Housing 메시지가 기록되지 않았습니다.
</td></tr></table><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">솔루션</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
표시 1 추가 메시지
</a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>Housing.sln:
</strong><span>솔루션 파일은 마이그레이션하지 않아도 됩니다.</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
숨기기 1 추가 메시지
</a></td></tr></table></div></div></body></html>

274
UpgradeLog2.htm

@ -1,274 +0,0 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
마이그레이션 보고서
</title><style>
/* Body style, for the entire document */
body
{
background: #F3F3F4;
color: #1E1E1F;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
padding: 0;
margin: 0;
}
/* Header1 style, used for the main title */
h1
{
padding: 10px 0px 10px 10px;
font-size: 21pt;
background-color: #E2E2E2;
border-bottom: 1px #C1C1C2 solid;
color: #201F20;
margin: 0;
font-weight: normal;
}
/* Header2 style, used for "Overview" and other sections */
h2
{
font-size: 18pt;
font-weight: normal;
padding: 15px 0 5px 0;
margin: 0;
}
/* Header3 style, used for sub-sections, such as project name */
h3
{
font-weight: normal;
font-size: 15pt;
margin: 0;
padding: 15px 0 5px 0;
background-color: transparent;
}
/* Color all hyperlinks one color */
a
{
color: #1382CE;
}
/* Table styles */
table
{
border-spacing: 0 0;
border-collapse: collapse;
font-size: 10pt;
}
table th
{
background: #E7E7E8;
text-align: left;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
table td
{
vertical-align: top;
padding: 3px 6px 5px 5px;
margin: 0px;
border: 1px solid #E7E7E8;
background: #F7F7F8;
}
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
.localLink
{
color: #1E1E1F;
background: #EEEEED;
text-decoration: none;
}
.localLink:hover
{
color: #1382CE;
background: #FFFF99;
text-decoration: none;
}
/* Center text, used in the over views cells that contain message level counts */
.textCentered
{
text-align: center;
}
/* The message cells in message tables should take up all avaliable space */
.messageCell
{
width: 100%;
}
/* Padding around the content after the h1 */
#content
{
padding: 0px 12px 12px 12px;
}
/* The overview table expands to width, with a max width of 97% */
#overview table
{
width: auto;
max-width: 75%;
}
/* The messages tables are always 97% width */
#messages table
{
width: 97%;
}
/* All Icons */
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
{
min-width:18px;
min-height:18px;
background-repeat:no-repeat;
background-position:center;
}
/* Success icon encoded */
.IconSuccessEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
}
/* Information icon encoded */
.IconInfoEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
}
/* Warning icon encoded */
.IconWarningEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
}
/* Error icon encoded */
.IconErrorEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
}
</style><script type="text/javascript" language="javascript">
// Startup
// Hook up the the loaded event for the document/window, to linkify the document content
var startupFunction = function() { linkifyElement("messages"); };
if(window.attachEvent)
{
window.attachEvent('onload', startupFunction);
}
else if (window.addEventListener)
{
window.addEventListener('load', startupFunction, false);
}
else
{
document.addEventListener('load', startupFunction, false);
}
// Toggles the visibility of table rows with the specified name
function toggleTableRowsByName(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
if(!!currentName && currentName.indexOf(name) == 0)
{
var isVisible = allRows[i].style.display == '';
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
}
}
}
function scrollToFirstVisibleRow(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
var isVisible = allRows[i].style.display == '';
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
{
allRows[i].scrollIntoView(true);
return true;
}
}
return false;
}
// Linkifies the specified text content, replaces candidate links with html links
function linkify(text)
{
if(!text || 0 === text.length)
{
return text;
}
// Find http, https and ftp links and replace them with hyper links
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
return text.replace(urlLink, '<a href="$&">$&</a>') ;
}
// Linkifies the specified element by ID
function linkifyElement(id)
{
var element = document.getElementById(id);
if(!!element)
{
element.innerHTML = linkify(element.innerHTML);
}
}
function ToggleMessageVisibility(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
toggleTableRowsByName("MessageRowClass" + projectName);
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
}
function ScrollToFirstVisibleMessage(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
// First try the 'Show messages' row
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
{
// Failed to find a visible row for 'Show messages', try an actual message row
scrollToFirstVisibleRow('MessageRowClass' + projectName);
}
}
</script></head><body><h1 _locID="ConversionReport">
마이그레이션 보고서 - </h1><div id="content"><h2 _locID="OverviewTitle">개요</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">프로젝트</th><th _locID="PathTableHeader">경로</th><th _locID="ErrorsTableHeader">오류</th><th _locID="WarningsTableHeader">경고</th><th _locID="MessagesTableHeader">메시지</th></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#Setup1">Setup1</a></strong></td><td>Setup1\Setup1.vdproj</td><td class="textCentered"><a href="#Setup1Error">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Housing">Housing</a></strong></td><td>Housing.csproj</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">솔루션</span></a></strong></td><td>Housing.sln</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">1</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">솔루션 및 프로젝트</h2><div id="messages"><a name="Setup1" /><h3>Setup1</h3><table><tr id="Setup1HeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassSetup1"><td class="IconErrorEncoded"><a name="Setup1Error" /></td><td class="messageCell"><strong>Setup1\Setup1.vdproj:
</strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 54435603-dbb4-11d2-8724-00a0c9a8b90c</span></td></tr></table><a name="Housing" /><h3>Housing</h3><table><tr id="HousingHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr><td class="IconInfoEncoded" /><td class="messageCell" _locID="NoMessagesRow">Housing 메시지가 기록되지 않았습니다.
</td></tr></table><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">솔루션</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
표시 1 추가 메시지
</a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>Housing.sln:
</strong><span>솔루션 파일은 마이그레이션하지 않아도 됩니다.</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
숨기기 1 추가 메시지
</a></td></tr></table></div></div></body></html>

274
UpgradeLog3.htm

@ -1,274 +0,0 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
마이그레이션 보고서
</title><style>
/* Body style, for the entire document */
body
{
background: #F3F3F4;
color: #1E1E1F;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
padding: 0;
margin: 0;
}
/* Header1 style, used for the main title */
h1
{
padding: 10px 0px 10px 10px;
font-size: 21pt;
background-color: #E2E2E2;
border-bottom: 1px #C1C1C2 solid;
color: #201F20;
margin: 0;
font-weight: normal;
}
/* Header2 style, used for "Overview" and other sections */
h2
{
font-size: 18pt;
font-weight: normal;
padding: 15px 0 5px 0;
margin: 0;
}
/* Header3 style, used for sub-sections, such as project name */
h3
{
font-weight: normal;
font-size: 15pt;
margin: 0;
padding: 15px 0 5px 0;
background-color: transparent;
}
/* Color all hyperlinks one color */
a
{
color: #1382CE;
}
/* Table styles */
table
{
border-spacing: 0 0;
border-collapse: collapse;
font-size: 10pt;
}
table th
{
background: #E7E7E8;
text-align: left;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
table td
{
vertical-align: top;
padding: 3px 6px 5px 5px;
margin: 0px;
border: 1px solid #E7E7E8;
background: #F7F7F8;
}
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
.localLink
{
color: #1E1E1F;
background: #EEEEED;
text-decoration: none;
}
.localLink:hover
{
color: #1382CE;
background: #FFFF99;
text-decoration: none;
}
/* Center text, used in the over views cells that contain message level counts */
.textCentered
{
text-align: center;
}
/* The message cells in message tables should take up all avaliable space */
.messageCell
{
width: 100%;
}
/* Padding around the content after the h1 */
#content
{
padding: 0px 12px 12px 12px;
}
/* The overview table expands to width, with a max width of 97% */
#overview table
{
width: auto;
max-width: 75%;
}
/* The messages tables are always 97% width */
#messages table
{
width: 97%;
}
/* All Icons */
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
{
min-width:18px;
min-height:18px;
background-repeat:no-repeat;
background-position:center;
}
/* Success icon encoded */
.IconSuccessEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
}
/* Information icon encoded */
.IconInfoEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
}
/* Warning icon encoded */
.IconWarningEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
}
/* Error icon encoded */
.IconErrorEncoded
{
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
/* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
}
</style><script type="text/javascript" language="javascript">
// Startup
// Hook up the the loaded event for the document/window, to linkify the document content
var startupFunction = function() { linkifyElement("messages"); };
if(window.attachEvent)
{
window.attachEvent('onload', startupFunction);
}
else if (window.addEventListener)
{
window.addEventListener('load', startupFunction, false);
}
else
{
document.addEventListener('load', startupFunction, false);
}
// Toggles the visibility of table rows with the specified name
function toggleTableRowsByName(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
if(!!currentName && currentName.indexOf(name) == 0)
{
var isVisible = allRows[i].style.display == '';
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
}
}
}
function scrollToFirstVisibleRow(name)
{
var allRows = document.getElementsByTagName('tr');
for (i=0; i < allRows.length; i++)
{
var currentName = allRows[i].getAttribute('name');
var isVisible = allRows[i].style.display == '';
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
{
allRows[i].scrollIntoView(true);
return true;
}
}
return false;
}
// Linkifies the specified text content, replaces candidate links with html links
function linkify(text)
{
if(!text || 0 === text.length)
{
return text;
}
// Find http, https and ftp links and replace them with hyper links
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
return text.replace(urlLink, '<a href="$&">$&</a>') ;
}
// Linkifies the specified element by ID
function linkifyElement(id)
{
var element = document.getElementById(id);
if(!!element)
{
element.innerHTML = linkify(element.innerHTML);
}
}
function ToggleMessageVisibility(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
toggleTableRowsByName("MessageRowClass" + projectName);
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
}
function ScrollToFirstVisibleMessage(projectName)
{
if(!projectName || 0 === projectName.length)
{
return;
}
// First try the 'Show messages' row
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
{
// Failed to find a visible row for 'Show messages', try an actual message row
scrollToFirstVisibleRow('MessageRowClass' + projectName);
}
}
</script></head><body><h1 _locID="ConversionReport">
마이그레이션 보고서 - </h1><div id="content"><h2 _locID="OverviewTitle">개요</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">프로젝트</th><th _locID="PathTableHeader">경로</th><th _locID="ErrorsTableHeader">오류</th><th _locID="WarningsTableHeader">경고</th><th _locID="MessagesTableHeader">메시지</th></tr><tr><td class="IconErrorEncoded" /><td><strong><a href="#Setup1">Setup1</a></strong></td><td>Setup1\Setup1.vdproj</td><td class="textCentered"><a href="#Setup1Error">1</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Housing">Housing</a></strong></td><td>Housing.csproj</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">솔루션</span></a></strong></td><td>Housing.sln</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">1</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">솔루션 및 프로젝트</h2><div id="messages"><a name="Setup1" /><h3>Setup1</h3><table><tr id="Setup1HeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="ErrorRowClassSetup1"><td class="IconErrorEncoded"><a name="Setup1Error" /></td><td class="messageCell"><strong>Setup1\Setup1.vdproj:
</strong><span>이 프로젝트 형식을 기반으로 하는 애플리케이션을 찾지 못했습니다. 추가 정보를 보려면 이 링크를 확인하십시오. 54435603-dbb4-11d2-8724-00a0c9a8b90c</span></td></tr></table><a name="Housing" /><h3>Housing</h3><table><tr id="HousingHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr><td class="IconInfoEncoded" /><td class="messageCell" _locID="NoMessagesRow">Housing 메시지가 기록되지 않았습니다.
</td></tr></table><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">솔루션</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">메시지</th></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
표시 1 추가 메시지
</a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>Housing.sln:
</strong><span>솔루션 파일은 마이그레이션하지 않아도 됩니다.</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
숨기기 1 추가 메시지
</a></td></tr></table></div></div></body></html>

40
init.sql

@ -74,25 +74,37 @@ BEGIN
END; END;
GO GO
IF NOT EXISTS DECLARE @DefaultOperatorProcesses TABLE
( (
SELECT 1 [ProcessName] NVARCHAR(30) NOT NULL PRIMARY KEY
FROM dbo.Operator_Process );
WHERE [Operator] = N'su'
AND [ProcessName] = N'Housing' INSERT INTO @DefaultOperatorProcesses
(
[ProcessName]
) )
BEGIN VALUES
INSERT INTO dbo.Operator_Process (N'Housing'),
( (N'Calibration'),
(N'EOL'),
(N'Marking');
INSERT INTO dbo.Operator_Process
(
[Operator], [Operator],
[ProcessName] [ProcessName]
) )
VALUES SELECT
(
N'su', N'su',
N'Housing' defaultProcess.[ProcessName]
); FROM @DefaultOperatorProcesses AS defaultProcess
END; WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Operator_Process AS operatorProcess
WHERE operatorProcess.[Operator] = N'su'
AND operatorProcess.[ProcessName] = defaultProcess.[ProcessName]
);
GO GO
CREATE OR ALTER PROCEDURE dbo.CheckOperator CREATE OR ALTER PROCEDURE dbo.CheckOperator

575
installer/HousingSetup.sed

@ -1,575 +0,0 @@
[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=0
HideExtractAnimation=1
UseLongFileName=1
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[Strings]
InstallPrompt=
DisplayLicense=
FinishMessage=AMO Housing setup completed.
TargetName=C:\Users\guseo\Desktop\AMO_Housing\installer\output\HousingSetup.exe
FriendlyName=AMO Housing Setup
AppLaunched=install.cmd
PostInstallCmd=<None>
AdminQuietInstCmd=install.cmd
UserQuietInstCmd=install.cmd
FILE0="Accessibility.dll"
FILE1="Azure.Core.dll"
FILE2="Azure.Identity.dll"
FILE3="clretwrc.dll"
FILE4="clrgc.dll"
FILE5="clrgcexp.dll"
FILE6="clrjit.dll"
FILE7="coreclr.dll"
FILE8="createdump.exe"
FILE9="D3DCompiler_47_cor3.dll"
FILE10="Database.ini"
FILE11="DirectWriteForwarder.dll"
FILE12="Hardware.ini"
FILE13="hostfxr.dll"
FILE14="hostpolicy.dll"
FILE15="Housing.deps.json"
FILE16="Housing.dll"
FILE17="Housing.exe"
FILE18="Housing.pdb"
FILE19="Housing.runtimeconfig.json"
FILE20="Housing_voltage_current_icon.ico"
FILE21="init.sql"
FILE22="InspectionSettings.ini"
FILE23="install.cmd"
FILE24="install.ps1"
FILE25="Microsoft.Bcl.AsyncInterfaces.dll"
FILE26="Microsoft.Bcl.Cryptography.dll"
FILE27="Microsoft.CSharp.dll"
FILE28="Microsoft.Data.SqlClient.dll"
FILE29="Microsoft.Data.SqlClient.SNI.dll"
FILE30="Microsoft.DiaSymReader.Native.amd64.dll"
FILE31="Microsoft.Extensions.Caching.Abstractions.dll"
FILE32="Microsoft.Extensions.Caching.Memory.dll"
FILE33="Microsoft.Extensions.DependencyInjection.Abstractions.dll"
FILE34="Microsoft.Extensions.Logging.Abstractions.dll"
FILE35="Microsoft.Extensions.Options.dll"
FILE36="Microsoft.Extensions.Primitives.dll"
FILE37="Microsoft.Identity.Client.dll"
FILE38="Microsoft.Identity.Client.Extensions.Msal.dll"
FILE39="Microsoft.IdentityModel.Abstractions.dll"
FILE40="Microsoft.IdentityModel.JsonWebTokens.dll"
FILE41="Microsoft.IdentityModel.Logging.dll"
FILE42="Microsoft.IdentityModel.Protocols.dll"
FILE43="Microsoft.IdentityModel.Protocols.OpenIdConnect.dll"
FILE44="Microsoft.IdentityModel.Tokens.dll"
FILE45="Microsoft.SqlServer.Server.dll"
FILE46="Microsoft.VisualBasic.Core.dll"
FILE47="Microsoft.VisualBasic.dll"
FILE48="Microsoft.Win32.Primitives.dll"
FILE49="Microsoft.Win32.Registry.AccessControl.dll"
FILE50="Microsoft.Win32.Registry.dll"
FILE51="Microsoft.Win32.SystemEvents.dll"
FILE52="mscordaccore.dll"
FILE53="mscordaccore_amd64_amd64_9.0.1726.26416.dll"
FILE54="mscordbi.dll"
FILE55="mscorlib.dll"
FILE56="mscorrc.dll"
FILE57="msquic.dll"
FILE58="netstandard.dll"
FILE59="PenImc_cor3.dll"
FILE60="PresentationCore.dll"
FILE61="PresentationFramework.Aero.dll"
FILE62="PresentationFramework.Aero2.dll"
FILE63="PresentationFramework.AeroLite.dll"
FILE64="PresentationFramework.Classic.dll"
FILE65="PresentationFramework.dll"
FILE66="PresentationFramework.Fluent.dll"
FILE67="PresentationFramework.Luna.dll"
FILE68="PresentationFramework.Royale.dll"
FILE69="PresentationFramework-SystemCore.dll"
FILE70="PresentationFramework-SystemData.dll"
FILE71="PresentationFramework-SystemDrawing.dll"
FILE72="PresentationFramework-SystemXml.dll"
FILE73="PresentationFramework-SystemXmlLinq.dll"
FILE74="PresentationNative_cor3.dll"
FILE75="PresentationUI.dll"
FILE76="ReachFramework.dll"
FILE77="System.AppContext.dll"
FILE78="System.Buffers.dll"
FILE79="System.ClientModel.dll"
FILE80="System.CodeDom.dll"
FILE81="System.Collections.Concurrent.dll"
FILE82="System.Collections.dll"
FILE83="System.Collections.Immutable.dll"
FILE84="System.Collections.NonGeneric.dll"
FILE85="System.Collections.Specialized.dll"
FILE86="System.ComponentModel.Annotations.dll"
FILE87="System.ComponentModel.DataAnnotations.dll"
FILE88="System.ComponentModel.dll"
FILE89="System.ComponentModel.EventBasedAsync.dll"
FILE90="System.ComponentModel.Primitives.dll"
FILE91="System.ComponentModel.TypeConverter.dll"
FILE92="System.Configuration.ConfigurationManager.dll"
FILE93="System.Configuration.dll"
FILE94="System.Console.dll"
FILE95="System.Core.dll"
FILE96="System.Data.Common.dll"
FILE97="System.Data.DataSetExtensions.dll"
FILE98="System.Data.dll"
FILE99="System.Diagnostics.Contracts.dll"
FILE100="System.Diagnostics.Debug.dll"
FILE101="System.Diagnostics.DiagnosticSource.dll"
FILE102="System.Diagnostics.EventLog.dll"
FILE103="System.Diagnostics.EventLog.Messages.dll"
FILE104="System.Diagnostics.FileVersionInfo.dll"
FILE105="System.Diagnostics.PerformanceCounter.dll"
FILE106="System.Diagnostics.Process.dll"
FILE107="System.Diagnostics.StackTrace.dll"
FILE108="System.Diagnostics.TextWriterTraceListener.dll"
FILE109="System.Diagnostics.Tools.dll"
FILE110="System.Diagnostics.TraceSource.dll"
FILE111="System.Diagnostics.Tracing.dll"
FILE112="System.DirectoryServices.dll"
FILE113="System.dll"
FILE114="System.Drawing.dll"
FILE115="System.Drawing.Primitives.dll"
FILE116="System.Dynamic.Runtime.dll"
FILE117="System.Formats.Asn1.dll"
FILE118="System.Formats.Nrbf.dll"
FILE119="System.Formats.Tar.dll"
FILE120="System.Globalization.Calendars.dll"
FILE121="System.Globalization.dll"
FILE122="System.Globalization.Extensions.dll"
FILE123="System.IdentityModel.Tokens.Jwt.dll"
FILE124="System.IO.Compression.Brotli.dll"
FILE125="System.IO.Compression.dll"
FILE126="System.IO.Compression.FileSystem.dll"
FILE127="System.IO.Compression.Native.dll"
FILE128="System.IO.Compression.ZipFile.dll"
FILE129="System.IO.dll"
FILE130="System.IO.FileSystem.AccessControl.dll"
FILE131="System.IO.FileSystem.dll"
FILE132="System.IO.FileSystem.DriveInfo.dll"
FILE133="System.IO.FileSystem.Primitives.dll"
FILE134="System.IO.FileSystem.Watcher.dll"
FILE135="System.IO.IsolatedStorage.dll"
FILE136="System.IO.MemoryMappedFiles.dll"
FILE137="System.IO.Packaging.dll"
FILE138="System.IO.Pipelines.dll"
FILE139="System.IO.Pipes.AccessControl.dll"
FILE140="System.IO.Pipes.dll"
FILE141="System.IO.Ports.dll"
FILE142="System.IO.UnmanagedMemoryStream.dll"
FILE143="System.Linq.dll"
FILE144="System.Linq.Expressions.dll"
FILE145="System.Linq.Parallel.dll"
FILE146="System.Linq.Queryable.dll"
FILE147="System.Memory.Data.dll"
FILE148="System.Memory.dll"
FILE149="System.Net.dll"
FILE150="System.Net.Http.dll"
FILE151="System.Net.Http.Json.dll"
FILE152="System.Net.HttpListener.dll"
FILE153="System.Net.Mail.dll"
FILE154="System.Net.NameResolution.dll"
FILE155="System.Net.NetworkInformation.dll"
FILE156="System.Net.Ping.dll"
FILE157="System.Net.Primitives.dll"
FILE158="System.Net.Quic.dll"
FILE159="System.Net.Requests.dll"
FILE160="System.Net.Security.dll"
FILE161="System.Net.ServicePoint.dll"
FILE162="System.Net.Sockets.dll"
FILE163="System.Net.WebClient.dll"
FILE164="System.Net.WebHeaderCollection.dll"
FILE165="System.Net.WebProxy.dll"
FILE166="System.Net.WebSockets.Client.dll"
FILE167="System.Net.WebSockets.dll"
FILE168="System.Numerics.dll"
FILE169="System.Numerics.Vectors.dll"
FILE170="System.ObjectModel.dll"
FILE171="System.Printing.dll"
FILE172="System.Private.CoreLib.dll"
FILE173="System.Private.DataContractSerialization.dll"
FILE174="System.Private.Uri.dll"
FILE175="System.Private.Xml.dll"
FILE176="System.Private.Xml.Linq.dll"
FILE177="System.Reflection.DispatchProxy.dll"
FILE178="System.Reflection.dll"
FILE179="System.Reflection.Emit.dll"
FILE180="System.Reflection.Emit.ILGeneration.dll"
FILE181="System.Reflection.Emit.Lightweight.dll"
FILE182="System.Reflection.Extensions.dll"
FILE183="System.Reflection.Metadata.dll"
FILE184="System.Reflection.Primitives.dll"
FILE185="System.Reflection.TypeExtensions.dll"
FILE186="System.Resources.Extensions.dll"
FILE187="System.Resources.Reader.dll"
FILE188="System.Resources.ResourceManager.dll"
FILE189="System.Resources.Writer.dll"
FILE190="System.Runtime.CompilerServices.Unsafe.dll"
FILE191="System.Runtime.CompilerServices.VisualC.dll"
FILE192="System.Runtime.dll"
FILE193="System.Runtime.Extensions.dll"
FILE194="System.Runtime.Handles.dll"
FILE195="System.Runtime.InteropServices.dll"
FILE196="System.Runtime.InteropServices.JavaScript.dll"
FILE197="System.Runtime.InteropServices.RuntimeInformation.dll"
FILE198="System.Runtime.Intrinsics.dll"
FILE199="System.Runtime.Loader.dll"
FILE200="System.Runtime.Numerics.dll"
FILE201="System.Runtime.Serialization.dll"
FILE202="System.Runtime.Serialization.Formatters.dll"
FILE203="System.Runtime.Serialization.Json.dll"
FILE204="System.Runtime.Serialization.Primitives.dll"
FILE205="System.Runtime.Serialization.Xml.dll"
FILE206="System.Security.AccessControl.dll"
FILE207="System.Security.Claims.dll"
FILE208="System.Security.Cryptography.Algorithms.dll"
FILE209="System.Security.Cryptography.Cng.dll"
FILE210="System.Security.Cryptography.Csp.dll"
FILE211="System.Security.Cryptography.dll"
FILE212="System.Security.Cryptography.Encoding.dll"
FILE213="System.Security.Cryptography.OpenSsl.dll"
FILE214="System.Security.Cryptography.Pkcs.dll"
FILE215="System.Security.Cryptography.Primitives.dll"
FILE216="System.Security.Cryptography.ProtectedData.dll"
FILE217="System.Security.Cryptography.X509Certificates.dll"
FILE218="System.Security.Cryptography.Xml.dll"
FILE219="System.Security.dll"
FILE220="System.Security.Permissions.dll"
FILE221="System.Security.Principal.dll"
FILE222="System.Security.Principal.Windows.dll"
FILE223="System.Security.SecureString.dll"
FILE224="System.ServiceModel.Web.dll"
FILE225="System.ServiceProcess.dll"
FILE226="System.Text.Encoding.CodePages.dll"
FILE227="System.Text.Encoding.dll"
FILE228="System.Text.Encoding.Extensions.dll"
FILE229="System.Text.Encodings.Web.dll"
FILE230="System.Text.Json.dll"
FILE231="System.Text.RegularExpressions.dll"
FILE232="System.Threading.AccessControl.dll"
FILE233="System.Threading.Channels.dll"
FILE234="System.Threading.dll"
FILE235="System.Threading.Overlapped.dll"
FILE236="System.Threading.Tasks.Dataflow.dll"
FILE237="System.Threading.Tasks.dll"
FILE238="System.Threading.Tasks.Extensions.dll"
FILE239="System.Threading.Tasks.Parallel.dll"
FILE240="System.Threading.Thread.dll"
FILE241="System.Threading.ThreadPool.dll"
FILE242="System.Threading.Timer.dll"
FILE243="System.Transactions.dll"
FILE244="System.Transactions.Local.dll"
FILE245="System.ValueTuple.dll"
FILE246="System.Web.dll"
FILE247="System.Web.HttpUtility.dll"
FILE248="System.Windows.Controls.Ribbon.dll"
FILE249="System.Windows.dll"
FILE250="System.Windows.Extensions.dll"
FILE251="System.Windows.Input.Manipulations.dll"
FILE252="System.Windows.Presentation.dll"
FILE253="System.Xaml.dll"
FILE254="System.Xml.dll"
FILE255="System.Xml.Linq.dll"
FILE256="System.Xml.ReaderWriter.dll"
FILE257="System.Xml.Serialization.dll"
FILE258="System.Xml.XDocument.dll"
FILE259="System.Xml.XmlDocument.dll"
FILE260="System.Xml.XmlSerializer.dll"
FILE261="System.Xml.XPath.dll"
FILE262="System.Xml.XPath.XDocument.dll"
FILE263="UIAutomationClient.dll"
FILE264="UIAutomationClientSideProviders.dll"
FILE265="UIAutomationProvider.dll"
FILE266="UIAutomationTypes.dll"
FILE267="vcruntime140_cor3.dll"
FILE268="WindowsBase.dll"
FILE269="wpfgfx_cor3.dll"
[SourceFiles]
SourceFiles0=C:\Users\guseo\Desktop\AMO_Housing\installer\staging\
[SourceFiles0]
%FILE0%=
%FILE1%=
%FILE2%=
%FILE3%=
%FILE4%=
%FILE5%=
%FILE6%=
%FILE7%=
%FILE8%=
%FILE9%=
%FILE10%=
%FILE11%=
%FILE12%=
%FILE13%=
%FILE14%=
%FILE15%=
%FILE16%=
%FILE17%=
%FILE18%=
%FILE19%=
%FILE20%=
%FILE21%=
%FILE22%=
%FILE23%=
%FILE24%=
%FILE25%=
%FILE26%=
%FILE27%=
%FILE28%=
%FILE29%=
%FILE30%=
%FILE31%=
%FILE32%=
%FILE33%=
%FILE34%=
%FILE35%=
%FILE36%=
%FILE37%=
%FILE38%=
%FILE39%=
%FILE40%=
%FILE41%=
%FILE42%=
%FILE43%=
%FILE44%=
%FILE45%=
%FILE46%=
%FILE47%=
%FILE48%=
%FILE49%=
%FILE50%=
%FILE51%=
%FILE52%=
%FILE53%=
%FILE54%=
%FILE55%=
%FILE56%=
%FILE57%=
%FILE58%=
%FILE59%=
%FILE60%=
%FILE61%=
%FILE62%=
%FILE63%=
%FILE64%=
%FILE65%=
%FILE66%=
%FILE67%=
%FILE68%=
%FILE69%=
%FILE70%=
%FILE71%=
%FILE72%=
%FILE73%=
%FILE74%=
%FILE75%=
%FILE76%=
%FILE77%=
%FILE78%=
%FILE79%=
%FILE80%=
%FILE81%=
%FILE82%=
%FILE83%=
%FILE84%=
%FILE85%=
%FILE86%=
%FILE87%=
%FILE88%=
%FILE89%=
%FILE90%=
%FILE91%=
%FILE92%=
%FILE93%=
%FILE94%=
%FILE95%=
%FILE96%=
%FILE97%=
%FILE98%=
%FILE99%=
%FILE100%=
%FILE101%=
%FILE102%=
%FILE103%=
%FILE104%=
%FILE105%=
%FILE106%=
%FILE107%=
%FILE108%=
%FILE109%=
%FILE110%=
%FILE111%=
%FILE112%=
%FILE113%=
%FILE114%=
%FILE115%=
%FILE116%=
%FILE117%=
%FILE118%=
%FILE119%=
%FILE120%=
%FILE121%=
%FILE122%=
%FILE123%=
%FILE124%=
%FILE125%=
%FILE126%=
%FILE127%=
%FILE128%=
%FILE129%=
%FILE130%=
%FILE131%=
%FILE132%=
%FILE133%=
%FILE134%=
%FILE135%=
%FILE136%=
%FILE137%=
%FILE138%=
%FILE139%=
%FILE140%=
%FILE141%=
%FILE142%=
%FILE143%=
%FILE144%=
%FILE145%=
%FILE146%=
%FILE147%=
%FILE148%=
%FILE149%=
%FILE150%=
%FILE151%=
%FILE152%=
%FILE153%=
%FILE154%=
%FILE155%=
%FILE156%=
%FILE157%=
%FILE158%=
%FILE159%=
%FILE160%=
%FILE161%=
%FILE162%=
%FILE163%=
%FILE164%=
%FILE165%=
%FILE166%=
%FILE167%=
%FILE168%=
%FILE169%=
%FILE170%=
%FILE171%=
%FILE172%=
%FILE173%=
%FILE174%=
%FILE175%=
%FILE176%=
%FILE177%=
%FILE178%=
%FILE179%=
%FILE180%=
%FILE181%=
%FILE182%=
%FILE183%=
%FILE184%=
%FILE185%=
%FILE186%=
%FILE187%=
%FILE188%=
%FILE189%=
%FILE190%=
%FILE191%=
%FILE192%=
%FILE193%=
%FILE194%=
%FILE195%=
%FILE196%=
%FILE197%=
%FILE198%=
%FILE199%=
%FILE200%=
%FILE201%=
%FILE202%=
%FILE203%=
%FILE204%=
%FILE205%=
%FILE206%=
%FILE207%=
%FILE208%=
%FILE209%=
%FILE210%=
%FILE211%=
%FILE212%=
%FILE213%=
%FILE214%=
%FILE215%=
%FILE216%=
%FILE217%=
%FILE218%=
%FILE219%=
%FILE220%=
%FILE221%=
%FILE222%=
%FILE223%=
%FILE224%=
%FILE225%=
%FILE226%=
%FILE227%=
%FILE228%=
%FILE229%=
%FILE230%=
%FILE231%=
%FILE232%=
%FILE233%=
%FILE234%=
%FILE235%=
%FILE236%=
%FILE237%=
%FILE238%=
%FILE239%=
%FILE240%=
%FILE241%=
%FILE242%=
%FILE243%=
%FILE244%=
%FILE245%=
%FILE246%=
%FILE247%=
%FILE248%=
%FILE249%=
%FILE250%=
%FILE251%=
%FILE252%=
%FILE253%=
%FILE254%=
%FILE255%=
%FILE256%=
%FILE257%=
%FILE258%=
%FILE259%=
%FILE260%=
%FILE261%=
%FILE262%=
%FILE263%=
%FILE264%=
%FILE265%=
%FILE266%=
%FILE267%=
%FILE268%=
%FILE269%=

BIN
installer/output/HousingSetup.exe

Binary file not shown.

BIN
installer/staging/Accessibility.dll

Binary file not shown.

BIN
installer/staging/Azure.Core.dll

Binary file not shown.

BIN
installer/staging/Azure.Identity.dll

Binary file not shown.

BIN
installer/staging/D3DCompiler_47_cor3.dll

Binary file not shown.

13
installer/staging/Database.ini

@ -1,13 +0,0 @@
[Database]
IP=127.0.0.1
Database=Housing
DbId=sa
DbPw=your_password
Encrypt=True
TrustServerCertificate=True
Timeout=5
[Login]
Procedure=dbo.CheckOperator
ProcessName=Housing
OfflinePreview=true

BIN
installer/staging/DirectWriteForwarder.dll

Binary file not shown.

78
installer/staging/Hardware.ini

@ -1,78 +0,0 @@
[Board]
PortName=COM5
BaudRate=115200
ReadTimeout=5000
PreConnectCommand=x00o
ConnectCommand=x00c_001101:owt28006727ea97c7801
ReadIdCommand=x00c_001101:ow2800326003e
PostReadIdCommand=x00o
CalDefaultCommand=x00c_001001:owt28006727ea97c7801
EndToken=<end>
DtrEnable=false
RtsEnable=false
[BarcodeScanner]
Enabled=true
PortName=Auto
BaudRate=9600
ReadTimeout=500
IdleCommitMilliseconds=250
DtrEnable=true
RtsEnable=true
[StartSignal]
; USB-6501
Enabled=true
Connection=Ni6501
PhysicalChannel=Dev1/port0/line0
ActiveState=High
PollIntervalMilliseconds=50
TimeoutMilliseconds=30000
PostSignalDelayMilliseconds=2000
RequireInactiveBeforeStart=true
[Equipment]
; V 출력: Keysight 34465A DMM 값
; A 출력: Keysight E36233A Power Supply CH1 Current 값
; USB 장비는 Keysight Connection Expert 또는 NI MAX에서 보이는 VISA 주소를 Resource
Timeout=5000
SettleMilliseconds=300
PreBoardCommand=VOLT 5, (@2);OUTP ON, (@2)
PreBoardDelayMilliseconds=2000
LogoutCommand=OUTP OFF, (@1);OUTP OFF, (@2)
; 34465A DMM
VoltageConnection=LAN
VoltageResource=
VoltageIdnMatch=34465A
VoltageHost=192.168.200.3
VoltagePort=5025
VoltageSetupCommand=
VoltageReadCommand=MEAS:VOLT:DC?
; E36233A Power Supply
CurrentConnection=LAN
CurrentResource=
CurrentIdnMatch=E36233A
; Change this to the E36233A LAN IP if the instrument uses a different address.
CurrentHost=192.168.200.111
CurrentPort=5025
CurrentPortName=
CurrentBaudRate=9600
CurrentTerminator=LF
CurrentSetupCommand=OUTP ON, (@1)
CurrentCleanupCommand=OUTP OFF, (@1)
CurrentReadCommand=MEAS:CURR? (@1)
; COM 포트로 잡히는 장비 예시:
; VoltageConnection=Serial
; VoltagePortName=Auto
; VoltageBaudRate=115200
; LAN 장비 예시:
; VoltageConnection=Tcp
; VoltageHost=192.168.0.10
; VoltagePort=5025
; E36233A 파워서플라이에서 CH1 전압까지 읽고 싶을 때 예시:
; VoltageReadCommand=MEAS:VOLT? CH1

1453
installer/staging/Housing.deps.json

File diff suppressed because it is too large

BIN
installer/staging/Housing.dll

Binary file not shown.

BIN
installer/staging/Housing.exe

Binary file not shown.

BIN
installer/staging/Housing.pdb

Binary file not shown.

20
installer/staging/Housing.runtimeconfig.json

@ -1,20 +0,0 @@
{
"runtimeOptions": {
"tfm": "net9.0",
"includedFrameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "9.0.17"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "9.0.17"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
}
}
}

BIN
installer/staging/Housing_voltage_current_icon.ico

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

5
installer/staging/InspectionSettings.ini

@ -1,5 +0,0 @@
[Judgement]
VMin=0.00
VMax=9.99
AMin=0.00
AMax=9.99

BIN
installer/staging/Microsoft.Bcl.AsyncInterfaces.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Bcl.Cryptography.dll

Binary file not shown.

BIN
installer/staging/Microsoft.CSharp.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Data.SqlClient.SNI.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Data.SqlClient.dll

Binary file not shown.

BIN
installer/staging/Microsoft.DiaSymReader.Native.amd64.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.Caching.Abstractions.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.Caching.Memory.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.DependencyInjection.Abstractions.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.Logging.Abstractions.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.Options.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Extensions.Primitives.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Identity.Client.Extensions.Msal.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Identity.Client.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.Abstractions.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.JsonWebTokens.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.Logging.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.Protocols.dll

Binary file not shown.

BIN
installer/staging/Microsoft.IdentityModel.Tokens.dll

Binary file not shown.

BIN
installer/staging/Microsoft.SqlServer.Server.dll

Binary file not shown.

BIN
installer/staging/Microsoft.VisualBasic.Core.dll

Binary file not shown.

BIN
installer/staging/Microsoft.VisualBasic.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Win32.Primitives.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Win32.Registry.AccessControl.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Win32.Registry.dll

Binary file not shown.

BIN
installer/staging/Microsoft.Win32.SystemEvents.dll

Binary file not shown.

BIN
installer/staging/PenImc_cor3.dll

Binary file not shown.

BIN
installer/staging/PresentationCore.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework-SystemCore.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework-SystemData.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework-SystemDrawing.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework-SystemXml.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework-SystemXmlLinq.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Aero.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Aero2.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.AeroLite.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Classic.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Fluent.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Luna.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.Royale.dll

Binary file not shown.

BIN
installer/staging/PresentationFramework.dll

Binary file not shown.

BIN
installer/staging/PresentationNative_cor3.dll

Binary file not shown.

BIN
installer/staging/PresentationUI.dll

Binary file not shown.

BIN
installer/staging/ReachFramework.dll

Binary file not shown.

BIN
installer/staging/System.AppContext.dll

Binary file not shown.

BIN
installer/staging/System.Buffers.dll

Binary file not shown.

BIN
installer/staging/System.ClientModel.dll

Binary file not shown.

BIN
installer/staging/System.CodeDom.dll

Binary file not shown.

BIN
installer/staging/System.Collections.Concurrent.dll

Binary file not shown.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save