Browse Source

marking gui

master
seuuung 2 months ago
commit
efa1a6600d
  1. BIN
      .vs/marking_gui.slnx/FileContentIndex/0f300553-b2b1-487e-84ab-a8db20762c77.vsidx
  2. BIN
      .vs/marking_gui.slnx/FileContentIndex/162264f1-2546-4ef0-9673-9650abefef99.vsidx
  3. BIN
      .vs/marking_gui.slnx/FileContentIndex/2b3efbed-7f8f-4cce-ac73-0752c9498731.vsidx
  4. BIN
      .vs/marking_gui.slnx/FileContentIndex/9a507dce-807b-4786-8496-a7266205d746.vsidx
  5. BIN
      .vs/marking_gui.slnx/FileContentIndex/fd87be81-02e0-4660-95e1-727749e9f7c2.vsidx
  6. BIN
      .vs/marking_gui.slnx/v18/.suo
  7. 52
      .vs/marking_gui.slnx/v18/DocumentLayout.backup.json
  8. 52
      .vs/marking_gui.slnx/v18/DocumentLayout.json
  9. BIN
      login_screenshot.png
  10. BIN
      main_screenshot.png
  11. 3
      marking_gui.slnx
  12. 11
      marking_gui/App.config
  13. 8
      marking_gui/App.xaml
  14. 39
      marking_gui/App.xaml.cs
  15. 293
      marking_gui/MainWindow.xaml
  16. 288
      marking_gui/MainWindow.xaml.cs
  17. 45
      marking_gui/Models/MeasurementLimits.cs
  18. 28
      marking_gui/Models/Product.cs
  19. 52
      marking_gui/Properties/AssemblyInfo.cs
  20. 71
      marking_gui/Properties/Resources.Designer.cs
  21. 117
      marking_gui/Properties/Resources.resx
  22. 30
      marking_gui/Properties/Settings.Designer.cs
  23. 7
      marking_gui/Properties/Settings.settings
  24. 30
      marking_gui/Services/MockDatabase.cs
  25. 58
      marking_gui/Services/MockMeasurer.cs
  26. 63
      marking_gui/Services/MssqlDatabaseService.cs
  27. 81
      marking_gui/SettingsWindow.xaml
  28. 59
      marking_gui/SettingsWindow.xaml.cs
  29. 138
      marking_gui/StartupLoginWindow.xaml
  30. 71
      marking_gui/StartupLoginWindow.xaml.cs
  31. BIN
      marking_gui/bin/Debug/marking_gui.exe
  32. 11
      marking_gui/bin/Debug/marking_gui.exe.config
  33. BIN
      marking_gui/bin/Debug/marking_gui.pdb
  34. 119
      marking_gui/marking_gui.csproj
  35. 4
      marking_gui/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
  36. 55
      marking_gui/obj/Debug/App.g.cs
  37. 55
      marking_gui/obj/Debug/App.g.i.cs
  38. BIN
      marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
  39. BIN
      marking_gui/obj/Debug/MainWindow.baml
  40. 295
      marking_gui/obj/Debug/MainWindow.g.cs
  41. 295
      marking_gui/obj/Debug/MainWindow.g.i.cs
  42. BIN
      marking_gui/obj/Debug/SettingsWindow.baml
  43. 155
      marking_gui/obj/Debug/SettingsWindow.g.cs
  44. 155
      marking_gui/obj/Debug/SettingsWindow.g.i.cs
  45. BIN
      marking_gui/obj/Debug/StartupLoginWindow.baml
  46. 182
      marking_gui/obj/Debug/StartupLoginWindow.g.cs
  47. 182
      marking_gui/obj/Debug/StartupLoginWindow.g.i.cs
  48. BIN
      marking_gui/obj/Debug/marking_gui.Properties.Resources.resources
  49. BIN
      marking_gui/obj/Debug/marking_gui.csproj.AssemblyReference.cache
  50. 1
      marking_gui/obj/Debug/marking_gui.csproj.CoreCompileInputs.cache
  51. 19
      marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt
  52. BIN
      marking_gui/obj/Debug/marking_gui.csproj.GenerateResource.cache
  53. BIN
      marking_gui/obj/Debug/marking_gui.exe
  54. BIN
      marking_gui/obj/Debug/marking_gui.g.resources
  55. BIN
      marking_gui/obj/Debug/marking_gui.pdb
  56. 20
      marking_gui/obj/Debug/marking_gui_MarkupCompile.cache
  57. 20
      marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache
  58. 4
      marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref
  59. 4
      marking_gui/obj/Debug/marking_gui_MarkupCompile.lref
  60. 162
      program_flow.md

BIN
.vs/marking_gui.slnx/FileContentIndex/0f300553-b2b1-487e-84ab-a8db20762c77.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/162264f1-2546-4ef0-9673-9650abefef99.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/2b3efbed-7f8f-4cce-ac73-0752c9498731.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/9a507dce-807b-4786-8496-a7266205d746.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/FileContentIndex/fd87be81-02e0-4660-95e1-727749e9f7c2.vsidx

Binary file not shown.

BIN
.vs/marking_gui.slnx/v18/.suo

Binary file not shown.

52
.vs/marking_gui.slnx/v18/DocumentLayout.backup.json

@ -0,0 +1,52 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\computer1\\desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml",
"ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeToolTip": "marking_gui\\MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-05T02:08:02.816Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeToolTip": "marking_gui\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC",
"WhenOpened": "2026-06-05T02:08:02.789Z"
}
]
}
]
}
]
}

52
.vs/marking_gui.slnx/v18/DocumentLayout.json

@ -0,0 +1,52 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|c:\\users\\computer1\\desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
},
{
"AbsoluteMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}|marking_gui\\marking_gui.csproj|solutionrelative:marking_gui\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "MainWindow.xaml",
"DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml",
"ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml",
"RelativeToolTip": "marking_gui\\MainWindow.xaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2026-06-05T02:08:02.816Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "MainWindow.xaml.cs",
"DocumentMoniker": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeDocumentMoniker": "marking_gui\\MainWindow.xaml.cs",
"ToolTip": "C:\\Users\\COMPUTER1\\Desktop\\mobi\\marking_gui\\marking_gui\\MainWindow.xaml.cs",
"RelativeToolTip": "marking_gui\\MainWindow.xaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADKSURBVDhP7ZMhDoNAEEX/VlStqMYwJ\u002BgFegguwB1AIsC1ZhWKE3AVkj3DojCEBIOumZqWLENoSVPZl6zYPz8/k5ldQHC\u002BWbbtyFLfjW1HDvOGbTuyMYaJiIui2AxUYd5wN92ljvB0RHe9KCLiKIqglEJZlkr6VvgdAAARMQAkScJpmm52MiNnQEQ8DMO\u002BEGPMqviag3\u002BkZ\u002BZt8Yn0HPzLN/wDfh2gtYZzbnOVzjkOgmChLd52XddcVRX6vvflGa01sixDHMef/8ReHgD\u002BXy4W5TMHAAAAAElFTkSuQmCC",
"WhenOpened": "2026-06-05T02:08:02.789Z"
}
]
}
]
}
]
}

BIN
login_screenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

BIN
main_screenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

3
marking_gui.slnx

@ -0,0 +1,3 @@
<Solution>
<Project Path="marking_gui/marking_gui.csproj" Id="9e96d5be-9375-4ed3-82de-f200f83ebc2f" />
</Solution>

11
marking_gui/App.config

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MssqlConnection"
connectionString="Server=localhost;Database=MarkingDb;Trusted_Connection=True;"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

8
marking_gui/App.xaml

@ -0,0 +1,8 @@
<Application x:Class="marking_gui.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:marking_gui">
<Application.Resources>
</Application.Resources>
</Application>

39
marking_gui/App.xaml.cs

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace marking_gui
{
/// <summary>
/// App.xaml에 대한 상호 작용 논리
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 로그인 창이 닫힐 때 앱이 자동 종료되는 것을 방지하기 위해 ExplicitShutdown으로 설정
ShutdownMode = ShutdownMode.OnExplicitShutdown;
var loginWindow = new Housing.Login.StartupLoginWindow();
if (loginWindow.ShowDialog() == true)
{
var loginResult = loginWindow.Result;
var mainWindow = new MainWindow(loginResult);
// 메인 창이 닫힐 때 앱이 정상 종료되도록 기본 모드로 원복
ShutdownMode = ShutdownMode.OnLastWindowClose;
mainWindow.Show();
}
else
{
Shutdown();
}
}
}
}

293
marking_gui/MainWindow.xaml

@ -0,0 +1,293 @@
<Window x:Class="marking_gui.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:marking_gui"
mc:Ignorable="d"
Title="양산형 테스트 기기 모니터링 시스템" Height="700" Width="900"
MinWidth="900" MinHeight="700" WindowState="Maximized"
WindowStartupLocation="CenterScreen" Background="#F3F4F6">
<Window.Resources>
<!-- 버튼 스타일 -->
<Style x:Key="ModernButtonStyle" TargetType="Button">
<Setter Property="Background" Value="#3B82F6"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="15,10"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
CornerRadius="6"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2563EB"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#D1D5DB"/>
<Setter Property="Foreground" Value="#9CA3AF"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 스타트 버튼 전용 스타일 (하단 영역 꽉 채우는 형태) -->
<Style x:Key="StartButtonStyle" TargetType="Button">
<Setter Property="Background" Value="#10B981"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="24"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#059669"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#E5E7EB"/>
<Setter Property="Foreground" Value="#9CA3AF"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- 카드 보더 스타일 -->
<Style x:Key="CardBorderStyle" TargetType="Border">
<Setter Property="Background" Value="White"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="BorderBrush" Value="#E5E7EB"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="20"/>
<Setter Property="Margin" Value="10"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<!-- 상단 헤더 -->
<RowDefinition Height="70"/>
<!-- 메인 콘텐츠 -->
<RowDefinition Height="*"/>
<!-- 하단 푸터 (스타트 버튼 배치) -->
<RowDefinition Height="120"/>
<!-- 최하단 바 (설정 버튼 배치) -->
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<!-- 1. 상단 헤더 영역 -->
<Border Grid.Row="0" Background="#1F2937" Padding="20,10">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="Marking" Foreground="White" FontSize="20" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Text="v1.0.0 (Updated: 2026-06-05)" Foreground="#9CA3AF" FontSize="12" VerticalAlignment="Bottom" Margin="12,0,0,2"/>
<TextBlock x:Name="txtLoginInfo" Text="[작업자: --- | 모델: --- | 라인: ---]" Foreground="#9CA3AF" FontSize="13" FontWeight="Medium" VerticalAlignment="Bottom" Margin="25,0,0,2"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock x:Name="txtCurrentTime" Text="0000-00-00 00:00:00" Foreground="White" FontSize="16" FontWeight="Bold" VerticalAlignment="Center" Margin="0,0,20,0"/>
<TextBlock Text="상태: 대기 중" x:Name="txtSystemStatus" Foreground="#10B981" FontSize="16" FontWeight="Bold" VerticalAlignment="Center"/>
</StackPanel>
</Grid>
</Border>
<!-- 2. 메인 콘텐츠 영역 -->
<Grid Grid.Row="1" Margin="10">
<Grid.ColumnDefinitions>
<!-- 좌측: S/N 입력 및 이전 단계 결과 (비율 3.5:6.5) -->
<ColumnDefinition Width="3.5*"/>
<!-- 우측: 현재 측정 데이터 및 판정 -->
<ColumnDefinition Width="6.5*"/>
</Grid.ColumnDefinitions>
<!-- 좌측 패널 (Grid로 감싸서 반응형 스케일 지원) -->
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 시리얼 입력 카드 -->
<Border Grid.Row="0" Style="{StaticResource CardBorderStyle}">
<StackPanel>
<TextBlock Text="S/N 입력" FontSize="16" FontWeight="Bold" Foreground="#374151" Margin="0,0,0,10"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="65"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtSerial" Grid.Column="0" FontSize="18" Padding="8,6" Margin="0,0,8,0"
VerticalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1" GotFocus="txtSerial_GotFocus" KeyDown="txtSerial_KeyDown"/>
<Button x:Name="btnSearchSerial" Grid.Column="1" Content="조회" Style="{StaticResource ModernButtonStyle}" Click="btnSearchSerial_Click"/>
</Grid>
<TextBlock Text="※ 테스트 S/N: PASS1234 / FAIL5678" Foreground="#9CA3AF" FontSize="11" Margin="0,8,0,0"/>
</StackPanel>
</Border>
<!-- 이전 시험 단계 결과 카드 (최소 높이 안전장치 추가) -->
<Border Grid.Row="1" Style="{StaticResource CardBorderStyle}" MinHeight="250">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="이전 시험 단계 결과" FontSize="16" FontWeight="Bold" Foreground="#374151" Margin="0,0,0,10"/>
<Grid Grid.Row="1" Margin="0,5,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Housing 검사 -->
<Grid Grid.Row="0" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="1. Housing" FontSize="18" Foreground="#4B5563" FontWeight="SemiBold"/>
<TextBlock x:Name="txtPrevHousing" Grid.Column="1" Text="대기" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF"/>
</Grid>
<Separator Grid.Row="1" Background="#F3F4F6"/>
<!-- Cal 검사 -->
<Grid Grid.Row="2" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="2. Calibration" FontSize="18" Foreground="#4B5563" FontWeight="SemiBold"/>
<TextBlock x:Name="txtPrevCal" Grid.Column="1" Text="대기" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF"/>
</Grid>
<Separator Grid.Row="3" Background="#F3F4F6"/>
<!-- EOL 검사 -->
<Grid Grid.Row="4" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="3. EOL" FontSize="18" Foreground="#4B5563" FontWeight="SemiBold"/>
<TextBlock x:Name="txtPrevEol" Grid.Column="1" Text="대기" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF"/>
</Grid>
</Grid>
</Grid>
</Border>
</Grid> <!-- 좌측 Grid 닫기 -->
<!-- 우측 패널 -->
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<!-- 현재 전압 / 전류 측정값 (비율 1.8:3) -->
<RowDefinition Height="1.8*"/>
<!-- 최종 판정 영역 -->
<RowDefinition Height="3*"/>
</Grid.RowDefinitions>
<!-- 전압/전류 측정값 표시 카드 -->
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 전압 -->
<Border Grid.Column="0" Style="{StaticResource CardBorderStyle}" MinWidth="220" MinHeight="160" Padding="20,10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="측정 전압 (Voltage)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/>
<Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock x:Name="txtVoltage" Text="---.-" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/>
<TextBlock Text=" V" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/>
</StackPanel>
</Viewbox>
<TextBlock x:Name="txtVoltageRangeGuide" Grid.Row="2" Text="기준범위: 4.0V ~ 6.0V" FontSize="12" Foreground="#9CA3AF" HorizontalAlignment="Center"/>
</Grid>
</Border>
<!-- 전류 -->
<Border Grid.Column="1" Style="{StaticResource CardBorderStyle}" MinWidth="220" MinHeight="160" Padding="20,10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="측정 전류 (Current)" FontSize="14" Foreground="#6B7280" HorizontalAlignment="Center"/>
<Viewbox Grid.Row="1" Stretch="Uniform" Margin="0,5">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock x:Name="txtCurrent" Text="--.-" FontSize="54" FontWeight="Bold" Foreground="#1F2937"/>
<TextBlock Text=" A" FontSize="20" FontWeight="Bold" Foreground="#9CA3AF" VerticalAlignment="Bottom" Margin="5,0,0,8"/>
</StackPanel>
</Viewbox>
<TextBlock x:Name="txtCurrentRangeGuide" Grid.Row="2" Text="기준범위: 8.0A ~ 10.0A" FontSize="12" Foreground="#9CA3AF" HorizontalAlignment="Center"/>
</Grid>
</Border>
</Grid>
<!-- 최종 합/불 판정 영역 카드 -->
<Border Grid.Row="1" Style="{StaticResource CardBorderStyle}" x:Name="borderFinalResult" Background="#E5E7EB" MinHeight="200">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="최종 판정 결과" FontSize="16" FontWeight="SemiBold" Foreground="#4B5563" HorizontalAlignment="Center" Margin="10,15,10,5"/>
<Viewbox Grid.Row="1" Stretch="Uniform" Margin="10">
<StackPanel HorizontalAlignment="Center">
<TextBlock x:Name="txtFinalResult" Text="대 기 중" FontSize="80" FontWeight="Black" Foreground="#9CA3AF" HorizontalAlignment="Center"/>
<TextBlock x:Name="txtFinalSerial" Text="S/N: ---" FontSize="16" FontWeight="Bold" Foreground="#6B7280" HorizontalAlignment="Center" Margin="0,10,0,0"/>
</StackPanel>
</Viewbox>
</Grid>
</Border>
</Grid>
</Grid>
<!-- 3. 하단 푸터 (전체 영역이 스타트 버튼) -->
<Border Grid.Row="2" BorderBrush="#D1D5DB" BorderThickness="0,1,0,0">
<Button x:Name="btnStart" Content="▶ 검사 시작 (START)"
Style="{StaticResource StartButtonStyle}" IsEnabled="False" Click="btnStart_Click"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Border>
<!-- 4. 최하단 바 (파라미터 버튼 배치) -->
<Border Grid.Row="3" Background="#1F2937" BorderBrush="#111827" BorderThickness="0,1,0,0" Padding="20,0">
<Grid>
<!-- 파라미터 설정 버튼 (좌측 정렬) -->
<Button x:Name="btnOpenSettings" Content="⚙ 파라미터 설정" Width="140" Height="36"
Style="{StaticResource ModernButtonStyle}" Click="btnOpenSettings_Click"
HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="14" Padding="10,0"/>
</Grid>
</Border>
</Grid>
</Window>

288
marking_gui/MainWindow.xaml.cs

@ -0,0 +1,288 @@
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using marking_gui.Models;
using marking_gui.Services;
namespace marking_gui
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
private DispatcherTimer _measurementTimer;
private DispatcherTimer _clockTimer;
private int _timerTickCount = 0;
// 비즈니스 로직 및 가상 하드웨어/DB 서비스 분리
private readonly MssqlDatabaseService _database = new MssqlDatabaseService();
private readonly MockMeasurer _measurer = new MockMeasurer();
private MeasurementLimits _limits = new MeasurementLimits();
private readonly Housing.Login.StartupLoginWindowResult _loginInfo;
public MainWindow() : this(new Housing.Login.StartupLoginWindowResult { Operator = "SYSTEM", Model = "DEFAULT", LineNo = "DEFAULT" })
{
}
public MainWindow(Housing.Login.StartupLoginWindowResult loginResult)
{
InitializeComponent();
_loginInfo = loginResult ?? new Housing.Login.StartupLoginWindowResult { Operator = "SYSTEM", Model = "DEFAULT", LineNo = "DEFAULT" };
InitializeTimer();
InitializeClock();
ResetUI();
InitializeLimits();
DisplayLoginInfo();
}
private void DisplayLoginInfo()
{
if (txtLoginInfo != null)
{
txtLoginInfo.Text = string.Format("[작업자: {0} | 모델: {1} | 라인: {2}]",
_loginInfo.Operator,
string.IsNullOrEmpty(_loginInfo.Model) ? "N/A" : _loginInfo.Model,
string.IsNullOrEmpty(_loginInfo.LineNo) ? "N/A" : _loginInfo.LineNo);
}
}
private void InitializeTimer()
{
_measurementTimer = new DispatcherTimer();
_measurementTimer.Interval = TimeSpan.FromMilliseconds(200); // 0.2초마다 갱신 (시뮬레이션 효과 연출)
_measurementTimer.Tick += MeasurementTimer_Tick;
}
private void InitializeClock()
{
_clockTimer = new DispatcherTimer();
_clockTimer.Interval = TimeSpan.FromSeconds(1);
_clockTimer.Tick += (s, e) => {
txtCurrentTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
};
_clockTimer.Start();
txtCurrentTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
private void InitializeLimits()
{
UpdateRangeGuides();
}
private void UpdateRangeGuides()
{
txtVoltageRangeGuide.Text = string.Format("기준범위: {0:F1}V ~ {1:F1}V", _limits.MinVoltage, _limits.MaxVoltage);
txtCurrentRangeGuide.Text = string.Format("기준범위: {0:F1}A ~ {1:F1}A", _limits.MinCurrent, _limits.MaxCurrent);
}
private void btnOpenSettings_Click(object sender, RoutedEventArgs e)
{
SettingsWindow settings = new SettingsWindow(_limits);
settings.Owner = this;
if (settings.ShowDialog() == true)
{
_limits = settings.Limits;
UpdateRangeGuides();
MessageBox.Show("기준 범위 설정이 적용되었습니다.", "설정 완료", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
// UI 초기화 상태
private void ResetUI()
{
txtSystemStatus.Text = "상태: 대기 중";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175)); // Gray
txtPrevHousing.Text = "대기";
txtPrevHousing.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtPrevCal.Text = "대기";
txtPrevCal.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtPrevEol.Text = "대기";
txtPrevEol.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
txtVoltage.Text = "---.-";
txtVoltage.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtCurrent.Text = "--.-";
txtCurrent.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55));
txtFinalResult.Text = "대 기 중";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175));
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(229, 231, 235)); // Light Gray
txtFinalSerial.Text = "S/N: ---";
btnStart.IsEnabled = false;
}
// 시리얼 텍스트 박스 포커스 이벤트
private void txtSerial_GotFocus(object sender, RoutedEventArgs e)
{
txtSerial.SelectAll();
}
// S/N 조회 버튼 클릭
private void btnSearchSerial_Click(object sender, RoutedEventArgs e)
{
string serial = txtSerial.Text.Trim().ToUpper();
if (string.IsNullOrEmpty(serial))
{
MessageBox.Show("S/N을 입력해주세요.", "알림", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
ResetUI();
txtFinalSerial.Text = "S/N: " + serial;
// 데이터베이스 서비스 조회 호출 (예외 방어 처리)
Product product = null;
try
{
product = _database.GetProductBySerial(serial);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "DB 조회 오류", MessageBoxButton.OK, MessageBoxImage.Error);
txtSystemStatus.Text = "상태: DB 연동 에러";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
return;
}
if (product != null)
{
// 이전 검사 결과 바인딩 및 색상 설정
txtPrevHousing.Text = product.HousingResult;
txtPrevHousing.Foreground = product.HousingResult == "PASS"
? new SolidColorBrush(Color.FromRgb(16, 185, 129))
: new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtPrevCal.Text = product.CalResult;
txtPrevCal.Foreground = product.CalResult == "PASS"
? new SolidColorBrush(Color.FromRgb(16, 185, 129))
: new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtPrevEol.Text = product.EolResult;
txtPrevEol.Foreground = product.EolResult == "PASS"
? new SolidColorBrush(Color.FromRgb(16, 185, 129))
: new SolidColorBrush(Color.FromRgb(239, 68, 68));
if (product.IsPreviousStepsPassed)
{
txtSystemStatus.Text = "상태: 검사 가능 (이전 단계 합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
// 스타트 버튼 활성화
btnStart.IsEnabled = true;
}
else
{
string failedStep = string.Empty;
if (product.HousingResult == "FAIL") failedStep = "Housing 검사";
else if (product.CalResult == "FAIL") failedStep = "Calibration 검사";
else if (product.EolResult == "FAIL") failedStep = "EOL 검사";
txtSystemStatus.Text = "상태: 진행 불가 (이전 단계 불합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
// 스타트 버튼 비활성화
btnStart.IsEnabled = false;
MessageBox.Show(string.Format("이전 공정 단계({0})가 불합격 상태이므로 최종 성능 검사를 시작할 수 없습니다.", failedStep), "검사 제한", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
else
{
MessageBox.Show("등록되지 않은 S/N입니다.\n테스트용 S/N(PASS1234 또는 FAIL5678)을 입력해 주세요.", "조회 실패", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
// 엔터 키 입력 시 조회 처리
private void txtSerial_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Enter)
{
btnSearchSerial_Click(sender, e);
}
}
// 스타트 버튼 클릭
private void btnStart_Click(object sender, RoutedEventArgs e)
{
btnStart.IsEnabled = false;
btnSearchSerial.IsEnabled = false;
txtSerial.IsEnabled = false;
txtSystemStatus.Text = "상태: 검사 진행 중...";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(59, 130, 246)); // Blue
txtFinalResult.Text = "측 정 중";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(59, 130, 246));
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(219, 234, 254)); // Light Blue
// 시뮬레이션 타이머 시작
_timerTickCount = 0;
_measurementTimer.Start();
}
// 타이머 틱 이벤트 (측정값 변화 시뮬레이션)
private void MeasurementTimer_Tick(object sender, EventArgs e)
{
_timerTickCount++;
if (_timerTickCount < 10) // 약 2초 동안 측정값 흔들림 효과 연출
{
double tempVoltage, tempCurrent;
_measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent);
txtVoltage.Text = tempVoltage.ToString("F1");
txtCurrent.Text = tempCurrent.ToString("F1");
}
else // 최종 측정 완료 및 판정
{
_measurementTimer.Stop();
double finalVoltage, finalCurrent;
_measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent);
txtVoltage.Text = finalVoltage.ToString("F1");
txtCurrent.Text = finalCurrent.ToString("F1");
// 합/불 판정
bool isVoltageOk = finalVoltage >= _limits.MinVoltage && finalVoltage <= _limits.MaxVoltage;
bool isCurrentOk = finalCurrent >= _limits.MinCurrent && finalCurrent <= _limits.MaxCurrent;
bool isFinalPass = isVoltageOk && isCurrentOk;
// 측정값 색상 표시 (통과 시 검은색, 실패 시 빨간색)
txtVoltage.Foreground = isVoltageOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtCurrent.Foreground = isCurrentOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68));
if (isFinalPass)
{
txtSystemStatus.Text = "상태: 검사 완료 (합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
txtFinalResult.Text = "PASS";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129));
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(209, 250, 229)); // Light Green
}
else
{
txtSystemStatus.Text = "상태: 검사 완료 (불합격)";
txtSystemStatus.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
txtFinalResult.Text = "FAIL";
txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(239, 68, 68));
borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(254, 226, 226)); // Light Red
}
// 컨트롤 원상 복구 (재검사를 위해)
btnSearchSerial.IsEnabled = true;
txtSerial.IsEnabled = true;
btnStart.IsEnabled = true;
}
}
}
}

45
marking_gui/Models/MeasurementLimits.cs

@ -0,0 +1,45 @@
using System;
namespace marking_gui.Models
{
public class MeasurementLimits
{
public double MinVoltage { get; set; }
public double MaxVoltage { get; set; }
public double MinCurrent { get; set; }
public double MaxCurrent { get; set; }
public MeasurementLimits(double minVoltage = 4.0, double maxVoltage = 6.0, double minCurrent = 8.0, double maxCurrent = 10.0)
{
MinVoltage = minVoltage;
MaxVoltage = maxVoltage;
MinCurrent = minCurrent;
MaxCurrent = maxCurrent;
}
public bool Validate(out string errorMessage)
{
errorMessage = string.Empty;
if (MinVoltage < 0 || MaxVoltage < 0 || MinCurrent < 0 || MaxCurrent < 0)
{
errorMessage = "기준 범위 설정 값은 0 이상의 값이어야 합니다.";
return false;
}
if (MinVoltage >= MaxVoltage)
{
errorMessage = "전압 최소값은 최대값보다 작아야 합니다.";
return false;
}
if (MinCurrent >= MaxCurrent)
{
errorMessage = "전류 최소값은 최대값보다 작아야 합니다.";
return false;
}
return true;
}
}
}

28
marking_gui/Models/Product.cs

@ -0,0 +1,28 @@
using System;
namespace marking_gui.Models
{
public class Product
{
public string SerialNumber { get; set; }
public string HousingResult { get; set; }
public string CalResult { get; set; }
public string EolResult { get; set; }
public bool IsPreviousStepsPassed
{
get
{
return HousingResult == "PASS" && CalResult == "PASS" && EolResult == "PASS";
}
}
public Product(string serialNumber, string housingResult = "대기", string calResult = "대기", string eolResult = "대기")
{
SerialNumber = serialNumber;
HousingResult = housingResult;
CalResult = calResult;
EolResult = eolResult;
}
}
}

52
marking_gui/Properties/AssemblyInfo.cs

@ -0,0 +1,52 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
// 이러한 특성 값을 변경하세요.
[assembly: AssemblyTitle("marking_gui")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("marking_gui")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
[assembly: ComVisible(false)]
//지역화 가능 애플리케이션 빌드를 시작하려면 다음을 설정하세요.
//.csproj 파일의 <UICulture>CultureYouAreCodingWith</UICulture>
//<PropertyGroup> 내부. 예를 들어 미국 영어를 사용하는 경우
//사용하는 경우 <UICulture>를 en-US로 설정합니다. 그런 다음 아래
//NeutralResourceLanguage 특성의 주석 처리를 제거합니다. 아래 줄의 "en-US"를 업데이트하여
//프로젝트 파일의 UICulture 설정과 일치시킵니다.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //테마별 리소스 사전의 위치
//(페이지 또는 응용 프로그램 리소스 사진에
// 리소스가 없는 경우에 사용됨)
ResourceDictionaryLocation.SourceAssembly //제네릭 리소스 사전의 위치
//(페이지 또는 응용 프로그램 리소스 사진에
// 리소스가 없는 경우에 사용됨)
)]
// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
//
// 주 버전
// 부 버전
// 빌드 번호
// 수정 버전
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

71
marking_gui/Properties/Resources.Designer.cs

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
namespace marking_gui.Properties
{
/// <summary>
/// 지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
/// </summary>
// 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
// 클래스에서 자동으로 생성되었습니다.
// 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여
// ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// 이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("marking_gui.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
/// 재정의합니다.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

117
marking_gui/Properties/Resources.resx

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

30
marking_gui/Properties/Settings.Designer.cs

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace marking_gui.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

7
marking_gui/Properties/Settings.settings

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

30
marking_gui/Services/MockDatabase.cs

@ -0,0 +1,30 @@
using System;
using marking_gui.Models;
namespace marking_gui.Services
{
public class MockDatabase
{
public Product GetProductBySerial(string serial)
{
if (string.IsNullOrEmpty(serial))
return null;
string searchSerial = serial.Trim().ToUpper();
if (searchSerial == "PASS1234")
{
// 이전 검사 모두 합격
return new Product(searchSerial, "PASS", "PASS", "PASS");
}
else if (searchSerial == "FAIL5678")
{
// 이전 검사 중 Calibration 단계 실패
return new Product(searchSerial, "PASS", "FAIL", "PASS");
}
// 등록되지 않은 S/N
return null;
}
}
}

58
marking_gui/Services/MockMeasurer.cs

@ -0,0 +1,58 @@
using System;
using marking_gui.Models;
namespace marking_gui.Services
{
public class MockMeasurer
{
private readonly Random _random = new Random();
// 2초 동안 측정 중 요동칠 가상 데이터 생성
public void GenerateNoiseValues(MeasurementLimits limits, out double voltage, out double current)
{
double midVoltage = (limits.MinVoltage + limits.MaxVoltage) / 2.0;
double midCurrent = (limits.MinCurrent + limits.MaxCurrent) / 2.0;
// 설정 범위 폭에 맞추어 ±50% 범위의 노이즈 생성
double voltageSpan = limits.MaxVoltage - limits.MinVoltage;
double currentSpan = limits.MaxCurrent - limits.MinCurrent;
voltage = midVoltage + (_random.NextDouble() * voltageSpan - (voltageSpan / 2.0));
current = midCurrent + (_random.NextDouble() * currentSpan - (currentSpan / 2.0));
}
// 최종 합/불 판정 측정값 결정 (80% 확률로 합격 범위, 20% 확률로 불합격 범위 값 생성)
public void GenerateFinalValues(MeasurementLimits limits, out double voltage, out double current)
{
double voltageSpan = limits.MaxVoltage - limits.MinVoltage;
double currentSpan = limits.MaxCurrent - limits.MinCurrent;
if (_random.Next(0, 10) < 8)
{
// 합격 범위 내의 가상 측정값 생성
voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan);
current = limits.MinCurrent + (_random.NextDouble() * currentSpan);
}
else
{
// 불합격 범위 유도
if (_random.Next(0, 2) == 0)
{
// 전압 에러 유도 (범위 폭의 50% 정도 벗어나도록 가/감산하여 음수 방지)
voltage = _random.Next(0, 2) == 0
? (limits.MinVoltage - (voltageSpan * 0.5))
: (limits.MaxVoltage + (voltageSpan * 0.5));
current = limits.MinCurrent + (_random.NextDouble() * currentSpan);
}
else
{
// 전류 에러 유도
voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan);
current = _random.Next(0, 2) == 0
? (limits.MinCurrent - (currentSpan * 0.5))
: (limits.MaxCurrent + (currentSpan * 0.5));
}
}
}
}
}

63
marking_gui/Services/MssqlDatabaseService.cs

@ -0,0 +1,63 @@
using System;
using System.Configuration;
using marking_gui.Models;
namespace marking_gui.Services
{
public class MssqlDatabaseService
{
private readonly string _connectionString;
public MssqlDatabaseService()
{
try
{
// App.config 에서 연결 문자열을 로드하여 준비해둡니다.
var connSettings = ConfigurationManager.ConnectionStrings["MssqlConnection"];
if (connSettings != null)
{
_connectionString = connSettings.ConnectionString;
}
else
{
_connectionString = "Server=localhost;Database=MarkingDb;Trusted_Connection=True;";
}
}
catch (Exception ex)
{
_connectionString = string.Empty;
System.Diagnostics.Debug.WriteLine("설정 로드 중 예외 발생: " + ex.Message);
}
}
public Product GetProductBySerial(string serial)
{
if (string.IsNullOrEmpty(serial))
return null;
string searchSerial = serial.Trim().ToUpper();
// TODO: 사용자의 지시에 따라 실제 MSSQL DB 질의 쿼리는 아직 작성하지 않고 대기합니다.
// 추후 실제 연동 시 아래 SQL Connection 및 SELECT 쿼리를 구현할 수 있도록 준비만 해둡니다.
/*
string query = "SELECT SerialNumber, HousingResult, CalResult, EolResult FROM ProductResults WHERE UPPER(SerialNumber) = @Serial";
using (var conn = new System.Data.SqlClient.SqlConnection(_connectionString))
{
...
}
*/
// 준비 단계 동안 임시로 기존 Mock 데이터를 반환하도록 구현 (Stub)
if (searchSerial == "PASS1234")
{
return new Product(searchSerial, "PASS", "PASS", "PASS");
}
else if (searchSerial == "FAIL5678")
{
return new Product(searchSerial, "PASS", "FAIL", "PASS");
}
return null;
}
}
}

81
marking_gui/SettingsWindow.xaml

@ -0,0 +1,81 @@
<Window x:Class="marking_gui.SettingsWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="기준 범위 설정" Height="250" Width="350"
WindowStartupLocation="CenterOwner" ResizeMode="NoResize"
Background="#F3F4F6" ShowInTaskbar="False">
<Window.Resources>
<!-- 버튼 스타일 -->
<Style x:Key="DialogButtonStyle" TargetType="Button">
<Setter Property="Background" Value="#3B82F6"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="15,6"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2563EB"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="CancelButtonStyle" TargetType="Button" BasedOn="{StaticResource DialogButtonStyle}">
<Setter Property="Background" Value="#9CA3AF"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#4B5563"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="🔧 검사 판정 기준 범위 변경" FontSize="16" FontWeight="Bold" Foreground="#1F2937" Margin="0,0,0,15"/>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 전압 설정 -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="전압 (V):" FontSize="14" VerticalAlignment="Center" Foreground="#4B5563" FontWeight="SemiBold"/>
<TextBox x:Name="txtMinVoltage" Grid.Row="0" Grid.Column="1" FontSize="14" Padding="4" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="~" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBox x:Name="txtMaxVoltage" Grid.Row="0" Grid.Column="3" FontSize="14" Padding="4" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1"/>
<!-- 전류 설정 -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="전류 (A):" FontSize="14" VerticalAlignment="Center" Foreground="#4B5563" FontWeight="SemiBold"/>
<TextBox x:Name="txtMinCurrent" Grid.Row="2" Grid.Column="1" FontSize="14" Padding="4" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1"/>
<TextBlock Grid.Row="2" Grid.Column="2" Text="~" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBox x:Name="txtMaxCurrent" Grid.Row="2" Grid.Column="3" FontSize="14" Padding="4" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="#D1D5DB" BorderThickness="1"/>
</Grid>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,15,0,0">
<Button x:Name="btnSave" Content="저장" Style="{StaticResource DialogButtonStyle}" Width="70" Height="32" Click="btnSave_Click" Margin="0,0,10,0"/>
<Button x:Name="btnCancel" Content="취소" Style="{StaticResource CancelButtonStyle}" Width="70" Height="32" Click="btnCancel_Click"/>
</StackPanel>
</Grid>
</Window>

59
marking_gui/SettingsWindow.xaml.cs

@ -0,0 +1,59 @@
using System;
using System.Windows;
using marking_gui.Models;
namespace marking_gui
{
/// <summary>
/// SettingsWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class SettingsWindow : Window
{
public MeasurementLimits Limits { get; private set; }
public SettingsWindow(MeasurementLimits limits)
{
InitializeComponent();
// 원본의 데이터 무결성을 유지하기 위해 임시 복제하여 사용
Limits = new MeasurementLimits(limits.MinVoltage, limits.MaxVoltage, limits.MinCurrent, limits.MaxCurrent);
txtMinVoltage.Text = Limits.MinVoltage.ToString("F1");
txtMaxVoltage.Text = Limits.MaxVoltage.ToString("F1");
txtMinCurrent.Text = Limits.MinCurrent.ToString("F1");
txtMaxCurrent.Text = Limits.MaxCurrent.ToString("F1");
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
double minV, maxV, minC, maxC;
if (!double.TryParse(txtMinVoltage.Text, out minV) ||
!double.TryParse(txtMaxVoltage.Text, out maxV) ||
!double.TryParse(txtMinCurrent.Text, out minC) ||
!double.TryParse(txtMaxCurrent.Text, out maxC))
{
MessageBox.Show("기준 범위 설정 값은 올바른 숫자 형식이어야 합니다.", "설정 오류", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
MeasurementLimits tempLimits = new MeasurementLimits(minV, maxV, minC, maxC);
string errorMessage;
if (!tempLimits.Validate(out errorMessage))
{
MessageBox.Show(errorMessage, "설정 오류", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
Limits = tempLimits;
DialogResult = true;
Close();
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
}
}

138
marking_gui/StartupLoginWindow.xaml

@ -0,0 +1,138 @@
<Window x:Class="Housing.Login.StartupLoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="시스템 시작 로그인" Height="500" Width="480"
WindowStartupLocation="CenterScreen" ResizeMode="NoResize"
Background="#F3F4F6" BorderThickness="1" BorderBrush="#D1D5DB">
<Window.Resources>
<!-- 입력 텍스트박스 스타일 -->
<Style TargetType="TextBox">
<Setter Property="FontSize" Value="13"/>
<Setter Property="Padding" Value="8,5"/>
<Setter Property="BorderBrush" Value="#D1D5DB"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Margin" Value="0,4,0,12"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<Style TargetType="PasswordBox">
<Setter Property="FontSize" Value="13"/>
<Setter Property="Padding" Value="8,5"/>
<Setter Property="BorderBrush" Value="#D1D5DB"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Margin" Value="0,4,0,12"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<!-- 라벨 스타일 -->
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="#4B5563"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<!-- 버튼 스타일 -->
<Style x:Key="LoginButtonStyle" TargetType="Button">
<Setter Property="Background" Value="#3B82F6"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="6">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2563EB"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="*"/>
<RowDefinition Height="65"/>
</Grid.RowDefinitions>
<!-- 1. 헤더 영역 -->
<Border Grid.Row="0" Background="#1F2937" Padding="20,10">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="⚙" Foreground="White" FontSize="20" FontWeight="Bold" Margin="0,0,8,0"/>
<TextBlock Text="시스템 시작 설정 &amp; 로그인" Foreground="White" FontSize="18" FontWeight="Bold"/>
</StackPanel>
</Border>
<!-- 2. 입력 폼 영역 (2열 배치) -->
<Border Grid.Row="1" Background="White" Margin="15,15,15,0" CornerRadius="8" BorderBrush="#E5E7EB" BorderThickness="1" Padding="20,15">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 좌측 열 -->
<StackPanel Grid.Column="0" Grid.Row="0">
<TextBlock Text="제조사 (Maker)"/>
<TextBox x:Name="MakerTextBox" Text="MOBI"/>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="1">
<TextBlock Text="모델명 (Model)"/>
<TextBox x:Name="ModelTextBox" Text="MOBI-EV-01"/>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="2">
<TextBlock Text="색상 코드 (Color Code)"/>
<TextBox x:Name="ColorCodeTextBox" Text="BK-01"/>
</StackPanel>
<StackPanel Grid.Column="0" Grid.Row="3">
<TextBlock Text="라인 번호 (Line No)"/>
<TextBox x:Name="LineNoTextBox" Text="LINE-3"/>
</StackPanel>
<!-- 우측 열 -->
<StackPanel Grid.Column="2" Grid.Row="0">
<TextBlock>
<Run Text="작업자 (Operator)"/>
<Run Text=" *" Foreground="#EF4444"/>
</TextBlock>
<TextBox x:Name="OperatorTextBox" Text="test"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="1">
<TextBlock>
<Run Text="비밀번호 (Password)"/>
<Run Text=" *" Foreground="#EF4444"/>
</TextBlock>
<PasswordBox x:Name="PasswordBox"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="2">
<TextBlock Text="LOT 번호 (Lot No)"/>
<TextBox x:Name="LotNoTextBox" Text="LOT-20260605"/>
</StackPanel>
<StackPanel Grid.Column="2" Grid.Row="3">
<TextBlock Text="지그 번호 (Jig No)"/>
<TextBox x:Name="JigNoTextBox" Text="JIG-12"/>
</StackPanel>
</Grid>
</Border>
<!-- 3. 하단 로그인 버튼 영역 -->
<Border Grid.Row="2" Padding="15,5">
<StackPanel>
<TextBlock Text="※ 테스트 계정: test / test (자동 입력됨)" Foreground="#9CA3AF" FontSize="11" HorizontalAlignment="Center" Margin="0,0,0,5"/>
<Button x:Name="LogInButton" Content="시스템 시작 및 로그인" Style="{StaticResource LoginButtonStyle}" Height="40" Click="LogInButton_Click"/>
</StackPanel>
</Border>
</Grid>
</Window>

71
marking_gui/StartupLoginWindow.xaml.cs

@ -0,0 +1,71 @@
using System.Windows;
namespace Housing.Login
{
/*
* Usage in App.xaml.cs or Program.cs:
*
* var loginWindow = new Housing.Login.StartupLoginWindow();
* if (loginWindow.ShowDialog() != true)
* {
* return;
* }
*
* StartupLoginWindowResult loginResult = loginWindow.Result;
*/
public sealed class StartupLoginWindowResult
{
public string Maker { get; set; } = string.Empty;
public string Model { get; set; } = string.Empty;
public string ColorCode { get; set; } = string.Empty;
public string Operator { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string LineNo { get; set; } = string.Empty;
public string LotNo { get; set; } = string.Empty;
public string JigNo { get; set; } = string.Empty;
}
public partial class StartupLoginWindow : Window
{
public StartupLoginWindowResult Result { get; private set; } = new StartupLoginWindowResult();
public StartupLoginWindow()
{
InitializeComponent();
PasswordBox.Password = "test";
}
private void LogInButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(OperatorTextBox.Text))
{
MessageBox.Show(this, "Please enter Operator.", "Login", MessageBoxButton.OK, MessageBoxImage.Warning);
OperatorTextBox.Focus();
return;
}
if (string.IsNullOrWhiteSpace(PasswordBox.Password))
{
MessageBox.Show(this, "Please enter Password.", "Login", MessageBoxButton.OK, MessageBoxImage.Warning);
PasswordBox.Focus();
return;
}
Result = new StartupLoginWindowResult
{
Maker = MakerTextBox.Text.Trim(),
Model = ModelTextBox.Text.Trim(),
ColorCode = ColorCodeTextBox.Text.Trim(),
Operator = OperatorTextBox.Text.Trim(),
Password = PasswordBox.Password,
LineNo = LineNoTextBox.Text.Trim(),
LotNo = LotNoTextBox.Text.Trim(),
JigNo = JigNoTextBox.Text.Trim()
};
DialogResult = true;
Close();
}
}
}

BIN
marking_gui/bin/Debug/marking_gui.exe

Binary file not shown.

11
marking_gui/bin/Debug/marking_gui.exe.config

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MssqlConnection"
connectionString="Server=localhost;Database=MarkingDb;Trusted_Connection=True;"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

BIN
marking_gui/bin/Debug/marking_gui.pdb

Binary file not shown.

119
marking_gui/marking_gui.csproj

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9E96D5BE-9375-4ED3-82DE-F200F83EBC2F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>marking_gui</RootNamespace>
<AssemblyName>marking_gui</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System.Configuration" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="SettingsWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="StartupLoginWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="SettingsWindow.xaml.cs">
<DependentUpon>SettingsWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="StartupLoginWindow.xaml.cs">
<DependentUpon>StartupLoginWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Models\Product.cs" />
<Compile Include="Models\MeasurementLimits.cs" />
<Compile Include="Services\MssqlDatabaseService.cs" />
<Compile Include="Services\MockMeasurer.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

4
marking_gui/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]

55
marking_gui/obj/Debug/App.g.cs

@ -0,0 +1,55 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "FF67D152D4477693C16E024DEA5C02E25401A0E92468F2967B847C769CD467E5"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using marking_gui;
namespace marking_gui {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
marking_gui.App app = new marking_gui.App();
app.Run();
}
}
}

55
marking_gui/obj/Debug/App.g.i.cs

@ -0,0 +1,55 @@
#pragma checksum "..\..\App.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "FF67D152D4477693C16E024DEA5C02E25401A0E92468F2967B847C769CD467E5"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using marking_gui;
namespace marking_gui {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
marking_gui.App app = new marking_gui.App();
app.Run();
}
}
}

BIN
marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache

Binary file not shown.

BIN
marking_gui/obj/Debug/MainWindow.baml

Binary file not shown.

295
marking_gui/obj/Debug/MainWindow.g.cs

@ -0,0 +1,295 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "91D3EFB5F855ECB843447939E03D0FB956CA4155D34ABB2AD6ECC0C1038A3CB3"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using marking_gui;
namespace marking_gui {
/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 105 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtLoginInfo;
#line default
#line hidden
#line 108 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentTime;
#line default
#line hidden
#line 109 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSystemStatus;
#line default
#line hidden
#line 139 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSerial;
#line default
#line hidden
#line 141 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSearchSerial;
#line default
#line hidden
#line 172 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevHousing;
#line default
#line hidden
#line 183 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevCal;
#line default
#line hidden
#line 194 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevEol;
#line default
#line hidden
#line 228 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
#line default
#line hidden
#line 232 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltageRangeGuide;
#line default
#line hidden
#line 247 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
#line default
#line hidden
#line 251 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentRangeGuide;
#line default
#line hidden
#line 257 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border borderFinalResult;
#line default
#line hidden
#line 266 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalResult;
#line default
#line hidden
#line 267 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalSerial;
#line default
#line hidden
#line 277 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnStart;
#line default
#line hidden
#line 286 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnOpenSettings;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtLoginInfo = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtSerial = ((System.Windows.Controls.TextBox)(target));
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.GotFocus += new System.Windows.RoutedEventHandler(this.txtSerial_GotFocus);
#line default
#line hidden
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.KeyDown += new System.Windows.Input.KeyEventHandler(this.txtSerial_KeyDown);
#line default
#line hidden
return;
case 5:
this.btnSearchSerial = ((System.Windows.Controls.Button)(target));
#line 141 "..\..\MainWindow.xaml"
this.btnSearchSerial.Click += new System.Windows.RoutedEventHandler(this.btnSearchSerial_Click);
#line default
#line hidden
return;
case 6:
this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.borderFinalResult = ((System.Windows.Controls.Border)(target));
return;
case 14:
this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 15:
this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
return;
case 16:
this.btnStart = ((System.Windows.Controls.Button)(target));
#line 278 "..\..\MainWindow.xaml"
this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click);
#line default
#line hidden
return;
case 17:
this.btnOpenSettings = ((System.Windows.Controls.Button)(target));
#line 287 "..\..\MainWindow.xaml"
this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

295
marking_gui/obj/Debug/MainWindow.g.i.cs

@ -0,0 +1,295 @@
#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "91D3EFB5F855ECB843447939E03D0FB956CA4155D34ABB2AD6ECC0C1038A3CB3"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using marking_gui;
namespace marking_gui {
/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 105 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtLoginInfo;
#line default
#line hidden
#line 108 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentTime;
#line default
#line hidden
#line 109 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtSystemStatus;
#line default
#line hidden
#line 139 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtSerial;
#line default
#line hidden
#line 141 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSearchSerial;
#line default
#line hidden
#line 172 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevHousing;
#line default
#line hidden
#line 183 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevCal;
#line default
#line hidden
#line 194 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtPrevEol;
#line default
#line hidden
#line 228 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltage;
#line default
#line hidden
#line 232 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtVoltageRangeGuide;
#line default
#line hidden
#line 247 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrent;
#line default
#line hidden
#line 251 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtCurrentRangeGuide;
#line default
#line hidden
#line 257 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Border borderFinalResult;
#line default
#line hidden
#line 266 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalResult;
#line default
#line hidden
#line 267 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBlock txtFinalSerial;
#line default
#line hidden
#line 277 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnStart;
#line default
#line hidden
#line 286 "..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnOpenSettings;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtLoginInfo = ((System.Windows.Controls.TextBlock)(target));
return;
case 2:
this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target));
return;
case 3:
this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target));
return;
case 4:
this.txtSerial = ((System.Windows.Controls.TextBox)(target));
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.GotFocus += new System.Windows.RoutedEventHandler(this.txtSerial_GotFocus);
#line default
#line hidden
#line 140 "..\..\MainWindow.xaml"
this.txtSerial.KeyDown += new System.Windows.Input.KeyEventHandler(this.txtSerial_KeyDown);
#line default
#line hidden
return;
case 5:
this.btnSearchSerial = ((System.Windows.Controls.Button)(target));
#line 141 "..\..\MainWindow.xaml"
this.btnSearchSerial.Click += new System.Windows.RoutedEventHandler(this.btnSearchSerial_Click);
#line default
#line hidden
return;
case 6:
this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target));
return;
case 7:
this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target));
return;
case 8:
this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target));
return;
case 9:
this.txtVoltage = ((System.Windows.Controls.TextBlock)(target));
return;
case 10:
this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 11:
this.txtCurrent = ((System.Windows.Controls.TextBlock)(target));
return;
case 12:
this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target));
return;
case 13:
this.borderFinalResult = ((System.Windows.Controls.Border)(target));
return;
case 14:
this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target));
return;
case 15:
this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target));
return;
case 16:
this.btnStart = ((System.Windows.Controls.Button)(target));
#line 278 "..\..\MainWindow.xaml"
this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click);
#line default
#line hidden
return;
case 17:
this.btnOpenSettings = ((System.Windows.Controls.Button)(target));
#line 287 "..\..\MainWindow.xaml"
this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

BIN
marking_gui/obj/Debug/SettingsWindow.baml

Binary file not shown.

155
marking_gui/obj/Debug/SettingsWindow.g.cs

@ -0,0 +1,155 @@
#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace marking_gui {
/// <summary>
/// SettingsWindow
/// </summary>
public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 65 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinVoltage;
#line default
#line hidden
#line 67 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxVoltage;
#line default
#line hidden
#line 71 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinCurrent;
#line default
#line hidden
#line 73 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxCurrent;
#line default
#line hidden
#line 77 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSave;
#line default
#line hidden
#line 78 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCancel;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/settingswindow.xaml", System.UriKind.Relative);
#line 1 "..\..\SettingsWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtMinVoltage = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtMaxVoltage = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
this.txtMinCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 4:
this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
this.btnSave = ((System.Windows.Controls.Button)(target));
#line 77 "..\..\SettingsWindow.xaml"
this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click);
#line default
#line hidden
return;
case 6:
this.btnCancel = ((System.Windows.Controls.Button)(target));
#line 78 "..\..\SettingsWindow.xaml"
this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

155
marking_gui/obj/Debug/SettingsWindow.g.i.cs

@ -0,0 +1,155 @@
#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace marking_gui {
/// <summary>
/// SettingsWindow
/// </summary>
public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 65 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinVoltage;
#line default
#line hidden
#line 67 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxVoltage;
#line default
#line hidden
#line 71 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMinCurrent;
#line default
#line hidden
#line 73 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox txtMaxCurrent;
#line default
#line hidden
#line 77 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnSave;
#line default
#line hidden
#line 78 "..\..\SettingsWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button btnCancel;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/settingswindow.xaml", System.UriKind.Relative);
#line 1 "..\..\SettingsWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.txtMinVoltage = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.txtMaxVoltage = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
this.txtMinCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 4:
this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
this.btnSave = ((System.Windows.Controls.Button)(target));
#line 77 "..\..\SettingsWindow.xaml"
this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click);
#line default
#line hidden
return;
case 6:
this.btnCancel = ((System.Windows.Controls.Button)(target));
#line 78 "..\..\SettingsWindow.xaml"
this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

BIN
marking_gui/obj/Debug/StartupLoginWindow.baml

Binary file not shown.

182
marking_gui/obj/Debug/StartupLoginWindow.g.cs

@ -0,0 +1,182 @@
#pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "0B89F527155E3EAFBE9C0A93994E6FA56AC662C1FB48127C3AC7F487F3DBFA24"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace Housing.Login {
/// <summary>
/// StartupLoginWindow
/// </summary>
public partial class StartupLoginWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 89 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox MakerTextBox;
#line default
#line hidden
#line 93 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox ModelTextBox;
#line default
#line hidden
#line 97 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox ColorCodeTextBox;
#line default
#line hidden
#line 101 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox LineNoTextBox;
#line default
#line hidden
#line 110 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox OperatorTextBox;
#line default
#line hidden
#line 117 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.PasswordBox PasswordBox;
#line default
#line hidden
#line 121 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox LotNoTextBox;
#line default
#line hidden
#line 125 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox JigNoTextBox;
#line default
#line hidden
#line 134 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button LogInButton;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/startuploginwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\StartupLoginWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.MakerTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.ModelTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
this.ColorCodeTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 4:
this.LineNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
this.OperatorTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 6:
this.PasswordBox = ((System.Windows.Controls.PasswordBox)(target));
return;
case 7:
this.LotNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 8:
this.JigNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 9:
this.LogInButton = ((System.Windows.Controls.Button)(target));
#line 134 "..\..\StartupLoginWindow.xaml"
this.LogInButton.Click += new System.Windows.RoutedEventHandler(this.LogInButton_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

182
marking_gui/obj/Debug/StartupLoginWindow.g.i.cs

@ -0,0 +1,182 @@
#pragma checksum "..\..\StartupLoginWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "3E7427B4858245795A7F90250B5B4ED420C4D1D9471FEC97E8B80C741D6410AC"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
namespace Housing.Login {
/// <summary>
/// StartupLoginWindow
/// </summary>
public partial class StartupLoginWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 89 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox MakerTextBox;
#line default
#line hidden
#line 93 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox ModelTextBox;
#line default
#line hidden
#line 97 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox ColorCodeTextBox;
#line default
#line hidden
#line 101 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox LineNoTextBox;
#line default
#line hidden
#line 110 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox OperatorTextBox;
#line default
#line hidden
#line 117 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.PasswordBox PasswordBox;
#line default
#line hidden
#line 121 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox LotNoTextBox;
#line default
#line hidden
#line 125 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.TextBox JigNoTextBox;
#line default
#line hidden
#line 132 "..\..\StartupLoginWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Button LogInButton;
#line default
#line hidden
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/marking_gui;component/startuploginwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\StartupLoginWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
switch (connectionId)
{
case 1:
this.MakerTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 2:
this.ModelTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 3:
this.ColorCodeTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 4:
this.LineNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 5:
this.OperatorTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 6:
this.PasswordBox = ((System.Windows.Controls.PasswordBox)(target));
return;
case 7:
this.LotNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 8:
this.JigNoTextBox = ((System.Windows.Controls.TextBox)(target));
return;
case 9:
this.LogInButton = ((System.Windows.Controls.Button)(target));
#line 132 "..\..\StartupLoginWindow.xaml"
this.LogInButton.Click += new System.Windows.RoutedEventHandler(this.LogInButton_Click);
#line default
#line hidden
return;
}
this._contentLoaded = true;
}
}
}

BIN
marking_gui/obj/Debug/marking_gui.Properties.Resources.resources

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.csproj.AssemblyReference.cache

Binary file not shown.

1
marking_gui/obj/Debug/marking_gui.csproj.CoreCompileInputs.cache

@ -0,0 +1 @@
559df058ce0c66c637b01951457837d0ef0f289591a84f9f0b0c4b4e214ea9db

19
marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt

@ -0,0 +1,19 @@
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.Properties.Resources.resources
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.csproj.GenerateResource.cache
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\bin\Debug\marking_gui.exe.config
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\bin\Debug\marking_gui.exe
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\bin\Debug\marking_gui.pdb
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\MainWindow.g.cs
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\App.g.cs
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui_MarkupCompile.cache
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui_MarkupCompile.lref
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\MainWindow.baml
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.g.resources
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.exe
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.pdb
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\SettingsWindow.baml
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\SettingsWindow.g.cs
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.csproj.AssemblyReference.cache
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\marking_gui.csproj.CoreCompileInputs.cache
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\StartupLoginWindow.baml
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\StartupLoginWindow.g.cs

BIN
marking_gui/obj/Debug/marking_gui.csproj.GenerateResource.cache

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.exe

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.g.resources

Binary file not shown.

BIN
marking_gui/obj/Debug/marking_gui.pdb

Binary file not shown.

20
marking_gui/obj/Debug/marking_gui_MarkupCompile.cache

@ -0,0 +1,20 @@
marking_gui
winexe
C#
.cs
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\
marking_gui
none
false
DEBUG;TRACE
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml
31238780151
11-917122263
141066371409
MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml;
False

20
marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache

@ -0,0 +1,20 @@
marking_gui
winexe
C#
.cs
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\
marking_gui
none
false
DEBUG;TRACE
C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml
3-1210742192
12189271937
14-207034072
MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml;
True

4
marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref

@ -0,0 +1,4 @@

FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;

4
marking_gui/obj/Debug/marking_gui_MarkupCompile.lref

@ -0,0 +1,4 @@

FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;

162
program_flow.md

@ -0,0 +1,162 @@
# 양산형 테스트 기기 모니터링 시스템 사용자 설명서 (User Manual)
본 문서는 **양산형 테스트 기기 모니터링 시스템**을 사용하는 작업자 및 검사자를 위한 운영 설명서입니다. 프로그램의 시작부터 제품 조회, 성능 검사 수행, 판정 기준 설정까지 내부 프로그램 코드를 몰라도 누구나 쉽게 작동법을 이해할 수 있도록 사용자 화면 관점에서 기술되었습니다.
---
## 1. 시스템 개요 (Introduction)
본 시스템은 제조 라인의 최종 단계에서 제품의 전기적 성능(측정 전압 및 전류)을 검사하고 최종 합격/불합격 여부를 판정하는 모니터링 프로그램입니다.
- **이전 단계 확인:** 제품의 바코드(S/N)를 조회하여 이전 주요 공정(Housing, Calibration, EOL)을 모두 통과했는지 자동으로 검증합니다.
- **실시간 계측 및 판정:** 검사를 시작하면 전기적 신호가 측정되며, 설정된 범위 이내인 경우 최종 `PASS`(합격), 범위를 벗어나면 `FAIL`(불합격) 판정을 내립니다.
- **파라미터 조율:** 생산 제품 사양에 맞춰 합격 판정 기준 범위(최소/최대 전압 및 전류)를 간편하게 변경할 수 있습니다.
---
## 2. 전체 동작 흐름도 (Operational Flow)
검사자가 프로그램을 구동하여 최종 검사를 완료하기까지의 전체 프로세스는 다음과 같습니다.
```mermaid
graph TD
A([1. 프로그램 실행]) --> B[시작 설정 및 로그인 팝업]
B --> C{로그인 및 설정 완료?}
C -- 취소/종료 --> D([프로그램 종료])
C -- 로그인 완료 클릭 --> E[메인 모니터링 화면 기동]
E --> F[상단바에서 작업자 및 모델 정보 확인]
F --> G[S/N 입력 칸에 바코드 스캔 또는 직접 입력]
G --> H[조회 버튼 클릭 또는 엔터 키 입력]
H --> I{이전 검사 결과 확인}
I -- 이전 단계 중 불합격 존재 --> J[경고 팝업 창 출력 및 진행 불가 표시]
J --> K[START 버튼 비활성화 상태 유지 -> 검사 불가]
K --> G
I -- 이전 단계 모두 합격 PASS --> L[상태: 검사 가능 표시 및 START 버튼 활성화]
L --> M[▶ 검사 시작 START 버튼 클릭]
M --> N[상태: 검사 진행 중 표시 및 수치 측정 시작]
N --> O[전압/전류 계측값이 2초간 흔들리며 측정 동작 연출]
O --> P[측정 완료 및 최종값 표시]
P --> Q{측정 전압/전류가 기준범위 이내인가?}
Q -- 합격 범위 내 --> R[대형 화면에 PASS 녹색 표시 및 합격 판정]
Q -- 범위 이탈 --> S[대형 화면에 FAIL 적색 표시 및 불합격 판정]
R --> T[시스템 원상 복구 및 다음 제품 검사 대기]
S --> T
T --> G
```
---
## 3. 상세 기능별 동작 가이드
### 3.1. 시스템 시작 설정 및 로그인
1. **프로그램 기동:** 프로그램을 켜면 메인 화면이 뜨기 전, **[시스템 시작 설정 & 로그인]** 화면이 화면 중앙에 먼저 나타납니다.
2. **설정값 기입:** 제조사, 모델명, 색상 코드, 라인 번호, LOT 번호, 지그 번호를 확인 및 기입하고, 담당 **작업자명**과 **비밀번호**를 입력합니다.
3. **빠른 테스트 실행 (테스트 계정):**
   - 검사 편의를 위해 작업자(`test`)와 비밀번호(`test`)가 미리 입력되어 있습니다.
   - 별도 수정 없이 곧바로 하단의 **[시스템 시작 및 로그인]** 단추를 누르면 로그인이 완료됩니다.
4. **정보 연동:** 로그인이 완료되면 로그인 창이 닫히고 메인 화면이 자동으로 최대화되어 열립니다. 메인 화면 좌측 상단바 영역에 입력했던 정보가 `[작업자: test | 모델: MOBI-EV-01 | 라인: LINE-3]` 형태로 상시 노출됩니다.
---
### 3.2. 제품 조회 및 이전 공정 이력 검증
1. **S/N(시리얼 번호) 스캔:** 메인 화면 좌측의 **'S/N 입력'** 상자에 제품 바코드를 스캔하거나 입력합니다. (키보드의 엔터 키 또는 **[조회]** 버튼 클릭)
2. **이전 단계 확인:** 시스템이 이전 공정 단계들의 결과를 불러와 화면 좌측 **'이전 시험 단계 결과'** 표에 표시합니다.
   - **합격 제품 테스트 (S/N: `PASS1234`):** Housing, Calibration, EOL 단계가 모두 초록색 `PASS`로 채워지며, 하단의 대형 **[▶ 검사 시작 (START)]** 버튼이 초록색으로 활성화되어 성능 검사를 수행할 수 있습니다.
   - **불합격 제품 테스트 (S/N: `FAIL5678`):** 이전 단계 중 실패한 항목이 빨간색 `FAIL`로 표시되며, 경고 창이 나타납니다. 하단의 검사 시작 버튼은 비활성화되어 최종 검사 진행이 전면 차단됩니다.
---
### 3.3. 최종 성능 검사 및 합불 판정
1. **검사 시작:** 초록색으로 활성화된 **[▶ 검사 시작 (START)]** 버튼을 클릭합니다.
2. **측정 중 상태 (2초간):**
   - 검사가 시작되면 상태창이 파란색 **'측정 중'**으로 변경되고 전압 및 전류 측정 영역의 수치들이 약 2초간 측정됩니다.
3. **최종 판정:**
   - 2초가 지나면 측정이 끝나고 최종 검출된 전압과 전류 수치가 화면에 고정됩니다.
   - **합격 (`PASS`):** 측정된 전압(디폴트 `4.0V ~ 6.0V`)과 전류(디폴트 `8.0A ~ 10.0A`)가 모두 가이드 범위 내에 도달하면 대형 판정 영역이 초록색 배경의 **`PASS`**로 갱신되며 최종 합격 판정이 완료됩니다.
   - **불합격 (`FAIL`):** 전압이나 전류 중 하나라도 기준 범위를 벗어나면 해당 측정 텍스트와 대형 판정 영역이 빨간색 배경의 **`FAIL`**로 변하여 경보를 나타냅니다.
   - 판정이 종료되면 시스템은 자동으로 대기 상태로 복구되어 다음 제품 검사를 진행할 준비를 마칩니다.
---
### 3.4. 판정 기준 파라미터 설정
1. **설정창 열기:** 최하단 바 좌측에 있는 파란색 **[⚙ 파라미터 설정]** 버튼을 클릭합니다.
2. **기준값 수정:** 화면에 팝업창이 나타나며 전압의 최소/최대값 및 전류의 최소/최대 기준 범위를 키보드로 입력하여 수정할 수 있습니다.
3. **유효성 체크 및 저장:**
   - 입력한 값은 음수여서는 안 되며, 최소값이 최대값보다 작아야 저장할 수 있습니다.
   - **[저장]**을 누르면 변경 사항이 적용되며, 메인 화면 전압/전류 카드 하단에 표시되는 가이드 문구(`기준범위: X.XV ~ Y.YV`)가 실시간으로 자동 변경되어 즉시 새로운 판정 기준으로 적용됩니다.
---
### 4. GUI
#### 메인 화면
![[Pasted image 20260605142629.png]]
#### 작동화면
![[Pasted image 20260605142747.png]]
#### 이전 시험 단계 실패 화면
![[Pasted image 20260605142804.png]]
#### 파라미터 설정 화면
![[Pasted image 20260605142845.png]]
Loading…
Cancel
Save