diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md new file mode 100644 index 0000000..bf7e571 --- /dev/null +++ b/.agents/AGENTS.md @@ -0,0 +1,11 @@ +# Project Agent Rules + +이 워크스페이스에서 작업을 수행할 때 반드시 다음 프로젝트 규칙을 준수하십시오. + +## 1. 지식베이스 참조 규칙 +- 성능 검사 모니터링 시스템과 관련된 모든 작업(수정, 디버깅, 신규 기능 추가 등)을 시작하기 전에 반드시 [docs/knowledge_base.md](file:///c:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/knowledge_base.md) 파일을 먼저 확인하고 지침을 숙지하십시오. +- 시스템 구성 방식, 빌드 엔진 사용 지침 및 데모 모드 작동 방식은 지식베이스에 정의된 정책을 따릅니다. + +## 2. 데모 모드 관련 규칙 +- 상용/실서버 배포 릴리즈 목적의 빌드를 진행할 때는 [docs/knowledge_base.md#3.1.-데모용-시뮬레이션-격리-코드-제거-방법-(중요)](file:///c:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/knowledge_base.md#31-데모용-시뮬레이션-격리-코드-제거-방법-중요) 가이드에 명시된 대로 데모 격리 영역 주석 배너 안의 코드를 삭제해야 합니다. +- 임의로 데모 검증 성공 로직을 다른 방식으로 배포본에 포함하지 마십시오. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..910c7ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,83 @@ +# ======================== +# .NET Framework / WPF +# ======================== + +# 빌드 출력 디렉터리 +[Bb]in/ +[Oo]bj/ + +# Visual Studio 캐시 및 설정 파일 +.vs/ +*.user +*.suo +*.userosscache +*.sln.docstates + +# 빌드 로그 +*.log +build_err.txt +build_log.txt +build_summary.txt +msbuild.log + +# NuGet 패키지 +packages/ +*.nupkg +*.nuspec + +# MSTest 결과 +TestResults/ +*.trx + +# 리소스 파일 (자동 생성) +*.g.cs +*.g.i.cs + +# 퍼블리시 결과물 +publish/ +[Pp]ublish/ +PublishScripts/ + +# ======================== +# 데이터베이스 / 설정 파일 (민감 정보 보호) +# ======================== + +# Database.ini 는 서버 주소, 비밀번호 등 민감 정보를 담고 있으므로 +# 원본 파일 대신 예시 파일(Database.ini.example)만 저장소에 포함합니다. +marking_gui/Database.ini + +# ======================== +# OS 생성 파일 +# ======================== + +# Windows +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# ======================== +# IDE 관련 +# ======================== + +# JetBrains Rider +.idea/ +*.sln.iml + +# Visual Studio Code +.vscode/ + +# ======================== +# 기타 +# ======================== + +# 압축 파일 +*.zip +*.7z +*.rar diff --git a/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx b/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx deleted file mode 100644 index c403b3f..0000000 Binary files a/.vs/marking_gui.slnx/FileContentIndex/0eaf846b-d4b9-4caf-a370-de061ce0320c.vsidx and /dev/null differ diff --git a/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx b/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx deleted file mode 100644 index 044693b..0000000 Binary files a/.vs/marking_gui.slnx/FileContentIndex/39788850-5095-4727-824a-b7633641276a.vsidx and /dev/null differ diff --git a/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx b/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx deleted file mode 100644 index 00ebef0..0000000 Binary files a/.vs/marking_gui.slnx/FileContentIndex/69f01546-7ea2-4b97-b377-8aef86bfa5e6.vsidx and /dev/null differ diff --git a/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx b/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx deleted file mode 100644 index c403b3f..0000000 Binary files a/.vs/marking_gui.slnx/FileContentIndex/b5393d54-c101-4f5a-80aa-1b6a40dcea0c.vsidx and /dev/null differ diff --git a/.vs/marking_gui.slnx/v18/.suo b/.vs/marking_gui.slnx/v18/.suo index 65f50d1..7a14d40 100644 Binary files a/.vs/marking_gui.slnx/v18/.suo and b/.vs/marking_gui.slnx/v18/.suo differ diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json index aab3543..e9a678d 100644 --- a/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json +++ b/.vs/marking_gui.slnx/v18/DocumentLayout.backup.json @@ -14,8 +14,12 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 0, + "SelectedChildIndex": 1, "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + }, { "$type": "Document", "DocumentIndex": 0, diff --git a/.vs/marking_gui.slnx/v18/DocumentLayout.json b/.vs/marking_gui.slnx/v18/DocumentLayout.json index aab3543..e9a678d 100644 --- a/.vs/marking_gui.slnx/v18/DocumentLayout.json +++ b/.vs/marking_gui.slnx/v18/DocumentLayout.json @@ -14,8 +14,12 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 0, + "SelectedChildIndex": 1, "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + }, { "$type": "Document", "DocumentIndex": 0, diff --git a/build_err.txt b/build_err.txt index fb85ddd..ad2671b 100644 Binary files a/build_err.txt and b/build_err.txt differ diff --git a/docs/database_setup.sql b/docs/database_setup.sql new file mode 100644 index 0000000..b7288ce --- /dev/null +++ b/docs/database_setup.sql @@ -0,0 +1,124 @@ +-- ========================================================== +-- 양산형 테스트 기기 모니터링 시스템 MSSQL 2012 DB 구성 스크립트 +-- 작성일: 2026-06-22 +-- 호환 버전: Microsoft SQL Server 2012 이상 +-- ========================================================== + +USE [master]; +GO + +-- 데이터베이스 생성 (존재하지 않을 경우에만 생성) +IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'MarkingDb') +BEGIN + CREATE DATABASE [MarkingDb]; +END +GO + +USE [MarkingDb]; +GO + +-- ========================================== +-- 1. [Users] 테이블 생성 (작업자 정보 및 비밀번호 관리) +-- ========================================== +IF OBJECT_ID(N'[dbo].[Users]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Users] ( + [Id] INT IDENTITY(1,1) NOT NULL, + [OperatorId] VARCHAR(50) NOT NULL, + [Password] VARCHAR(50) NOT NULL, + [Name] NVARCHAR(50) NULL, + [IsActive] BIT DEFAULT 1 NOT NULL, + CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC), + CONSTRAINT [UQ_Users_OperatorId] UNIQUE ([OperatorId]) + ); +END +GO + +-- 기본 테스트 계정 데이터 적재 +IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'test') +BEGIN + INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive]) + VALUES ('test', 'test', '테스트작업자', 1); +END +GO + +IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'admin') +BEGIN + INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive]) + VALUES ('admin', 'admin', '시스템관리자', 1); +END +GO + +IF NOT EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [OperatorId] = 'su') +BEGIN + INSERT INTO [dbo].[Users] ([OperatorId], [Password], [Name], [IsActive]) + VALUES ('su', 'su', '최고권한자', 1); +END +GO + + +-- ========================================== +-- 2. [Marking] 테이블 생성 (성능 측정 결과 적재) +-- ========================================== +IF OBJECT_ID(N'[dbo].[Marking]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Marking] ( + [IC_SN] VARCHAR(50) NOT NULL, + [Marking_QR] NVARCHAR(100) NOT NULL, + [Maker] NVARCHAR(10) NOT NULL, + [Model] NVARCHAR(10) NOT NULL, + [Variant_1] NVARCHAR(10) NOT NULL, + [Variant_2] NVARCHAR(10) NOT NULL, + [Operator] NVARCHAR(10) NOT NULL, + [Production_Date] DATETIME2(0) NOT NULL, + [Line] NVARCHAR(5) NOT NULL, + [Lot_No] NVARCHAR(8) NOT NULL, + [Jig_No] NVARCHAR(10) NOT NULL, + [PT_Vol_1] DECIMAL(3, 2) NOT NULL, + [PT_Vol_2] DECIMAL(3, 2) NOT NULL, + [PT_Vol_3] DECIMAL(3, 2) NOT NULL, + [PT_Current_1] DECIMAL(3, 2) NOT NULL, + [PT_Current_2] DECIMAL(3, 2) NOT NULL, + [PT_Current_3] DECIMAL(3, 2) NOT NULL, + [PT_Resistance_1] DECIMAL(3, 2) NOT NULL, + [PT_Resistance_2] DECIMAL(3, 2) NOT NULL, + [PT_Resistance_3] DECIMAL(3, 2) NOT NULL, + [Result] NVARCHAR(5) NOT NULL, + [Spare_1] NVARCHAR(30) NULL, + [Spare_2] NVARCHAR(30) NULL, + [Spare_3] NVARCHAR(30) NULL, + [Spare_4] NVARCHAR(30) NULL, + CONSTRAINT [PK_Marking] PRIMARY KEY CLUSTERED ([IC_SN] ASC), + CONSTRAINT [UQ_Marking_Marking_QR] UNIQUE ([Marking_QR]) + ); + + -- 시리얼 번호(IC_SN) 조회용 인덱스는 클러스터드 기본키로 지정되었으므로 생략 또는 추가 필요 시 생성 +END +GO + + +-- ========================================== +-- 3. [CheckOperator] 로그인 검증용 저장 프로시저 생성 +-- ========================================== +IF OBJECT_ID(N'[dbo].[CheckOperator]', N'P') IS NOT NULL +BEGIN + DROP PROCEDURE [dbo].[CheckOperator]; +END +GO + +CREATE PROCEDURE [dbo].[CheckOperator] + @Operator VARCHAR(50), + @Password VARCHAR(50), + @ProcessName VARCHAR(50) = NULL +AS +BEGIN + SET NOCOUNT ON; + + -- 대소문자 구분 없이 입력 ID와 비밀번호 매칭 여부를 카운트(0 또는 1)로 리턴 + SELECT COUNT(*) + FROM [dbo].[Users] + WHERE UPPER([OperatorId]) = UPPER(@Operator) + AND [Password] = @Password + AND [IsActive] = 1; +END; +GO diff --git a/docs/knowledge_base.md b/docs/knowledge_base.md new file mode 100644 index 0000000..b332383 --- /dev/null +++ b/docs/knowledge_base.md @@ -0,0 +1,105 @@ +# 성능 검사 모니터링 시스템 기술 지식베이스 (Knowledge Base) + +본 문서는 **양산형 테스트 기기 모니터링 시스템**의 소프트웨어 아키텍처, 주요 기능 변경 사항(저항 테스트 및 로그인 프로시저 연동), 그리고 유지보수 및 릴리즈를 위한 가이드를 정리한 지식베이스 문서입니다. + +--- + +## 1. 시스템 개요 및 구성 (System Overview) + +본 시스템은 제조 라인 최종 단계에서 제품(전기차 부품 등)의 전기적 성능 계측 데이터(전압, 전류, 저항)를 실시간으로 모니터링하고 최종 합격/불합격(PASS/FAIL) 판정을 내린 후 결과를 데이터베이스에 기록하고 설비 제어 완료 신호를 전달하는 WPF 기반 윈도우 애플리케이션입니다. + +### 1.1. 디렉터리 및 주요 파일 구조 +- **[Models/](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Models)** + - `Product.cs`: 제품 정보 및 이전 공정(Housing, Calibration, EOL) 이력 정보 관리 모델 + - `MeasurementLimits.cs`: 전압, 전류, 저항의 판정 기준 최소/최대 임계치를 저장하고 유효성을 검증하는 모델 +- **[Services/](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Services)** + - `MockMeasurer.cs`: 2초 계측 효과 시뮬레이션용 요동치는 노이즈 생성 및 합격/불합격 최종 결정값 반환 모사 서비스 + - `MssqlDatabaseService.cs`: 소수점 이하 2자리 반올림 및 최종 판정 값을 MSSQL DB에 적재하기 위한 데이터 액세스 서비스 (로그 출력) + - `MemoryReaderService.cs`: 메모리(바코드 스캐너 연동 등)로부터 제품의 Serial Number를 자동으로 읽어오는 서비스 + - `LoginServicesStub.cs`: `Database.ini` 파일로부터 로그인 프로시저 설정을 읽고 DB 저장 프로시저(`StoredProcedure`) 호출 검증을 수행하는 서비스 +- **[UI Windows]** + - `App.xaml` / `App.xaml.cs`: 애플리케이션 리소스 및 OnStartup 구동 진입점 정의 + - `MainWindow.xaml` / `MainWindow.xaml.cs`: 메인 실시간 모니터링 모듈 (계측 전압/전류/저항 카드, 판정 화면, 이전 이력 그리드 표출) + - `SettingsWindow.xaml` / `SettingsWindow.xaml.cs`: 검사 판정 기준(전압, 전류, 저항 최소/최대값)을 실시간 수정할 수 있는 환경 설정 팝업 창 + - `StartupLoginWindow.xaml` / `StartupLoginWindow.xaml.cs`: 작업자 인증 및 모델 configuration 세팅 시작 모달 화면 + +--- + +## 2. 세부 개발 및 구현 이력 (Development History) + +### 2.1. 저항(Resistance) 테스트 검사 추가 +전압과 전류에 국한되었던 기존 시스템에 저항 검사 프로세스를 추가하여 3대 전기 파라미터를 완성했습니다. +- **물리적 개연성 반영:** V = I * R 연계를 고려하여, 전압(4~6V) 및 전류(8~10A) 조건에서 저항 기본 범위를 **0.4Ω ~ 0.8Ω**으로 세팅했습니다. +- **UI 및 환경설정 연동:** 메인 화면에 세 번째 Column으로 `측정 저항 (Resistance)` 카드를 시각적으로 추가하고 설정 창(SettingsWindow)의 세로 크기를 늘려 저항 판정 임계치 입력란을 통합했습니다. +- **판정 결합:** `isFinalPass = isVoltageOk && isCurrentOk && isResistanceOk` 조건을 통해 세 항목 중 하나라도 이탈 시 자동으로 빨간색 텍스트 및 대형 FAIL 판정이 출력되도록 비즈니스 로직을 보강했습니다. + +### 2.2. 로그인 저장 프로시저 호출 연동 +인라인 SQL 질의 구조를 탈피하여 외부 설정에 명시된 SQL Server 저장 프로시저를 직접 호출하도록 구현했습니다. +- **외부 설정 로딩:** [Database.ini](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Database.ini) 파일을 통해 런타임에 호출할 프로시저명과 오프라인 모드 여부를 읽어옵니다. + ```ini + [Login] + Procedure=dbo.CheckOperator + ProcessName=Marking + OfflinePreview=false + ``` +- **ADO.NET StoredProcedure 연동:** `SqlCommand.CommandType = CommandType.StoredProcedure` 설정을 사용하여 `@Operator`, `@Password`, 그리고 선택적으로 `@ProcessName` 파라미터를 매핑하여 계정 검증 프로시저를 안전하게 가동합니다. + +--- + +## 3. 유지보수 및 릴리즈 가이드 (Release & Maintenance) + +### 3.1. 데모용 시뮬레이션 격리 코드 제거 방법 (중요) +로컬 데모 실행을 위해 실제 DB 서버 접속이 실패하더라도 프로시저 성공 여부를 모사하여 로그인을 즉시 통과시키는 임시 시뮬레이션 코드가 구현되어 있습니다. +실제 상용(Production) 배포 시에는 보안 및 실 데이터 검증을 위해 아래의 지침을 따라 **데모 코드를 반드시 삭제**해야 합니다. + +1. **[LoginServicesStub.cs](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/marking_gui/Services/LoginServicesStub.cs)** 파일을 엽니다. +2. `ExistsAsync` 메서드 내 `catch (Exception ex)` 블록 내부로 이동합니다. +3. 아래의 **DEMO MODE 주석 배너**로 둘러싸인 영역을 완전히 삭제하거나 주석 처리합니다. + ```csharp + // ==================== [DEMO MODE START] ==================== + // 데모 시뮬레이션용 프로시저 성공 연출 코드 + // 상용 릴리즈 시 이 블록은 완전히 제거(삭제)할 수 있습니다. + if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure)) + { + System.Diagnostics.Debug.WriteLine(string.Format("[데모 시뮬레이션] 프로시저 '{0}' 호출 모사 (ID: {1}, PW: {2}, Process: {3})", + _loginSettings.Procedure, operatorId, password, _loginSettings.ProcessName)); + return IsDefaultAccount(operatorId, password); + } + // ==================== [DEMO MODE END] ==================== + ``` +4. 삭제 후 빌드를 다시 수행하면, DB 통신 실패 시 로그인이 우회되지 않고 정상적으로 "로그인 DB 확인 실패" 경고가 발생하게 됩니다. + +### 3.2. 빌드 실행 방법 +본 프로젝트는 레거시 .NET Framework 4.7.2 타깃의 WPF 애플리케이션으로, XAML 마크업 빌드가 정상 동작하기 위해서는 Visual Studio 환경의 MSBuild 엔진이 필요합니다. +- **MSBuild 권장 경로:** `C:\Program Files\Microsoft Visual Studio\18\Insiders\MSBuild\Current\Bin\MSBuild.exe` (설치 버전에 따라 Insiders, Community, Professional 등으로 달라질 수 있음) +- **빌드 명령어 (터미널):** + ```powershell + & "C:\Program Files\Microsoft Visual Studio\18\Insiders\MSBuild\Current\Bin\MSBuild.exe" /t:rebuild + ``` +- **출력 경로:** 빌드 완수 후 `marking_gui\bin\Debug\` 또는 `Release\` 폴더에 실행 바이너리 및 `Database.ini` 파일이 함께 생성됩니다. + +--- + +## 4. 데이터베이스 구성 가이드 (Database Configuration) + +본 시스템은 **Microsoft SQL Server 2012** 이상의 버전에 완전히 호환되도록 구성되었습니다. 데이터베이스 구성 시 [docs/database_setup.sql](file:///C:/Users/COMPUTER1/Desktop/mobi/marking_gui/docs/database_setup.sql) 스크립트를 활용할 수 있습니다. + +### 4.1. 데이터베이스 및 스키마 구조 +- **데이터베이스명:** `MarkingDb` +- **[Users] (작업자 및 비밀번호 관리 테이블):** + - 작업자의 고유 ID(`OperatorId`), 패스워드(`Password`), 이름(`Name`) 및 계정 상태(`IsActive`)를 관리합니다. + - 로그인 조회 속도를 향상시키기 위해 `OperatorId` 컬럼에 UNIQUE 제약 조건을 할당했습니다. +- **[dbo].[Marking] (공정 메타데이터 및 성능 계측값 저장 테이블):** + - 바코드 S/N(`IC_SN`, 기본키)을 키로 하며, 고유 식별을 위해 메타데이터와 날짜 조합의 고유 키 `Marking_QR` (Unique Key)이 생성됩니다. + - 공정 정보(`Maker`, `Model`, `Variant_1`, `Variant_2`, `Operator`, `Production_Date`, `Line`, `Lot_No`, `Jig_No`) 및 최종 판정(`Result`)이 통합 적재됩니다. + - 3단계에 걸친 전압/전류/저항 컬럼(`PT_Vol_1~3`, `PT_Current_1~3`, `PT_Resistance_1~3`)이 존재하며, 현재는 1번 컬럼들에 최종 계측 수치(소수점 2자리 반올림)를 저장하고 2, 3번 컬럼은 `0.00`으로 기본값을 보정하여 저장합니다. + - DB 필드 크기 한계를 초과하여 적재 에러가 나지 않도록, `Line` 컬럼은 최대 5자, `Lot_No` 컬럼은 최대 8자 등으로 자르는(Truncate) 방어적 코드 처리가 수행됩니다. + +### 4.2. 로그인 검증 저장 프로시저 ([CheckOperator]) +- **프로시저 기능:** 입력된 ID와 패스워드가 활성 상태인 작업자 테이블에 매칭되는지 대소문자 구분 없이 카운팅합니다. +- **매개변수 정보:** + - `@Operator` (VARCHAR(50)): 작업자 ID + - `@Password` (VARCHAR(50)): 비밀번호 + - `@ProcessName` (VARCHAR(50)): 호출 프로세스명 (선택사항, 기본값 NULL) +- **리턴:** 매칭되는 활성 사용자가 존재할 시 `1`, 존재하지 않을 시 `0`을 스칼라 결과로 반환합니다. + diff --git a/marking_gui/MainWindow.xaml b/marking_gui/MainWindow.xaml index d9cd080..3316cc2 100644 --- a/marking_gui/MainWindow.xaml +++ b/marking_gui/MainWindow.xaml @@ -267,15 +267,16 @@ - + + - + @@ -294,7 +295,7 @@ - + @@ -311,6 +312,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/marking_gui/MainWindow.xaml.cs b/marking_gui/MainWindow.xaml.cs index 8cbbc5d..915baa3 100644 --- a/marking_gui/MainWindow.xaml.cs +++ b/marking_gui/MainWindow.xaml.cs @@ -79,6 +79,7 @@ namespace marking_gui { 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); + txtResistanceRangeGuide.Text = string.Format("기준범위: {0:F1}Ω ~ {1:F1}Ω", _limits.MinResistance, _limits.MaxResistance); } private void btnOpenSettings_Click(object sender, RoutedEventArgs e) @@ -111,6 +112,8 @@ namespace marking_gui txtVoltage.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55)); txtCurrent.Text = "-.--"; txtCurrent.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55)); + txtResistance.Text = "-.--"; + txtResistance.Foreground = new SolidColorBrush(Color.FromRgb(31, 41, 55)); txtFinalResult.Text = "대 기 중"; txtFinalResult.Foreground = new SolidColorBrush(Color.FromRgb(156, 163, 175)); @@ -240,30 +243,34 @@ namespace marking_gui if (_timerTickCount < 10) // 약 2초 동안 측정값 흔들림 효과 연출 { - double tempVoltage, tempCurrent; - _measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent); + double tempVoltage, tempCurrent, tempResistance; + _measurer.GenerateNoiseValues(_limits, out tempVoltage, out tempCurrent, out tempResistance); txtVoltage.Text = tempVoltage.ToString("F2"); txtCurrent.Text = tempCurrent.ToString("F2"); + txtResistance.Text = tempResistance.ToString("F2"); } else // 최종 측정 완료 및 판정 { _measurementTimer.Stop(); - double finalVoltage, finalCurrent; - _measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent); + double finalVoltage, finalCurrent, finalResistance; + _measurer.GenerateFinalValues(_limits, out finalVoltage, out finalCurrent, out finalResistance); txtVoltage.Text = finalVoltage.ToString("F2"); txtCurrent.Text = finalCurrent.ToString("F2"); + txtResistance.Text = finalResistance.ToString("F2"); // 합/불 판정 bool isVoltageOk = finalVoltage >= _limits.MinVoltage && finalVoltage <= _limits.MaxVoltage; bool isCurrentOk = finalCurrent >= _limits.MinCurrent && finalCurrent <= _limits.MaxCurrent; - bool isFinalPass = isVoltageOk && isCurrentOk; + bool isResistanceOk = finalResistance >= _limits.MinResistance && finalResistance <= _limits.MaxResistance; + bool isFinalPass = isVoltageOk && isCurrentOk && isResistanceOk; // 측정값 색상 표시 (통과 시 검은색, 실패 시 빨간색) 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)); + txtResistance.Foreground = isResistanceOk ? new SolidColorBrush(Color.FromRgb(31, 41, 55)) : new SolidColorBrush(Color.FromRgb(239, 68, 68)); if (isFinalPass) { @@ -284,11 +291,24 @@ namespace marking_gui borderFinalResult.Background = new SolidColorBrush(Color.FromRgb(254, 226, 226)); // Light Red } - // 데이터베이스에 최종 검사 결과 저장 (소수점 2자리 반올림 포맷 반영) + // 데이터베이스에 최종 검사 결과 저장 (소수점 2자리 반올림 포맷 반영 및 공정 정보 전달) try { string serial = txtSerial.Text.Trim(); - _database.SaveProductResult(serial, finalVoltage, finalCurrent, isFinalPass ? "PASS" : "FAIL"); + _database.SaveProductResult( + serial, + _loginInfo.Maker, + _loginInfo.Model, + _loginInfo.Variant1, + _loginInfo.Variant2, + _loginInfo.Operator, + _loginInfo.LineNo, + _loginInfo.LotNo, + _loginInfo.JigNo, + finalVoltage, + finalCurrent, + finalResistance, + isFinalPass ? "PASS" : "FAIL"); // 합격 판정 시 최종 SUCCESS 신호 전달 시뮬레이션 if (isFinalPass) diff --git a/marking_gui/Models/MeasurementLimits.cs b/marking_gui/Models/MeasurementLimits.cs index 0d8f494..df839f6 100644 --- a/marking_gui/Models/MeasurementLimits.cs +++ b/marking_gui/Models/MeasurementLimits.cs @@ -8,20 +8,24 @@ namespace marking_gui.Models public double MaxVoltage { get; set; } public double MinCurrent { get; set; } public double MaxCurrent { get; set; } + public double MinResistance { get; set; } + public double MaxResistance { get; set; } - public MeasurementLimits(double minVoltage = 4.0, double maxVoltage = 6.0, double minCurrent = 8.0, double maxCurrent = 10.0) + public MeasurementLimits(double minVoltage = 4.0, double maxVoltage = 6.0, double minCurrent = 8.0, double maxCurrent = 10.0, double minResistance = 0.4, double maxResistance = 0.8) { MinVoltage = minVoltage; MaxVoltage = maxVoltage; MinCurrent = minCurrent; MaxCurrent = maxCurrent; + MinResistance = minResistance; + MaxResistance = maxResistance; } public bool Validate(out string errorMessage) { errorMessage = string.Empty; - if (MinVoltage < 0 || MaxVoltage < 0 || MinCurrent < 0 || MaxCurrent < 0) + if (MinVoltage < 0 || MaxVoltage < 0 || MinCurrent < 0 || MaxCurrent < 0 || MinResistance < 0 || MaxResistance < 0) { errorMessage = "기준 범위 설정 값은 0 이상의 값이어야 합니다."; return false; @@ -39,6 +43,12 @@ namespace marking_gui.Models return false; } + if (MinResistance >= MaxResistance) + { + errorMessage = "저항 최소값은 최대값보다 작아야 합니다."; + return false; + } + return true; } } diff --git a/marking_gui/Services/LoginServicesStub.cs b/marking_gui/Services/LoginServicesStub.cs index f0f945c..af1dfa6 100644 --- a/marking_gui/Services/LoginServicesStub.cs +++ b/marking_gui/Services/LoginServicesStub.cs @@ -45,6 +45,8 @@ namespace Housing.Services public class LoginSettings { public bool OfflinePreview { get; set; } = true; // 기본값은 오프라인 테스트 편의를 위해 true + public string Procedure { get; set; } = string.Empty; + public string ProcessName { get; set; } = string.Empty; public static LoginSettings Load(string path) { @@ -72,6 +74,22 @@ namespace Housing.Services } } } + else if (trimmed.StartsWith("Procedure", StringComparison.OrdinalIgnoreCase)) + { + var parts = trimmed.Split(new[] { '=' }, 2); + if (parts.Length == 2) + { + settings.Procedure = parts[1].Trim(); + } + } + else if (trimmed.StartsWith("ProcessName", StringComparison.OrdinalIgnoreCase)) + { + var parts = trimmed.Split(new[] { '=' }, 2); + if (parts.Length == 2) + { + settings.ProcessName = parts[1].Trim(); + } + } } } } @@ -251,22 +269,66 @@ namespace Housing.Services { await conn.OpenAsync(); - // 우선 Users 또는 Accounts와 같이 로그인 테이블명이 뭔지 모를 수 있으므로 - // 쿼리 실패 시 default 계정 검증으로 fallback 하도록 구성 - const string query = "SELECT COUNT(*) FROM [Users] WHERE [OperatorId] = @Id AND [Password] = @Pw"; - using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn)) + if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure)) { - cmd.Parameters.AddWithValue("@Id", operatorId); - cmd.Parameters.AddWithValue("@Pw", password); - - var count = (int)await cmd.ExecuteScalarAsync(); - return count > 0; + using (var cmd = new System.Data.SqlClient.SqlCommand(_loginSettings.Procedure, conn)) + { + cmd.CommandType = System.Data.CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("@Operator", operatorId); + cmd.Parameters.AddWithValue("@Password", password); + if (!string.IsNullOrWhiteSpace(_loginSettings.ProcessName)) + { + cmd.Parameters.AddWithValue("@ProcessName", _loginSettings.ProcessName); + } + + var resultObj = await cmd.ExecuteScalarAsync(); + if (resultObj != null) + { + if (int.TryParse(resultObj.ToString(), out var count)) + { + return count > 0; + } + if (bool.TryParse(resultObj.ToString(), out var boolVal)) + { + return boolVal; + } + return true; + } + return false; + } + } + else + { + // 우선 Users 또는 Accounts와 같이 로그인 테이블명이 뭔지 모를 수 있으므로 + // 쿼리 실패 시 default 계정 검증으로 fallback 하도록 구성 + const string query = "SELECT COUNT(*) FROM [Users] WHERE [OperatorId] = @Id AND [Password] = @Pw"; + using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn)) + { + cmd.Parameters.AddWithValue("@Id", operatorId); + cmd.Parameters.AddWithValue("@Pw", password); + + var count = (int)await cmd.ExecuteScalarAsync(); + return count > 0; + } } } } - catch + catch (Exception ex) { - // DB 연결이나 쿼리 오류 발생 시, 테스트 편의를 위해 test/test 혹은 admin/admin 등 디폴트 계정을 제공 + // DB 연결이나 쿼리 오류 발생 시 로그 출력 후 디폴트 계정 검증으로 fallback + System.Diagnostics.Debug.WriteLine($"로그인 검증 중 에러 발생: {ex.Message}"); + + // ==================== [DEMO MODE START] ==================== + // DB가 없고 데모 환경일 때도 프로시저를 호출하려는 동작 및 로그 연출을 수행한 후 강제로 성공 처리 + // 상용 릴리즈 시 이 블록은 완전히 제거(삭제)할 수 있습니다. + if (!string.IsNullOrWhiteSpace(_loginSettings.Procedure)) + { + System.Diagnostics.Debug.WriteLine(string.Format("[데모 시뮬레이션] 프로시저 '{0}' 호출 모사 (ID: {1}, PW: {2}, Process: {3})", + _loginSettings.Procedure, operatorId, password, _loginSettings.ProcessName)); + return IsDefaultAccount(operatorId, password); + } + // ==================== [DEMO MODE END] ==================== + return IsDefaultAccount(operatorId, password); } } diff --git a/marking_gui/Services/MockMeasurer.cs b/marking_gui/Services/MockMeasurer.cs index ddad0bb..f52dc87 100644 --- a/marking_gui/Services/MockMeasurer.cs +++ b/marking_gui/Services/MockMeasurer.cs @@ -8,49 +8,66 @@ namespace marking_gui.Services private readonly Random _random = new Random(); // 2초 동안 측정 중 요동칠 가상 데이터 생성 - public void GenerateNoiseValues(MeasurementLimits limits, out double voltage, out double current) + public void GenerateNoiseValues(MeasurementLimits limits, out double voltage, out double current, out double resistance) { double midVoltage = (limits.MinVoltage + limits.MaxVoltage) / 2.0; double midCurrent = (limits.MinCurrent + limits.MaxCurrent) / 2.0; + double midResistance = (limits.MinResistance + limits.MaxResistance) / 2.0; // 설정 범위 폭에 맞추어 ±50% 범위의 노이즈 생성 double voltageSpan = limits.MaxVoltage - limits.MinVoltage; double currentSpan = limits.MaxCurrent - limits.MinCurrent; + double resistanceSpan = limits.MaxResistance - limits.MinResistance; voltage = midVoltage + (_random.NextDouble() * voltageSpan - (voltageSpan / 2.0)); current = midCurrent + (_random.NextDouble() * currentSpan - (currentSpan / 2.0)); + resistance = midResistance + (_random.NextDouble() * resistanceSpan - (resistanceSpan / 2.0)); } // 최종 합/불 판정 측정값 결정 (80% 확률로 합격 범위, 20% 확률로 불합격 범위 값 생성) - public void GenerateFinalValues(MeasurementLimits limits, out double voltage, out double current) + public void GenerateFinalValues(MeasurementLimits limits, out double voltage, out double current, out double resistance) { double voltageSpan = limits.MaxVoltage - limits.MinVoltage; double currentSpan = limits.MaxCurrent - limits.MinCurrent; + double resistanceSpan = limits.MaxResistance - limits.MinResistance; if (_random.Next(0, 10) < 8) { // 합격 범위 내의 가상 측정값 생성 voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan); current = limits.MinCurrent + (_random.NextDouble() * currentSpan); + resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan); } else { // 불합격 범위 유도 - if (_random.Next(0, 2) == 0) + int errorType = _random.Next(0, 3); + if (errorType == 0) { // 전압 에러 유도 (범위 폭의 50% 정도 벗어나도록 가/감산하여 음수 방지) voltage = _random.Next(0, 2) == 0 ? (limits.MinVoltage - (voltageSpan * 0.5)) : (limits.MaxVoltage + (voltageSpan * 0.5)); current = limits.MinCurrent + (_random.NextDouble() * currentSpan); + resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan); } - else + else if (errorType == 1) { // 전류 에러 유도 voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan); current = _random.Next(0, 2) == 0 ? (limits.MinCurrent - (currentSpan * 0.5)) : (limits.MaxCurrent + (currentSpan * 0.5)); + resistance = limits.MinResistance + (_random.NextDouble() * resistanceSpan); + } + else + { + // 저항 에러 유도 + voltage = limits.MinVoltage + (_random.NextDouble() * voltageSpan); + current = limits.MinCurrent + (_random.NextDouble() * currentSpan); + resistance = _random.Next(0, 2) == 0 + ? (limits.MinResistance - (resistanceSpan * 0.5)) + : (limits.MaxResistance + (resistanceSpan * 0.5)); } } } diff --git a/marking_gui/Services/MssqlDatabaseService.cs b/marking_gui/Services/MssqlDatabaseService.cs index 8fa6fdf..b8e682d 100644 --- a/marking_gui/Services/MssqlDatabaseService.cs +++ b/marking_gui/Services/MssqlDatabaseService.cs @@ -12,15 +12,38 @@ namespace marking_gui.Services { try { - // App.config 에서 연결 문자열을 로드하여 준비해둡니다. - var connSettings = ConfigurationManager.ConnectionStrings["MssqlConnection"]; - if (connSettings != null) + // AppDomain.CurrentDomain.BaseDirectory 에서 Database.ini 로드 시도 + string iniPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Database.ini"); + if (System.IO.File.Exists(iniPath)) { - _connectionString = connSettings.ConnectionString; + var lines = System.IO.File.ReadAllLines(iniPath); + foreach (var line in lines) + { + var trimmed = line.Trim(); + if (trimmed.StartsWith("ConnectionString", StringComparison.OrdinalIgnoreCase)) + { + var parts = trimmed.Split(new[] { '=' }, 2); + if (parts.Length == 2) + { + _connectionString = parts[1].Trim(); + break; + } + } + } } - else + + // Database.ini 에 없을 경우 App.config 백업 사용 + if (string.IsNullOrEmpty(_connectionString)) { - _connectionString = "Server=localhost;Database=MarkingDb;Trusted_Connection=True;"; + var connSettings = ConfigurationManager.ConnectionStrings["MssqlConnection"]; + if (connSettings != null) + { + _connectionString = connSettings.ConnectionString; + } + else + { + _connectionString = "Server=localhost;Database=MarkingDb;Trusted_Connection=True;"; + } } } catch (Exception ex) @@ -64,23 +87,73 @@ namespace marking_gui.Services /// 최종 성능 검출 값을 데이터베이스에 저장합니다. /// 전압과 전류 수치는 3,2 포맷(DECIMAL(3, 2) 등)에 대응하기 위해 소수점 이하 2자리로 반올림하여 처리합니다. /// - public bool SaveProductResult(string serial, double voltage, double current, string result) + public bool SaveProductResult( + string serial, + string maker, + string model, + string variant1, + string variant2, + string operatorId, + string line, + string lotNo, + string jigNo, + double voltage, + double current, + double resistance, + string result) { - // 전압과 전류를 소수점 이하 2자리(3,2 포맷 규격)로 반올림 처리 + // 전압과 전류, 저항을 소수점 이하 2자리(3,2 포맷 규격)로 반올림 처리 decimal roundedVoltage = Math.Round((decimal)voltage, 2); decimal roundedCurrent = Math.Round((decimal)current, 2); + decimal roundedResistance = Math.Round((decimal)resistance, 2); + + // DB 컬럼 길이 한계에 맞춰서 문자열 안전하게 자르기 (Truncate) + string safeMaker = string.IsNullOrEmpty(maker) ? "" : (maker.Length > 10 ? maker.Substring(0, 10) : maker); + string safeModel = string.IsNullOrEmpty(model) ? "" : (model.Length > 10 ? model.Substring(0, 10) : model); + string safeVariant1 = string.IsNullOrEmpty(variant1) ? "" : (variant1.Length > 10 ? variant1.Substring(0, 10) : variant1); + string safeVariant2 = string.IsNullOrEmpty(variant2) ? "" : (variant2.Length > 10 ? variant2.Substring(0, 10) : variant2); + string safeOperator = string.IsNullOrEmpty(operatorId) ? "" : (operatorId.Length > 10 ? operatorId.Substring(0, 10) : operatorId); + string safeLine = string.IsNullOrEmpty(line) ? "" : (line.Length > 5 ? line.Substring(0, 5) : line); + string safeLotNo = string.IsNullOrEmpty(lotNo) ? "" : (lotNo.Length > 8 ? lotNo.Substring(0, 8) : lotNo); + string safeJigNo = string.IsNullOrEmpty(jigNo) ? "" : (jigNo.Length > 10 ? jigNo.Substring(0, 10) : jigNo); + + DateTime prodDate = DateTime.Now; + // QR Code 조합 포맷 생성 (Maker;Model;Variant_1;Variant_2;Operator;Production_Date) + string markingQr = string.Format("{0};{1};{2};{3};{4};{5}", + safeMaker, safeModel, safeVariant1, safeVariant2, safeOperator, prodDate.ToString("yyyyMMddHHmmss")); + if (markingQr.Length > 100) + { + markingQr = markingQr.Substring(0, 100); + } // TODO: 실제 MSSQL DB 적재를 위해 SQL 명령문 구현 템플릿 준비 /* - string query = "INSERT INTO ProductResults (SerialNumber, Voltage, Current, FinalResult, TestTime) VALUES (@Serial, @Voltage, @Current, @Result, GETDATE())"; + string query = @"INSERT INTO [dbo].[Marking] + ([IC_SN], [Marking_QR], [Maker], [Model], [Variant_1], [Variant_2], [Operator], [Production_Date], [Line], [Lot_No], [Jig_No], + [PT_Vol_1], [PT_Vol_2], [PT_Vol_3], [PT_Current_1], [PT_Current_2], [PT_Current_3], [PT_Resistance_1], [PT_Resistance_2], [PT_Resistance_3], [Result]) + VALUES + (@Serial, @Qr, @Maker, @Model, @Var1, @Var2, @Operator, @ProdDate, @Line, @LotNo, @JigNo, + @Vol1, 0.00, 0.00, @Cur1, 0.00, 0.00, @Res1, 0.00, 0.00, @Result)"; + using (var conn = new System.Data.SqlClient.SqlConnection(_connectionString)) { using (var cmd = new System.Data.SqlClient.SqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@Serial", serial); - // DECIMAL(3,2) 포맷 매핑 파라미터 (Precision=3, Scale=2) - cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Voltage", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedVoltage }); - cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Current", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedCurrent }); + cmd.Parameters.AddWithValue("@Qr", markingQr); + cmd.Parameters.AddWithValue("@Maker", safeMaker); + cmd.Parameters.AddWithValue("@Model", safeModel); + cmd.Parameters.AddWithValue("@Var1", safeVariant1); + cmd.Parameters.AddWithValue("@Var2", safeVariant2); + cmd.Parameters.AddWithValue("@Operator", safeOperator); + cmd.Parameters.AddWithValue("@ProdDate", prodDate); + cmd.Parameters.AddWithValue("@Line", safeLine); + cmd.Parameters.AddWithValue("@LotNo", safeLotNo); + cmd.Parameters.AddWithValue("@JigNo", safeJigNo); + + cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Vol1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedVoltage }); + cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Cur1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedCurrent }); + cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Res1", System.Data.SqlDbType.Decimal) { Precision = 3, Scale = 2, Value = roundedResistance }); cmd.Parameters.AddWithValue("@Result", result); conn.Open(); @@ -90,8 +163,9 @@ namespace marking_gui.Services */ // 데모 단계 로그 출력 및 성공 반환 - System.Diagnostics.Debug.WriteLine(string.Format("[DB 저장 로그] S/N: {0} | 전압: {1:F2}V | 전류: {2:F2}A | 결과: {3}", - serial, roundedVoltage, roundedCurrent, result)); + System.Diagnostics.Debug.WriteLine(string.Format( + "[DB 저장 로그] S/N: {0} | QR: {1} | Maker: {2} | Model: {3} | Line: {4} | LotNo: {5} | Vol_1: {6:F2}V | Cur_1: {7:F2}A | Res_1: {8:F2}Ω | 결과: {9}", + serial, markingQr, safeMaker, safeModel, safeLine, safeLotNo, roundedVoltage, roundedCurrent, roundedResistance, result)); return true; } diff --git a/marking_gui/SettingsWindow.xaml b/marking_gui/SettingsWindow.xaml index a4f1e5e..33a5d4b 100644 --- a/marking_gui/SettingsWindow.xaml +++ b/marking_gui/SettingsWindow.xaml @@ -1,7 +1,7 @@ @@ -44,14 +44,16 @@ - + - + + + @@ -59,18 +61,24 @@ - + - + + + + + + + diff --git a/marking_gui/SettingsWindow.xaml.cs b/marking_gui/SettingsWindow.xaml.cs index c4d26a3..f16f6eb 100644 --- a/marking_gui/SettingsWindow.xaml.cs +++ b/marking_gui/SettingsWindow.xaml.cs @@ -16,28 +16,32 @@ namespace marking_gui InitializeComponent(); // 원본의 데이터 무결성을 유지하기 위해 임시 복제하여 사용 - Limits = new MeasurementLimits(limits.MinVoltage, limits.MaxVoltage, limits.MinCurrent, limits.MaxCurrent); + Limits = new MeasurementLimits(limits.MinVoltage, limits.MaxVoltage, limits.MinCurrent, limits.MaxCurrent, limits.MinResistance, limits.MaxResistance); txtMinVoltage.Text = Limits.MinVoltage.ToString("F1"); txtMaxVoltage.Text = Limits.MaxVoltage.ToString("F1"); txtMinCurrent.Text = Limits.MinCurrent.ToString("F1"); txtMaxCurrent.Text = Limits.MaxCurrent.ToString("F1"); + txtMinResistance.Text = Limits.MinResistance.ToString("F1"); + txtMaxResistance.Text = Limits.MaxResistance.ToString("F1"); } private void btnSave_Click(object sender, RoutedEventArgs e) { - double minV, maxV, minC, maxC; + double minV, maxV, minC, maxC, minR, maxR; 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)) + !double.TryParse(txtMaxCurrent.Text, out maxC) || + !double.TryParse(txtMinResistance.Text, out minR) || + !double.TryParse(txtMaxResistance.Text, out maxR)) { MessageBox.Show("기준 범위 설정 값은 올바른 숫자 형식이어야 합니다.", "설정 오류", MessageBoxButton.OK, MessageBoxImage.Warning); return; } - MeasurementLimits tempLimits = new MeasurementLimits(minV, maxV, minC, maxC); + MeasurementLimits tempLimits = new MeasurementLimits(minV, maxV, minC, maxC, minR, maxR); string errorMessage; if (!tempLimits.Validate(out errorMessage)) { diff --git a/marking_gui/bin/Debug/marking_gui.exe b/marking_gui/bin/Debug/marking_gui.exe index ea62845..34c1d9c 100644 Binary files a/marking_gui/bin/Debug/marking_gui.exe and b/marking_gui/bin/Debug/marking_gui.exe differ diff --git a/marking_gui/bin/Debug/marking_gui.pdb b/marking_gui/bin/Debug/marking_gui.pdb index e47e031..7045d97 100644 Binary files a/marking_gui/bin/Debug/marking_gui.pdb and b/marking_gui/bin/Debug/marking_gui.pdb differ diff --git a/marking_gui/marking_gui.csproj b/marking_gui/marking_gui.csproj index 1215700..6aa673f 100644 --- a/marking_gui/marking_gui.csproj +++ b/marking_gui/marking_gui.csproj @@ -117,6 +117,9 @@ + + PreserveNewest + \ No newline at end of file diff --git a/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index da83b00..e41949b 100644 Binary files a/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/marking_gui/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/marking_gui/obj/Debug/MainWindow.baml b/marking_gui/obj/Debug/MainWindow.baml index aaa4968..1b96b34 100644 Binary files a/marking_gui/obj/Debug/MainWindow.baml and b/marking_gui/obj/Debug/MainWindow.baml differ diff --git a/marking_gui/obj/Debug/MainWindow.g.cs b/marking_gui/obj/Debug/MainWindow.g.cs index 7ffa890..3156126 100644 --- a/marking_gui/obj/Debug/MainWindow.g.cs +++ b/marking_gui/obj/Debug/MainWindow.g.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "78353F577CF95121F4374AAAC541156B6A45BBD586BC828F32989335C29F1F19" +#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD4A4C06745EFEC612E5A40E8825C3B16CE481532342C19F0C009E1B56E7E5F4" //------------------------------------------------------------------------------ // // 이 코드는 도구를 사용하여 생성되었습니다. @@ -137,7 +137,7 @@ namespace marking_gui { #line hidden - #line 288 "..\..\MainWindow.xaml" + #line 289 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtVoltage; @@ -145,7 +145,7 @@ namespace marking_gui { #line hidden - #line 292 "..\..\MainWindow.xaml" + #line 293 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtVoltageRangeGuide; @@ -153,7 +153,7 @@ namespace marking_gui { #line hidden - #line 307 "..\..\MainWindow.xaml" + #line 308 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtCurrent; @@ -161,7 +161,7 @@ namespace marking_gui { #line hidden - #line 311 "..\..\MainWindow.xaml" + #line 312 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtCurrentRangeGuide; @@ -169,7 +169,23 @@ namespace marking_gui { #line hidden - #line 317 "..\..\MainWindow.xaml" + #line 327 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock txtResistance; + + #line default + #line hidden + + + #line 331 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock txtResistanceRangeGuide; + + #line default + #line hidden + + + #line 337 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Border borderFinalResult; @@ -177,7 +193,7 @@ namespace marking_gui { #line hidden - #line 326 "..\..\MainWindow.xaml" + #line 346 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtFinalResult; @@ -185,7 +201,7 @@ namespace marking_gui { #line hidden - #line 327 "..\..\MainWindow.xaml" + #line 347 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtFinalSerial; @@ -193,7 +209,7 @@ namespace marking_gui { #line hidden - #line 337 "..\..\MainWindow.xaml" + #line 357 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnStart; @@ -201,7 +217,7 @@ namespace marking_gui { #line hidden - #line 346 "..\..\MainWindow.xaml" + #line 366 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnOpenSettings; @@ -331,27 +347,33 @@ namespace marking_gui { this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target)); return; case 21: - this.borderFinalResult = ((System.Windows.Controls.Border)(target)); + this.txtResistance = ((System.Windows.Controls.TextBlock)(target)); return; case 22: - this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target)); + this.txtResistanceRangeGuide = ((System.Windows.Controls.TextBlock)(target)); return; case 23: - this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target)); + this.borderFinalResult = ((System.Windows.Controls.Border)(target)); return; case 24: + this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target)); + return; + case 25: + this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target)); + return; + case 26: this.btnStart = ((System.Windows.Controls.Button)(target)); - #line 338 "..\..\MainWindow.xaml" + #line 358 "..\..\MainWindow.xaml" this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click); #line default #line hidden return; - case 25: + case 27: this.btnOpenSettings = ((System.Windows.Controls.Button)(target)); - #line 347 "..\..\MainWindow.xaml" + #line 367 "..\..\MainWindow.xaml" this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click); #line default diff --git a/marking_gui/obj/Debug/MainWindow.g.i.cs b/marking_gui/obj/Debug/MainWindow.g.i.cs index 48f970b..3156126 100644 --- a/marking_gui/obj/Debug/MainWindow.g.i.cs +++ b/marking_gui/obj/Debug/MainWindow.g.i.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "60B18A2C8EC6850BAA7CCDBE87ACA2C0E97BE83EC5737A82EA9755C4685A0C2C" +#pragma checksum "..\..\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "AD4A4C06745EFEC612E5A40E8825C3B16CE481532342C19F0C009E1B56E7E5F4" //------------------------------------------------------------------------------ // // 이 코드는 도구를 사용하여 생성되었습니다. @@ -89,7 +89,23 @@ namespace marking_gui { #line hidden - #line 188 "..\..\MainWindow.xaml" + #line 170 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button btnMaximize; + + #line default + #line hidden + + + #line 171 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock txtMaximizeIcon; + + #line default + #line hidden + + + #line 201 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtSerial; @@ -97,7 +113,7 @@ namespace marking_gui { #line hidden - #line 219 "..\..\MainWindow.xaml" + #line 232 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtPrevHousing; @@ -105,7 +121,7 @@ namespace marking_gui { #line hidden - #line 230 "..\..\MainWindow.xaml" + #line 243 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtPrevCal; @@ -113,7 +129,7 @@ namespace marking_gui { #line hidden - #line 241 "..\..\MainWindow.xaml" + #line 254 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtPrevEol; @@ -121,7 +137,7 @@ namespace marking_gui { #line hidden - #line 275 "..\..\MainWindow.xaml" + #line 289 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtVoltage; @@ -129,7 +145,7 @@ namespace marking_gui { #line hidden - #line 279 "..\..\MainWindow.xaml" + #line 293 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtVoltageRangeGuide; @@ -137,7 +153,7 @@ namespace marking_gui { #line hidden - #line 294 "..\..\MainWindow.xaml" + #line 308 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtCurrent; @@ -145,7 +161,7 @@ namespace marking_gui { #line hidden - #line 298 "..\..\MainWindow.xaml" + #line 312 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtCurrentRangeGuide; @@ -153,7 +169,23 @@ namespace marking_gui { #line hidden - #line 304 "..\..\MainWindow.xaml" + #line 327 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock txtResistance; + + #line default + #line hidden + + + #line 331 "..\..\MainWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock txtResistanceRangeGuide; + + #line default + #line hidden + + + #line 337 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Border borderFinalResult; @@ -161,7 +193,7 @@ namespace marking_gui { #line hidden - #line 313 "..\..\MainWindow.xaml" + #line 346 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtFinalResult; @@ -169,7 +201,7 @@ namespace marking_gui { #line hidden - #line 314 "..\..\MainWindow.xaml" + #line 347 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBlock txtFinalSerial; @@ -177,7 +209,7 @@ namespace marking_gui { #line hidden - #line 324 "..\..\MainWindow.xaml" + #line 357 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnStart; @@ -185,7 +217,7 @@ namespace marking_gui { #line hidden - #line 333 "..\..\MainWindow.xaml" + #line 366 "..\..\MainWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnOpenSettings; @@ -231,21 +263,29 @@ namespace marking_gui { #line hidden return; case 2: - this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target)); + + #line 129 "..\..\MainWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TopBar_MouseLeftButtonDown); + + #line default + #line hidden return; case 3: - this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target)); + this.txtCurrentTime = ((System.Windows.Controls.TextBlock)(target)); return; case 4: - this.txtOperatorInfo = ((System.Windows.Controls.TextBlock)(target)); + this.txtSystemStatus = ((System.Windows.Controls.TextBlock)(target)); return; case 5: - this.txtModelInfo = ((System.Windows.Controls.TextBlock)(target)); + this.txtOperatorInfo = ((System.Windows.Controls.TextBlock)(target)); return; case 6: - this.txtLineInfo = ((System.Windows.Controls.TextBlock)(target)); + this.txtModelInfo = ((System.Windows.Controls.TextBlock)(target)); return; case 7: + this.txtLineInfo = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: this.btnLogout = ((System.Windows.Controls.Button)(target)); #line 163 "..\..\MainWindow.xaml" @@ -254,52 +294,86 @@ namespace marking_gui { #line default #line hidden return; - case 8: + case 9: + + #line 167 "..\..\MainWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMinimize_Click); + + #line default + #line hidden + return; + case 10: + this.btnMaximize = ((System.Windows.Controls.Button)(target)); + + #line 170 "..\..\MainWindow.xaml" + this.btnMaximize.Click += new System.Windows.RoutedEventHandler(this.BtnMaximize_Click); + + #line default + #line hidden + return; + case 11: + this.txtMaximizeIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 12: + + #line 173 "..\..\MainWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 13: this.txtSerial = ((System.Windows.Controls.TextBox)(target)); return; - case 9: + case 14: this.txtPrevHousing = ((System.Windows.Controls.TextBlock)(target)); return; - case 10: + case 15: this.txtPrevCal = ((System.Windows.Controls.TextBlock)(target)); return; - case 11: + case 16: this.txtPrevEol = ((System.Windows.Controls.TextBlock)(target)); return; - case 12: + case 17: this.txtVoltage = ((System.Windows.Controls.TextBlock)(target)); return; - case 13: + case 18: this.txtVoltageRangeGuide = ((System.Windows.Controls.TextBlock)(target)); return; - case 14: + case 19: this.txtCurrent = ((System.Windows.Controls.TextBlock)(target)); return; - case 15: + case 20: this.txtCurrentRangeGuide = ((System.Windows.Controls.TextBlock)(target)); return; - case 16: + case 21: + this.txtResistance = ((System.Windows.Controls.TextBlock)(target)); + return; + case 22: + this.txtResistanceRangeGuide = ((System.Windows.Controls.TextBlock)(target)); + return; + case 23: this.borderFinalResult = ((System.Windows.Controls.Border)(target)); return; - case 17: + case 24: this.txtFinalResult = ((System.Windows.Controls.TextBlock)(target)); return; - case 18: + case 25: this.txtFinalSerial = ((System.Windows.Controls.TextBlock)(target)); return; - case 19: + case 26: this.btnStart = ((System.Windows.Controls.Button)(target)); - #line 325 "..\..\MainWindow.xaml" + #line 358 "..\..\MainWindow.xaml" this.btnStart.Click += new System.Windows.RoutedEventHandler(this.btnStart_Click); #line default #line hidden return; - case 20: + case 27: this.btnOpenSettings = ((System.Windows.Controls.Button)(target)); - #line 334 "..\..\MainWindow.xaml" + #line 367 "..\..\MainWindow.xaml" this.btnOpenSettings.Click += new System.Windows.RoutedEventHandler(this.btnOpenSettings_Click); #line default diff --git a/marking_gui/obj/Debug/SettingsWindow.baml b/marking_gui/obj/Debug/SettingsWindow.baml index d2534d0..19322e5 100644 Binary files a/marking_gui/obj/Debug/SettingsWindow.baml and b/marking_gui/obj/Debug/SettingsWindow.baml differ diff --git a/marking_gui/obj/Debug/SettingsWindow.g.cs b/marking_gui/obj/Debug/SettingsWindow.g.cs index 5bddb21..593bd91 100644 --- a/marking_gui/obj/Debug/SettingsWindow.g.cs +++ b/marking_gui/obj/Debug/SettingsWindow.g.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D" +#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "3B54A611CD6FF472DF4AA312133DE53F7310470DDD5247B79B8465A5C8B8AF60" //------------------------------------------------------------------------------ // // 이 코드는 도구를 사용하여 생성되었습니다. @@ -40,7 +40,7 @@ namespace marking_gui { public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { - #line 65 "..\..\SettingsWindow.xaml" + #line 67 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMinVoltage; @@ -48,7 +48,7 @@ namespace marking_gui { #line hidden - #line 67 "..\..\SettingsWindow.xaml" + #line 69 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMaxVoltage; @@ -56,7 +56,7 @@ namespace marking_gui { #line hidden - #line 71 "..\..\SettingsWindow.xaml" + #line 73 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMinCurrent; @@ -64,7 +64,7 @@ namespace marking_gui { #line hidden - #line 73 "..\..\SettingsWindow.xaml" + #line 75 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMaxCurrent; @@ -72,7 +72,23 @@ namespace marking_gui { #line hidden - #line 77 "..\..\SettingsWindow.xaml" + #line 79 "..\..\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox txtMinResistance; + + #line default + #line hidden + + + #line 81 "..\..\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox txtMaxResistance; + + #line default + #line hidden + + + #line 85 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnSave; @@ -80,7 +96,7 @@ namespace marking_gui { #line hidden - #line 78 "..\..\SettingsWindow.xaml" + #line 86 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnCancel; @@ -130,18 +146,24 @@ namespace marking_gui { this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target)); return; case 5: + this.txtMinResistance = ((System.Windows.Controls.TextBox)(target)); + return; + case 6: + this.txtMaxResistance = ((System.Windows.Controls.TextBox)(target)); + return; + case 7: this.btnSave = ((System.Windows.Controls.Button)(target)); - #line 77 "..\..\SettingsWindow.xaml" + #line 85 "..\..\SettingsWindow.xaml" this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click); #line default #line hidden return; - case 6: + case 8: this.btnCancel = ((System.Windows.Controls.Button)(target)); - #line 78 "..\..\SettingsWindow.xaml" + #line 86 "..\..\SettingsWindow.xaml" this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click); #line default diff --git a/marking_gui/obj/Debug/SettingsWindow.g.i.cs b/marking_gui/obj/Debug/SettingsWindow.g.i.cs index 5bddb21..593bd91 100644 --- a/marking_gui/obj/Debug/SettingsWindow.g.i.cs +++ b/marking_gui/obj/Debug/SettingsWindow.g.i.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "33961FE01569FF3D7FDD670A40AE2AB5450B6E4881EBA8EABD242BBB6EA0F36D" +#pragma checksum "..\..\SettingsWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "3B54A611CD6FF472DF4AA312133DE53F7310470DDD5247B79B8465A5C8B8AF60" //------------------------------------------------------------------------------ // // 이 코드는 도구를 사용하여 생성되었습니다. @@ -40,7 +40,7 @@ namespace marking_gui { public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { - #line 65 "..\..\SettingsWindow.xaml" + #line 67 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMinVoltage; @@ -48,7 +48,7 @@ namespace marking_gui { #line hidden - #line 67 "..\..\SettingsWindow.xaml" + #line 69 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMaxVoltage; @@ -56,7 +56,7 @@ namespace marking_gui { #line hidden - #line 71 "..\..\SettingsWindow.xaml" + #line 73 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMinCurrent; @@ -64,7 +64,7 @@ namespace marking_gui { #line hidden - #line 73 "..\..\SettingsWindow.xaml" + #line 75 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.TextBox txtMaxCurrent; @@ -72,7 +72,23 @@ namespace marking_gui { #line hidden - #line 77 "..\..\SettingsWindow.xaml" + #line 79 "..\..\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox txtMinResistance; + + #line default + #line hidden + + + #line 81 "..\..\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox txtMaxResistance; + + #line default + #line hidden + + + #line 85 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnSave; @@ -80,7 +96,7 @@ namespace marking_gui { #line hidden - #line 78 "..\..\SettingsWindow.xaml" + #line 86 "..\..\SettingsWindow.xaml" [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] internal System.Windows.Controls.Button btnCancel; @@ -130,18 +146,24 @@ namespace marking_gui { this.txtMaxCurrent = ((System.Windows.Controls.TextBox)(target)); return; case 5: + this.txtMinResistance = ((System.Windows.Controls.TextBox)(target)); + return; + case 6: + this.txtMaxResistance = ((System.Windows.Controls.TextBox)(target)); + return; + case 7: this.btnSave = ((System.Windows.Controls.Button)(target)); - #line 77 "..\..\SettingsWindow.xaml" + #line 85 "..\..\SettingsWindow.xaml" this.btnSave.Click += new System.Windows.RoutedEventHandler(this.btnSave_Click); #line default #line hidden return; - case 6: + case 8: this.btnCancel = ((System.Windows.Controls.Button)(target)); - #line 78 "..\..\SettingsWindow.xaml" + #line 86 "..\..\SettingsWindow.xaml" this.btnCancel.Click += new System.Windows.RoutedEventHandler(this.btnCancel_Click); #line default diff --git a/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt b/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt index d88a64c..d9434a0 100644 --- a/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt +++ b/marking_gui/obj/Debug/marking_gui.csproj.FileListAbsolute.txt @@ -38,3 +38,4 @@ C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\obj\Debug\MainWindow.bam 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\bin\Debug\Database.ini diff --git a/marking_gui/obj/Debug/marking_gui.exe b/marking_gui/obj/Debug/marking_gui.exe index ea62845..34c1d9c 100644 Binary files a/marking_gui/obj/Debug/marking_gui.exe and b/marking_gui/obj/Debug/marking_gui.exe differ diff --git a/marking_gui/obj/Debug/marking_gui.g.resources b/marking_gui/obj/Debug/marking_gui.g.resources index ddd7d20..38085ca 100644 Binary files a/marking_gui/obj/Debug/marking_gui.g.resources and b/marking_gui/obj/Debug/marking_gui.g.resources differ diff --git a/marking_gui/obj/Debug/marking_gui.pdb b/marking_gui/obj/Debug/marking_gui.pdb index e47e031..7045d97 100644 Binary files a/marking_gui/obj/Debug/marking_gui.pdb and b/marking_gui/obj/Debug/marking_gui.pdb differ diff --git a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache index f529594..165b1b9 100644 --- a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache +++ b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.cache @@ -12,7 +12,7 @@ DEBUG;TRACE C:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml 3-1210742192 -13735417974 +141215079075 14-207034072 MainWindow.xaml;SettingsWindow.xaml;StartupLoginWindow.xaml; diff --git a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref index 8b24a01..98f95c1 100644 --- a/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref +++ b/marking_gui/obj/Debug/marking_gui_MarkupCompile.i.lref @@ -1,4 +1,4 @@  -FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\App.xaml;; + FC:\Users\COMPUTER1\Desktop\mobi\marking_gui\marking_gui\MainWindow.xaml;;