Compare commits

..

26 Commits

Author SHA1 Message Date
dc6c670c8e 데이터 소스 자동 수신 상태 분리 2026-05-14 13:10:46 +09:00
7e3f496ae4 Apply council seat table by sigungu 2026-05-14 12:35:55 +09:00
df01f07c44 Sync selected cut duration from schedule edits 2026-05-14 12:24:00 +09:00
24915c1dca Fix normal basic mayor panse aggregation 2026-05-14 12:21:06 +09:00
72afee11fc Restart schedule from bottom active item 2026-05-14 12:07:18 +09:00
258b3ddaeb Restore playback countdown display 2026-05-14 12:04:55 +09:00
a743a5f709 Remove duplicate channel status badges 2026-05-14 12:01:46 +09:00
8beee8e419 Clarify unavailable schedule data 2026-05-14 12:00:33 +09:00
aa2336358b Improve connection status cards 2026-05-14 11:54:28 +09:00
f9596a2033 Simplify schedule playback order 2026-05-14 11:50:16 +09:00
e76c37ef56 5.14 시작전 2026-05-14 09:38:45 +09:00
8b5c92194f wndrks 2026-05-13 11:21:48 +09:00
960163dad8 어린이날 기념 커밋 2026-05-05 00:50:11 +09:00
e40a2a568e 기초 2026-05-02 05:35:16 +09:00
57aeba4bb8 기존 커밋 2026-04-27 10:54:39 +09:00
31857815d7 중간 저장 2026-04-22 13:30:24 +09:00
7cedeef5a9 중간저장 04.20 2026-04-20 20:06:18 +09:00
210b546130 스케줄에 2026-04-17 00:52:37 +09:00
fa49317b34 26.04.17 작업 진행 사항 2026-04-17 00:39:25 +09:00
e0c5f4dbfe 컷별 데이터 연계 2026-04-14 17:14:12 +09:00
54c778c75d setValue 테스트 2026-04-14 14:48:03 +09:00
e29267c530 토네이도 연결 및 송출 확인 2026-04-14 14:36:03 +09:00
28e2806678 md 파일 수 2026-04-09 18:03:15 +09:00
28a1011c48 다음 송출 명칭 변경 2026-04-09 17:56:46 +09:00
666d757ff6 중간 과정 진행 후 커밋 2026-04-09 17:49:31 +09:00
05762c0e33 라이브러리 추가 2026-04-09 14:05:37 +09:00
256 changed files with 85554 additions and 962 deletions

View File

@@ -0,0 +1,20 @@
{
"name": "tornado3-local",
"interface": {
"displayName": "Tornado3 Local Plugins"
},
"plugins": [
{
"name": "cut-design-debugger",
"source": {
"source": "local",
"path": "./plugins/cut-design-debugger"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}

32
AGENTS.md Normal file
View File

@@ -0,0 +1,32 @@
# Repository Instructions
## MSIX publish after user approval
When the user says a completed change is approved and asks to publish, deploy,
patch, or update the MSIX, use the automated NAS publish script instead of
manually editing package versions or copying files.
Normal approved publish command:
```powershell
powershell -ExecutionPolicy Bypass -File .\tools\msix\Publish-MsixToNas.ps1 -Configuration Release -IncrementPackageRevision
```
Prerequisites:
- `NAS_USER` must be set to the NAS account with write access to `/volume1/web/msix`.
- `NAS_SSH_KEY` should point to the SSH private key for that NAS account.
- The signing certificate thumbprint must remain
`E691A33C64DF20A204FFD4F096B9C3EB4B95709C`.
The script will:
1. Read `Tornado3_2026Election/Package.appxmanifest`.
2. Increment the fourth package version part.
3. Build and sign the MSIX package.
4. Rewrite App Installer URLs to the public NAS path.
5. Upload the files to the NAS over SSH/SCP.
6. Verify the public URLs after upload.
Do not run this publish command unless the user has explicitly approved
publishing or deployment.

31
COUNTER_DEBUG.md Normal file
View File

@@ -0,0 +1,31 @@
# Counter Debug Notes
Date: 2026-04-14
## Summary
- Scene: `1-2위_ani_광역단체장`
- Counter objects: `득표율01`, `득표율02`
- API: `IKACounter.SetCounterNumberKey(KeyIndex, Number)`
- Key index used for this test: `1`
## Current test values
- `득표율01` -> `30`
- `득표율02` -> `20`
## Verification
- `tools/KarismaTcpProbe` supports `--test-counter`.
- Verified against `127.0.0.1:30001`.
- `OnSetCounterNumberKey` returned `RESULT_SUCCESS` for both `득표율01` and `득표율02`.
## Runtime Mapping Update
- `KarismaTornado3Adapter` now maps scene variables from `ElectionDataSnapshot` at send time.
- Candidate text keys such as `후보명NN`, `정당명NN`, `득표수NN`, `득표율NN`, `순위NN`, `표차NN`, `득표차NN` are populated automatically.
- Common scene keys such as `선거구명01`, `시도명01`, `개표율01`, `투표율01`, `전국투표율01` are populated automatically.
- Animated templates with `ani` in the template id or name also send `IKACounter.SetCounterNumberKey(1, voteRate)` for each `득표율NN`.
- `유확당NN` resolves to `유력.vrv`, `확정.vrv` or `확실.vrv`, and `당선.vrv`.
- `후보사진NN` falls back to `Images/Photo/sampleNEW.png` when a candidate-specific photo is not found.
- Party image keys such as `정당바NN`, `정당판NN`, `정당심볼NN`, `그룹NN` resolve from the `Images/Dang` asset folders when a matching party file exists.

View File

@@ -0,0 +1,189 @@
# 2026-04-18 현재 구현 상태 정리
이 문서는 2026-04-18 기준으로 Tornado3 2026 Election 프로젝트에 실제 반영된 구현 사항과 운영 기준을 한 번에 확인하기 위한 현행화 문서다.
## 1. 화면 구성
- 메인 네비게이션은 아래 페이지를 제공한다.
- `통합 스케줄`
- `노멀`
- `좌상단`
- `하단`
- `비디오월`
- `사전데이터`
- `데이터`
- `컷리스트`
- `설정`
- `로그`
- `사전데이터` 페이지는 저장형 역대 데이터 조회/수정/저장 전용 화면이다.
- `컷리스트` 페이지는 전체 컷 목록, 채널 필터, 컷 시간, 썸네일 현황을 관리하는 운영 화면이다.
## 2. 데이터 화면
- 데이터 화면에서 원본 JSON 형태로 보여주던 `데이터 시트`는 제거했다.
- 현재 데이터 화면에는 아래 두 시트만 남겨두었다.
- `개표율 시트`
- `후보 시트`
- `데이터 - 선거구명` 콤보박스 첫 항목에 `전체보기`를 추가했다.
- `전체보기` 선택 시, 현재 수신 가능한 지역 데이터를 작은 카드 형태로 한 번에 볼 수 있도록 바꿨다.
- 표시 형식: `지역명 - 개표율`
- 목적: 전체 데이터 수신 상태를 빠르게 확인하기 위한 개요 화면
- 데이터 탭에는 `선거구명`, `지역 코드` 외에 `시도명`, `송출 선거구명`, `StatusText`를 함께 표시한다.
## 3. SBS API 실연동 범위
- 현재 실연동 대상 선거 종류는 아래와 같다.
- `광역단체장`
- `교육감`
- `기초단체장`
- `광역단체장`
- 개표: 지원
- 사전 투표율: 지원
- `교육감`
- 개표: 지원
- 사전 투표율: SBS API 미지원
- `기초단체장`
- 개표: 지원
- 사전 투표율: SBS API 미지원
- `교육감`, `기초단체장`의 사전 방송 데이터는 저장형 사전 데이터(JSON)로 보완한다.
## 4. 저장형 사전데이터
- 저장형 사전데이터는 `Tornado3_2026Election/Assets/Data/pre_election_history.json`에 보관한다.
- 2026-04-18 기준 저장 건수는 아래와 같다.
- `광역단체장`: 전국 17개 시도
- `교육감`: 전국 17개 시도
- `기초단체장`: 전국 262개 선거구
- 커버리지 요약:
- `광역단체장` 당선자: 1995~2022
- `광역단체장` 투표율: 2002~2022
- `교육감`: 직선제 기준 2010~2022
- `기초단체장`: 공식 API 기준 2002~2022
- `사전데이터` 페이지에서 아래 기능을 제공한다.
- 선거 종류별 레코드 선택
- 지역별 역대 투표율 카드 보기
- 지역별 역대 당선자 카드 보기
- 엑셀형 편집 그리드에서 직접 수정
- `사전데이터 저장` 버튼으로 JSON 반영
- `사전_역대당선자`, `사전_역대당선자_교육감`, `사전_역대당선자_기초단체장` 편집 행에는 `ColorParty` 콤보박스가 있다.
- 표기 정당명은 그대로 두고
- 송출용 색상 포맷 정당만 별도로 지정할 수 있다.
- 예: 표기 `한나라당`, 색상 포맷 `국민의힘`
- 사전데이터 편집 화면에서는 개별 항목의 `SourceUrl`을 노출하지 않는다.
## 5. 사전 컷 연동 규칙
- `사전_역대당선자*` 계열은 `사전``개표` 양쪽 단계에서 모두 사용할 수 있다.
- `사전_역대투표율*` 계열은 `사전` 단계 전용이다.
- 사전 컷 송출 시에는 저장형 사전데이터의 `TurnoutHistory`, `WinnerHistory`를 사용한다.
- 역사 정당명은 색상 포맷 선택과 별개로 아래 별칭을 함께 처리한다.
- `민주자유당`, `신한국당`, `한나라당`, `새누리당`, `자유한국당` -> `국민의힘`
- `민주당`, `새천년민주당`, `열린우리당`, `새정치민주연합` -> `더불어민주당`
- `무소속` -> `무기타`, `무소속기타`
## 6. 후보/개표 데이터 처리 규칙
- 후보가 나오는 데이터는 개표 데이터 기준으로 처리한다.
- 개표 데이터에는 반드시 `개표율`도 함께 표시되도록 맞췄다.
- 개표율 텍스트는 아래 형식으로 송출한다.
- 예: `개표 98.7%`
- 수동 판정값이 있으면 수동 판정을 우선 적용하고, 없으면 API 판정값을 사용한다.
- SBS API 판정 코드는 아래 기준으로 반영한다.
- `40`: 유력
- `50`: 확정
- `60`: 개표중 당선
- `80`: 무투표 당선
- `90`: 개표마감 당선
## 7. 직함 표기 규칙
- `광역단체장`, `교육감`, `기초단체장`은 전 컷 공통으로 지역명 대신 직함 기준 표기를 사용한다.
- 적용 대상은 컷 종류를 가리지 않고 executive 계열 전체다.
- 예시:
- `서울특별시` -> `서울시장`
- `전라남도` -> `전라남도지사`
- `부산광역시` -> `부산광역시교육감`
- `경상남도 창원시` -> `창원시장`
- 송출 시 `선거구명`, `시도명`, `RegionName`, `ElectionDistrictName`, `DistrictName` 계열 값에 같은 규칙을 적용한다.
## 8. 유확당 변수 처리 규칙
`유확당` 계열 변수는 전 컷 공통으로 아래 순서로 처리한다.
1. 해당 컷에 존재하는 `유확당*` 변수를 먼저 모두 `visible=false`로 숨긴다.
2. 실제 판정 이미지가 필요한 후보에게만 `SetValue(...)`를 넣는다.
3. 값이 들어간 변수만 다시 `visible=true`로 켠다.
적용 범위:
- `1-2위`
- `1-3위`
- `당선`
- `모든후보`
- `접전`
- `초접전`
- `이시각1위`
## 9. RGB / 정당 색상 매핑
- 정당 색상은 RGB txt 기준으로 매핑한다.
- RGB txt에 `style > ... > color` 지시가 있으면 이미지 교체보다 `SetStyleColor(...)`를 우선 사용한다.
- style color 지시가 없는 항목만 기존 asset 기반 `SetValue(...)` 경로를 사용한다.
- `사전_역대당선자*` 계열도 `ColorParty` 또는 정당 별칭을 기준으로 동일한 색상 자산 해석을 사용한다.
- 상세 매핑은 `RGB_SPEC_CUT_MAPPING.md`를 기준으로 관리한다.
## 10. 컷 카탈로그 / 실제 디자인 매칭
- 컷 목록은 폴더 스캔이 아니라 `FormatCatalogService`의 하드코딩 카탈로그 기준으로 관리한다.
- 2026-04-18 기준 현재 카탈로그는 실제 `.tscn` 파일 기준으로 정리되어 있다.
- `Elect2026_Bottom_민방`: 15컷
- `Elect2026_Normal_민방`: 63컷
- `Elect2026_Top_민방`: 11컷
- 총 89컷
- 실제 `.tscn` 파일이 없는 오래된 별칭(`_L`, `_END`, `_7680` 등)은 현재 카탈로그에서 제거했다.
- 다만 기존 저장 상태/큐 복원을 위해 예전 `FormatId`는 내부 별칭 맵으로 현재 실제 컷 이름에 자동 연결한다.
- 2026-04-18 전수 감사 기준:
- 카탈로그 등록 컷 중 실제 씬 누락 `0건`
## 11. 썸네일 운영
- 썸네일 저장 위치는 `Assets/Thumbnail/<template.Id>.png` 규칙을 사용한다.
- 콤보박스에서 컷을 선택하면 해당 썸네일을 즉시 프리뷰에 표시한다.
- 로딩 우선순위:
1. 프로젝트 내부 `Assets/Thumbnail`
2. 번들된 앱 내부 `Assets/Thumbnail`
3. 기본 앱 아이콘
- `컷리스트` 페이지에서는 전체 컷 썸네일 보유 현황과 채널별 컷 목록을 함께 확인할 수 있다.
- `썸네일 생성` 기능은 Karisma에 씬을 로드한 뒤 320x180 PNG를 저장한다.
## 12. 설정 저장 및 복원
- 설정은 변경 즉시 자동 저장한다.
- 자동 저장 대상에는 아래 항목들이 포함된다.
- API 자동 갱신 ON/OFF
- API 갱신 주기
- 데이터 관련 주요 선택 상태
- 채널별 큐 상태
- 컷별 재생 시간
- 방송사 지역 필터
- 저장된 큐에 예전 컷 ID가 들어 있어도 복원 시 현재 canonical 컷으로 자동 정규화한다.
## 13. 검증 상태
- `dotnet build .\Tornado3_2026Election\Tornado3_2026Election.csproj` 통과
- 2026-04-18 컷 감사 결과 `MISSING_SCENES=0`
- 현재 남아 있는 빌드 경고는 아래와 같다.
- `WindowsBase` 참조 충돌 경고
- MSIX 인증서 경고
- `MockTornado3Adapter.ConnectionChanged` 미사용 경고
## 14. 참고 문서
- `SYSTEM_SPEC.md`
- `INTEGRATION_NOTES_2026-04-15.md`
- `RGB_SPEC_CUT_MAPPING.md`
- `TSCN_VARIABLE_DISCOVERY_ELECT2026_NORMAL.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_labels.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_style.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_judgement_visibility.md`

View File

@@ -0,0 +1,140 @@
# 2026-04-15 통합 작업 메모
이 문서는 2026-04-15에 시작한 연동 점검 메모를 2026-04-18 기준으로 현행화한 기록이다.
## 0. 작업 요약
- SBS 선거 API 기준 실연동 범위를 `광역단체장(3)`, `기초단체장(4)`, `교육감(11)`으로 정리했다.
- 선거 종류 변경 시 실제 SBS `선거구` 코드 기준으로 지역 목록과 요청 코드가 맞물리도록 보정했다.
- `기초단체장` 지역 옵션 교체 중 발생하던 `ArgumentNullException (key)``ObservableCollection during CollectionChanged` 계열 UI 전환 이슈를 방어 로직으로 정리했다.
- `교육감`, `기초단체장` 사전 방송용 데이터 공백은 저장형 사전데이터(JSON)로 보완했다.
- 사전데이터는 `사전데이터` 페이지에서 조회/수정/저장 가능하게 만들었다.
- `사전_역대당선자*` 계열은 표기 정당과 색상 포맷 정당을 분리해 저장할 수 있게 했다.
- 직함 표기는 광역단체장만이 아니라 `광역단체장`, `교육감`, `기초단체장` 전 컷으로 확대했다.
- 컷 카탈로그는 실제 `.tscn` 이름 기준으로 정리했고, 과거 별칭은 호환용 alias로만 유지한다.
- 컷 썸네일은 `Assets/Thumbnail`에 저장하고, 제어 패널과 컷리스트에서 프리뷰를 표시하도록 정리했다.
## 1. 선거 종류별 연동 결과
### `3` 광역단체장
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=3`
- 개표 요청: `gaepyo/3/sungergus?ids=<선거구 id>`
- 사전 투표율 요청: `tupyo/3/sidos?ids=<시도 id>`
- 결론:
- 개표 연동 정상
- 사전 투표율 연동 정상
### `4` 기초단체장
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=4`
- 개표 요청: `gaepyo/4/sungergus?ids=<선거구 id>`
- 결론:
- 개표 연동 정상
- SBS API 사전 투표율은 미지원
- 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공
### `11` 교육감
- 선거구 목록: `sungerInfo/region?type=선거구&sungerType=11`
- 개표 요청: `gaepyo/11/sungergus?ids=<선거구 id>`
- 결론:
- 개표 연동 정상
- SBS API 사전 투표율은 미지원
- 사전 방송용 역사 데이터는 저장형 사전데이터에서 제공
## 2. SBS API 제한 사항
- `tupyo/4/...` 계열은 현재 `기초단체장`에 대해 `400`을 반환한다.
- `tupyo/11/...` 계열은 현재 `교육감`에 대해 `400`을 반환한다.
- 위 두 경우는 앱 오류가 아니라 API 제공 범위 밖으로 본다.
- 실제 운영에서는 저장형 사전데이터로 공백을 메운다.
## 3. 저장형 사전데이터 운영
- 저장 위치: `Tornado3_2026Election/Assets/Data/pre_election_history.json`
- 2026-04-18 기준 저장 건수:
- `광역단체장` 17건
- `교육감` 17건
- `기초단체장` 262건
- 페이지 기능:
- 선거 종류/지역 선택
- 역대 투표율 카드
- 역대 당선자 카드
- 엑셀형 편집
- 저장
- `사전_역대당선자`, `사전_역대당선자_교육감`, `사전_역대당선자_기초단체장``ColorParty`를 저장할 수 있다.
## 4. 지역 선택 / 전환 안정화
- `DistrictName`, `DistrictCode`, `ElectionType`는 내부적으로 null이 아닌 문자열 상태를 유지한다.
- 지역 옵션 교체 중에는 `_isUpdatingDistrictOptions` 플래그로 transient UI 값을 무시한다.
- 사전데이터용 지역 콤보박스도 별도 `_isUpdatingPreElectionHistoryDistrictOptions` 플래그로 같은 문제를 피한다.
- 선택 변경 뒤에는 debounce 후 자동 재조회한다.
## 5. 직함 표기 확대
- 현재 직함 표기는 `광역단체장`, `교육감`, `기초단체장` 전부에 적용한다.
- 적용 대상 변수:
- `선거구명`
- `시도명`
- `RegionName`
- `ElectionDistrictName`
- `DistrictName`
- 예:
- `서울특별시` -> `서울시장`
- `전라남도` -> `전라남도지사`
- `부산광역시` -> `부산광역시교육감`
- `창원시` -> `창원시장`
## 6. 컷 카탈로그 / 실제 씬 파일
- 현재 카탈로그는 실제 존재하는 `.tscn` 파일명 기준으로 정리했다.
- 2026-04-18 기준 canonical 카탈로그:
- Bottom 15컷
- Normal 63컷
- Top 11컷
- 총 89컷
- 기존에 사용되던 `_L`, `_END`, `_7680` 계열은 현재 카탈로그에서 제거했다.
- 다만 저장된 큐/상태 복원을 위해 legacy format alias는 유지한다.
- 전수 감사 기준 실제 씬 누락은 `0건`이다.
## 7. 썸네일
- 저장 위치: `Assets/Thumbnail/<template.Id>.png`
- 제어 패널의 컷 선택 콤보박스에서 프리뷰 표시
- `컷리스트` 페이지에서 전체 현황 확인
- `썸네일 생성` 기능은 Karisma에 씬을 로드해 320x180 PNG로 저장
## 8. 변수 매핑 관련 기록
- Karisma 장면 변수 지원 범위 로깅을 유지한다.
- 다음 alias 매핑을 보강했다.
- `기준시`, `기준시01`, `기준시02`
- `유권자수`, `유권자수01`
- `투표자수`, `투표자수01`
- `득표수바NN`
- `정당원NN`
- `정당색NN`
- 역사 당선자 컷은 저장형 사전데이터의 `ColorParty`와 정당 별칭 정규화를 함께 사용한다.
## 9. 주요 변경 파일
- `Tornado3_2026Election/Services/SbsElectionApiClient.cs`
- `Tornado3_2026Election/ViewModels/DataViewModel.cs`
- `Tornado3_2026Election/ViewModels/MainViewModel.cs`
- `Tornado3_2026Election/ViewModels/ChannelScheduleViewModel.cs`
- `Tornado3_2026Election/Services/PreElectionHistoryService.cs`
- `Tornado3_2026Election/Services/CutThumbnailAssetCatalog.cs`
- `Tornado3_2026Election/Services/KarismaThumbnailGeneratorService.cs`
- `Tornado3_2026Election/Services/FormatCatalogService.cs`
- `Tornado3_2026Election/Services/KarismaTornado3Adapter.cs`
## 10. 현재 체크 결과
- `dotnet build .\\Tornado3_2026Election\\Tornado3_2026Election.csproj` 통과
- 기존 경고는 유지
- `WindowsBase` 참조 충돌
- MSIX 인증서 경고
- `MockTornado3Adapter.ConnectionChanged` 미사용 경고
- 컷 카탈로그 감사 결과 실제 씬 누락 `0건`

View File

@@ -0,0 +1,31 @@
# Scene Variable Validation
- Generated: 2026-04-14 16:51:07
- Scene: `E:\김의연\지역민방\T3_Cut\Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Operations: `C:\Users\MD\source\repos\Tornado3_2026Election\tools\KarismaTcpProbe\scene-ops\1-2위_ani_광역단체장_live.json`
- Success Count: 21
- Failure Count: 0
| Object | Method | Payload | Result | Detail |
| --- | --- | --- | --- | --- |
| 개표율01 | SetValue | 88.8 | RESULT_SUCCESS | |
| 시도명01 | SetValue | 서울특별시 | RESULT_SUCCESS | |
| 표차01 | SetValue | 25,000 | RESULT_SUCCESS | |
| 유확당01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Tag\\당선.vrv | RESULT_SUCCESS | |
| 순위01 | SetValue | 1 | RESULT_SUCCESS | |
| 정당명01 | SetValue | 더불어민주당 | RESULT_SUCCESS | |
| 후보명01 | SetValue | 김후보 | RESULT_SUCCESS | |
| 득표수01 | SetValue | 2,123,456 | RESULT_SUCCESS | |
| 정당바01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Dang\\Dang_Map\\더불어민주당.png | RESULT_SUCCESS | |
| 정당판01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Dang\\Dang_Round\\더불어민주당.png | RESULT_SUCCESS | |
| 후보사진01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Photo\\sampleNEW.png | RESULT_SUCCESS | |
| 득표율01 | SetCounterNumberKey | keyIndex=1, number=34.8 | RESULT_SUCCESS | |
| 유확당02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Tag\\유력.vrv | RESULT_SUCCESS | |
| 순위02 | SetValue | 2 | RESULT_SUCCESS | |
| 정당명02 | SetValue | 국민의힘 | RESULT_SUCCESS | |
| 후보명02 | SetValue | 이후보 | RESULT_SUCCESS | |
| 득표수02 | SetValue | 1,123,456 | RESULT_SUCCESS | |
| 정당바02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Dang\\Dang_Map\\국민의힘.png | RESULT_SUCCESS | |
| 정당판02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Dang\\Dang_Round\\국민의힘.png | RESULT_SUCCESS | |
| 후보사진02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Photo\\sampleNEW.png | RESULT_SUCCESS | |
| 득표율02 | SetCounterNumberKey | keyIndex=1, number=32 | RESULT_SUCCESS | |

View File

@@ -0,0 +1,14 @@
# Scene Variable Validation
- Generated: 2026-04-17 00:08:19
- Scene: `E:\김의연\지역민방\T3_Cut\Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Operations: `C:\Users\MD\source\repos\Tornado3_2026Election\tools\KarismaTcpProbe\scene-ops\1-2위_ani_광역단체장_judgement_visibility.json`
- Success Count: 4
- Failure Count: 0
| Object | Method | Payload | Result | Detail |
| --- | --- | --- | --- | --- |
| 유확당01 | SetVisible | visible=False | RESULT_SUCCESS | |
| 유확당01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Normal_민방\\Images\\Tag\\당선.vrv | RESULT_SUCCESS | |
| 유확당01 | SetVisible | visible=True | RESULT_SUCCESS | |
| 유확당02 | SetVisible | visible=False | RESULT_SUCCESS | |

View File

@@ -0,0 +1,12 @@
# Scene Variable Validation
- Generated: 2026-04-17 00:01:13
- Scene: `E:\김의연\지역민방\T3_Cut\Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Operations: `C:\Users\MD\source\repos\Tornado3_2026Election\tools\KarismaTcpProbe\scene-ops\1-2위_ani_광역단체장_labels.json`
- Success Count: 2
- Failure Count: 0
| Object | Method | Payload | Result | Detail |
| --- | --- | --- | --- | --- |
| 개표율01 | SetValue | 개표 98.7% | RESULT_SUCCESS | |
| 시도명01 | SetValue | 부산시장 | RESULT_SUCCESS | |

View File

@@ -0,0 +1,13 @@
# Scene Variable Validation
- Generated: 2026-04-16 23:55:53
- Scene: `E:\김의연\지역민방\T3_Cut\Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Operations: `C:\Users\MD\source\repos\Tornado3_2026Election\tools\KarismaTcpProbe\scene-ops\1-2위_ani_광역단체장_style.json`
- Success Count: 3
- Failure Count: 0
| Object | Method | Payload | Result | Detail |
| --- | --- | --- | --- | --- |
| 정당판01 | SetStyleColor | styleType=face, order=0, rgba=(57, 84, 199, 255) | RESULT_SUCCESS | |
| 정당바01 | SetStyleColor | styleType=face, order=0, rgba=(0, 30, 84, 255) | RESULT_SUCCESS | |
| 득표율01 | SetStyleColor | styleType=edge, order=0, rgba=(57, 84, 199, 255) | RESULT_SUCCESS | |

9
OBJECT_TYPE_QUERY.md Normal file
View File

@@ -0,0 +1,9 @@
# Object Type Query
- Generated: 2026-05-10 04:13:49
- Scene: `D:\Elect2026\T3_Cut\Elect2026_Bottom_민방\전후보_광역단체장.tscn`
- Objects Queried: 1
| Object | Result | Type | Detail |
| --- | --- | --- | --- |
| 득표율01,득표율02,득표율03 | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | |

View File

@@ -0,0 +1,248 @@
# RGB 색상 지침 전수조사
- 작성일: 2026-04-29
- 기준 폴더: `E:\김의연\지역민방\T3_Cut`
- 기준 문서/코드: `RGB_SPEC_CUT_MAPPING.md`, `TSCN_VARIABLE_DISCOVERY_E_DRIVE.md`, `PartyColorCatalog`
- 판정 기준:
- 장면 변수에는 `정당명`, `정당바`, `정당판`, `정당원`, `정당색`, `그룹`, `득표율` 등이 있으나 RGB txt에 같은 항목의 색상 지침이 없으면 “색상 지침 없음”으로 정리했다.
- RGB txt가 컷명과 1:1로 대응하지 않고 shared/family/inferred/naming bridge/historical로 연결되면 “기준 파일 안내 필요”로 정리했다.
- 아래 내용은 RGB txt와 장면 변수 기준 1차 전수조사다. 샘플 이미지와 실제 송출 화면의 육안 색상 차이는 별도 캡처 대조가 필요하다.
## 외부 공유용 핵심 이슈
[Normal] 1-2위_ani_광역단체장
- 정당명 오브젝트가 있으나 RGB txt에는 정당명 색상 지침이 없음
- RGB txt는 `정당판/득표율`, `정당바` 기준만 제공하므로, RGB txt대로 정당명까지 바꾸면 샘플 색상과 다르게 보일 수 있음
- 현재 live 검증은 `정당판01`, `정당바01`, `득표율01``SetStyleColor`만 확인되어 있음
## 색상 지침 누락 의심 컷
[Normal] 1-2위_광역단체장_시도별영상
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-2위_광역단체장,기초단체장_시도별영상.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-2위_교육감
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
[Normal] 1-2위_기초단체장
- 정당바 오브젝트가 있으나 RGB txt에는 정당바 색상 지침이 없음
- 현재 RGB txt는 득표율 기준만 있음
[Normal] 1-2위_기초단체장_시도별영상
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-2위_광역단체장,기초단체장_시도별영상.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-3위_ani_광역단체장
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-3위_ani_광역단체장,보궐.txt`를 family 기준으로 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-3위_ani_기초단체장
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-3위_ani_기초단체장(5760동일).txt`를 family 기준으로 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-3위_기초단체장_5760
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-3위_ani_기초단체장(5760동일).txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-3위_보궐선거
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `1-3위_ani_광역단체장,보궐.txt`를 추정 연결 중이라 기준 파일 안내가 필요함
[Normal] 모든후보_광역단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `모든후보.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 모든후보_광역단체장_5760
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `모든후보.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 모든후보_교육감
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
[Normal] 모든후보_교육감_5760
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `모든후보_교육감.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 모든후보_기초단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `모든후보.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 모든후보_기초단체장_5760
- 정당명, 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `모든후보.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 접전_광역단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `접전,초접전.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 접전_기초단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `접전,초접전.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 초접전_광역단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `접전,초접전.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 초접전_기초단체장
- 정당명, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `접전,초접전.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 이시각1위_광역단체장
- 정당바, 정당색, 그룹 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- 현재 RGB txt는 정당명/득표율 기준만 있음
[Normal] 이시각1위_기초단체장
- 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `이시각1위_기초단체장(5760동일).txt`를 family 기준으로 사용 중이라 기준 파일 안내가 필요함
[Normal] 이시각1위_기초단체장_HD
- 그룹, 득표율 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `이시각1위_기초단체장(5760동일).txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 판세_광역단체장
- 정당명, 정당바 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- 현재 RGB txt는 지역명 기준만 있음
[Normal] 판세_기초단체장
- 득표율 오브젝트가 있으나 RGB txt에는 득표율 색상 지침이 없음
- `판세_광역단체장.txt`를 추정 연결 중이라 기준 파일 안내가 필요함
[Normal] 판세_기초단체장_5760
- 득표율 오브젝트가 있으나 RGB txt에는 득표율 색상 지침이 없음
- `판세_광역단체장.txt`를 추정 연결 중이라 기준 파일 안내가 필요함
[Bottom] 1-3위_광역단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `1-2위, 1-3위, 이시각1위.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 1-3위_기초단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `1-2위, 1-3위, 이시각1위.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 1위_광역단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `1-2위, 1-3위, 이시각1위.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 1위_기초단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `1-2위, 1-3위, 이시각1위.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 당선_광역단체장
- 정당명, 그룹 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `당선.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 당선_광역의원
- 정당명, 그룹 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `당선.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 당선_기초단체장
- 정당명, 그룹 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `당선.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 당선_기초의원
- 정당명, 그룹 오브젝트가 있으나 RGB txt에는 해당 색상 지침이 없음
- `당선.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 전후보_광역단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `모든후보.txt`로 naming bridge 연결 중이라 기준 파일 안내가 필요함
[Bottom] 전후보_교육감
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `모든후보_교육감.txt`로 naming bridge 연결 중이라 기준 파일 안내가 필요함
[Bottom] 전후보_기초단체장
- 그룹 오브젝트가 있으나 RGB txt에는 그룹 색상 지침이 없음
- `모든후보.txt`로 naming bridge 연결 중이라 기준 파일 안내가 필요함
[Top] 광역단체장_2인_텍스트
- 득표율 오브젝트가 있으나 RGB txt에는 득표율 색상 지침이 없음
- `1-2위_텍스트.txt`를 text layout 기준으로 사용 중이라 기준 파일 안내가 필요함
[Top] 기초단체장_2인_텍스트
- 득표율 오브젝트가 있으나 RGB txt에는 득표율 색상 지침이 없음
- `1-2위_텍스트.txt`를 text layout 기준으로 사용 중이라 기준 파일 안내가 필요함
## 기준 파일 안내가 필요한 컷
[Normal] 1-2위_ani_기초단체장_5760
- `1-2위_ani_기초단체장.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-2위_광역단체장
- `1-2위_광역단체장, 보궐.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-2위_광역단체장_5760
- `1-2위_광역단체장, 보궐.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 1-2위_보궐선거
- `1-2위_광역단체장, 보궐.txt`를 추정 연결 중이라 기준 파일 안내가 필요함
[Normal] 경력_광역단체장_in
- `경력.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 경력_기초단체장_in
- `경력.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 당선_광역단체장/HD, 당선_광역의원/HD, 당선_기초단체장/HD, 당선_기초의원/HD
- `당선.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 당선_교육감_HD
- `당선_교육감.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Normal] 사전_역대당선자, 사전_역대당선자_기초단체장
- `사전_역대당선.txt`를 historical 기준으로 사용 중이라 기준 파일 안내가 필요함
[Normal] 사전_역대당선자_교육감
- `사전_역대당선_교육감.txt`를 historical 기준으로 사용 중이라 기준 파일 안내가 필요함
[Normal] 이시각1위_광역단체장_HD
- `이시각1위_광역단체장.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Bottom] 1-2위_광역단체장, 1-2위_기초단체장
- `1-2위, 1-3위, 이시각1위.txt`를 공유 사용 중이라 기준 파일 안내가 필요함
[Top] 광역단체장_2인, 기초단체장_2인
- `1-2위_사진.txt`를 photo layout 기준으로 사용 중이라 기준 파일 안내가 필요함
## RGB 명시 매핑이 아직 없는 컷
[Normal] 광역의원표
- RGB txt 명시 매핑이 아직 없음
[Normal] 광역의원표_HD
- RGB txt 명시 매핑이 아직 없음
[Normal] 기초의원표
- RGB txt 명시 매핑이 아직 없음
[Normal] 기초의원표_HD
- RGB txt 명시 매핑이 아직 없음
[Normal] 역대시도판세_광역단체장
- RGB txt 명시 매핑이 아직 없음
[Normal] 역대시도판세_기초단체장
- RGB txt 명시 매핑이 아직 없음
[Top] 판세_광역단체장
- RGB txt 명시 매핑이 아직 없음
[Top] 판세_광역의원
- RGB txt 명시 매핑이 아직 없음
[Top] 판세_교육감
- RGB txt 명시 매핑이 아직 없음
[Top] 판세_기초단체장
- RGB txt 명시 매핑이 아직 없음
[Top] 판세_기초의원
- RGB txt 명시 매핑이 아직 없음
## 색상 작업 대상에서 제외해도 되는 컷
[공통] 민방_타이틀*, 사전_역대투표율*, 사전투표율, 투표율*
- 정당색/후보색 중심 컷이 아니라 현재 RGB 정당 색상 이슈 대상에서는 제외 가능함
[공통] 투표율_사진, 투표율_선거구별, 투표율_선거구별 사전, 투표율_시도별, 투표율_영상
- 정당색/후보색 중심 컷이 아니라 현재 RGB 정당 색상 이슈 대상에서는 제외 가능함

172
RGB_SPEC_CUT_MAPPING.md Normal file
View File

@@ -0,0 +1,172 @@
# RGB Spec Cut Mapping
- Updated: 2026-04-19
- Source root: `E:\김의연\지역민방\T3_Cut`
- 이 문서는 현재 화면에 노출되는 canonical 컷 이름 기준으로 정리한다.
- 과거 `_L`, `_END`, `_7680` 계열 이름은 저장 호환용 alias만 유지하며, 아래 표에는 적지 않는다.
## Runtime Rule
- RGB txt header가 `style > ... > color` 또는 `> ... > color` 형태면 해당 오브젝트는 이미지 `SetValue` 대신 `SetStyleColor`를 우선 적용한다.
- `face 2번째`처럼 순서가 명시된 경우 `SetStyleColor(..., order=1, ...)`로 적용한다.
- `정당바`는 RGB spec section `정당바` 우선
- `정당판`은 RGB spec section `정당판` 우선
- `정당원`은 RGB spec section `정당원` 우선, 없으면 `정당색`, `정당판`, `정당바`
- `정당색`은 RGB spec section `정당색` 우선, 없으면 `정당바`, `정당판`
- `그룹``그룹`이 없으면 `정당바`, `정당판`
- 기존 png 자산이 있으면 그대로 사용한다.
- 기존 png가 없으면 `%LOCALAPPDATA%\Tornado3_2026Election\GeneratedPartyAssets` 아래에 RGB 기반 fallback png를 생성한다.
- `사전_역대당선자*` 계열은 `ColorParty` 값이 있으면 이를 우선 사용하고, 없으면 표기 정당명과 역사 정당 별칭을 기준으로 색상 자산을 찾는다.
## Verified
- `1-2위_ani_광역단체장`
- `정당판01` -> `SetStyleColor(face, order=0)`
- `정당바01` -> `SetStyleColor(face, order=0)`
- `득표율01` -> `SetStyleColor(edge, order=0)`
- 검증 로그: `LIVE_VALIDATE_1-2위_ani_광역단체장_style.md`
## Implemented Mapping
### Normal - 1~2위 / 1~3위 계열
| Canonical template | RGB spec file | Note |
| --- | --- | --- |
| `1-2위_ani_광역단체장` | `1-2위_ani_광역단체장.txt` | exact |
| `1-2위_ani_기초단체장` | `1-2위_ani_기초단체장.txt` | exact |
| `1-2위_ani_기초단체장_5760` | `1-2위_ani_기초단체장.txt` | shared |
| `1-2위_광역단체장` | `1-2위_광역단체장, 보궐.txt` | shared |
| `1-2위_광역단체장_5760` | `1-2위_광역단체장, 보궐.txt` | shared |
| `1-2위_광역단체장_시도별영상` | `1-2위_광역단체장,기초단체장_시도별영상.txt` | family |
| `1-2위_교육감` | `1-2위_교육감.txt` | exact |
| `1-2위_기초단체장` | `1-2위_기초단체장.txt` | exact |
| `1-2위_기초단체장_시도별영상` | `1-2위_광역단체장,기초단체장_시도별영상.txt` | family |
| `1-2위_보궐선거` | `1-2위_광역단체장, 보궐.txt` | inferred |
| `1-3위_ani_광역단체장` | `1-3위_ani_광역단체장,보궐.txt` | family |
| `1-3위_ani_기초단체장` | `1-3위_ani_기초단체장(5760동일).txt` | family |
| `1-3위_기초단체장_5760` | `1-3위_ani_기초단체장(5760동일).txt` | shared |
| `1-3위_보궐선거` | `1-3위_ani_광역단체장,보궐.txt` | inferred |
### Normal - 경력 / 당선 / 이시각1위 / 접전
| Canonical template | RGB spec file | Note |
| --- | --- | --- |
| `경력_광역단체장_in` | `경력.txt` | shared |
| `경력_기초단체장_in` | `경력.txt` | shared |
| `당선_광역단체장` | `당선.txt` | shared |
| `당선_광역단체장_HD` | `당선.txt` | shared |
| `당선_광역의원` | `당선.txt` | shared |
| `당선_광역의원_HD` | `당선.txt` | shared |
| `당선_교육감` | `당선_교육감.txt` | exact |
| `당선_교육감_HD` | `당선_교육감.txt` | shared |
| `당선_기초단체장` | `당선.txt` | shared |
| `당선_기초단체장_HD` | `당선.txt` | shared |
| `당선_기초의원` | `당선.txt` | shared |
| `당선_기초의원_HD` | `당선.txt` | shared |
| `이시각1위_광역단체장` | `이시각1위_광역단체장.txt` | exact |
| `이시각1위_광역단체장_HD` | `이시각1위_광역단체장.txt` | shared |
| `이시각1위_기초단체장` | `이시각1위_기초단체장(5760동일).txt` | family |
| `이시각1위_기초단체장_HD` | `이시각1위_기초단체장(5760동일).txt` | shared |
| `접전_광역단체장` | `접전,초접전.txt` | shared |
| `접전_기초단체장` | `접전,초접전.txt` | shared |
| `초접전_광역단체장` | `접전,초접전.txt` | shared |
| `초접전_기초단체장` | `접전,초접전.txt` | shared |
### Normal - 모든후보 / 판세 / 역사 컷
| Canonical template | RGB spec file | Note |
| --- | --- | --- |
| `모든후보_광역단체장` | `모든후보.txt` | shared |
| `모든후보_광역단체장_5760` | `모든후보.txt` | shared |
| `모든후보_교육감` | `모든후보_교육감.txt` | exact |
| `모든후보_교육감_5760` | `모든후보_교육감.txt` | shared |
| `모든후보_기초단체장` | `모든후보.txt` | shared |
| `모든후보_기초단체장_5760` | `모든후보.txt` | shared |
| `사전_역대당선자` | `사전_역대당선.txt` | historical |
| `사전_역대당선자_교육감` | `사전_역대당선_교육감.txt` | historical |
| `사전_역대당선자_기초단체장` | `사전_역대당선.txt` | historical |
| `판세_광역단체장` | `판세_광역단체장.txt` | exact |
| `판세_기초단체장` | `판세_광역단체장.txt` | inferred |
| `판세_기초단체장_5760` | `판세_광역단체장.txt` | inferred |
### Bottom
| Canonical template | RGB spec file | Note |
| --- | --- | --- |
| `1-2위_광역단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `1-2위_기초단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `1-3위_광역단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `1-3위_기초단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `1위_광역단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `1위_기초단체장` | `1-2위, 1-3위, 이시각1위.txt` | shared |
| `당선_광역단체장` | `당선.txt` | shared |
| `당선_광역의원` | `당선.txt` | shared |
| `당선_기초단체장` | `당선.txt` | shared |
| `당선_기초의원` | `당선.txt` | shared |
| `전후보_광역단체장` | `모든후보.txt` | naming bridge |
| `전후보_교육감` | `모든후보_교육감.txt` | naming bridge |
| `전후보_기초단체장` | `모든후보.txt` | naming bridge |
### Top
| Canonical template | RGB spec file | Note |
| --- | --- | --- |
| `광역단체장_2인` | `1-2위_사진.txt` | photo layout |
| `기초단체장_2인` | `1-2위_사진.txt` | photo layout |
| `광역단체장_2인_텍스트` | `1-2위_텍스트.txt` | text layout |
| `기초단체장_2인_텍스트` | `1-2위_텍스트.txt` | text layout |
## No Explicit Mapping Yet
### Normal
- `광역의원표`
- `광역의원표_HD`
- `기초의원표`
- `기초의원표_HD`
- `역대시도판세_광역단체장`
- `역대시도판세_기초단체장`
### Top
- `판세_광역단체장`
- `판세_광역의원`
- `판세_교육감`
- `판세_기초단체장`
- `판세_기초의원`
## No Party Color Work Needed Right Now
- `민방_타이틀*`
- `사전_역대투표율*`
- `사전투표율`
- `투표율*`
- `투표율_사진`
- `투표율_선거구별`
- `투표율_선거구별 사전`
- `투표율_시도별`
- `투표율_영상`
## Compatibility Note
- 예전 문서나 저장 상태에 남아 있는 아래 이름들은 현재 canonical 이름으로 내부 매핑한다.
- `_L` 계열
- `_END` 계열
- `판세_기초단체장_7680`
- RGB spec 운영 문서는 앞으로 canonical 이름만 기준으로 관리한다.
## 2026-04-19 Runtime Note
- style color binding이 있는 오브젝트는 후보 슬롯 clear 단계에서 들어간 빈 `SetValue("")`를 최종 values payload에서 제거해야 한다.
-`SetValue`가 남아 있으면 `Path Shape` face color가 적용되지 않은 것처럼 보일 수 있다.
- `1-2위_ani_광역단체장``정당바`는 RGB spec의 `정당바` 값을 그대로 사용해 `SetStyleColor(face, order=0, ...)`로 적용한다.
- `더불어민주당 = 0,30,84`
- `국민의힘 = 95,0,15`
- `1-2위_ani_광역단체장_loop``1-2위_광역단체장`도 동일하게 `정당바``Path Shape > Appearance > Face Color` 직접 변경 기준으로 운용한다.
- `정당판`은 probe로는 직접 style color 적용이 가능하지만, 현재 runtime에서는 운영 요구에 맞춰 asset alias 경로를 유지한다.
## Notes
- `판세_기초단체장*`은 현재 `판세_광역단체장.txt`로 연결한다.
- `보궐선거` 계열은 가장 가까운 광역/보궐 계열 spec로 연결한다.
- 역사 당선자 컷은 `ColorParty`와 정당 별칭 정규화를 함께 사용한다.

View File

@@ -0,0 +1,42 @@
# Scene Capability Inspection
- Generated: 2026-05-10 04:24:05
- Scene: `D:\Elect2026\T3_Cut\Elect2026_Bottom_민방\전후보_광역단체장_loop.tscn`
- Candidate Count: 34
| Candidate | Found | Anim | Chart | Counter | Path | QueryType | Type | QueryPos | X | Y | Z | SetPos | SetValueText | SetValueImage | CounterKey | Detail |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| bar | yes | | no | no | no | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | RESULT_ERROR_NO_VARIABLE_OBJECT | | | | | RESULT_ERROR_NO_VARIABLE_OBJECT | RESULT_ERROR_NO_VARIABLE_OBJECT | | |
| data01 | yes | | no | no | no | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | RESULT_ERROR_NO_VARIABLE_OBJECT | | | | | RESULT_ERROR_NO_VARIABLE_OBJECT | RESULT_ERROR_NO_VARIABLE_OBJECT | | |
| Root | yes | | no | no | no | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | RESULT_ERROR_NO_VARIABLE_OBJECT | | | | | RESULT_ERROR_NO_VARIABLE_OBJECT | RESULT_ERROR_NO_VARIABLE_OBJECT | | |
| 개표율01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | -24.198 | 23.054 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 그룹01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_UNKNOWN | RESULT_SUCCESS | -752.384 | -1 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 그룹02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_UNKNOWN | RESULT_SUCCESS | -271.38 | -1 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 그룹03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_UNKNOWN | RESULT_SUCCESS | 210.62 | -1 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 득표수01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 185.185 | -47.402 | -0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 득표수02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 185.185 | -47.402 | -0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 득표수03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 185.185 | -47.402 | -0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 득표율01 | yes | | no | yes | no | RESULT_SUCCESS | OBJECT_TYPE_COUNTER | RESULT_SUCCESS | 239 | -21 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | |
| 득표율02 | yes | | no | yes | no | RESULT_SUCCESS | OBJECT_TYPE_COUNTER | RESULT_SUCCESS | 239 | -21 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | |
| 득표율03 | yes | | no | yes | no | RESULT_SUCCESS | OBJECT_TYPE_COUNTER | RESULT_SUCCESS | 239 | -21 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | |
| 마스크 | yes | | no | no | no | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | RESULT_ERROR_NO_VARIABLE_OBJECT | | | | | RESULT_ERROR_NO_VARIABLE_OBJECT | RESULT_ERROR_NO_VARIABLE_OBJECT | | |
| 선거구명01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | -0.73 | -22.031 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 순위01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -182 | 9 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 순위02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -182 | 9 | -0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 순위03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -182 | 9 | -0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 시도 | yes | | no | no | no | RESULT_ERROR_NO_VARIABLE_OBJECT | OBJECT_TYPE_UNKNOWN | RESULT_ERROR_NO_VARIABLE_OBJECT | | | | | RESULT_ERROR_NO_VARIABLE_OBJECT | RESULT_ERROR_NO_VARIABLE_OBJECT | | |
| 유확당01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -181 | 10 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 유확당02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -181 | 10 | -0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 유확당03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -181 | 10 | -0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 정당명01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 11.187 | 37.97 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 정당명02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 11.187 | 37.97 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 정당명03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 11.187 | 37.97 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 정당바01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_RECT | RESULT_SUCCESS | 36.258 | 0 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 정당바02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_RECT | RESULT_SUCCESS | 36.258 | 0 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 정당바03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_RECT | RESULT_SUCCESS | 36.258 | 0 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 후보명01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 10.053 | -4.864 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 후보명02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 10.053 | -4.864 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 후보명03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_TEXT | RESULT_SUCCESS | 10.053 | -4.864 | 0 | RESULT_SUCCESS | RESULT_SUCCESS | RESULT_SUCCESS | | |
| 후보사진01 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -94.972 | -16 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 후보사진02 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -94.972 | -16 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |
| 후보사진03 | yes | | no | no | no | RESULT_SUCCESS | OBJECT_TYPE_IMAGE | RESULT_SUCCESS | -94.972 | -16 | 0 | RESULT_SUCCESS | RESULT_FAILURE | RESULT_SUCCESS | | |

View File

@@ -0,0 +1,28 @@
# Scene Variable Validation
- Note: 이 문서는 초기 변수명 가정으로 수행한 1차 검증 결과다. 현재 정상 동작 기준 최종 검증 결과는 `LIVE_VALIDATE_1-2위_ani_광역단체장.md`를 기준으로 본다.
- Generated: 2026-04-14 15:14:18
- Scene: `C:\Users\MD\Documents\Tornado3 Data\T3_Cut\T3_Cut\Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Operations: `C:\Users\MD\source\repos\Tornado3_2026Election\tools\KarismaTcpProbe\scene-ops\1-2위_ani_광역단체장.json`
- Success Count: 14
- Failure Count: 3
| Object | Method | Payload | Result | Detail |
| --- | --- | --- | --- | --- |
| Image | SetValue | C:\\Users\\MD\\Documents\\Tornado3 Data\\T3_Cut\\T3_Cut\\Elect2026_Normal_민방\\Images\\Etc\\가이드.png | RESULT_ERROR_NO_VARIABLE_OBJECT | |
| 시도명 | SetValue | 서울특별시 | RESULT_ERROR_NO_VARIABLE_OBJECT | |
| 표차 | SetValue | 100,000표차 | RESULT_ERROR_NO_VARIABLE_OBJECT | |
| 유확당01 | SetValue | C:\\Users\\MD\\Documents\\Tornado3 Data\\T3_Cut\\T3_Cut\\Elect2026_Normal_민방\\Images\\Tag\\당선.vrv | RESULT_SUCCESS | |
| 순위01 | SetValue | 1 | RESULT_SUCCESS | |
| 정당명01 | SetValue | 더불어민주당 | RESULT_SUCCESS | |
| 후보명01 | SetValue | 김후보 | RESULT_SUCCESS | |
| 득표수01 | SetValue | 2,123,456 | RESULT_SUCCESS | |
| 후보사진01 | SetValue | C:\\Users\\MD\\Documents\\Tornado3 Data\\T3_Cut\\T3_Cut\\Elect2026_Normal_민방\\Images\\Photo\\sampleNEW.png | RESULT_SUCCESS | |
| 득표율01 | SetCounterNumberKey | keyIndex=1, number=30 | RESULT_SUCCESS | |
| 유확당02 | SetValue | C:\\Users\\MD\\Documents\\Tornado3 Data\\T3_Cut\\T3_Cut\\Elect2026_Normal_민방\\Images\\Tag\\당선.vrv | RESULT_SUCCESS | |
| 순위02 | SetValue | 2 | RESULT_SUCCESS | |
| 정당명02 | SetValue | 국민의힘 | RESULT_SUCCESS | |
| 후보명02 | SetValue | 이후보 | RESULT_SUCCESS | |
| 득표수02 | SetValue | 1,123,456 | RESULT_SUCCESS | |
| 후보사진02 | SetValue | C:\\Users\\MD\\Documents\\Tornado3 Data\\T3_Cut\\T3_Cut\\Elect2026_Normal_민방\\Images\\Photo\\sampleNEW.png | RESULT_SUCCESS | |
| 득표율02 | SetCounterNumberKey | keyIndex=1, number=20 | RESULT_SUCCESS | |

View File

@@ -1,228 +1,228 @@
# 선거방송 송출 프로그램 요구사항 정의 (v0.1)
---
# 선거방송 송출 프로그램 요구사항 정의 (v0.2)
## 1. 시스템 개요
### 1.1 목적
- Tornado3를 통해 선거 방송 자막 송출
- 포맷(디자인)에 데이터 매핑 후 송출
---
- Tornado3 / Karisma를 통해 선거 방송 자막 컷을 송출한다.
- 디자인(포맷)과 데이터를 매핑한 뒤 준비/송출/아웃 흐름을 운영한다.
### 1.2 기본 구조
- 방송 채널: `노멀`, `좌상단`, `하단`, `비디오월`
- 데이터 모드: `사전`, `개표`
- 저장형 보조 데이터: `사전데이터(JSON)`
- 운영 페이지: `통합 스케줄`, 채널별 페이지, `사전데이터`, `데이터`, `컷리스트`, `설정`, `로그`
## 2. 데이터 처리
### 2.1 데이터 수신
- Polling 기반
- 수동 수신 가능
### 2.2 수동 수신 정책
- 수동 수신 시 polling 주기 초기화
- 3초 이내 재요청 금지
### 2.3 갱신 vs 송출
- 갱신 중 송출 요청 시 → 갱신 완료 후 송출
### 2.2 지원 선거 범위
- 실연동 지원:
- `광역단체장`
- `교육감`
- `기초단체장`
- `광역단체장`은 개표/사전 투표율을 모두 SBS API로 받는다.
- `교육감`, `기초단체장`은 개표만 SBS API로 받고, 사전 방송용 역사 데이터는 저장형 사전데이터로 보완한다.
### 2.3 데이터 기준
### 2.4 데이터 기준
- 득표율: 소수점 1자리 반올림
- 득표수: 3자리 콤마
- 개표율 표기: `개표 x.x%`
### 2.4 데이터 유효성
### 2.5 데이터 유효성
- 필수 필드 누락 시 송출 금지
- 사진 필수 포맷에서 이미지 없으면 송출 금지
- 사진 필수 포맷에서 이미지 없으면 송출 금지
- 단계에 맞지 않는 컷은 목록에서 숨기고 송출 직전 검증에서도 차단
---
## 3. 포맷
## 3. 포맷 / 컷 카탈로그
### 3.1 정의
- 디자인 템플릿
- 데이터 매핑 구조
### 3.2 구조
- 포맷 → 컷 → (준비 → 송출)
- 포맷은 하드코딩된 템플릿 카탈로그로 관리한다.
- 포맷은 1개 이상의 컷을 가진다.
- 실제 Karisma 씬 파일은 `.tscn` 기준이다.
### 3.3 루프
- 하위 범주 반복 (예: 시도별 17개)
### 3.2 현재 canonical 카탈로그
### 3.4 데이터 반영
- 현재 컷 반영 금지
- 다음 컷부터 반영
- `Elect2026_Bottom_민방`: 15컷
- `Elect2026_Normal_민방`: 63컷
- `Elect2026_Top_민방`: 11컷
- 총 89컷
### 3.5 송출 시간
- 포맷별 설정 가능
- 변경 시 다음 컷부터 적용
### 3.3 실제 디자인명 기준
---
- 현재 카탈로그는 실제 존재하는 `.tscn` 파일명 기준으로 맞춘다.
- 과거에 사용하던 `_L`, `_END`, `_7680` 계열 별칭은 현재 카탈로그에 노출하지 않는다.
- 저장된 큐/상태 복원을 위해 예전 컷 ID는 내부 별칭 맵으로 canonical 이름에 자동 연결한다.
### 3.4 루프 컷 규칙
- 같은 컷 이름에 `_loop.tscn` 파일이 있으면 반복 송출 컷으로 사용한다.
- 최초 송출 시에는 기본 `.tscn`을 우선 사용한다.
- 이미 송출 중인 상태에서 같은 컷을 다시 호출할 때 `_loop.tscn`이 있으면 우선 사용한다.
- `_loop.tscn`이 없으면 기본 `.tscn` 파일로 폴백한다.
### 3.5 단계별 사용 규칙
- `사전_역대당선자*` 계열은 `사전`, `개표` 양쪽 단계에서 사용 가능
- `사전_역대투표율*` 계열은 `사전` 단계 전용
- 일반 후보/판세/당선/접전 계열은 주로 `개표` 단계에서 사용
## 4. 스케줄
### 4.1 구조
- 큐 기반
### 4.2 상태
- 현재 송출: 빨간색
- 다음 송출: 주황색
- 채널별 독립 큐 기반
- `현재`, `다음`, `대기` 상태를 구분한다.
### 4.2 지역 범위
- 큐 추가 시 컷만이 아니라 지역 범위도 함께 지정한다.
- 지원 범위:
- `전체`
- `선택권역`
- `개별 지역`
### 4.3 제어
- 다음 포맷 변경 가능
- 현재 포맷 강제 중지 후 전환 가능
- 순서 변경 가능
### 4.4 삭제 정책
- 대기 포맷 삭제 가능
- 송출 중 포맷 삭제 불가
- `다음` 지정
- `위/아래` 순서 변경
- `제거`
- `반복`
- 빈 스케줄 시 `즉시 아웃` 또는 `마지막 화면 유지`
### 4.5 루프
- 전체 루프 가능
- 첫 포맷부터 재시작
### 4.4 복원
### 4.6 빈 스케줄
- 설정에 따라:
- 즉시 Out
- 마지막 화면 유지
- 저장 상태 복원 시 채널별 큐와 지역 범위를 함께 복원한다.
- 예전 컷 ID가 저장돼 있어도 복원 시 canonical 컷 ID로 정규화한다.
### 4.7 종료
- 수동 종료 시:
- 스케줄 종료
- 해당 Layer Out
## 5. 사전데이터
---
### 5.1 저장 위치
## 5. 방송 영역
- `Tornado3_2026Election/Assets/Data/pre_election_history.json`
- 노멀
- 좌상단
- 하단
- VideoWall
### 5.2 지원 범위
특징:
- 독립 스케줄
- 동시 송출 가능
- `광역단체장`: 전국 17개 시도
- `교육감`: 전국 17개 시도
- `기초단체장`: 전국 262개 선거구
---
### 5.3 기능
## 6. 방송사 설정
- 선거 종류/지역 선택
- 역대 투표율 카드 표시
- 역대 당선자 카드 표시
- 엑셀형 편집 그리드
- JSON 저장
### 대상
- KNN, TBC, KBC, G1, TJB, JTV
### 5.4 색상 포맷 분리
### 특징
- 동일 구조
- 지역 필터만 다름
- `사전_역대당선자*` 편집 행에는 `ColorParty` 콤보박스를 제공한다.
- 표기 정당명과 송출 색상 정당을 분리할 수 있다.
- 송출 시에는 `ColorParty`가 있으면 이를 우선 사용하고, 없으면 표기 정당명을 사용한다.
### 지역 필터
- 기본값 제공
- 사용자 수정 가능
## 6. 썸네일 / 컷리스트
---
### 6.1 저장 규칙
## 7. 유력/확실/당선
- 썸네일은 `Assets/Thumbnail/<template.Id>.png` 규칙으로 저장한다.
### 기준
- 후보 단위
### 6.2 프리뷰
### 수동 입력
- 콤보박스 선택
- 자동 판정보다 우선
- 채널 제어 패널의 컷 선택 콤보박스는 선택한 컷의 썸네일 프리뷰를 표시한다.
- 프로젝트 썸네일이 없으면 번들 썸네일, 그것도 없으면 기본 아이콘을 사용한다.
### 자동 판정
- 수동 지정 없는 경우만 적용
- 당선 조건:
- (1위 - 2위) > 남은 개표수
### 6.3 생성
### 초기화
- 전체 초기화 가능
- `썸네일 생성` 기능은 Karisma에 씬을 로드하고 320x180 PNG를 저장한다.
- 씬은 `KarismaSceneResolver`가 실제 `.tscn`/`_loop.tscn` 규칙으로 해석한다.
### 저장
- 방송사 + 선거종류 + 선거구 + 후보 기준
### 6.4 컷리스트 페이지
---
- 전체 컷 목록
- 채널 필터
- 컷별 재생 시간 편집
- 썸네일 현황 요약
## 8. Tornado3 연동
## 7. 직함 표기
### 방식
- TCP + DLL
- `광역단체장`, `교육감`, `기초단체장`은 전 컷 공통으로 지역명 대신 직함을 사용한다.
- 예:
- `서울특별시` -> `서울시장`
- `전라남도` -> `전라남도지사`
- `부산광역시` -> `부산광역시교육감`
- `창원시` -> `창원시장`
### 기능
- 이미지 변경
- 텍스트 변경
- 준비
- 송출
## 8. RGB / 정당 색상
### 응답 처리
- ACK 대기 없음
- 5초 내 응답 없으면 실패
- RGB txt 기준으로 정당색을 해석한다.
- RGB txt에 style color 지정이 있으면 `SetStyleColor(...)`를 우선 사용한다.
- style color가 없을 때만 이미지 자산 경로를 사용한다.
- 역사 정당명은 `한나라당 -> 국민의힘`, `열린우리당 -> 더불어민주당` 등 별칭 정규화를 함께 지원한다.
### 상태
- IDLE
- READY (송출 가능 상태)
- SENDING
- ON_AIR
- ERROR
## 9. Tornado3 / Karisma 연동
### 연결
- 끊김 시 재연결
- 재연결 후 사용자 확인 후 재개
### 9.1 방식
---
- TCP + `Interop.KAsyncEngineLib.dll`
## 9. 상태 흐름
### 9.2 기본 연결
IDLE → READY → SENDING → ON_AIR → NEXT
ERROR
- 기본 대상: `127.0.0.1:30001`
- 환경변수:
- `TORNADO_KARISMA_HOST`
- `TORNADO_KARISMA_PORT`
---
### 9.3 채널 바인딩
## 10. 복원
- 기본:
- `노멀=0:0`
- `좌상단=0:1`
- `하단=0:2`
- `비디오월=1:0`
- 환경변수:
- `TORNADO_KARISMA_BIND_NORMAL`
- `TORNADO_KARISMA_BIND_TOPLEFT`
- `TORNADO_KARISMA_BIND_BOTTOM`
- `TORNADO_KARISMA_BIND_VIDEOWALL`
### 대상
- 스케줄
- 방송사
- 상태값
### 9.4 T3_Cut 경로
### 방식
- 통합 대화상자
- 체크박스 선택
- 앱, 송출 어댑터, 썸네일 생성기, Karisma 디버깅 도구는 `D:\\Elect2026\\T3_Cut`를 고정 기준 경로로 사용한다.
- 사용자 설정값, 저장된 상태값, `TORNADO_T3CUT_PATH`, 디버깅 도구의 `--image-root`/`--root` 입력은 T3_Cut 기준 경로를 바꾸지 않는다.
---
### 9.5 폴백
## 11. UI 구조
- 시작 시 `T3_Cut` 경로가 유효하지 않으면 Mock Adapter로 폴백한다.
### 네비게이션
- 통합 스케줄
- 노멀
- 좌상단
- 하단
- VideoWall
- 데이터
- 설정
- 로그
## 10. 상태 저장 / 자동 저장
### 표시
- 빨강: 현재 송출
- 주황: 다음 송출
- 주요 설정 변경 시 자동 저장
- 저장 대상:
- API 자동 갱신 여부
- API 갱신 주기
- 데이터 선택 상태
- 채널 큐
- 컷별 재생 시간
- 방송사 지역 필터
---
## 11. 인코딩 규칙
## 12. 이미지
- 텍스트 파일은 UTF-8 기준으로 관리한다.
- 한글 문자열 수정 후에는 `?`, `U+FFFD`, 모지바케가 없는지 반드시 확인한다.
경로 규칙:
{선택경로}/{선거종류}/{지역코드}/{후보코드}.png
## 12. 현재 확인된 빌드 경고
---
## 13. 예외 처리
- API 실패 → 사용자 알림
- Tornado 실패 → ERROR 상태
---
## 14. 핵심 개념
- 포맷 기반
- 컷 단위 송출
- 스케줄 큐 구조
- 상태 머신 기반 제어
- `WindowsBase` 참조 충돌 경고
- MSIX 인증서 경고
- `MockTornado3Adapter.ConnectionChanged` 미사용 경고

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
# TSCN Variable Discovery
- Generated: 2026-04-14 15:24:09
- Root: `E:\김의연\지역민방\T3_Cut`
- Scene Count: 1
- Discovered Variable Count: 21
- Failure Count: 0
## Method
- Candidate names are extracted from each `.tscn` as UTF-16LE strings.
- Each candidate is verified through Karisma TCP callbacks.
- `SetValue(__TCP_VALIDATE__)`, valid `.png`, valid `.vrv`, and `SetCounterNumberKey(1, 1)` are tried as applicable.
- Only callbacks that returned `RESULT_SUCCESS` are listed as discovered variables.
## Scenes
### `Elect2026_Normal_민방\1-2위_ani_광역단체장.tscn`
- Candidate Count: 28
- Discovered Variables: 21
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표수01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표수02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 시도명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 유확당02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 정당명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 정당명02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 정당바01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 정당바02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 정당판01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 정당판02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 표차01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 후보명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 후보명02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 후보사진01 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |
| 후보사진02 | SetValue | E:\\김의연\\지역민방\\T3_Cut\\Elect2026_Bottom_민방\\Images\\Etc\\가이드.png | RESULT_SUCCESS |

View File

@@ -0,0 +1,39 @@
# TSCN Variable Discovery
- Note: 이 문서는 초기 샘플 3개 컷에 대한 탐색 결과다. 전체 `T3_Cut` 기준 확정 스캔 결과는 `TSCN_VARIABLE_DISCOVERY_E_DRIVE.md`를 기준으로 본다.
- Generated: 2026-04-14 15:21:19
- Root: `E:\김의연\지역민방\T3_Cut`
- Scene Count: 3
- Discovered Variable Count: 0
- Failure Count: 0
## Method
- Candidate names are extracted from each `.tscn` as UTF-16LE strings.
- Each candidate is verified through Karisma TCP callbacks.
- `SetValue(__TCP_VALIDATE__)`, valid `.png`, valid `.vrv`, and `SetCounterNumberKey(1, 1)` are tried as applicable.
- Only callbacks that returned `RESULT_SUCCESS` are listed as discovered variables.
## Scenes
### `Elect2026_Bottom_민방\1-2위_광역단체장.tscn`
- Candidate Count: 54
- Discovered Variables: 0
- No variables discovered with the current TCP validation heuristics.
### `Elect2026_Bottom_민방\1-2위_광역단체장_loop.tscn`
- Candidate Count: 53
- Discovered Variables: 0
- No variables discovered with the current TCP validation heuristics.
### `Elect2026_Bottom_민방\1-2위_기초단체장.tscn`
- Candidate Count: 53
- Discovered Variables: 0
- No variables discovered with the current TCP validation heuristics.

View File

@@ -0,0 +1,193 @@
# TSCN Variable Discovery
- Generated: 2026-05-09 03:06:16
- Root: `D:\Elect2026\T3_Cut\Elect2026_Top_민방`
- Scene Count: 8
- Discovered Variable Count: 112
- Failure Count: 0
## Method
- Candidate names are extracted from each `.tscn` as UTF-16LE strings.
- Each candidate is verified through Karisma TCP callbacks.
- `SetValue(__TCP_VALIDATE__)`, valid `.png`, valid `.vrv`, and `SetCounterNumberKey(1, 1)` are tried as applicable.
- Only callbacks that returned `RESULT_SUCCESS` are listed as discovered variables.
## Scenes
### `광역단체장_2인.tscn`
- Candidate Count: 20
- Discovered Variables: 14
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
### `광역단체장_2인_텍스트.tscn`
- Candidate Count: 18
- Discovered Variables: 14
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 후보명02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
### `기초단체장_2인.tscn`
- Candidate Count: 20
- Discovered Variables: 15
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 시도명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
### `기초단체장_2인_텍스트.tscn`
- Candidate Count: 19
- Discovered Variables: 13
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 시도명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
### `Elect2026_Top_민방\광역단체장_2인.tscn`
- Candidate Count: 20
- Discovered Variables: 14
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
### `Elect2026_Top_민방\광역단체장_2인_텍스트.tscn`
- Candidate Count: 18
- Discovered Variables: 14
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 후보명02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
### `Elect2026_Top_민방\기초단체장_2인.tscn`
- Candidate Count: 20
- Discovered Variables: 15
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 시도명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 후보사진02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
### `Elect2026_Top_민방\기초단체장_2인_텍스트.tscn`
- Candidate Count: 19
- Discovered Variables: 13
| Variable | Method | Payload | Result |
| --- | --- | --- | --- |
| 개표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 득표율02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 선거구명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 순위02 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 시도명01 | SetValue | __TCP_VALIDATE__ | RESULT_SUCCESS |
| 유확당01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 유확당02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당바02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼01 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |
| 정당심볼02 | SetValue | D:\\Elect2026\\T3_Cut\\Elect2026_Top_민방\\Elect2026_Top_민방\\Images\\Dang\\Dang_Symbol\\개혁신당.png | RESULT_SUCCESS |

View File

@@ -1,13 +1,12 @@
<Solution>
<Configurations>
<Platform Name="ARM64" />
<Platform Name="x64" />
<Platform Name="x86" />
</Configurations>
<Project Path="Tornado3_2026Election/Tornado3_2026Election.csproj">
<Platform Solution="*|ARM64" Project="ARM64" />
<Platform Solution="*|x64" Project="x64" />
<Platform Solution="*|x86" Project="x86" />
<Deploy />
</Project>
<Project Path="tools/KarismaTcpProbe/KarismaTcpProbe.csproj">
<Platform Solution="*|x64" Project="x64" />
</Project>
</Solution>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 108 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1 @@

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

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