add: figma_to_html_agent/blocks/ + 변환 도구 docs 갱신

전체 401 files (397 추가 + 4 수정), 14304 insertions.

추가:
- figma_to_html_agent/blocks/ — Figma 변환 결과 (32 frame, ~79MB).
  각 frame folder = {analysis.md, flat.md, texts.md, index.html, assets/,
  _renders/, _render.py, RELATIONSHIPS.md / STATUS.md / classification.md
  (일부 frame)}.
  Phase Z 의 *figma source layer* — runtime 에서 직접 사용 X, contract /
  partial / builder adapter (미래 axis A) 의 source.
- figma_to_html_agent/DISCUSSION-SUMMARY-20260411.md — 변환 설계 회의 기록.
- figma_to_html_agent/HARNESS.md — 변환 검증 harness.
- figma_to_html_agent/scripts/fetch_figma_screenshots.py — Figma 스크린샷 자동 수집.

수정:
- figma_to_html_agent/PROCESS-CONTROL.md / PROCESS.md / RULES.md —
  변환 프로세스 / 룰 갱신 (R8/R9 lock 강화 등).
- figma_to_html_agent/blocks_index.md — 32 frame 인덱스 갱신.

Phase Z 영향 0 (figma_to_html_agent/blocks/ 가 V4 catalog +
templates/phase_z2/families adapter 의 source — runtime 에서 직접 import X).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 09:41:05 +09:00
parent cc2f434000
commit 9fbe3ac90c
401 changed files with 14304 additions and 2 deletions

View File

@@ -0,0 +1,303 @@
# Design Agent 구조 재정리를 위한 논의 요약 (2026-04-11)
> 이 문서는 figma_to_html_agent 세션에서 논의된 핵심 사항을 정리한 것.
> design_agent 총괄 AI에게 전달하여 전체 파이프라인 재구성에 참고하기 위한 브리핑.
---
## 1. Figma → HTML 변환 구조
### 1.1 전체 흐름
```
피그마 프레임 (디자인 원본)
↓ MCP 도구로 데이터 수집 (구조, 스타일, 스크린샷)
실측 기록부 (flat.md)
↓ 그라데이션 수학 변환 + CSS 작성
블록 HTML (1:1 정적 변환물)
↓ Selenium 자동 검증
블록 라이브러리 등록 (catalog.yaml)
```
### 1.2 산출물 3종 세트
| 파일 | 역할 | 비유 |
|------|------|------|
| **flat.md** | 원본 피그마의 모든 요소 위치·크기·각도·폰트·색상 기록 | 현장 실측 기록부 |
| **{블록}.html** | HTML+CSS+이미지 참조. 실제 렌더되는 파일 | 표준 설계도면 |
| **catalog.yaml** | 블록 용도·조건·슬롯 메타 정보 | 건축 자재 카탈로그 |
### 1.3 AI vs 코드 역할 분담
| 구간 | 주체 | 오차 |
|------|------|------|
| 데이터 수집 (좌표, 색, 폰트) | **코드** (Figma MCP) | 0 |
| 그라데이션 좌표→각도 변환 | **코드** (gradient_math.py) | 0 |
| HTML 렌더링 | **코드** (Selenium) | 0 |
| 구조 해석, HTML 설계, 검증 판단 | **AI** | 존재 |
**핵심:** AI는 블록 템플릿을 **1회 설계**하는 데만 관여. 이후 런타임 사용은 **100% 코드** (Jinja2 + CSS).
---
## 2. 블록 선택 방식 — 결론: TF-IDF 직접 매칭
### 2.1 검토한 방식들
| 방식 | 적합성 | 이유 |
|------|--------|------|
| **FAISS (임베딩 벡터)** | ❌ 불필요 | 35개 블록에 오버스펙. 같은 도메인 텍스트는 벡터가 비슷해서 구분 어려움 |
| **RAG (LLM 판단)** | ❌ 불필요 | 입력이 이미 구조화(MDX)되어 있고 블록 수가 적어 AI 판단 불필요 |
| **BM25 + Kiwi** | ⚠️ 가능 | catalog 설명 품질에 의존. 설명이 잘 되어있으면 작동 |
| **구조 태그 매칭 (코드)** | ✅ 가능 | MDX 파싱 → item_count, relation_type → catalog 태그 비교 |
| **TF-IDF 직접 매칭** | ✅ **최적** | 디자인 안의 실제 텍스트와 MDX 텍스트를 직접 비교 |
### 2.2 TF-IDF 직접 매칭이 최적인 이유
**핵심 전제:** MDX 텍스트와 Figma 디자인 안의 텍스트가 **같은 원본 문서에서 나온 것**이라 핵심 키워드가 자연스럽게 겹침.
```
[1회성 사전 준비]
각 Figma 디자인(35개)에서 텍스트 추출 → 블록별 텍스트 저장
[매칭 실행]
MDX 텍스트 → TF-IDF로 35개 블록 텍스트와 유사도 계산 → 최고 점수 디자인 선택 → 텍스트 교체
```
**장점:**
- AI 비용 0원 (100% 코드)
- 결정론적 (같은 입력 → 같은 결과)
- 35개 전수 비교에 0.01초
- 디버깅 용이 ("이 단어들이 겹쳐서 선택됨" 즉시 설명 가능)
- catalog.yaml 설명 품질에 의존 안 함 (디자인 안의 실제 텍스트로 매칭)
- FAISS, RAG, 임베딩 모델 등 복잡한 인프라 불필요
**실증:** BM25 테스트에서 콘텐츠A(기술/사람/자연)→3열블록, 콘텐츠B(Process/Product)→2열블록 정확 매칭 확인.
### 2.3 이 방식이 성립하는 조건
1. 블록 수가 30~35개 수준 (소규모)
2. 각 디자인의 텍스트가 서로 충분히 다름 (같은 문서 내 다른 섹션)
3. MDX 콘텐츠가 Figma 디자인의 원본 텍스트와 동일 도메인
4. 매칭 후 "텍스트만 업데이트"하는 구조 (디자인 구조 자체는 변경 안 함)
**한계 시점:** 블록이 수백 개가 되거나, 완전히 새로운 도메인 콘텐츠가 들어오면 구조 분석(AI) 또는 임베딩 검색 추가 필요.
---
## 3. 전체 파이프라인 재정리 제안
### 3.1 현재 파이프라인 (복잡)
```
MDX → Kei 실장(AI) 구조분석 → catalog 태그 매칭(코드) → 블록 선택
→ Kei 편집자(AI) 텍스트 편집 → Jinja2 렌더(코드) → 슬라이드
```
### 3.2 단순화된 파이프라인 (제안)
```
MDX → TF-IDF 매칭(코드) → 디자인 선택 → 텍스트 교체(코드) → 슬라이드
```
**AI가 필요한 시점:**
- 매칭 결과가 애매할 때 (점수 차이가 미미한 후보 2~3개 중 선택)
- 텍스트가 디자인 공간에 안 맞을 때 (요약/편집 필요)
- 새로운 패턴의 디자인이 필요할 때 (블록 신규 제작)
**AI가 불필요한 시점:**
- 디자인 선택 (TF-IDF 매칭)
- 텍스트 삽입 (Jinja2 치환)
- 렌더링 (CSS + 브라우저)
### 3.3 블록 선택에서 AI 개입 최소화 구조
```
MDX 텍스트
[코드] TF-IDF 매칭 → 후보 1~3개 + 점수
점수 차이 크면 (예: 1위가 2위보다 2배 이상) → 코드가 자동 확정
점수 차이 작으면 → AI가 후보 중 최종 선택 (최소 개입)
[코드] 텍스트 교체 + 렌더
```
---
## 4. Figma MCP 관련 발견 사항
### 4.1 MCP 2종류
| MCP | 제공자 | 장단점 |
|-----|-------|--------|
| Framelink Figma MCP | 커뮤니티 (REST API) | rotation/blend mode 미제공 |
| Figma Desktop Dev Mode MCP | Figma 공식 (로컬 SSE) | rotation/blend/정확한 CSS 모두 제공 |
**결론:** Figma Desktop Dev Mode MCP (`127.0.0.1:3845/sse`)가 정답. Framelink MCP는 rotation 등 핵심 정보 부재로 한계.
### 4.2 Figma Dev Mode HTML 직접 활용
Figma Dev Mode에서 프레임 전체를 HTML 코드로 export 가능:
- transform: rotate() 포함
- background-blend-mode 포함
- 모든 좌표/크기/색상 포함
- 이 HTML을 기반으로 scale 조정 후 직접 사용 가능
### 4.3 MCP 한계 (확인됨)
- rotation 속성 미제공 (Framelink MCP)
- dimensions가 bounding box (회전 포함된 크기) — 원본 크기와 다를 수 있음
- gradient 각도: Figma 좌표계 vs CSS 좌표계 차이 → 수학 변환 필요
---
## 5. CSS 구현 원칙
### 5.1 왜 SVG가 아닌 CSS인가
| 이유 | 설명 |
|------|------|
| **한글 텍스트** | CSS는 자동 줄바꿈·어절 처리. SVG `<text>`는 수작업 줄바꿈 |
| **레이아웃** | CSS flex/grid/aspect-ratio. SVG는 레이아웃 시스템 없음 |
| **혼합 콘텐츠** | 도형+이미지+텍스트 섞기. HTML이 자연스러움 |
| **템플릿화** | Jinja2 변수 치환이 CSS에서 자연스러움 |
| **예외** | 곡선 아크, 복잡한 필터 → SVG/PNG 유지 |
### 5.2 그라데이션 수학 변환
- SVG: 좌표 기반 (x1, y1, x2, y2)
- CSS: 각도 기반 (Xdeg)
- 변환: `atan2(y2-y1, x2-x1)``scripts/gradient_math.py`
- 회전+그라데이션 합성: 래퍼 구조(`transform: rotate()`)로 분리해서 수학 합성 회피
### 5.3 회전 처리
- 도형 자체를 회전하지 않고, **래퍼(wrapper) 컨테이너를 회전**
- border-radius와 gradient가 같이 돌아감
- Figma Dev Mode가 자동으로 이 래퍼 구조를 생성해줌
---
## 6. 핵심 결론
1. **블록 선택은 TF-IDF 직접 매칭으로 충분** — RAG/FAISS 불필요
2. **AI는 "블록 템플릿 1회 제작"에만 관여** — 런타임은 100% 코드
3. **Figma Desktop Dev Mode MCP가 정답** — Framelink MCP는 한계
4. **CSS 우선, SVG는 곡선만** — 한글 텍스트 처리와 템플릿화 때문
5. **복잡한 구조(RAG/임베딩/구조분석)보다 단순한 구조(TF-IDF+코드)가 현재 규모에 최적**
---
## 7. 산출물 구조 확정 (프레임당 4종)
### 7.1 프레임별 산출물
```
figma_to_html_agent/
├── CLAUDE.md, PROCESS.md, RULES.md ... ← 프로세스 문서
├── scripts/gradient_math.py ← 수학 변환
├── blocks_index.md ← 변환 완료 인덱스
├── block-tests/ ← 프레임별 산출물
│ ├── {slug}.html ← ① HTML 블록
│ ├── {slug}_flat.md ← ② 노드별 실측 기록
│ └── {slug}_texts.md ← ③ 텍스트만 모은 목록 (TF-IDF용, 신규)
└── texts_index/ ← TF-IDF 매칭 인덱스 (신규)
└── (35개 프레임 텍스트 인덱스)
```
- ①②는 기존 프로세스
- ③은 신규: 프레임 안의 **모든 텍스트를 빠짐없이** 추출해서 별도 목록으로 저장
- texts_index/는 ③들을 모아 TF-IDF 인덱스로 구축
### 7.2 ③ texts.md가 필요한 이유
현재 flat.md의 문제:
- 텍스트가 노드 계층 설명 안에 **산발적으로 흩어져** 있음
- 일부 노드는 텍스트 내용이 **생략**됨 (예: `17:1941 ~ 17:1952 (12개)`)
- TF-IDF 매칭용으로 쓰려면 프레임별 **텍스트만 모은 깨끗한 목록** 필요
### 7.3 산출물의 사용처
```
① {slug}.html → templates/에 프로모션 (블록 렌더링용)
② {slug}_flat.md → yaml 메타 정보 + HTML 제작 근거
③ {slug}_texts.md → TF-IDF 인덱스 (블록 자동 선택용)
```
---
## 8. TF-IDF 선택 근거 (왜 다른 유사도 방법이 아닌가)
### 8.1 매칭 신호 = "단어 겹침"
MDX와 Figma 텍스트는 같은 원본 문서에서 나온 것이라 **같은 단어가 직접 겹침**.
의미 추론이 아니라 단어 일치가 매칭 근거.
### 8.2 IDF의 역할
```
"건설" → 35개 프레임 전부에 등장 → IDF 낮음 → 구분 못 함
"3D모델" → 3개 프레임에만 → IDF 높음 → 구분 가능
"Copy&Paste" → 1개 프레임에만 → IDF 매우 높음 → 확정적
```
"모든 프레임에 나오는 흔한 단어는 무시, 특정 프레임에만 나오는 희귀 단어는 강조"
### 8.3 다른 방법이 안 맞는 이유
| 방법 | 문제 |
|------|------|
| FAISS/임베딩 | 같은 도메인 단어를 **뭉개서** 프레임 구분 못 함. "병렬"≈"교차"로 취급 |
| RAG | 35개에 AI 판단은 오버스펙. 비용 발생 |
| Jaccard | 단어 희귀성 무시. "건설"이든 "Copy&Paste"든 동일 1점 |
| Word2Vec/BERT | 의미 유사도는 불필요 (단어가 직접 겹치므로). 한국어 도메인 모델 품질 불확실 |
| BM25 | 가능하지만 35개 수준에서 TF-IDF와 차이 없음. TF-IDF가 더 단순 |
---
## 9. 정리 완료 현황 (2026-04-16)
### 9.1 templates/ (완료)
```
templates/
├── blocks/
│ └── slide-base.html ← 유일하게 남긴 것
└── catalog.yaml ← 초기화
```
기존 104개 파일 삭제 완료.
### 9.2 figma_to_html_agent/ (완료)
```
figma_to_html_agent/
├── CLAUDE.md, PROCESS.md, MATH.md, RULES.md, PROCESS-CONTROL.md, README.md
├── DISCUSSION-SUMMARY-20260411.md
├── INSIGHT-GRADIENT.md
├── blocks_index.md
└── scripts/gradient_math.py
```
구 파일(FIGMA-EXTRACTION.md, block_index.faiss, figma_beps_full.json, block-tests/, figma-analysis/ 등) 전부 삭제 완료.
### 9.3 다음 단계
깨끗한 상태에서 35개 프레임을 1개씩 재추출:
1. Figma Desktop MCP 또는 Dev Mode HTML로 데이터 수집
2. 프레임당 3종 산출물 생성 (html + flat.md + texts.md)
3. texts_index/ 에 TF-IDF 인덱스 누적
4. templates/에 프로모션 (사용자 승인 후)
---
## 10. design_agent 총괄에게 전달할 질문/제안
1. **Phase Q 블록 선택 단계**를 TF-IDF 직접 매칭으로 단순화할 수 있는가?
2. **Kei 실장의 "구조 분석" 역할**이 TF-IDF 매칭으로 대체 가능한 범위는?
3. **catalog.yaml의 content_structure/when/not_for 필드**를 유지하되, 1차 매칭은 TF-IDF로 하고 AI는 fallback으로만 쓰는 구조가 합리적인가?
4. **Figma Desktop Dev Mode MCP**를 PROCESS.md STEP 1~3에 공식 반영할 것인가?
5. **산출물 3종 → 4종 (texts.md 추가)** 으로 PROCESS.md 업데이트할 것인가?

View File

@@ -0,0 +1,294 @@
# 변환 하네스 (Conversion Harness)
> **이 체크리스트의 모든 항목을 순서대로 통과해야 한다. 건너뛰기 금지.**
> 각 항목에서 "확인"이 안 되면 다음으로 넘어가지 않는다.
> **2층 구조: 1층(행동 통제) → 2층(구현)**. 1층을 통과하지 않으면 2층 진입 금지.
---
# ═══ 1층: 행동 통제 하네스 ═══
## A. 사용자 요청 해석
- [ ] 사용자가 실제로 말한 문제를 **한 문장으로** 다시 적었는가?
- [ ] 내가 하려는 수정이 **그 문제에 직접 대응**하는가?
- [ ] 사용자가 말하지 않은 구조 변경을 하려면 **사전 합의**가 필요한가?
- [ ] "이것도 같이 바꾸면 좋겠다"는 생각이 들면 → **멈추고 물어본다**
## B. 블록 분류 (patch / rewrite / hold)
작업 시작 전 반드시 분류하고 근거를 3줄로 적는다.
```
이 블록은 무엇인가?
├── patch — 구조는 살아 있고 특정 부분만 수정하면 됨
│ 근거: ___
├── rewrite — 구조 자체가 틀어져서 처음부터 다시 해야 함
│ 근거: ___
└── hold — 지금 건드리지 않고 보류
근거: ___
```
- [ ] 분류 결정함 → `blocks/{id}/classification.md`에 기록
- [ ] 근거 3줄 적음
- [ ] **patch가 아닌 블록에 임의 구조 전환 금지**
- [ ] **rewrite 블록은 사용자 확인 후에만 착수**
## C. 변경 범위 제한
- [ ] **이번 수정의 단일 목표**를 한 문장으로 적었는가?
- [ ] 이번 수정에서 바꾸는 축은 **1개**인가?
- 예: spacing만 / bullet model만 / gradient CSS 변환만
- [ ] 다른 축은 건드리지 않았는가?
- [ ] 현재 정상 동작하는 요소를 **변경 금지 목록**으로 적었는가?
```
변경 대상: ___
변경하지 않는 것: ___
```
## D. 변경 전 기록
- [ ] 수정 전 현재 값/구조 기록 (되돌릴 수 있도록)
- [ ] 변경 전 렌더링 스크린샷 baseline 저장
## E. 중단 조건
아래 상황 발생 시 **즉시 멈추고 사용자에게 보고**:
- [ ] 인코딩 깨짐 발견
- [ ] MCP 좌표와 렌더 결과가 크게 다름 (30px+ 이상 차이)
- [ ] 패치하려던 블록이 구조 붕괴 상태
- [ ] 한 군데 고치니 다른 곳이 깨짐 (cascade failure)
- [ ] 사용자 요청과 다른 방향으로 가고 있음을 인지
→ patch 중단
→ rewrite required로 분류 전환
`blocks/{id}/STATUS.md` 남기고 다음 블록으로
## F. 완료 판정
patch 또는 rewrite가 끝났다고 판단하기 전에:
- [ ] 사용자가 지적한 문제가 **실제로 사라졌는가** (렌더링 확인)
- [ ] 새로 생긴 **부작용이 없는가**
- [ ] baseline 대비 **더 나빠진 요소가 없는가**
- [ ] 아래 4개 산출물을 남겼는가:
- before screenshot
- after screenshot
- 변경 요약 3줄
- classification 결과 (patch/rewrite/hold)
위 전부 통과해야 "완료". 하나라도 안 되면 미완료.
---
# ═══ 2층: 구현 하네스 ═══
> **1층 A~F를 모두 통과한 후에만 아래 진행**
## 0. 시작 전 — 규칙 파일 읽기 + 행동 원칙 확인
- [ ] RULES.md 읽음 (R1~R19 전부)
- [ ] PROCESS-CONTROL.md 읽음 (규칙 1~8)
- [ ] PROCESS.md 읽음 (STEP 0~10)
- [ ] HARNESS.md 읽음 (이 파일)
- [ ] blocks_index.md 읽음 (기존 패턴 확인)
### 행동 원칙 (PROCESS-CONTROL에서, 매 작업 전 상기)
- [ ] **소스는 Figma 데이터다** — PNG를 보고 판단하지 않음 (규칙1)
- [ ] **이미지 해석 금지** — 멀티모달로 gradient 방향 추측 안 함 (규칙2)
- [ ] **작동하는 것은 건드리지 않는다** — A만 문제면 A만 수정 (규칙3)
- [ ] **한 번에 하나만 바꾼다** — gradient 각도와 border-radius 동시 변경 금지 (규칙4)
- [ ] **사용자가 말한 것만 한다** — 자의적 해석 금지 (규칙5)
- [ ] **찍어맞추기 금지** — 값을 바꾸기 전에 WHY를 먼저 설명 (규칙6)
- [ ] **쉬운 전면 재작성 금지** — 80점에서 2개 고칠 때 구조를 갈아엎지 않음 (규칙7)
- [ ] **MCP 데이터 전수 반영** — "핵심만", "단순화" 금지 (규칙8)
---
## 1. MCP 데이터 수집
- [ ] get_metadata 호출 → 모든 노드 ID, 위치, 크기 확보
- [ ] get_design_context 호출 → gradient, font, style, rotation 확보
- [ ] 에셋 URL 목록 추출
---
## 2. 에셋 분류 — R9 CSS vs 이미지 판정 (에셋마다 반드시 수행)
각 에셋에 대해:
```
이 에셋이 뭔가?
├── 단순 사각형 + gradient → CSS linear-gradient + border-radius [R9]
├── 단순 원 + gradient → CSS border-radius:50% + linear-gradient [R9]
├── 단순 직선/점선 → CSS border [R9]
├── 단색 사각형 → CSS background-color [R9]
├── plus-darker blend → multiply로 교체 [R10]
└── 복잡 path / 사진 / 아이콘 / 곡선 → 이미지 유지
```
- [ ] 모든 에셋 분류 완료
- [ ] CSS 대체 가능한 에셋은 다운로드하지 않음
- [ ] 이미지 유지 에셋만 다운로드
---
## 3. gradient 변환 — R9 CSS 대체 에셋
CSS로 대체하기로 한 에셋마다:
- [ ] SVG 파일을 열어 linearGradient 데이터 추출
- [ ] gradient_math.py로 CSS linear-gradient 변환 (인라인 복사 금지)
- [ ] viewBox padding이 있으면 R12 remap 적용
- [ ] 변환 결과 기록
---
## 4. 구조 결정 — R17 레이아웃 타입
```
이 블록의 레이아웃은?
├── 순차 행 (비교표, 이슈 목록, 불릿 리스트)
│ → flex column (행 간) + flex row (행 내부) [R17]
│ → 텍스트 늘면 행이 밀림
├── 표 (행×열 구조)
│ → CSS grid [R17]
│ → border가 곧 그리드 라인
│ → 셀 높이 auto
├── 2D 다이어그램 (원, 노드, 겹침)
│ → absolute + 명시 height + zoom [R19]
│ → 겹침이 있으므로 flex 불가
└── 좌우 분할 (좌:이미지 / 우:목록)
→ display:flex (좌:flex-none / 우:flex column)
```
- [ ] 레이아웃 타입 결정
- [ ] zoom 적용 (transform:scale 금지) [R19]
---
## 5. HTML 작성 — 요소별 체크
### 5-A. DOM 순서
- [ ] MCP metadata 순서 = HTML DOM 순서 (나중 요소가 위에 렌더)
- [ ] z-index 별도 지정 필요 없음 (DOM 순서로 해결)
### 5-B. 텍스트 요소
- [ ] 본문 텍스트에 position:absolute 사용 안 함 [R17]
- [ ] overflow:hidden으로 텍스트 숨기기 안 함 [R17]
- [ ] 고정 height로 텍스트 제한 안 함 [R17]
- [ ] word-break: keep-all 적용 [R14]
- [ ] descender 보정 필요한가? [R1]
- line-height / font-size < 1.448 (Noto Sans KR) → padding-bottom 계산
- [ ] gradient 텍스트인가? → background-clip: text [R4]
- [ ] 다중 fills인가? → 첫 번째 불투명 fill만 사용 [R5]
- [ ] 중복 노드인가? (동일 좌표 + 동일 내용) → 1개만 렌더 [R6]
- [ ] 세로 텍스트인가? (width < fontSize × 0.8) → `<br>` 줄바꿈, writing-mode 사용 금지 [R3]
- [ ] vertical center 정렬이 필요한가? → flex justify-center [R15]
- [ ] 불필요한 `<br>` 삽입 안 함 (자연 wrap에 맡김)
### 5-C. 불릿/마커 리스트 [R13]
- [ ] `<ul><li>` 사용 안 함
- [ ] R13 flex pair 구조 사용:
```html
<div class="bullet-row">
<span class="marker">•</span>
<span class="text">내용</span>
</div>
```
- [ ] 2줄째가 첫째 줄 텍스트 시작점에 정렬되는가?
- [ ] level 2 (- dash)는 padding-left로 한 단계 더 들여쓰기
- [ ] 우측 배치: bullet-row 자체는 좌→우 읽기, 컨테이너가 우측 정렬
### 5-D. 회전 요소 [R2]
- [ ] MCP bbox가 회전된 상태인가? (width > height × 1.5 for 단일 문자)
- [ ] 회전 bbox의 x좌표를 그대로 left에 넣지 않음 [R2 addendum]
- [ ] 같은 축 요소들의 center_x를 기준으로 정렬
- [ ] design_context의 center 좌표 + translate(-50%,-50%) 사용
### 5-E. 이미지 프레임 [R16]
- [ ] overflow:hidden + left/width로 부분 표시
- [ ] rotate(180deg) 하단은 이미지 배치 반전
- [ ] crop variant와 label position 분리 [R18]
- [ ] pill 접합이 있는 경우: seam 메타데이터 기록 (pill_seam_meta.md)
- left_seam, right_seam, flat_start, flat_end 측정
- label anchor는 현재 designer-tuned fallback, 장기 computed
### 5-F. CSS gradient/도형 [R9]
- [ ] 단순 도형은 CSS div + border-radius + linear-gradient
- [ ] gradient_math.py 결과값 사용 (감으로 넣지 않음)
- [ ] stroke: border로 변환 [R11 케이스A/B]
### 5-G. 배경/장식
- [ ] .slide 배경은 항상 #fff [R7]
- [ ] 장식 요소(배경 텍스처, 아크 등)는 absolute OK
- [ ] 장식 요소의 mix-blend-mode 반영 (multiply 등)
---
## 6. Flexible 구조 검증
- [ ] 텍스트를 2배로 늘렸을 때 겹치지 않는가?
- [ ] 텍스트를 절반으로 줄였을 때 빈 공간이 방치되지 않는가?
- [ ] 불릿 항목을 추가했을 때 아래 요소가 자연스럽게 밀리는가?
- [ ] 표의 경우: 셀 텍스트 늘면 행이 늘고 border가 따라가는가?
---
## 7. 산출물 작성
- [ ] texts.md — 콘텐츠 텍스트만 (TF-IDF용)
- 구조 메타(노드 ID, 블릿 개수, 역할 설명) 넣지 않음
- 섹션별 그룹핑은 가독성 위해 OK
- 한자/괄호/장식 문자 제외
- [ ] flat.md — 모든 노드 좌표/크기/속성, 변형 축, sub-pattern
- "간략하게" 금지 — 실측 기록부에 간략은 없다
- 이상 탐지 결과 포함 (회전, 세로 텍스트, 중복)
- [ ] index.html — 위 체크 모두 통과한 HTML
---
## 8. 검증
- [ ] Selenium 스크린샷
- [ ] Figma 원본과 시각 비교
- [ ] texts.md의 모든 텍스트가 index.html에 존재
- [ ] flat.md의 모든 시각 요소가 index.html에 반영
- [ ] CSS 대체한 에셋의 assets/ 폴더에서 삭제 확인
---
## 9. 완료 후
- [ ] blocks_index.md에 1줄 추가 (STEP 10)
- [ ] 기존 패턴과 비교 — 2번째 등장이면 templates_staging 진행 여부 확인
---
## 수정 시 추가 체크 (기존 블록 수정할 때)
- [ ] 수정 전 현재 값 기록 (변경 전)
- [ ] 수정 후 변경한 값 기록 (변경 후)
- [ ] 되돌려야 할 때 어디로 돌아가는지 알아야 한다 (PROCESS-CONTROL 규칙3)
- [ ] A만 문제면 A만 수정 — B, C를 "같은 이유로 틀릴 것 같다"고 함께 바꾸지 않음
- [ ] 구조 변경이 불가피하면 사전에 영향 범위 분석 + 사용자 확인 후 진행
---
## 절대 하지 말 것 (매번 확인)
- [ ] PNG/SVG를 CSS로 안 바꾸고 img src로 넣기 [R9 위반]
- **단순 gradient bar, rectangle, circle, line은 기본적으로 CSS다.**
- **이미지 유지가 필요하면 "왜 CSS 불가인지"를 먼저 적고 진행한다.**
- [ ] 본문 텍스트를 absolute로 배치 [R17 위반]
- [ ] overflow:hidden으로 텍스트 숨기기 [R17 위반]
- [ ] transform:scale 사용 (zoom 사용) [R19 위반]
- [ ] `<ul><li>` 불릿 사용 (flex pair 사용) [R13 위반]
- [ ] gradient 값을 감으로 넣기 (gradient_math.py 사용)
- [ ] MCP 회전 bbox x좌표를 그대로 left에 넣기 [R2 위반]
- [ ] 규칙 파일 안 읽고 작업 시작

View File

@@ -42,6 +42,22 @@
- 점점 나빠지면 **즉시 멈추고 마지막 OK 상태로 복원** - 점점 나빠지면 **즉시 멈추고 마지막 OK 상태로 복원**
- 구조 변경이 불가피하면 **사전에 영향 범위 분석 + 사용자 확인 후** 진행 - 구조 변경이 불가피하면 **사전에 영향 범위 분석 + 사용자 확인 후** 진행
### 8. MCP 데이터 전수 반영 (단순화/생략 절대 금지)
- MCP get_design_context 응답의 **모든 요소**를 HTML에 반영한다
- "핵심만 골라서", "단순화해서", "비슷하게" → **전부 금지**
- MCP React+Tailwind 코드를 HTML/CSS로 **1:1 변환**한다
- 구조를 임의로 바꾸지 않는다 (래퍼 div 구조 유지)
- 반드시 반영해야 하는 속성:
- transform: rotate(), scaleY() 등 → 래퍼 div로 감싸는 구조 그대로
- mix-blend-mode: multiply 등 → 절대 생략 금지
- opacity → 절대 생략 금지
- border-radius, inset → Figma 값 그대로
- background-image (gradient) → gradient_math.py로 정확한 CSS 변환
- box-shadow, text-shadow → 값 그대로
- letter-spacing, line-height → 값 그대로
- 검증: MCP 응답에서 CSS 속성을 추출 → index.html에서 동일 속성이 있는지 전수 대조
- "나중에 추가하면 된다"는 생각 금지 → **처음부터 빠짐없이**
## Figma 도형 gradient 처리 프로세스 ## Figma 도형 gradient 처리 프로세스
``` ```

View File

@@ -108,9 +108,27 @@ f05ebf15....png arc_top
--- ---
## STEP 5 — flat.md 작성 (분석 + 이상 탐지) ## STEP 5 — 산출물 3종 작성 (flat.md + texts.md + index.html)
`block-tests/{slug}_flat.md` 파일 생성. 다음 섹션을 반드시 포함: ### 산출물 폴더 구조 (프레임별)
```
blocks/{frame_id}/
├── index.html ← ① HTML 블록 (CSS gradient, transform: scale)
├── flat.md ← ② 실측 기록 (모든 노드 좌표/크기/속성)
└── texts.md ← ③ TF-IDF용 텍스트 (모든 텍스트 빠짐없이)
```
**texts.md 작성 규칙:**
- MCP get_design_context에서 모든 텍스트 노드의 텍스트를 추출
- 노드 계층 설명이 아니라 **텍스트만** 깨끗하게 나열
- 빠짐없이. "간략하게" 금지. flat.md에서 TEXT 타입 노드를 전수 추출
- 섹션별로 그룹핑 (열1, 열2, 열3 등)
- TF-IDF 인덱스 구축 시 이 파일을 직접 사용
### flat.md 작성 규칙
`blocks/{frame_id}/flat.md` 파일 생성. 다음 섹션을 반드시 포함:
### 섹션 1. 메타 ### 섹션 1. 메타
```markdown ```markdown
@@ -245,6 +263,73 @@ from scripts.gradient_math import svg_to_css
**왜 transform: scale을 쓰는가:** 모든 위치/크기/폰트/그림자/스트로크가 한 번의 transform으로 균일하게 축소됨. 매 값을 수동으로 ×S 곱하는 것보다 안전하고 검증 가능. ([MATH.md §1](MATH.md)) **왜 transform: scale을 쓰는가:** 모든 위치/크기/폰트/그림자/스트로크가 한 번의 transform으로 균일하게 축소됨. 매 값을 수동으로 ×S 곱하는 것보다 안전하고 검증 가능. ([MATH.md §1](MATH.md))
### 7-A1. 콘텐츠 주도형 구조 (R17/R19, 권장)
텍스트 분량 변화에 유연한 블록을 만들 때는 아래 구조를 사용한다:
```html
<div class="slide">
<div class="block">
<div class="inner"> <!-- zoom: S (transform:scale 대신, R19) -->
<div class="title">...</div>
<div class="rows"> <!-- flex column: 행 간 자연 flow -->
<section class="row"> <!-- flex column: pill → body → pill -->
<div class="pill-area">...</div>
<div class="body-area"> <!-- flex row: left | divider | right -->
<div class="body-left">텍스트 (자연 flow)</div>
<div class="divider"></div>
<div class="body-right">텍스트 (자연 flow)</div>
</div>
</section>
</div>
</div>
</div>
</div>
```
```css
.inner { width: {W}px; zoom: {S}; }
.rows { display: flex; flex-direction: column; }
.row { display: flex; flex-direction: column; }
.body-area { flex: 1; display: flex; }
.body-left, .body-right { flex: 1; }
```
**핵심 원칙:**
- 본문 텍스트에 absolute 금지 → flex/flow로 자연 배치
- 텍스트 늘면 body-area가 늘고, 아래 행이 밀림
- overflow:hidden으로 텍스트 숨기기 절대 금지
- pill 장식은 section 기준 상대 배치 (콘텐츠를 따름)
- pill의 crop variant와 label position은 분리 (R18)
**사용 시점:** 텍스트 분량이 가변적인 블록 (비교표, 이슈 목록, 불릿 리스트 등)
### 7-A2. MCP 데이터 → HTML 1:1 변환 원칙 (PROCESS-CONTROL 규칙 8)
MCP get_design_context 응답의 React+Tailwind 코드를 HTML/CSS로 변환할 때:
1. **모든 요소를 빠짐없이 반영** — "핵심만", "단순화" 금지
2. **래퍼 구조 유지** — MCP에 flex container + rotate 래퍼가 있으면 HTML에도 동일 구조
3. **시각 속성 절대 생략 금지**:
- `mix-blend-mode: multiply` → CSS에 반드시 포함
- `opacity-80`, `opacity-70` → CSS opacity 반드시 포함
- `transform: rotate()`, `scaleY()` → 래퍼 div 구조로
- `border-radius`, `inset` → Figma 값 그대로
- `background-image` (gradient) → gradient_math.py 변환 또는 MCP 값 직접 사용
- `box-shadow`, `text-shadow`, `letter-spacing` → 값 그대로
4. **검증**: 변환 후 MCP 응답의 CSS 속성 수 vs index.html CSS 속성 수 대조
**변환 순서:**
```
MCP className/style 읽기
→ 각 속성을 CSS로 매핑
→ position: absolute + MCP 좌표(left, top, width, height)
→ 래퍼가 있으면 래퍼 div 생성 + transform 적용
→ 시각 속성 (blend, opacity, radius, shadow) 전부 추가
→ 텍스트 내용 삽입
→ 완성 후 MCP 원본과 속성 수 대조
```
### 7-B. 요소 변환 우선순위 ### 7-B. 요소 변환 우선순위
| 요소 종류 | 구현 방법 | 이유 | | 요소 종류 | 구현 방법 | 이유 |
@@ -312,6 +397,40 @@ d.quit()
- Figma `get_screenshot` 응답과 Selenium 결과를 **사람 눈**으로 비교 - Figma `get_screenshot` 응답과 Selenium 결과를 **사람 눈**으로 비교
- 차이 발견 시 STEP 5~7로 돌아가서 원인 파악 (값 수정 금지) - 차이 발견 시 STEP 5~7로 돌아가서 원인 파악 (값 수정 금지)
### STEP 8-B. 전수 대조 검증 (필수, 다음 프레임 진행 전 반드시 통과)
**원칙: "간략하게", "핵심만", "중요한 것만" — 전부 금지. 전수 처리.**
프레임 완료 전 아래 3가지 검증을 모두 통과해야 다음 프레임으로 넘어갈 수 있다:
**① texts.md 전수 검증:**
- MCP get_design_context의 모든 텍스트 노드를 texts.md와 1:1 대조
- texts.md에 없는 텍스트 노드가 하나라도 있으면 실패
- 검증 방법: MCP 응답에서 텍스트 추출 → texts.md와 diff
**② flat.md 전수 검증:**
- MCP get_metadata의 모든 노드가 flat.md에 기록되어 있는지 대조
- 좌표, 크기, 타입, 이름이 빠짐없이 기록되어야 함
- "간략하게만 적었습니다" → 절대 금지. 실측 기록부에 간략은 없다
**③ index.html 전수 검증:**
- texts.md의 모든 텍스트가 index.html에 존재하는지 대조
- flat.md의 모든 시각 요소(bar, line, icon 등)가 index.html에 반영되어 있는지 대조
- 하나라도 누락되면 실패
**검증 실행 방법:**
```
# texts.md vs index.html 교차 대조
texts.md의 각 줄 텍스트 → index.html에서 grep → 없으면 FAIL
# MCP 텍스트 노드 수 vs texts.md 항목 수
MCP 텍스트 노드: N개
texts.md 항목: M개
N == M 이어야 PASS
```
**검증 미통과 시:** 다음 프레임 진행 금지. 누락 항목 수정 후 재검증.
--- ---
## STEP 9 — 결과물 저장 ## STEP 9 — 결과물 저장

View File

@@ -60,6 +60,38 @@ Figma bbox: 60×19 (가로가 김)
.rotated-bracket-close { transform: rotate(-90deg); } /* 닫는 괄호 */ .rotated-bracket-close { transform: rotate(-90deg); } /* 닫는 괄호 */
``` ```
**⚠️ 회전 bbox의 x,y 좌표를 그대로 left,top에 넣지 마라:**
MCP get_metadata가 보고하는 회전 텍스트의 `x, y`는 **회전 후 bbox의 top-left**이다. 회전 전 글자의 시각적 중심과 다르다. 같은 세로 축에 있는 요소들인데 MCP x 값이 제각각인 경우가 이것 때문이다.
```
예시: 세로 라벨 "기술 ( 디지털 )" — 모두 같은 세로 축
MCP 보고값:
"기 술" x=17.8 width=37 → center_x = 36.3
"(" x=72 width=60 → center_x = 102 ← bbox가 회전으로 이동
"디지털" x=17.8 width=37 → center_x = 36.3
"(" x=0 width=60 → center_x = 30 ← 반대쪽으로 이동
시각적 중심은 모두 x≈36.3인데, MCP bbox x는 0, 17.8, 72로 제각각.
```
**올바른 처리:**
1. 같은 세로 축에 있는 요소들을 먼저 식별 (같은 그룹, 같은 바 안 등)
2. 비회전 텍스트의 center_x를 기준축으로 확정: `center_x = left + width / 2`
3. 회전 요소의 컨테이너도 같은 center_x에 정렬: `container_left = center_x - container_width / 2`
4. **y값만 MCP에서 그대로 사용** (y는 회전 여부와 관계없이 정확)
```
기준: center_x = 17.8 + 37/2 = 36.3
괄호 컨테이너(60px): left = 36.3 - 30 = 6.3
→ 모든 요소가 x=36.3 중심으로 정렬
```
**절대 하지 말 것:**
- MCP의 회전 bbox x 값을 그대로 CSS left에 넣기 (72px, 0px 등)
- "MCP 데이터니까 맞겠지" 하고 검증 없이 사용
--- ---
## R3. 세로 텍스트 (좁은 박스) ## R3. 세로 텍스트 (좁은 박스)
@@ -74,6 +106,11 @@ Figma bbox: 60×19 (가로가 김)
``` ```
이유: `writing-mode: vertical-rl`은 Figma 원본과 다른 간격/정렬을 만듦. 이유: `writing-mode: vertical-rl`은 Figma 원본과 다른 간격/정렬을 만듦.
**동일 축 정렬 원칙:** 세로 텍스트 + 회전 괄호가 하나의 세로 라인을 이루면:
- 모든 요소의 **x 중심이 동일**해야 한다
- y만 변한다 (위에서 아래로 순서대로)
- R2의 "회전 bbox 좌표 함정" 규칙 적용 필수
--- ---
## R4. 그라데이션 텍스트 ## R4. 그라데이션 텍스트
@@ -464,3 +501,111 @@ left: 0; width: 151.25%
| 프레임 | 사용 | 비고 | | 프레임 | 사용 | 비고 |
|--------|------|------| |--------|------|------|
| 1171281194 (issues-paired-rows) | 두루마리 pill 8개 | 첫 적용. 상/하 배치 반전 패턴 발견. | | 1171281194 (issues-paired-rows) | 두루마리 pill 8개 | 첫 적용. 상/하 배치 반전 패턴 발견. |
---
## R17. 콘텐츠 주도형 레이아웃 (absolute 금지, flex/flow 필수)
**문제:** 블록 내 모든 요소를 absolute + 고정 top/left로 배치하면, 텍스트 분량이 바뀔 때 겹치거나 빈 공간이 생긴다. overflow:hidden으로 숨기는 건 해결이 아니라 더 큰 문제.
**원칙:**
- CLAUDE.md: "텍스트를 자르지 않는다. 디자인이 텍스트에 맞춘다."
- CLAUDE.md: "빈 공간 방치 안 함"
- blocks_index.md I-1: "모든 픽셀 위치 절대 배치 금지"
**구조 (2단계):**
```
.inner (zoom: S — 뷰포트 맞춤)
.title (flow)
.rows (display: flex; flex-direction: column)
section.row (flex column — pill → body → pill)
.pill-area (flex: none)
.body-area (flex: 1, display: flex)
.body-left (flex: 1, 자연 flow)
.divider (flex: none)
.body-right (flex: 1, 자연 flow)
.pill-area (flex: none)
section.row ...
```
**1단계:** row 내부만 flex/flow (row 위치는 absolute top 유지)
**2단계:** row 간 배치도 flex column (행이 커지면 아래 행이 밀림)
**절대 하지 말 것:**
- 본문 텍스트에 position: absolute + 고정 top
- 텍스트 겹침을 overflow: hidden으로 숨기기
- 텍스트 높이를 고정값으로 제한
**적용 사례:**
| 프레임 | 전환 | 결과 |
|--------|------|------|
| 1171281194 | absolute → flex 2단계 | 텍스트-pill 겹침 해결, 행 간 자연 flow |
---
## R18. Crop variant / Label position 분리 (pill 2축 구조)
**문제:** pill 이미지의 crop 방향(어떤 곡면을 보여줄지)과 라벨 위치(행에서 좌/우 어디에 있는지)를 같은 클래스로 묶으면, 하단 pill(flip 적용)에서 라벨 위치가 뒤집힌다.
**원인:** crop-left/right는 이미지 방향 축, pos-left/right는 행 내 위치 축. 이 둘은 독립.
**규칙:** 두 축을 분리한다.
```css
/* 축1: 이미지 crop (어떤 곡면 보일지) */
.crop-left { } /* 우측 곡선 보임 */
.crop-right { } /* 좌측 곡선 보임 */
/* 축2: 라벨 위치 (행에서 좌/우) */
.pos-left .label { left: ...; }
.pos-right .label { right: ...; text-align: right; }
```
**4가지 조합:**
| 상황 | crop | pos | 예 |
|------|------|-----|-----|
| 상단 좌 pill | crop-left | pos-left | 개념 부재 |
| 상단 우 pill | crop-right | pos-right | 잘못된 접근방식 |
| 하단 좌 pill (flip) | crop-right | pos-left | 방향성 상실 |
| 하단 우 pill (flip) | crop-left | pos-right | 전제조건 오류 |
**라벨 offset:**
- 현재: designer-tuned fallback (Figma 원본 값)
- 장기 목표: seam-based computed anchor (pill_seam_meta.md 참조)
- 라벨 offset은 crop visible area 기준으로 별도 조정 가능
**적용 사례:** 1171281194 (issues-paired-rows) — 하단 pill 라벨 위치 오류 수정
---
## R19. zoom vs transform:scale
**문제:** `transform: scale(S)`는 시각적 크기만 줄이고 레이아웃 상의 높이는 원본 그대로. flex/flow 기반 콘텐츠와 함께 쓰면 하단에 큰 여백이 생긴다.
**규칙:** 콘텐츠 주도형 레이아웃(R17)에서는 `zoom`을 사용한다.
```css
/* ✗ 문제: layout height가 원본 크기 */
.inner {
transform: scale(0.69);
transform-origin: top left;
}
/* ✓ 해결: layout height도 실제로 줄어듦 */
.inner {
zoom: 0.69;
}
```
**차이:**
| 속성 | 시각 크기 | 레이아웃 크기 | flow 호환 |
|------|----------|-------------|----------|
| transform: scale | 줄어듦 | 원본 그대로 | ✗ |
| zoom | 줄어듦 | 줄어듦 | ✓ |
**주의:** 기존 absolute 기반 블록(1:1 reference)에서는 transform:scale이 문제없음. R17 구조로 전환한 블록에서만 zoom 적용.
**브라우저 지원:** Chrome, Safari, Firefox 126+ (2024~) 모두 지원.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,63 @@
# Frame 1171281172 — S/W 개발 방향 순환도
## 내용 설명
S/W 개발 방향을 6개 노드(기술기반·디지털전환·품질향상·S/W 한계·
개발목표·융합)의 순환/방사형 다이어그램으로 표현하는 디자인.
기술기반 중요성, 디지털전환 직관지 역할, 품질향상과 호환성,
기존 S/W 한계 인식, 개발목표 설정, 융합 필요성을 6개 노드로
배치해 S/W 개발의 다면적 방향을 시각화. 6개 병렬 개념 순환도
·S/W 개발 방향 다면 시각화에 적합. 3/4/5개 이하 항목·주체별
나열·시간 순서·2개 비교·단일 개념 심층에는 부적합.
## 후보 키워드
S/W개발, 개발방향, 개발목표, 기술기반, 디지털전환, 품질향상, S/W한계, 융합, 호환성, 직관지
## 정제 Anchor Sets
- **sw_development**: S/W개발, 개발방향, 개발목표
- **six_core_concepts**: 기술기반, 디지털전환, 품질향상, S/W한계, 융합, 호환성
- **directional_concepts**: 직관지
## 구조 매칭 정보
- **family**: diagram
- **layout**: circular-nodes-6
- **axis**: horizontal
- **relation_type**: parallel
- **cardinality**: ideal 6 / min 6 / max 6
- **slots** (7개, required 7개): title, node_1, node_2, node_3, node_4, node_5, node_6
- **source title**: S/W 개발 방향 순환도
- **original layout**: circular-nodes
## 적합/부적합 기준
### suits
- S/W 개발 방향 순환도
- 6개 병렬 개념 시각화
- 다면적 방향성 다이어그램
### not_suits
- 3개 또는 4개 이하 항목
- 주체별 나열 (발주자/시공자/설계자)
- 시간 순서
- 2개 비교
- 단일 개념 심층
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281172 — S/W 개발 방향 순환도
## 구조
- **layout**: circular-nodes
- **detail**: 6개 노드 라벨(기술기반·디지털전환·품질향상·S/W한계·개발목표·융합)이 순환/방사형으로 배치된 다이어그램
## 내용
S/W 개발 방향 순환도 — 기술기반 중요성, 디지털전환 직관지 역할, 품질향상과 호환성, 기존 S/W 한계 인식, 개발목표 설정, 융합 필요성.
## 후보 키워드
S/W개발, 개발방향, 순환도, 기술기반, 디지털전환, 직관지, 품질향상, 호환성, S/W한계, 개발목표, 융합, 다이어그램
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1,27 @@
# Frame 1171281172 — 실측 기록 (flat)
> 원본: 1579 × 981 px (node 145:8352)
> 패턴: circular-nodes-6 (6개 원형 노드 다이어그램)
> Scale: 1280 / 1579 = 0.81064
## 구조
2D 공간에 6개 원형 노드 + 중앙 이미지 + 배경 + 연결 이미지.
absolute 배치 필수 (2D 시각 다이어그램).
## 노드 6개 (각각 원형 배경 + 내부 아이콘 + 라벨)
| 노드 | 라벨 | center 좌표 |
|------|------|------------|
| 145:8370 | 기술기반 중요성 | (180, 436) |
| 145:8374 | 디지털전환 직관지 역할 | (319, 837) |
| 145:8378 | 품질향상 & 호환성 | (896, 811) |
| 145:8382 | 기존 S/W 한계 인식 | (1394, 573) |
| 145:8386 | S/W 개발목표 설정 | (1293, 146) |
| 145:8390 | 융합의 필요성 | (707, 147) |
## 에셋 (9개, 모두 이미지)
image 4009: 노드 배경 원 (×6 동일)
image 4010: 노드 내부 아이콘 (×6 동일)
기타: 배경, 중앙 이미지, 연결선 등

View File

@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280">
<title>S/W 개발 방향 다이어그램 (Frame 1171281172)</title>
<!--
Frame: 145:8352, 1579×981 px
Scale: 1280 / 1579 = 0.81064
패턴: circular-nodes-6
구조: 2D 다이어그램 → absolute + R19 zoom
텍스트 라벨: design_context center 좌표 + translate(-50%,-50%)
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@700&display=swap" rel="stylesheet">
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh;
}
.slide {
width: 1280px;
background: #fff; position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
}
.block { width: 1280px; position: relative; overflow: hidden; }
.inner {
width: 1579px; height: 981px;
zoom: 0.81064; /* R19 */
position: relative;
}
.abs { position: absolute; }
.abs img { width: 100%; height: 100%; object-fit: cover; display: block; }
.node-label {
position: absolute;
transform: translate(-50%, -50%);
font-weight: 700; font-size: 45px; line-height: 60px;
color: #fff; text-align: center;
text-shadow: 0 0 4px rgba(0,0,0,0.5);
word-break: keep-all;
}
/* 회전 래퍼 */
.rot-wrap {
position: absolute; display: flex; align-items: center; justify-content: center;
}
.rot-wrap img { display: block; }
</style>
</head>
<body>
<div class="slide">
<div class="block">
<div class="inner">
<!-- 배경 -->
<div class="rot-wrap" style="left:0; top:37.26px; width:1579.22px; height:910.34px;">
<div style="flex:none; transform:rotate(-8.84deg);"><img src="assets/0b6599f832b0f69b2038ead1ba6d95cdcc42c4cf.png" style="width:1490.97px; height:689.31px;"></div>
</div>
<div class="rot-wrap" style="left:158.1px; top:144px; width:1237.22px; height:713.19px;">
<div style="flex:none; transform:rotate(-8.84deg);"><img src="assets/93b81ffe48e6fca68e58cef7a84def27cf91469e.png" style="width:1168.08px; height:540.03px; opacity:0.5;"></div>
</div>
<!-- 중앙 이미지 -->
<div class="abs" style="left:490px; top:262px; width:622px; height:437px;"><img src="assets/a902e39ab83c931afd5c93afcab26780b7d330b9.png"></div>
<div class="abs" style="left:557px; top:323px; width:488px; height:287px;"><img src="assets/75bcffb34242270e352ef1b44dea1a9b6f3f4b7c.png"></div>
<!-- 장식 원 (동일 이미지 ×6) -->
<div class="abs" style="left:40.32px; top:294.18px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<div class="abs" style="left:179.73px; top:698.58px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<div class="abs" style="left:568px; top:5px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<div class="abs" style="left:1150.97px; top:5px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<div class="abs" style="left:1253.51px; top:432.44px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<div class="abs" style="left:756.95px; top:670.93px; width:278.81px; height:278.81px;"><img src="assets/c6aa15ac498406ca8f65ac71b1585a13002cd194.png"></div>
<!-- 연결선 이미지들 -->
<div class="abs" style="left:331.81px; top:236.58px; width:261.53px; height:142.86px;"><img src="assets/a33ed237bbe2afff43a5bc9100be50c2331b6005.png"></div>
<div class="rot-wrap" style="left:867.24px; top:46.26px; width:297.47px; height:240.63px;">
<div style="flex:none; transform:rotate(25.2deg);"><img src="assets/a33ed237bbe2afff43a5bc9100be50c2331b6005.png" style="width:261.53px; height:142.86px;"></div>
</div>
<div class="rot-wrap" style="left:993.13px; top:587.98px; width:273.91px; height:167.03px;">
<div style="flex:none; transform:rotate(-174.56deg);"><img src="assets/a33ed237bbe2afff43a5bc9100be50c2331b6005.png" style="width:261.53px; height:142.86px;"></div>
</div>
<div class="rot-wrap" style="left:462px; top:698.58px; width:294.72px; height:224.14px;">
<div style="flex:none; transform:rotate(-159.87deg);"><img src="assets/a33ed237bbe2afff43a5bc9100be50c2331b6005.png" style="width:261.53px; height:142.86px;"></div>
</div>
<div class="rot-wrap" style="left:85.26px; top:587.98px; width:112.78px; height:196.81px;">
<div style="flex:none; transform:rotate(-10.33deg);"><img src="assets/c21d9171275fc89f4db34d42d455fa41a006b348.png" style="width:80.85px; height:185.32px;"></div>
</div>
<div class="rot-wrap" style="left:1403.29px; top:246.32px; width:81.83px; height:185.74px;">
<div style="flex:none; transform:rotate(-179.69deg);"><img src="assets/c21d9171275fc89f4db34d42d455fa41a006b348.png" style="width:80.85px; height:185.32px;"></div>
</div>
<!-- 노드 배경 + 아이콘 + 라벨 ×6 -->
<!-- 1: 기술기반 중요성 -->
<div class="abs" style="left:35px; top:290px; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:75px; top:332px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:180.03px; top:436.21px;">기술기반<br>중요성</div>
<!-- 2: 디지털전환 직관지 역할 -->
<div class="abs" style="left:174px; top:691px; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:214px; top:733px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:319.03px; top:837.21px;">디지털전환<br>직관지 역할</div>
<!-- 3: 품질향상 & 호환성 -->
<div class="abs" style="left:751px; top:665px; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:791px; top:707px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:896.03px; top:811.21px; line-height:45px;">품질향상<br>&amp;<br>호환성</div>
<!-- 4: 기존 S/W 한계 인식 -->
<div class="abs" style="left:1249px; top:427px; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:1289px; top:469px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:1394.03px; top:573.21px;">기존 S/W<br>한계 인식</div>
<!-- 5: S/W 개발목표 설정 -->
<div class="abs" style="left:1148px; top:0; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:1188px; top:42px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:1293.03px; top:146.21px;">S/W<br>개발목표<br>설정</div>
<!-- 6: 융합의 필요성 -->
<div class="abs" style="left:562px; top:1px; width:290px; height:290px;"><img src="assets/311e27c78b94633cbcdbdebf4f4382b3944947c0.png"></div>
<div class="abs" style="left:602px; top:43px; width:208px; height:208px;"><img src="assets/63887534bb17277ead4cfd833ab7ce939d9324d0.png"></div>
<div class="node-label" style="left:707.03px; top:147.21px;">융합의<br>필요성</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,10 @@
# Frame 1171281172 — 텍스트 (TF-IDF 매칭용)
## 노드 라벨
개발 패러다임
기술기반 중요성
디지털전환 직관지 역할
품질향상 & 호환성
기존 S/W 한계 인식
S/W 개발목표 설정
융합의 필요성

View File

@@ -0,0 +1,63 @@
# Frame 1171281173 — Engineering S/W 개발 (Domain knowledge 기반)
## 내용 설명
Engineering S/W 개발을 위한 기술기반을 4가지 관점(Open Source 혁명·
AI 발전·추론 기반 AI·코딩 기반 S/W)의 원형 라벨로 제시하는 디자인.
중앙 강조 메시지 + 하단 설명으로 Domain knowledge(토목공학 지식)가
기술에 반영되어야 함을 역설. 4가지 기술 트렌드 관점·Engineering S/W
개발 기술기반·Open Source/AI 중심 기술 생태계 설명에 적합. 3개
이하·5개 이상 항목·주체별 나열·시간 순서·필수요건 나열(기술/사람/
자연)·2개 비교에는 부적합.
## 후보 키워드
OpenSource, AI, 추론기반AI, 코딩기반SW, DomainKnowledge, 토목공학, 지식기반, 기술기반, Engineering, EngineeringSW, S/W개발
## 정제 Anchor Sets
- **tech_foundations**: OpenSource, AI, 추론기반AI, 코딩기반SW
- **domain_knowledge**: DomainKnowledge, 토목공학, 지식기반, 기술기반
- **engn_sw_dev**: Engineering, EngineeringSW, S/W개발
## 구조 매칭 정보
- **family**: cards
- **layout**: bullet-cards-4-plus-center
- **axis**: horizontal
- **relation_type**: parallel
- **cardinality**: ideal 4 / min 4 / max 4
- **slots** (7개, required 6개): title, pillar_1_label, pillar_2_label, pillar_3_label, pillar_4_label, center_message, description
- **source title**: Engineering S/W 개발 (Domain knowledge 기반)
- **original layout**: bullet-cards
## 적합/부적합 기준
### suits
- 4가지 기술 트렌드 관점
- Engineering S/W 개발 기술기반
- Open Source/AI 중심 기술 생태계
### not_suits
- 3개 이하 항목
- 5개 이상 항목
- 주체별 나열 (발주자/시공자/설계자)
- 시간 순서
- 필수요건 나열 (기술/사람/자연)
- 2개 비교
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281173 — Engineering S/W 개발 (Domain knowledge 기반)
## 구조
- **layout**: bullet-cards
- **detail**: 상단 4개 원형 라벨(Open Source 혁명, AI 발전, 추론 기반 AI, 코딩 기반 S/W) + 중앙 강조 + 하단 설명
## 내용
Domain knowledge(토목공학 지식)이 반영될 수 있는 기술기반 — Engineering S/W 개발을 위한 Open Source·AI·추론·코딩 관점 정리.
## 후보 키워드
Engineering, EngineeringSW, Domain knowledge, 토목공학, 지식기반, OpenSource, AI, 추론기반AI, 코딩기반SW, 기술기반, S/W개발
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,47 @@
# Frame 1171281173 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출. nodeId: 182:2870
## 타이틀
Domain knowledge(토목공학 지식)이 반영될 수 있는 기술기반
## 서브타이틀
Engineering S/W 개발
## 원형 라벨 (상단 좌측 2개)
Open Source 혁명
AI 비약적 발전
## 원형 라벨 텍스트 (상단 오버레이)
AI
## 원형 라벨 (상단 우측 2개)
추론 기반 AI
코딩 기반 S/W
## 중앙 좌측 강조
시대적 변화
## 중앙 우측 강조
자료 중요성
## 하단 라벨 (좌측)
H/W 성능개선, S/W 고급화
## 하단 라벨 (우측)
S/W 개발 시 많은 시간 필요
## 하단 결론 바
정확한 지식기반 설계 메뉴얼

View File

@@ -0,0 +1,42 @@
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import os, time
here = os.path.dirname(os.path.abspath(__file__))
renders = os.path.join(here, '_renders')
os.makedirs(renders, exist_ok=True)
opts = Options()
opts.add_argument('--headless=new')
opts.add_argument('--hide-scrollbars')
opts.add_argument('--force-device-scale-factor=1')
opts.add_argument('--window-size=1600,900')
d = webdriver.Chrome(options=opts)
p = os.path.join(here, 'index.html').replace(os.sep, '/')
d.get('file:///' + p)
time.sleep(2.0)
full_png = os.path.join(renders, '_full.png')
d.save_screenshot(full_png)
r = d.execute_script(
'const r=document.querySelector(".slide").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('slide bounds:', r)
Image.open(full_png).crop(
(int(r[0]), int(r[1]), int(r[0]+r[2]), int(r[1]+r[3]))
).save(os.path.join(renders, 'slide.png'))
b = d.execute_script(
'const r=document.querySelector(".block").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('block bounds:', b)
Image.open(full_png).crop(
(int(b[0]), int(b[1]), int(b[0]+b[2]), int(b[1]+b[3]))
).save(os.path.join(renders, 'block.png'))
d.quit()
print('OK')

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

View File

@@ -0,0 +1,62 @@
# Frame 1171281174 — 국외 BIM 수행 현황
## 내용 설명
국외 BIM 및 설계 업무 수행의 4가지 주요 특징을 번호별 리스트로
제시하는 디자인. 항목: Claim 최소화 오류예방, 설계 업무 Data 정리
필수, 기술업무 Manual 작성, 데이터 통합 및 관리. 국외 선진 사례
특성 나열·자체 기술력 기반 수행 특징 정리·번호별 항목 4개 병렬
제시에 적합. 3개 이하·5개 이상 항목·주체별 나열·2개 비교·시간
순서 단계(step1→step2)·필수요건 나열에는 부적합.
## 후보 키워드
국외, BIM수행, Claim최소화, 오류예방, 설계Data, Manual, 기술업무, 데이터통합, 관리
## 정제 Anchor Sets
- **overseas_bim**: 국외, BIM수행
- **bim_practices**: Claim최소화, 오류예방, 설계Data, Manual, 기술업무, 데이터통합
- **management**: 관리, 기술업무
## 구조 매칭 정보
- **family**: list
- **layout**: list-numbered-4
- **axis**: vertical
- **relation_type**: parallel
- **cardinality**: ideal 4 / min 4 / max 4
- **slots** (5개, required 5개): title, item_1, item_2, item_3, item_4
- **source title**: 국외 BIM 수행 현황
- **original layout**: list-numbered
## 적합/부적합 기준
### suits
- 국외 선진 사례 특성 4항목
- 자체 기술력 기반 수행 특징
- 번호별 4 병렬 리스트
### not_suits
- 3개 이하 항목
- 5개 이상 항목
- 주체별 나열 (발주자/시공자/설계자)
- 2개 비교
- 시간 순서 단계
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281174 — 국외 BIM 수행 현황
## 구조
- **layout**: list-numbered
- **detail**: 타이틀("국외") + 번호별 4개 항목 리스트(01~04)
## 내용
국외 BIM/설계 업무 수행 특징 — Claim 최소화, 설계 업무 Data 정리 필수, 기술업무 Manual 작성, 데이터 통합 및 관리.
## 후보 키워드
국외, BIM수행, Claim최소화, 오류예방, 설계Data, Manual, 기술업무, 데이터통합, 관리, 자체기술력
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,80 @@
# Frame 1171281174 — 실측 기록 (flat)
> 원본: 1728 × 657 px (node 182:2810, file 9S6LsQyO6zlRxtiqZccOUM, page 29:373)
> 패턴: scene-with-numbered-list-4 (좌:장면 이미지+글로브, 우:번호 4개 + brown pill 텍스트 버블)
> Scale: 1280 / 1728 = **0.74074** → 슬라이드 안 1280 × 486.7 px 차지
## 구조 (bottom-up)
```
Frame 182:2810 "Frame 1171281174" (1728 × 657)
├─ rounded-rect 182:2811 "image 3939" (0, 0) 447×133 ← header_pill.png (브라운 pill 배경)
├─ TEXT 182:2812 "국외" center=(223.5, 68), top-left=(46, 23) 355×90 — 60px Bold 흰색, tracking -1.8, line-height 90
├─ rounded-rect 182:2813 "image 3940" (0, 19) 75×88 ← pin_icon.png (pin/marker 아이콘)
├─ rounded-rect 182:2825 "image 3949" (53, 139) 815×465 ← scene.png (건설 현장 합성 이미지, opacity 0.7, radius 27)
├─ rounded-rect 182:2826 "image 3951" (718, 159) 127×126 ← globe.png (구 모양 아이콘, border 3 white, radius 132.5, opacity 0.8)
├─ rounded-rect 182:2828 "image 3957" (825, 86) 115×571 ← arrow_chain.png (수직 화살표 체인, 4개 노드를 연결)
├─ rounded-rect 182:2814 "image 3953" (954, 136) 760×97 ← text_bubble.png (브라운 둥근 막대)
├─ rounded-rect 182:2815 "image 3954" (954, 266) 760×97 ← text_bubble.png (재사용)
├─ rounded-rect 182:2816 "image 3955" (954, 407) 760×97 ← text_bubble.png (재사용)
├─ rounded-rect 182:2817 "image 3956" (954, 543) 760×97 ← text_bubble.png (재사용)
├─ TEXT 182:2818 "오류에 의한 Claim 최소화" (1033, 149) 695×60 — 45px Medium #11231D, leading 60, text-shadow
├─ TEXT 182:2819 "설계 업무 시 사업 Data 정리 필수" (1033, 285) 695×60
├─ TEXT 182:2820 "자체적인 기술업무 Manual 작성" (1033, 421) 695×60
├─ TEXT 182:2821 "데이터 통합 및 관리" (1033, 562) 695×60
├─ rounded-rect 182:2822 "01 2" (906, 117) 89×93 ← badge_01.png (번호 1 + 우측 화살표)
├─ rounded-rect 182:2823 "02 2" (906, 238) 89×93 ← badge_02.png
├─ rounded-rect 182:2824 "03 2" (906, 376) 89×93 ← badge_03.png
└─ rounded-rect 182:2827 "04 1" (906, 509) 89×93 ← badge_04.png (이름 suffix만 다름)
```
## 에셋 (10개)
| 파일 | 의미 | 크기 | 사용 횟수 |
|------|------|------|---------|
| `assets/header_pill.png` | 좌상단 브라운 pill 헤더 배경 | 447×133 | 1 |
| `assets/pin_icon.png` | pin/marker 아이콘 (헤더 위 겹침) | 75×88 | 1 |
| `assets/scene.png` | 건설 현장 합성 메인 이미지 (4.5MB) | 815×465 | 1 (opacity 0.7) |
| `assets/globe.png` | 구 모양 원형 아이콘 (장면 위) | 127×126 | 1 (opacity 0.8, white border) |
| `assets/arrow_chain.png` | 수직 화살표 체인 (장면→번호 연결) | 115×571 | 1 |
| `assets/text_bubble.png` | 브라운 둥근 막대 배경 | 760×97 | **4** (재사용) |
| `assets/badge_01.png` | 번호 1 (chevron 우측 화살표 포함) | 89×93 | 1 |
| `assets/badge_02.png` | 번호 2 | 89×93 | 1 |
| `assets/badge_03.png` | 번호 3 | 89×93 | 1 |
| `assets/badge_04.png` | 번호 4 (Figma 이름 suffix `_1` 다름, 비주얼 동일) | 89×93 | 1 |
## 이상 탐지 결과
| 검사 | 결과 |
|------|------|
| 회전 단일문자 | 없음 |
| 좁은 박스 세로 텍스트 | 없음 |
| 중복 노드 (동일 좌표 + 동일 내용) | 없음. text_bubble은 동일 src 4× 재사용 — 정상 |
| Vector 좌표 metadata vs design_context 불일치 | 일치 |
| 회전 적용 (bbox vs render 차이) | 없음 (모두 정사각형 또는 가로 배치) |
| z-order 비정상 | scene(이미지 3949)가 badges 01-03 다음 순서로 그려짐 → 시각 영향 없음 (위치 비겹침) |
## 변형 가능 축
- **list_items[N=4] (required)** — 번호 4개 항목, cardinality=4 고정 (analysis.md)
- `text` (required, 한 줄, 45px 분량)
- `header_pill` (required) — 좌상단 카테고리 헤더 ("국외" 외 다른 텍스트 가능)
- `header_pin` (optional) — pin 아이콘
- `scene_image` (optional) — 메인 합성 이미지. 없으면 박스 자리만 차지하거나 단색 fill
- `globe_overlay` (optional) — 원형 오버레이 아이콘
- `arrow_chain` (required) — 장면과 리스트 연결하는 수직 체인
- `numbered_badges[N=list_items.length]` (required) — 번호별 PNG 배지
## Sub-patterns
- `scene-photo-with-circle-overlay` — 큰 합성 이미지 + 원형 아이콘 오버레이 (R16 비슷한 프레임 배치 패턴)
- `numbered-pill-list` — 번호 배지 + 옆 pill 텍스트 막대 N개 (1171281180 stacked-arrow-list와 다름: 여기는 평행 배열, 1171281180은 계단)
## 임시 보정 (1:1, 템플릿화 시 재고려)
- 번호 배지를 PNG로 유지 (CSS 변환 시 1171281174의 chevron 모양 + 번호 폰트 동시 재현 필요 → 향후 svg/ 폴더로 정리)
- text_bubble을 PNG로 유지 (CSS gradient/border-radius로 변환 가능 → 프로모션 시 CSS화 후보)

View File

@@ -0,0 +1,205 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280">
<title>국외 BIM 수행 현황 (Frame 1171281174)</title>
<!--
Frame: 182:2810, 1728 × 657 px (Frame 1171281174)
Source: file 9S6LsQyO6zlRxtiqZccOUM, page 29:373
Scale: 1280 / 1728 = 0.74074 (zoom on .inner per R19)
패턴: scene-with-numbered-list-4
구조: 좌(헤더 pill + scene + 글로브) / 우(수직 화살표 체인 + 번호 배지 4개 + 텍스트 버블)
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700;900&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh;
word-break: keep-all;
}
.slide {
width: 1280px; height: 720px;
background: #fff;
position: relative; overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
display: flex; align-items: center; justify-content: center;
}
.block {
width: 1280px;
position: relative;
overflow: hidden;
}
.inner {
width: 1728px; height: 657px;
position: relative;
zoom: 0.74074;
}
/* ① 메인 장면 이미지 (배경) */
.scene {
position: absolute;
left: 53px; top: 139px;
width: 815px; height: 465px;
border-radius: 27px;
overflow: hidden;
}
.scene img {
width: 100%; height: 100%;
object-fit: cover;
opacity: 0.7;
display: block;
}
/* ② 글로브 오버레이 (원형, 흰 테두리) */
.globe {
position: absolute;
left: 718px; top: 159px;
width: 127px; height: 126px;
border: 3px solid white;
border-radius: 132.5px;
overflow: hidden;
}
.globe img {
width: 100%; height: 100%;
object-fit: cover;
opacity: 0.8;
display: block;
}
/* ③ 좌상단 헤더 pill */
.header-pill {
position: absolute;
left: 0; top: 0;
width: 447px; height: 133.005px;
}
.header-pill img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* ④ pin 아이콘 (헤더 위에 겹침) */
.pin {
position: absolute;
left: 0; top: 19px;
width: 75px; height: 87.662px;
}
.pin img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* ⑤ "국외" 타이틀 텍스트 */
.title-text {
position: absolute;
left: 46px; top: 23px;
width: 355px; height: 90px;
font-family: 'Noto Sans KR', sans-serif;
font-weight: 700;
font-size: 60px;
color: white;
text-align: center;
letter-spacing: -1.8px;
line-height: 90px;
text-shadow: 0 0 4px rgba(0,0,0,0.5);
}
/* ⑥ 수직 화살표 체인 (장면 → 리스트) */
.arrow-chain {
position: absolute;
left: 825px; top: 86px;
width: 115px; height: 571px;
}
.arrow-chain img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* ⑦ 텍스트 버블 4개 (브라운 pill 배경) */
.bubble {
position: absolute;
left: 954px;
width: 760px; height: 97px;
}
.bubble img { width: 100%; height: 100%; object-fit: cover; display: block; }
.bubble--1 { top: 136px; }
.bubble--2 { top: 266px; }
.bubble--3 { top: 407px; }
.bubble--4 { top: 543px; }
/* ⑧ 텍스트 라벨 4개 */
.label {
position: absolute;
left: 1033px;
width: 695px; height: 60px;
font-family: 'Noto Sans KR', sans-serif;
font-weight: 500;
font-size: 45px;
color: #11231D;
text-shadow: 0 0 4px rgba(0,0,0,0.5);
display: flex;
align-items: center;
}
.label > p { margin: 0; line-height: 60px; }
.label--1 { top: 149px; } /* center_y=179, h=60 → top=149 */
.label--2 { top: 285px; }
.label--3 { top: 421px; }
.label--4 { top: 562px; }
/* ⑨ 번호 배지 4개 */
.badge {
position: absolute;
left: 906px;
width: 89px; height: 93px;
}
.badge img { width: 100%; height: 100%; object-fit: cover; display: block; }
.badge--1 { top: 117px; }
.badge--2 { top: 238px; }
.badge--3 { top: 376px; }
.badge--4 { top: 509px; }
</style>
</head>
<body>
<div class="slide">
<div class="block">
<div class="inner">
<!-- ① 장면 이미지 (배경, opacity 0.7) -->
<div class="scene"><img src="assets/scene.png" alt=""></div>
<!-- ② 글로브 오버레이 -->
<div class="globe"><img src="assets/globe.png" alt=""></div>
<!-- ③ 좌상단 헤더 pill -->
<div class="header-pill"><img src="assets/header_pill.png" alt=""></div>
<!-- ④ pin 아이콘 -->
<div class="pin"><img src="assets/pin_icon.png" alt=""></div>
<!-- ⑤ "국외" 타이틀 -->
<div class="title-text">국외</div>
<!-- ⑥ 수직 화살표 체인 -->
<div class="arrow-chain"><img src="assets/arrow_chain.png" alt=""></div>
<!-- ⑦ 텍스트 버블 4개 -->
<div class="bubble bubble--1"><img src="assets/text_bubble.png" alt=""></div>
<div class="bubble bubble--2"><img src="assets/text_bubble.png" alt=""></div>
<div class="bubble bubble--3"><img src="assets/text_bubble.png" alt=""></div>
<div class="bubble bubble--4"><img src="assets/text_bubble.png" alt=""></div>
<!-- ⑧ 텍스트 라벨 4개 -->
<div class="label label--1"><p>오류에 의한 Claim 최소화</p></div>
<div class="label label--2"><p>설계 업무 시 사업 Data 정리 필수</p></div>
<div class="label label--3"><p>자체적인 기술업무 Manual 작성</p></div>
<div class="label label--4"><p>데이터 통합 및 관리</p></div>
<!-- ⑨ 번호 배지 4개 -->
<div class="badge badge--1"><img src="assets/badge_01.png" alt="1"></div>
<div class="badge badge--2"><img src="assets/badge_02.png" alt="2"></div>
<div class="badge badge--3"><img src="assets/badge_03.png" alt="3"></div>
<div class="badge badge--4"><img src="assets/badge_04.png" alt="4"></div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,25 @@
# Frame 1171281174 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출. nodeId: 182:2810
## 타이틀
국외
## 본문 (번호별 항목)
### 01
오류에 의한 Claim 최소화
### 02
설계 업무 시 사업 Data 정리 필수
### 03
자체적인 기술업무 Manual 작성
### 04
데이터 통합 및 관리

View File

@@ -0,0 +1,62 @@
# Frame 1171281175 — 국내 BIM 수행 관계도
## 내용 설명
국내 BIM 수행 주체 간 관계를 중앙 4각 관계도로 표현하는 다이어그램.
건설관리사·설계사·시공사·정부기관(발주처) 4주체 사이의 지침·규정·
기술 형식 관계를 라벨과 연결선으로 배치. 4개 주체·기관·이해당사자
간 관계 구조 설명·국내 BIM 생태계 관계 구도 제시에 적합.
3개 이하 주체·5개 이상 항목·주체별 효과 나열(table 형태)·시간 순서
·단일 주체 심층·필수요건 나열에는 부적합.
## 후보 키워드
건설관리사, 설계사, 시공사, 정부기관, 발주처, 지침, 규정, 기술형식, BIM수행, 국내
## 정제 Anchor Sets
- **bim_actors**: 건설관리사, 설계사, 시공사, 정부기관, 발주처
- **regulation_relations**: 지침, 규정, 기술형식, BIM수행
- **domestic_relations**: 국내
## 구조 매칭 정보
- **family**: diagram
- **layout**: quadrilateral-relations
- **axis**: horizontal
- **relation_type**: hierarchy
- **cardinality**: ideal 4 / min 4 / max 4
- **slots** (6개, required 5개): title, actor_1, actor_2, actor_3, actor_4, relations
- **source title**: 국내 BIM 수행 관계도
- **original layout**: diagram-labels
## 적합/부적합 기준
### suits
- 4주체 간 관계 구조
- 국내 BIM 생태계 관계 구도
- 이해당사자 관계도
### not_suits
- 3개 이하 주체
- 5개 이상 항목
- 주체별 기대효과 나열 (table)
- 시간 순서
- 단일 주체 심층
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281175 — 국내 BIM 수행 관계도
## 구조
- **layout**: diagram-labels
- **detail**: 타이틀("국내") + 중앙 4각 관계도 (건설관리사·설계사·시공사·정부기관 관계)
## 내용
국내 BIM 수행 주체 간 관계 다이어그램 — 건설관리사·설계사·시공사·정부기관(발주처)의 지침·규정·기술 형식 관계.
## 후보 키워드
국내, BIM수행, 건설관리사, 설계사, 시공사, 정부기관, 발주처, 지침, 규정, 기술형식, 4각관계도, 주체별관계
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,52 @@
# Frame 1171281175 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출. nodeId: 182:2829
## 타이틀
국내
## 다이어그램 라벨 (중앙 4각 관계도)
건설관리사
설계사
시공사
정부기관&발주처
## 다이어그램 강조 라벨 (빨간색)
지침
형식적
규정
설계기술
발전X
## 본문 (번호별 항목)
### 01
엔지니어링사 -> 정부에 지침 요구
- 정부주도 성과품 -> 기술수준 저하
- 보안/지식재산권 없이 성과품 공유
### 02
형식적 규정 수행 및 기술발전 저해
- 과거 수행 방식 답습
- 형식적인 규정 및 절차 증가
### 03
부족한 인력, 짧은 설계기간, 빠른 경제발전
- 차관사업(IBRD, ADB) -> 빠른 발전
- 기본적인 Data 정리 / Manual 작성 부재

View File

@@ -0,0 +1,63 @@
# Frame 1171281176 — 보상현황·민원 관리 (시각화 활용)
## 내용 설명
보상현황·민원 관리에서 시각화 도구를 어떻게 활용하는지를 좌측
사이드 다크 배경 타이틀 + 우측 불릿 리스트 본문 구조로 제시하는
디자인. 종합평면도/용지도 기반 토지·물건 현황 시각화, 보상서류/
사진/영상 필지별 정보 시각화, 위치기반 시각화로 민원 상세 분석
내용 나열. Frame 06(full-page-map)과 동일 주제지만 list 형식으로
세부 시각화 도구 나열. 시각화 도구·방법 나열형 설명·보상현황
민원관리 실무 도구 정리에 적합. 표/카드/다이어그램 나열·주체별
나열·비교 구조·단일 주제 심층에는 부적합.
## 후보 키워드
보상현황, 민원관리, 시각화, 종합평면도, 용지도, 토지현황, 물건현황, 필지별, 보상서류
## 정제 Anchor Sets
- **compensation_visualization**: 보상현황, 민원관리, 시각화
- **land_property_data**: 종합평면도, 용지도, 토지현황, 물건현황, 필지별, 보상서류
## 구조 매칭 정보
- **family**: cards
- **layout**: side-card-with-list
- **axis**: horizontal
- **relation_type**: parallel
- **cardinality**: ideal 3 / min 3 / max 5
- **slots** (4개, required 4개): title, item_1, item_2, item_3
- **source title**: 보상현황·민원 관리 (시각화 활용)
- **original layout**: side-card
## 적합/부적합 기준
### suits
- 시각화 도구·방법 나열
- 보상현황 민원관리 실무 도구 정리
- 토지/물건 현황 시각화 리스트
### not_suits
- 표/카드 형식 항목 나열
- 주체별 나열 (발주자/시공자/설계자)
- 비교 구조 (대조)
- 단일 주제 심층
- 2개 비교
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: True
- **merge**: True
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281176 — 보상현황·민원 관리 (시각화 활용)
## 구조
- **layout**: side-card
- **detail**: 좌측 사이드 다크 배경 타이틀("보상현황·민원 관리") + 우측 불릿 리스트 본문
## 내용
보상현황·민원 관리 시각화 활용 — 종합평면도·용지도 기반 토지/물건 현황 시각화, 보상서류/사진/영상 필지별 정보 시각화, 위치기반 시각화로 민원 상세 분석.
## 후보 키워드
보상현황, 민원관리, 시각화, 종합평면도, 용지도, 토지현황, 물건현황, 보상서류, 필지별, 위치기반시각화, 민원분석
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,13 @@
# Frame 1171281176 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출. nodeId: 182:3046
## 사이드 타이틀 (좌측 다크 배경)
보상현황·민원 관리
## 본문 (불릿 리스트)
- 종합평면도, 용지도를 사용한 토지 및 물건 현황 시각화
- 보상서류, 사진 및 영상 등 필지별 보상 현황 정보 시각화
- 위치기반 시각화를 활용하여 민원에 대한 상세 분석 가능

View File

@@ -0,0 +1,61 @@
# Frame 1171281177 — 보상현황·민원 관리
## 내용 설명
보상현황과 민원 관리를 위한 위치 기반 시공 리스크 맵을 풀페이지로
제시하는 디자인. 상단 배너 타이틀 + 풀페이지 맵 시각화로 시공
리스크 사업 영역을 지리 정보 위에 표시. 위치 기반 리스크 시각화·
보상현황/민원관리 맵·사업 맵 기반 정보 제공에 적합.
표/카드/다이어그램 형식의 항목 나열·주체별 나열·시간 순서·
단일 개념 정의·다면 비교에는 부적합.
## 후보 키워드
보상현황, 민원관리, 보상, 민원, 시공리스크, 위치기반
## 정제 Anchor Sets
- **compensation_complaint**: 보상현황, 민원관리, 보상, 민원
- **site_risk_map**: 시공리스크, 위치기반
## 구조 매칭 정보
- **family**: map
- **layout**: full-page-map-banner
- **axis**: horizontal
- **relation_type**: definition
- **cardinality**: ideal 1 / min 1 / max 1
- **slots** (2개, required 2개): banner_title, map_area
- **source title**: 보상현황·민원 관리
- **original layout**: full-page-map
## 적합/부적합 기준
### suits
- 위치 기반 리스크 시각화
- 보상현황/민원관리 맵
- 사업 맵 기반 정보
### not_suits
- 표 형식 항목 나열
- 카드 형식 나열
- 주체별 나열 (발주자/시공자/설계자)
- 시간 순서
- 2개 이상 비교
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: False
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281177 — 보상현황·민원 관리 (맵 기반)
## 구조
- **layout**: full-page-map
- **detail**: 상단 배너 타이틀("보상현황·민원 관리") + 풀페이지 맵 시각화 (시공 리스크 사업 맵)
## 내용
보상현황·민원 관리 맵 기반 — 시공 리스크와 사업 맵을 풀페이지로 시각화.
## 후보 키워드
보상현황, 민원관리, 맵, 시공리스크, 사업맵, 풀페이지시각화, 상단배너, 위치기반
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,29 @@
# Frame 1171281177 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출. nodeId: 182:3053
## 타이틀 (상단 배너)
보상현황·민원 관리
## 서브타이틀
시공단계 토지 및 지장물에 대한 보상 현황과 다양한 민원 관리 업무 지원
## 본문 (불릿 항목)
- 종합 평면도와 용지도를 사용하여 토지 및 물건 현황, 필지별 보상현황 정보 시각화
- 시공현장에서 발생하는 보상 민원, 요구 민원, 불편 민원 등 유형별 발생 현황 및 처리결과 표출
## 하단 결론 바
사업 리스크의 조기 파악 및 선제 대응 가능
## 민원 태그 (지도 위 라벨)
이동 데크 추가 요청
토지보상 재결 승복 이후 재민원
배수 문제 발생

View File

@@ -0,0 +1,66 @@
# Frame 1171281178 — System 구성 (H/W + S/W BIGRoom)
## 내용 설명
BIGRoom 시스템의 구성 요소를 좌측 H/W (Server·Network·회의시스템·
CCTV·Drone·Sensor) + 우측 S/W (C.C.P·WatchBIM·Domainer)의 2열
페어드 리스트로 제시하는 디자인. IT 인프라와 소프트웨어를 나란히
배치해 하나의 통합 시스템 구성 요소를 보여줌. 이 디자인은 개념
비교(예: BIM vs DX)나 과정/결과 대조(Frame 29)가 아니라, 하나의
시스템을 H/W·S/W 두 축으로 분해하는 구성 관점. BIGRoom H/W+S/W
시스템 구성·IT 인프라 + S/W 분해 설명에 적합. BIM vs DX 다면
비교·과정/결과 2분할·주체별 나열·3개 이상 비교·시간 순서·단일
구성요소 심층에는 부적합.
## 후보 키워드
BIGRoom, System, H/W, Server, Network, 회의시스템, CCTV, Drone, Sensor, 센서, IoT, S/W, CCP, WatchBIM, Domainer
## 정제 Anchor Sets
- **bigroom_system**: BIGRoom, System
- **hw_components**: H/W, Server, Network, 회의시스템, CCTV, Drone, Sensor, 센서, IoT
- **sw_components**: S/W, CCP, WatchBIM, Domainer
## 구조 매칭 정보
- **family**: compare
- **layout**: 2col-paired-list
- **axis**: horizontal
- **relation_type**: compare
- **cardinality**: ideal 2 / min 2 / max 2
- **slots** (5개, required 5개): title, col_a_label, col_a_items, col_b_label, col_b_items
- **source title**: System 구성 (H/W + S/W BIGRoom)
- **original layout**: 2col-paired
## 적합/부적합 기준
### suits
- BIGRoom H/W+S/W 시스템 구성
- IT 인프라 + S/W 분해 설명
- 하나의 시스템을 2축으로 분해
### not_suits
- BIM vs DX 직접 대조
- 과정/결과 2분할 (Frame 29 주제)
- 주체별 나열 (발주자/시공자/설계자)
- 3개 이상 비교
- 시간 순서
- 단일 구성요소 심층
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: True
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281178 — System 구성 (H/W + S/W BIGRoom)
## 구조
- **layout**: 2col-paired
- **detail**: H/W 항목(Server·Network·회의시스템·CCTV·Drone·Sensor)과 S/W 항목(C.C.P·WatchBIM·Domainer) 2열 페어드 리스트
## 내용
BIGRoom 시스템 구성 — H/W(Server·Network·회의·CCTV·Drone·Sensor) + S/W(C.C.P·WatchBIM·Domainer) 상세 설명.
## 후보 키워드
System, BIGRoom, H/W, S/W, Server, Network, 회의시스템, CCTV, Drone, Sensor, 센서, IoT, CCP, WatchBIM, Domainer, 시공관리, 공사단계, 용지보상, 구성
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 335.165 87.74" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Rectangle 42079" d="M0 0H259.349C278.04 0 295.171 10.4254 303.759 27.0272L312.472 43.87L335.165 87.74H0V0Z" fill="var(--fill-0, #D16013)"/>
</svg>

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,5 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 406.561 6.0001" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 3697">
<line id="Line 1003" x1="9.20848e-08" y1="3" x2="406.561" y2="3.0001" stroke="var(--stroke-0, white)" stroke-width="6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 886 B

View File

@@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 335.165 87.74" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Rectangle 42078" d="M0 0H259.349C278.04 0 295.171 10.4254 303.759 27.0272L312.472 43.87L335.165 87.74H0V0Z" fill="var(--fill-0, #838486)"/>
</svg>

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,18 @@
# Frame 1171281178 — 실측 기록 (flat)
> 원본: 2446 × 1943 px (node 145:8394)
> 패턴: system-config-hw-sw (H/W + S/W 시스템 구성도)
> Scale: 1280 / 2446 = 0.52331
## 구조
좌: H/W 항목 7개 (Display, Server & Storage, Network, 회의시스템, CCTV, Dron Broadcasting, Sensor)
우: S/W 항목 6개 (C.C.P, WatchBIM, Domainer, BCMF, Twin Highway, B.E.Ps)
중앙: System 구성 원 (BIG Room)
하단: Ground 이미지
2D 복합 레이아웃 → absolute + zoom
## 에셋 (16개)
배경, 패널, 중앙 원, 장식 아이콘, 헤더 바 SVG 등. 모두 이미지 유지.

View File

@@ -0,0 +1,184 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280">
<title>System 구성 H/W + S/W (Frame 1171281178)</title>
<!--
Frame: 145:8394, 2446×1943 px
Scale: 1280 / 2446 = 0.52331
패턴: system-config-hw-sw
구조: 2D 복합 레이아웃 → absolute + R19 zoom
좌: H/W 7항목, 우: S/W 6항목, 중앙: BIG Room
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh; word-break: keep-all;
}
.slide {
width: 1280px;
background: #fff; position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
}
.block { width: 1280px; position: relative; overflow: hidden; }
.inner {
width: 2446px; height: 1943px;
zoom: 0.52331; /* R19 */
position: relative;
}
.abs { position: absolute; }
.abs img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* 라벨 바 (CSS gradient) */
.hw-bar {
position: absolute; height: 52.44px;
background: linear-gradient(to right, rgba(255,255,255,0.5), #adb0af);
border-radius: 0 40px 40px 0;
}
.sw-bar {
position: absolute; height: 48.41px;
background: linear-gradient(to right, #fbefe8, #f8ae7c);
border-radius: 0 40px 40px 0;
}
.bar-label {
position: absolute; transform: translateY(-50%);
font-weight: 700; font-size: 40px; line-height: normal;
color: #000; display: flex; align-items: center; gap: 10px;
}
.bar-label img { width: 28px; height: 29px; flex: none; }
.body-text {
position: absolute;
font-weight: 500; font-size: 38px; line-height: 60px;
color: #000;
}
</style>
</head>
<body>
<div class="slide">
<div class="block">
<div class="inner">
<!-- 배경 -->
<div class="abs" style="left:0; top:1577px; width:2446px; height:366px;"><img src="assets/b2accb7d555f4db0c2d35d1569011429edde1ade.png"></div>
<div class="abs" style="left:52.73px; top:77.65px; width:1144.49px; height:1819.35px;"><img src="assets/26130bd845450735906360cb922f58e3793148b7.png"></div>
<div class="abs" style="left:54.7px; top:87.74px; width:1142.52px; height:395.33px;"><img src="assets/d13b0ac6c9a0ff5028859102f433367cab26a98b.png"></div>
<div class="abs" style="left:1264.25px; top:92.78px; width:1118.86px; height:1803.21px;"><img src="assets/48d066e78784843a146e436d0edea28d91c9d007.png"></div>
<div class="abs" style="left:1264.25px; top:1509.85px; width:1118.86px; height:387.27px;"><img src="assets/151f041f6b2a897a0c3a57343474ded6aa2c720c.png"></div>
<div style="position:absolute; left:1260.31px; top:87.74px; width:1130.69px; height:391.3px; display:flex; align-items:center; justify-content:center;">
<div style="flex:none; transform:scaleY(-1);"><img src="assets/151f041f6b2a897a0c3a57343474ded6aa2c720c.png" style="width:1130.69px; height:391.3px;"></div>
</div>
<div class="abs" style="left:44.84px; top:1497.75px; width:1152.38px; height:399.37px;"><img src="assets/5c11126f4fafa3898129693842b176646a6cdec8.png"></div>
<!-- H/W 헤더 -->
<div class="abs" style="left:54.7px; top:1.01px; width:335.17px; height:87.74px;"><img src="assets/8b24ef76bacdfbd53e7ec3c4f029190aacbd722e.svg"></div>
<div style="position:absolute; left:196.65px; top:45.89px; transform:translate(-50%,-50%); font-weight:700; font-size:50px; color:#fff; text-align:center;">H/W</div>
<!-- S/W 헤더 -->
<div style="position:absolute; left:2055.83px; top:0; width:335.17px; height:87.74px; display:flex; align-items:center; justify-content:center;">
<div style="flex:none; transform:scaleY(-1) rotate(180deg);"><img src="assets/06d5951cfd9fc1902012bae433505eb88e04151b.svg" style="width:335.17px; height:87.74px;"></div>
</div>
<div style="position:absolute; left:2240.17px; top:43.87px; transform:translate(-50%,-50%); font-weight:700; font-size:50px; color:#fff; text-align:center;">S/W</div>
<!-- 중앙 원 -->
<div class="abs" style="left:883.74px; top:632.33px; width:671.18px; height:684.78px;"><img src="assets/922ee6f4bea1434652ffc08f962086052286b6c5.png"></div>
<div style="position:absolute; left:1217.79px; top:921.76px; transform:translate(-50%,-50%); text-align:center; font-weight:700; font-size:0; color:#fff;">
<p style="font-size:70px; line-height:normal; color:yellow;">System</p>
<p style="font-size:60px; line-height:normal;">구성</p>
</div>
<div style="position:absolute; left:1226.23px; top:1107.92px; transform:translate(-50%,-50%); font-weight:700; font-size:50px; color:#fff; text-align:center;">BIG Room</div>
<!-- ═══ H/W 항목 ═══ -->
<!-- Display -->
<div class="hw-bar" style="left:83.29px; top:129.09px; width:325.31px;"></div>
<div class="bar-label" style="left:83.29px; top:151.78px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Display</div>
<div class="body-text" style="left:123.73px; top:189.6px; width:1098.3px;">범위가 넓고 긴 형태의 인프라 시설 규모에 적합한 대형 사이니지를 적용하여 벡터기반 도면, 3D정보 모델을 높은 정밀도로 표출</div>
<!-- Server & Storage -->
<div class="hw-bar" style="left:83.29px; top:361.05px; width:425.95px;"></div>
<div class="bar-label" style="left:83.29px; top:383.74px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Server &amp; Strorage</div>
<div class="body-text" style="left:123.73px; top:414.5px; width:1042.45px;">방대한 건설현장 데이터를 안전하게 저장하고 관리, 시공 및 공정, 기성 등 데이터베이스화 하여 실시간 접근 및 효율적인 정보공유와 관리 지원</div>
<!-- Network -->
<div class="hw-bar" style="left:74.42px; top:642.42px; width:325.31px;"></div>
<div class="bar-label" style="left:83.29px; top:667.13px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Network</div>
<div class="body-text" style="left:123.73px; top:682.76px; width:1170.22px;">네트워크 서비스를 통한 실시간 데이터 수집 및 연계, 위치기반 안전관리, SaaS 기반 실시간 데이터 공유와 관리 가능</div>
<!-- 회의시스템 -->
<div class="hw-bar" style="left:74.42px; top:916.73px; width:325.31px;"></div>
<div class="bar-label" style="left:83.29px; top:943.46px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">회의시스템</div>
<div class="body-text" style="left:123.73px; top:982.29px; width:884.49px;">공사 현장, 개별 공구별 사무실, 사업단 회의시스템을 구축하여 신속한 의사결정을 바탕으로 업무효율성 증대</div>
<!-- CCTV -->
<div class="hw-bar" style="left:74.42px; top:1177.94px; width:325.31px;"></div>
<div class="bar-label" style="left:83.29px; top:1201.64px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">CCTV</div>
<div class="body-text" style="left:123.73px; top:1237.44px; width:967.95px;">각 현장에 설치된 실시간 CCTV와 연계하여 공사 진행과정과 위험 요소를 지속적으로 모니터링하여 사고를 사전에 예방</div>
<!-- Dron Broadcasting -->
<div class="hw-bar" style="left:74.42px; top:1425.02px; width:502.57px;"></div>
<div class="bar-label" style="left:84px; top:1446.7px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Dron Broadcasting</div>
<div class="body-text" style="left:123.73px; top:1485.53px; width:1098.3px;">드론을 활용하여 건설 현장을 촬영하고 구조물의 상태를 실시간으로 확인 함으로써 공사의 품질을 높이며 안전한 작업 환경 조성</div>
<!-- Sensor -->
<div class="hw-bar" style="left:74.42px; top:1670.09px; width:325.31px;"></div>
<div class="bar-label" style="left:83.29px; top:1694.79px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Sensor</div>
<!-- Sensor body: hw-bar bottom=1722.53 + 8px = 1731 (translateY(-50%) 제거) -->
<div class="body-text" style="left:123.73px; top:1731px; width:1067.52px;">현장에 IoT 위치기반 센서를 설치하여 사전에 균열, 진동, 기울기의 변화 등 위험요소를 실시간으로 확인하고 문제 발생 시 화면 표출</div>
<!-- ═══ S/W 항목 ═══ -->
<!-- C.C.P -->
<div class="sw-bar" style="left:1283.03px; top:129.09px; width:325.31px;"></div>
<div class="bar-label" style="left:1287.91px; top:151.78px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">C.C.P</div>
<!-- C.C.P body: sw-bar bottom=177.5 + 8px = 186 (translateY(-50%) 제거) -->
<div class="body-text" style="left:1341.14px; top:186px; width:1021.58px;">사업의 기본정보 및 공사진행과 관련된 모든 자료를 취합, 검증, 확인, 협업하는 효율적인 공사단계 프로세스 협업 및 관리 솔루션</div>
<!-- WatchBIM -->
<div class="sw-bar" style="left:1283.97px; top:374.16px; width:366.7px;"></div>
<div class="bar-label" style="left:1294.81px; top:398.86px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">WatchBIM</div>
<div class="body-text" style="left:1351.02px; top:436.68px; width:1011.65px;">공사중 단계별 건설과정을 설계모델의 시각화와 공정시뮬레이션을 통해 현장 공사진행사항을 직관적으로 확인 및 검증</div>
<!-- Domainer -->
<div class="sw-bar" style="left:1447.61px; top:650.49px; width:365.72px;"></div>
<div class="bar-label" style="left:1446.62px; top:672.17px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Domainer</div>
<div class="body-text" style="left:1503.82px; top:715.03px; width:834.14px;">시공단계에서 민원 및 용지보상과 관련한 업무를 수행하는 솔루션으로 지번검색, 계약사항, 일정관리, 성과품, 협의자료 생성 등의 업무를 수행</div>
<!-- BCMF -->
<div class="sw-bar" style="left:1536.33px; top:1003.46px; width:263.74px;"></div>
<div class="bar-label" style="left:1536.33px; top:1025.15px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png"><span style="font-size:0;"><span style="font-size:30px;">B</span><span style="font-size:40px;">CM</span><span style="font-size:30px;">F</span></span></div>
<!-- BCMF body: sw-bar bottom=1051.87 + 8px = 1060 (translateY(-50%) 제거) -->
<div class="body-text" style="left:1579.7px; top:1060px; width:786.66px;">건설 현장의 공사, 품질, 안전, 사업관리 등의 업무를 효율적으로 수행할 수 있는 BIM기반 현장 맞춤형 건설사업관리 솔루션</div>
<!-- Twin Highway -->
<div class="sw-bar" style="left:1297.77px; top:1350.39px; width:471.2px;"></div>
<div class="bar-label" style="left:1283.97px; top:1371.06px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png">Twin Highway</div>
<!-- Twin Highway body: sw-bar bottom=1398.8 + 8px = 1407 (translateY(-50%) 제거) -->
<div class="body-text" style="left:1342.13px; top:1407px; width:1030.45px;">준공 후 가상세계의 정보모델을 실시간 데이터와 연결하여 다양한 시뮬레이션을 통해 효율적인 시설물 관리 및 운영전략 수립 지원</div>
<!-- B.E.Ps <참고> -->
<div class="sw-bar" style="left:1297.77px; top:1647.9px; width:352.91px;"></div>
<div class="bar-label" style="left:1283.97px; top:1668.57px;"><img src="assets/7e260569216fd75f7df60441a94a25763e7f24c8.png"><span style="font-size:0;"><span style="font-size:40px;">B.E.P</span><span style="font-size:30px;">s &lt;참고&gt;</span></span></div>
<!-- B.E.Ps body: sw-bar bottom=1696.31 + 8px = 1705 (translateY(-50%) 제거) -->
<div class="body-text" style="left:1343.14px; top:1705px; width:1039.89px;">건설산업의 디지털전환을 위한 개념 및 BIM 수행을 위한 방법, 예시, 사례들을 모아놓은 사내용 시공 BIM 수행 메뉴얼 및 학습 시스템</div>
<!-- 장식 이미지들 -->
<div class="abs" style="left:338.61px; top:802.77px; width:118.29px; height:121.02px;"><img src="assets/f6d6c38d03350b0b72b994f44c10d41ac1ae67e0.png"></div>
<div class="abs" style="left:34px; top:513.33px; width:98.58px; height:100.85px;"><img src="assets/f6d6c38d03350b0b72b994f44c10d41ac1ae67e0.png"></div>
<div class="abs" style="left:577.16px; top:345.92px; width:47.32px; height:48.41px;"><img src="assets/501526da860c6430caa4bb133a8d6bd3ba1580f2.png"></div>
<div class="abs" style="left:973.45px; top:1461.33px; width:98.58px; height:100.85px;"><img src="assets/f6d6c38d03350b0b72b994f44c10d41ac1ae67e0.png"></div>
<div class="abs" style="left:1560.97px; top:732.18px; width:124.21px; height:127.07px;"><img src="assets/6a5c82585b829bba6812fb47fc12a2e3f419e62d.png"></div>
<div class="abs" style="left:1936.55px; top:1225.34px; width:54.22px; height:55.47px;"><img src="assets/1e43a4acb2f3f368932da59f33a8793ba8b95fc7.png"></div>
<div class="abs" style="left:776.29px; top:1323.16px; width:83.79px; height:85.72px;"><img src="assets/5f14763f6097e3a734ac3375813a675d341ae1f3.png"></div>
<div class="abs" style="left:348.46px; top:1619.66px; width:98.58px; height:100.85px;"><img src="assets/f6d6c38d03350b0b72b994f44c10d41ac1ae67e0.png"></div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,35 @@
# Frame 1171281178 — 텍스트 (TF-IDF 매칭용)
## H/W 항목
Display
범위가 넓고 긴 형태의 인프라 시설 규모에 적합한 대형 사이니지를 적용하여 벡터기반 도면, 3D정보 모델을 높은 정밀도로 표출
Server & Strorage
방대한 건설현장 데이터를 안전하게 저장하고 관리, 시공 및 공정, 기성 등 데이터베이스화 하여 실시간 접근 및 효율적인 정보공유와 관리 지원
Network
네트워크 서비스를 통한 실시간 데이터 수집 및 연계, 위치기반 안전관리, SaaS 기반 실시간 데이터 공유와 관리 가능
회의시스템
공사 현장, 개별 공구별 사무실, 사업단 회의시스템을 구축하여 신속한 의사결정을 바탕으로 업무효율성 증대
CCTV
각 현장에 설치된 실시간 CCTV와 연계하여 공사 진행과정과 위험 요소를 지속적으로 모니터링하여 사고를 사전에 예방
Dron Broadcasting
드론을 활용하여 건설 현장을 촬영하고 구조물의 상태를 실시간으로 확인 함으로써 공사의 품질을 높이며 안전한 작업 환경 조성
Sensor
현장에 IoT 위치기반 센서를 설치하여 사전에 균열, 진동, 기울기의 변화 등 위험요소를 실시간으로 확인하고 문제 발생 시 화면 표출
## S/W 항목
C.C.P
사업의 기본정보 및 공사진행과 관련된 모든 자료를 취합, 검증, 확인, 협업하는 효율적인 공사단계 프로세스 협업 및 관리 솔루션
WatchBIM
공사중 단계별 건설과정을 설계모델의 시각화와 공정시뮬레이션을 통해 현장 공사진행사항을 직관적으로 확인 및 검증
Domainer
시공단계에서 민원 및 용지보상과 관련한 업무를 수행하는 솔루션으로 지번검색, 계약사항, 일정관리, 성과품, 협의자료 생성 등의 업무를 수행
BCMF
건설 현장의 공사, 품질, 안전, 사업관리 등의 업무를 효율적으로 수행할 수 있는 BIM기반 현장 맞춤형 건설사업관리 솔루션
Twin Highway
준공 후 가상세계의 정보모델을 실시간 데이터와 연결하여 다양한 시뮬레이션을 통해 효율적인 시설물 관리 및 운영전략 수립 지원
B.E.Ps <참고>
건설산업의 디지털전환을 위한 개념 및 BIM 수행을 위한 방법, 예시, 사례들을 모아놓은 사내용 시공 BIM 수행 메뉴얼 및 학습 시스템
## 중앙
System 구성
BIG Room

View File

@@ -0,0 +1,42 @@
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import os, time
here = os.path.dirname(os.path.abspath(__file__))
renders = os.path.join(here, '_renders')
os.makedirs(renders, exist_ok=True)
opts = Options()
opts.add_argument('--headless=new')
opts.add_argument('--hide-scrollbars')
opts.add_argument('--force-device-scale-factor=1')
opts.add_argument('--window-size=1600,900')
d = webdriver.Chrome(options=opts)
p = os.path.join(here, 'index.html').replace(os.sep, '/')
d.get('file:///' + p)
time.sleep(2.0)
full_png = os.path.join(renders, '_full.png')
d.save_screenshot(full_png)
r = d.execute_script(
'const r=document.querySelector(".slide").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('slide bounds:', r)
Image.open(full_png).crop(
(int(r[0]), int(r[1]), int(r[0]+r[2]), int(r[1]+r[3]))
).save(os.path.join(renders, 'slide.png'))
b = d.execute_script(
'const r=document.querySelector(".block").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('block bounds:', b)
Image.open(full_png).crop(
(int(b[0]), int(b[1]), int(b[0]+b[2]), int(b[1]+b[3]))
).save(os.path.join(renders, 'block.png'))
d.quit()
print('OK')

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@@ -0,0 +1,62 @@
# Frame 1171281179 — 효율적인 정보의 관리와 활용 (What/How/When)
## 내용 설명
효율적인 정보의 관리와 활용을 What(무슨 정보)·How(어떻게 관리)·
When(언제 활용) 3가지 관점으로 정리하는 프레임워크 디자인. 3개
섹션을 가로/세로로 분할해 각 관점별 내용을 병렬 제시. 정보
관리/활용 프레임워크 3관점·What/How/When 방법론·효율성 체계
정리에 적합. 주체별 나열·필수요건 나열(기술/사람/자연)·2개
비교·4개 이상 항목·시간 순서 단계·단일 관점 심층에는 부적합.
## 후보 키워드
What, How, 무슨정보, 정보관리, 정보활용, 효율성
## 정제 Anchor Sets
- **what_how_when**: What, How, 무슨정보 _[min_hits=2, cap=0.75, exempt_if≥0.5]_
- note: What/How/When은 범용 영어 의문사. 둘 이상 등장해도 이 템플릿 주제라 단정 불가. 정보관리·프레임워크 맥락 방증 필요.
- **info_management**: 정보관리, 정보활용, 효율성
## 구조 매칭 정보
- **family**: cards
- **layout**: 3-section-framework
- **axis**: horizontal
- **relation_type**: parallel
- **cardinality**: ideal 3 / min 3 / max 3
- **slots** (7개, required 7개): title, what_label, what_body, how_label, how_body, when_label, when_body
- **source title**: 효율적인 정보의 관리와 활용 (What/How/When)
- **original layout**: 3-section
## 적합/부적합 기준
### suits
- What/How/When 3관점 프레임워크
- 정보 관리/활용 체계 정리
- 3관점 병렬 제시
### not_suits
- 주체별 나열 (발주자/시공자/설계자)
- 필수요건 나열 (기술/사람/자연)
- 2개 비교
- 4개 이상 항목
- 시간 순서 단계
- 단일 관점 심층
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281179 — 효율적인 정보 관리·활용 (What/How/When)
## 구조
- **layout**: 3-section
- **detail**: 타이틀("효율적인 정보의 관리와 활용") + 3개 섹션(What·How·When) 가로/세로 분할
## 내용
효율적인 정보의 관리와 활용 프레임워크 — What(무슨 정보) · How(어떻게 관리) · When(언제 활용) 3관점.
## 후보 키워드
정보관리, 정보활용, What, How, When, 3섹션, 효율성, 프레임워크, 무슨정보, 어떻게관리, 언제활용
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -0,0 +1,99 @@
# Frame 1171281179 — 실측 기록 (flat)
> 원본: 1207 × 861 px (node 182:3024, file 9S6LsQyO6zlRxtiqZccOUM, page 29:373)
> 패턴: framework-3section-label-body (좌 라벨 / 우 카드 본문, 3 섹션)
> Scale: **min(1280/1207, 720/861) = 720/861 = 0.83624** (height fit, 1009×720 block in 1280×720 slide)
## 구조 (bottom-up)
```
Frame 182:3024 "Frame 1171281179" (1207 × 861)
└─ Group 182:3025 "Group 1171285821" (0, 0) 1207×861
├─ ① 헤더 (title row, 0, 0) 1166×94
│ └─ 항목 frame 182:3027: flex gap=15, items-center
│ ├─ icon 50×61 (green circle, 50×50 image inside) — title_icon.png
│ └─ TEXT 182:3030 "효율적인 정보의 관리와 활용"
│ - "효율적인 " 50px Bold, gradient 180° (#296B55 → #123328)
│ - "정보의 관리와 활용" 65px Bold, gradient 180° (#000 → #883700)
│ - text-shadow: 0 0 4px #322C1E
├─ ② 좌측 브라운 라벨 (3개, 282×230, rgba(50,31,9,0.8), rounded right corners r=20)
│ ├─ 182:3033 "What" label (18, 124) — drop-shadow 0 4 2 rgba(0,0,0,0.25)
│ │ "무슨 정보" 40px Bold white + "What" 53px Bold #FFE100 (yellow)
│ ├─ 182:3035 "HOW" label (18, 378) — drop-shadow 동일
│ │ "어떻게 연계" 40px + "HOW" 53px #FFE100
│ └─ 182:3031 "WHEN" label (18, 631) — drop-shadow 없음
│ "언제 사용" 40px + "WHEN" 53px #FFE100
├─ ③ 우측 흰 카드 (3개, 877~879×230, white bg, 3px border #A5BBB4, rounded right r=20)
│ ├─ 182:3037 (315, 124) 877×230 ← What 카드
│ ├─ 182:3039 (315, 378) 877×230 ← HOW 카드
│ └─ 182:3038 (313, 631) 879×230 ← WHEN 카드
├─ ④ 우측 카드 장식 이미지 (3개, 383×177, rounded-bl r=17, 동일 src 재사용)
│ ├─ 182:3040 image 5624 (804, 176) — card_decor.png
│ ├─ 182:3041 image 5625 (805, 428) — 동일
│ └─ 182:3042 image 5626 (803, 680) — 동일
├─ ⑤ 본문 텍스트 (3 섹션)
│ ├─ 182:3043 What 본문 (321, 143) 880×193 — 35px Medium black + 40px Bold #CC5200 강조
│ │ • 수량, CBS 내역, 단가, 공사일정, 자원 투입계획 등 [계획 정보]
│ │ • 일일 작업수량, 실제 투입 자원 등 [공사 실행 정보]
│ │ • 품질/안전/환경 등 점검일지, 체크리스트, 사진 등 [공사 결과]
│ │
│ ├─ 182:3045 HOW 본문 (319, 396) 888×194
│ │ • 3D 형상 [산출속성과 연계]하여 S/W를 통해 정의
│ │ • 객체별 품질 검사 기준 등은 [시방규정과 연계]하여 S/W로 정의
│ │ • 객체별 필요정보를 Text기반 형식으로 [사용자가 입력]
│ │
│ └─ 182:3044 WHEN 본문 (319, 653) 868×177
│ • [착수 전] 공정계획, 시공계획 등 계획 수립
│ • [개별 공사 전] 시공상세도를 기반으로 한 작업 내용 확인
│ • [개별 공사 후] 실적 관리, 공사관련 문서 작성, 업무 보고
└─ ⑥ image 3341 placeholder (656, 517) 536×311 opacity 85
— design_context에 src 미포함. WHEN 카드 영역 내 정체 불명 placeholder.
— 시각 영향 없으므로 생략.
```
## 에셋 (2개 + 1 missing)
| 파일 | 의미 | 크기 | 사용 |
|------|------|------|------|
| `assets/title_icon.png` | 타이틀 좌측 녹색 원형 아이콘 (1171281194에서도 사용) | 50×50 | 1× |
| `assets/card_decor.png` | 카드 우측 장식 이미지 (3D 헥사곤/패턴) | 383×177 | **3×** (재사용) |
| (image 3341) | metadata에는 있으나 design_context 미제공 | 536×311 | 생략 |
## 이상 탐지 결과
| 검사 | 결과 |
|------|------|
| 회전 단일문자 | 없음 |
| 좁은 박스 세로 텍스트 | 없음 |
| 중복 노드 | card_decor 동일 src 3× 재사용 — 정상 |
| Vector 좌표 metadata vs design_context | 일치 |
| **이상한 회전 nesting** | 좌측 라벨 3개 모두 `rotate-180` 래퍼 + 내부 컨텐츠도 `rotate-180` → 시각적으로 identity. Figma 자동 레이아웃 export 부산물. CSS에서는 회전 생략하고 `border-top-right-radius/bottom-right-radius: 20px`만 적용. |
| **이상한 image transform** | 카드 장식 3개 모두 `-scale-y-100` + `rotate-180` → 시각적으로 identity. CSS에서 transform 생략. |
| metadata에 있으나 design_context 미제공 | image 3341 (placeholder) — 무시 |
## 변형 가능 축
- **sections[N=3] (required)** — cardinality 3 고정 (analysis.md), label + body 페어 3쌍
- `label_kr` (required, 40px) — "무슨 정보" / "어떻게 연계" / "언제 사용"
- `label_en` (required, 53px yellow) — "What" / "HOW" / "WHEN"
- `body_bullets[N=3]` (required) — 본문 불릿 (35px black + 40px Bold #CC5200 강조)
- `title` (required) — "효율적인 정보의 관리와 활용" 형태, 두 부분 폰트 사이즈 다름 (50/65)
- `title_icon` (required) — 녹색 원형 아이콘
- `card_decor` (optional) — 카드 우측 장식 이미지. 없으면 흰 카드만
## Sub-patterns
- `label-body-rounded-right-pair` — 좌(브라운 라벨, rounded right) / 우(흰 카드, rounded right + border) 페어
- `bullet-list-with-highlight` — 불릿 리스트에서 핵심어 색상/폰트 강조 (#CC5200, +5px)
- `gradient-bg-clip-text-title` — 멀티 폰트 사이즈 + 멀티 색 그라디언트 텍스트 헤더 (1171281194의 title-row와 비슷)
## 임시 보정 (1:1, 템플릿화 시 재고려)
- 좌측 라벨의 `drop-shadow`는 What/HOW만 적용, WHEN에는 미적용 — Figma에서 의도된 차이일 수 있음 (검토 필요). 우선 보존.
- 본문 tracking 값(letter-spacing) 마이크로 조정 (-1.75 ~ -2.8px). 템플릿에서는 자연 wrap에 맡김 권장.

View File

@@ -0,0 +1,237 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280">
<title>효율적인 정보의 관리와 활용 (Frame 1171281179)</title>
<!--
Frame: 182:3024, 1207 × 861 px (Frame 1171281179)
Source: file 9S6LsQyO6zlRxtiqZccOUM, page 29:373
Scale: min(1280/1207, 720/861) = 720/861 = 0.83624 (height fit)
Block in slide: 1009 × 720 (centered horizontally, white margin sides)
패턴: framework-3section-label-body
구조: 헤더 (icon + title) / 좌 브라운 라벨 ×3 / 우 흰 카드 ×3 (불릿 본문 + 우측 장식 이미지)
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700;900&display=swap" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh;
word-break: keep-all;
}
.slide {
width: 1280px; height: 720px;
background: #fff;
position: relative; overflow: hidden;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
display: flex; align-items: center; justify-content: center;
}
.block {
position: relative;
overflow: hidden;
}
.inner {
width: 1207px; height: 861px;
position: relative;
zoom: 0.83624;
}
/* ① 헤더 (title row) */
.title-row {
position: absolute;
left: 0; top: 0;
width: 1166px; height: 94px;
display: flex; align-items: center; gap: 15px;
}
.title-icon {
flex: none;
width: 50px; height: 61px;
display: flex; align-items: center; justify-content: center;
}
.title-icon img {
width: 50px; height: 50px;
object-fit: cover;
display: block;
}
.title-text {
flex: none;
font-family: 'Noto Sans KR', sans-serif;
font-weight: 700;
white-space: pre;
text-shadow: 0 0 4px #322C1E;
line-height: 1;
}
.title-text .part-1 {
font-size: 50px;
background-image: linear-gradient(180deg, #296B55 0%, #123328 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
.title-text .part-2 {
font-size: 65px;
background-image: linear-gradient(180deg, rgb(0,0,0) 0%, rgb(136,55,0) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
/* ② 좌측 브라운 라벨 (3개) */
.label-box {
position: absolute;
left: 18px;
width: 282px; height: 230px;
background: rgba(50, 31, 9, 0.8);
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
padding: 9px 22px;
}
.label-box--shadow {
filter: drop-shadow(0 4px 2px rgba(0,0,0,0.25));
}
.label-box .kr {
font-family: 'Noto Sans KR', sans-serif;
font-weight: 700;
font-size: 40px;
color: white;
line-height: 70px;
text-align: center;
text-shadow: 0 4px 4px rgba(0,0,0,0.25);
}
.label-box .en {
font-family: 'Noto Sans KR', sans-serif;
font-weight: 700;
font-size: 53px;
color: #FFE100;
line-height: 70px;
text-align: center;
text-shadow: 0 4px 4px rgba(0,0,0,0.25);
}
.label--what { top: 124px; }
.label--how { top: 378px; }
.label--when { top: 631px; }
/* ③ 우측 흰 카드 (3개) */
.card-box {
position: absolute;
height: 230px;
background: white;
border: 3px solid #A5BBB4;
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
}
.card-box--what { left: 315px; top: 124px; width: 877px; }
.card-box--how { left: 315px; top: 378px; width: 877px; }
.card-box--when { left: 313px; top: 631px; width: 879px; }
/* ④ 카드 우측 장식 이미지 (3개, 같은 src) */
.card-decor {
position: absolute;
width: 383px; height: 177px;
border-bottom-left-radius: 17px;
overflow: hidden;
}
.card-decor img {
width: 100%; height: 100%;
object-fit: cover;
display: block;
}
.card-decor--what { left: 804px; top: 176px; }
.card-decor--how { left: 805px; top: 428px; }
.card-decor--when { left: 803px; top: 680px; }
/* ⑤ 본문 텍스트 (3 섹션 공통) */
.body-text {
position: absolute;
font-family: 'Noto Sans KR', sans-serif;
font-weight: 500;
color: black;
}
.body-text p { margin: 0; line-height: 65px; }
.body-text .bullet { font-size: 35px; line-height: 65px; letter-spacing: 0; }
.body-text .text { font-size: 35px; line-height: 65px; letter-spacing: -2px; }
.body-text .accent {
font-weight: 700;
font-size: 40px;
line-height: 65px;
color: #CC5200;
letter-spacing: -2.2px;
}
.body-text--what { left: 321px; top: 143px; width: 880px; height: 193px; }
.body-text--how { left: 319px; top: 396px; width: 888px; height: 194px; }
.body-text--when { left: 319px; top: 653px; width: 868px; height: 177px; }
</style>
</head>
<body>
<div class="slide">
<div class="block">
<div class="inner">
<!-- ① 헤더 -->
<div class="title-row">
<div class="title-icon"><img src="assets/title_icon.png" alt=""></div>
<div class="title-text"><span class="part-1">효율적인 </span><span class="part-2">정보의 관리와 활용</span></div>
</div>
<!-- ② 좌측 브라운 라벨 ×3 -->
<div class="label-box label-box--shadow label--what">
<div class="kr">무슨 정보</div>
<div class="en">What</div>
</div>
<div class="label-box label-box--shadow label--how">
<div class="kr">어떻게 연계</div>
<div class="en">HOW</div>
</div>
<div class="label-box label--when">
<div class="kr">언제 사용</div>
<div class="en">WHEN</div>
</div>
<!-- ③ 우측 흰 카드 ×3 (배경) -->
<div class="card-box card-box--what"></div>
<div class="card-box card-box--how"></div>
<div class="card-box card-box--when"></div>
<!-- ④ 카드 우측 장식 이미지 -->
<div class="card-decor card-decor--what"><img src="assets/card_decor.png" alt=""></div>
<div class="card-decor card-decor--how"><img src="assets/card_decor.png" alt=""></div>
<div class="card-decor card-decor--when"><img src="assets/card_decor.png" alt=""></div>
<!-- ⑤ 본문 텍스트 — What -->
<div class="body-text body-text--what">
<p><span class="bullet"></span><span class="text">수량, CBS 내역, 단가, 공사일정, 자원 투입계획 등 </span><span class="accent">계획 정보</span></p>
<p><span class="bullet"></span><span class="text">일일 작업수량, 실제 투입 자원 등 </span><span class="accent">공사 실행 정보</span></p>
<p><span class="bullet"></span><span class="text">품질/안전/환경 등 점검일지, 체크리스트, 사진 등 </span><span class="accent">공사 결과</span></p>
</div>
<!-- ⑤ 본문 텍스트 — HOW -->
<div class="body-text body-text--how">
<p><span class="bullet"></span><span class="text">3D 형상 </span><span class="accent">산출속성과 연계</span><span class="text">하여 S/W를 통해 정의</span></p>
<p><span class="bullet"></span><span class="text">객체별 품질 검사 기준 등은 </span><span class="accent">시방규정과 연계</span><span class="text">하여 S/W로 정의</span></p>
<p><span class="bullet"></span><span class="text">객체별 필요정보를 Text기반 형식으로 </span><span class="accent">사용자가 입력</span></p>
</div>
<!-- ⑤ 본문 텍스트 — WHEN -->
<div class="body-text body-text--when">
<p><span class="bullet"></span><span class="accent">착수 전</span><span class="text"> 공정계획, 시공계획 등 계획 수립</span></p>
<p><span class="bullet"></span><span class="accent">개별 공사 전</span><span class="text"> 시공상세도를 기반으로 한 작업 내용 확인</span></p>
<p><span class="bullet"></span><span class="accent">개별 공사 후</span><span class="text"> 실적 관리, 공사관련 문서 작성, 업무 보고</span></p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,33 @@
# Frame 1171281179 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출.
## 타이틀
효율적인 정보의 관리와 활용
## 섹션1 — 무슨 정보 (What)
무슨 정보
What
### 본문
- 수량, CBS 내역, 단가, 공사일정, 자원 투입계획 등 **계획 정보**
- 일일 작업수량, 실제 투입 자원 등 **공사 실행 정보**
- 품질/안전/환경 등 점검일지, 체크리스트, 사진 등 **공사 결과**
## 섹션2 — 어떻게 연계 (HOW)
어떻게 연계
HOW
### 본문
- 3D 형상 **산출속성과 연계**하여 S/W를 통해 정의
- 객체별 품질 검사 기준 등은 **시방규정과 연계**하여 S/W로 정의
- 객체별 필요정보를 Text기반 형식으로 **사용자가 입력**
## 섹션3 — 언제 사용 (WHEN)
언제 사용
WHEN
### 본문
- **착수 전** 공정계획, 시공계획 등 계획 수립
- **개별 공사 전** 시공상세도를 기반으로 한 작업 내용 확인
- **개별 공사 후** 실적 관리, 공사관련 문서 작성, 업무 보고

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

View File

@@ -0,0 +1,62 @@
# Frame 1171281180 — 시공 전 모델 기반 시공상세 정보물
## 내용 설명
시공 전 모델 기반 시공상세 정보물을 활용한 시공계획 작성 지원
내용을 세로 스택 리스트로 제시하는 디자인. 타이틀 + 세로 라벨 +
여러 항목(정보물·모델·시뮬레이션·도면·성과물)을 수직으로 나열.
시공 전 계획 단계 정보물 나열·3D 모델 기반 시공 산출물 목록·
시공계획 작성 지원 도구 정리에 적합. 주체별 나열·비교 구조·
2개 대조·3개 이하 항목·시간 순서 단계·필수요건 나열에는 부적합.
## 후보 키워드
시공전모델, 시공상세정보물, 시공계획, 계획작성, 정보물, 모델, 시뮬레이션, 도면, 성과물, 3D모델, 지원
## 정제 Anchor Sets
- **pre_construction**: 시공전모델, 시공상세정보물, 시공계획, 계획작성
- **deliverables**: 정보물, 모델, 시뮬레이션, 도면, 성과물, 3D모델
- **support_context**: 지원
## 구조 매칭 정보
- **family**: list
- **layout**: list-stacked-vertical
- **axis**: vertical
- **relation_type**: parallel
- **cardinality**: ideal 5 / min 4 / max 6
- **slots** (3개, required 3개): title, side_label, items
- **source title**: 시공 전 모델 기반 시공상세 정보물
- **original layout**: list-stacked
## 적합/부적합 기준
### suits
- 시공 전 계획 단계 정보물 나열
- 3D 모델 기반 시공 산출물 목록
- 시공계획 도구 정리
### not_suits
- 주체별 나열 (발주자/시공자/설계자)
- 비교 구조 (대조)
- 2개 대조
- 3개 이하 항목
- 시간 순서 단계
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: True
- **merge**: True
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281180 — 시공 전 모델 기반 시공상세 정보물
## 구조
- **layout**: list-stacked
- **detail**: 타이틀("시공 전 모델 기반 시공상세 정보물 이용한 시공계획 작성 지원") + 세로 라벨 + 수직 리스트 항목들
## 내용
시공 전 모델 기반 시공상세 정보물 활용 — 시공계획 작성 지원을 위한 정보물·모델·시뮬레이션·도면·성과물 리스트.
## 후보 키워드
시공전모델, 시공상세정보물, 시공계획, 정보물, 모델, 시뮬레이션, 도면, 성과물, 계획작성, 지원, 3D모델
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 22.4 16.8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M21.4629 0.5L11.1191 15.8984L0.930664 0.5H21.4629Z" fill="var(--fill-0, black)" stroke="var(--stroke-0, white)"/>
</svg>

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -0,0 +1,30 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 210.699 489.919" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Mask group" filter="url(#filter0_d_106_321)">
<mask id="mask0_106_321" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="201" height="475">
<path id="Intersect" d="M0 58.1721C0 62.7691 3.14483 66.7452 7.5533 68.0482C80.6773 89.662 134.036 157.329 134.036 237.46C134.036 317.59 80.677 385.255 7.55332 406.868C3.14484 408.171 0 412.148 0 416.745V465.118C0 471.337 5.62415 476.059 11.6872 474.677C119.925 450.01 200.699 353.169 200.699 237.46C200.699 121.751 119.925 24.9083 11.6872 0.241745C5.62413 -1.13998 0 3.58191 0 9.80042V58.1721Z" fill="url(#paint0_linear_106_321)"/>
</mask>
<g mask="url(#mask0_106_321)">
<rect id="Rectangle 43991" y="-0.00117085" width="270" height="95" fill="var(--fill-0, #FD9164)" fill-opacity="0.8"/>
<rect id="Rectangle 43992" y="94.9988" width="270" height="95" fill="var(--fill-0, #F29700)" fill-opacity="0.8"/>
<rect id="Rectangle 43993" x="-54" y="189.999" width="270" height="95" fill="var(--fill-0, #FCC948)" fill-opacity="0.8"/>
<rect id="Rectangle 43994" y="284.999" width="270" height="95" fill="var(--fill-0, #C3D601)" fill-opacity="0.8"/>
<rect id="Rectangle 43995" y="379.999" width="270" height="95" fill="var(--fill-0, #65C6C4)" fill-opacity="0.8"/>
</g>
</g>
<defs>
<filter id="filter0_d_106_321" x="0" y="0" width="210.699" height="489.919" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="5" dy="10"/>
<feGaussianBlur stdDeviation="2.5"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_106_321"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_106_321" result="shape"/>
</filter>
<linearGradient id="paint0_linear_106_321" x1="121.177" y1="-3.68723" x2="22.5301" y2="487.856" gradientUnits="userSpaceOnUse">
<stop stop-color="#6FD6D8"/>
<stop offset="1" stop-color="#14706E"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,68 @@
# Frame 1171281180 — 실측 기록 (flat)
> 원본: 1153 × 592 px (node 112:87)
> 패턴: stacked-arrow-list (계단식 pill 리스트)
> Scale: 1280 / 1153 = 1.11015
## 구조
```
Frame 112:87 (1153 × 592)
├── 112:89 타이틀 바 (12, 47) 1141×29 — CSS: #fbd5b9, radius:5px, shadow
├── 112:90 TEXT 타이틀 center(592, 38) — mixed: 43px+50px gradient, #144838
├── 112:91 좌측 아크 장식 (12, 117) 200.7×474.9 — SVG mask group (이미지)
├── 112:117 TEXT "시공 상세 정보물" center(62.5, 342) — 45px Bold #144838, 세로 3줄
├── 5개 pill 행 (CSS: bg + border-bottom + radius + shadow)
│ ├── 112:111 행1 (65, 128.89) 1088×70 — border-bottom: 3px #fb5915
│ │ ├── 화살표 SVG (-rotate-90)
│ │ └── TEXT "3차원 형상의 정보 모델과 Data Base (D/B)" — 38px Medium
│ │
│ ├── 112:114 행2 (137, 220.89) 1016×70 — border-bottom: 3px #e79000
│ │ └── TEXT "목적물, 가시설 등의 단계별 시공 시뮬레이션"
│ │
│ ├── 112:108 행3 (166, 318.89) 987×70 — border-bottom: 3px #e9a804
│ │ └── TEXT "시공 및 안전교육에 도움이 되는 영상물 등 성과물"
│ │
│ ├── 112:102 행4 (137, 420.89) 1016×70 — border-bottom: 3px #919f00
│ │ └── TEXT "모델 또는 D/B, 시뮬레이션으로 부터 추출한 도면"
│ │
│ └── 112:105 행5 (65, 508.89) 1088×70 — border-bottom: 3px #0d6361
│ └── TEXT "모델에서 추출이 곤란한 안전, 유의사항, 개념도 등 상세 표현 도면"
```
## 에셋
| hash | 의미 |
|------|------|
| ff649c28...svg | 좌측 아크 장식 (복잡 mask, 이미지 유지) |
| 29c778b5...svg | 화살표 아이콘 (-rotate-90, 이미지 유지) |
## pill 행 CSS 속성 (공통)
- bg: rgba(255,255,255,0.5)
- border-bottom: 3px solid {color}
- border-radius: 30px
- box-shadow: 2px 4px 5px rgba(0,0,0,0.5)
- padding: 10px 20px
- display: flex; align-items: center; gap: 15px
## 계단 배치 패턴
| 행 | left | width | 색상 |
|----|------|-------|------|
| 1 | 65 | 1088 | #fb5915 |
| 2 | 137 | 1016 | #e79000 |
| 3 | 166 | 987 | #e9a804 |
| 4 | 137 | 1016 | #919f00 |
| 5 | 65 | 1088 | #0d6361 |
다이아몬드 형태: 넓→좁→좁→넓→넓
## 변형 가능 축
- items[N=3~7] (required) — 각 행: text + border_color
- stacking_pattern (required) — indent 패턴
- arc_decoration (optional)
- vertical_label (optional)

View File

@@ -0,0 +1,175 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280">
<title>시공상세 정보물 (Frame 1171281180)</title>
<!--
Frame: 112:87, 1153×592 px
Scale: 1280 / 1153 = 1.11015
패턴: stacked-arrow-list
구조: R17 (pill 행 flex column) + R19 (zoom)
-->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700;900&display=swap" rel="stylesheet">
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body {
font-family: 'Noto Sans KR', sans-serif;
background: #e8ecf0;
display: flex; justify-content: center; align-items: center;
min-height: 100vh; word-break: keep-all;
}
.slide {
width: 1280px;
background: #fff; position: relative;
box-shadow: 0 4px 20px rgba(0,0,0,.15);
}
.block { width: 1280px; position: relative; overflow: hidden; }
.inner {
width: 1153px;
zoom: 1.11015; /* R19: layout 크기도 반영 */
position: relative;
}
/* 타이틀 영역 */
.title-area {
position: relative;
height: 100px;
}
.title-bar {
position: absolute; left: 12px; top: 47px;
width: 1141px; height: 29px;
background: #fbd5b9; border-radius: 5px;
box-shadow: 0 4px 4px rgba(0,0,0,0.25);
}
.title-text {
position: absolute;
left: 592px; top: 38px;
transform: translate(-50%, -50%);
font-weight: 700; font-size: 0; line-height: 0;
color: #144838; text-align: center;
white-space: nowrap; letter-spacing: -2.25px;
}
/* 좌측 장식 (absolute, 콘텐츠 영역 위에 overlay) */
.arc-deco {
position: absolute; left: 12px; top: 117px;
width: 200.7px; height: 474.92px;
z-index: 0;
}
.arc-deco img { width: 105%; height: 103.16%; display: block; }
.vlabel {
position: absolute;
left: 62.5px; top: 342px;
transform: translate(-50%, -50%);
font-weight: 700; font-size: 45px; line-height: 76px;
color: #144838; text-align: center;
text-shadow: 0 4px 4px rgba(0,0,0,0.25);
white-space: nowrap;
z-index: 1;
}
/* pill 행 컨테이너 (flex column, R17) */
.pill-rows {
display: flex;
flex-direction: column;
align-items: center; /* 계단 배치: 각 행이 개별 width */
gap: 22px;
padding-top: 29px; /* 타이틀 아래 여백 */
position: relative;
z-index: 1;
}
/* pill 행 (flex row: arrow + text) */
.pill-row {
height: 70px;
background: rgba(255,255,255,0.5);
border-radius: 30px;
box-shadow: 2px 4px 5px rgba(0,0,0,0.5);
border-bottom: 3px solid;
display: flex; align-items: center;
padding: 10px 20px; gap: 15px;
align-self: flex-start; /* 좌측 정렬 기본 */
}
.pill-row .arrow {
flex: none; width: 16.8px; height: 22.4px;
display: flex; align-items: center; justify-content: center;
}
.pill-row .arrow img {
width: 22.4px; height: 16.8px;
transform: rotate(-90deg);
}
.pill-row .text {
font-weight: 500; font-size: 38px; line-height: 75px;
color: #000; letter-spacing: -1.14px; white-space: nowrap;
}
/* 결론 바 영역 */
.conclusion {
position: relative;
margin-top: 20px;
height: 109px;
}
</style>
</head>
<body>
<div class="slide">
<div class="block">
<div class="inner">
<!-- 타이틀 영역 -->
<div class="title-area">
<div class="title-bar"></div>
<div class="title-text">
<span style="font-size:43px; line-height:76px;">시공 전 모델 기반</span>
<span style="font-size:45px; line-height:76px;"> </span>
<span style="font-weight:900; font-size:50px; line-height:76px; background:linear-gradient(90deg, rgb(204,82,0), rgb(204,82,0)); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;">시공상세 정보물</span>
<span style="font-size:45px; line-height:76px;"> </span>
<span style="font-size:43px; line-height:76px;">이용한 시공계획 작성 지원</span>
</div>
</div>
<!-- 좌측 장식 (absolute overlay) -->
<div class="arc-deco"><img src="assets/ff649c28fd98518d6b48b9e5451fe1da4c1e95d5.svg" alt=""></div>
<div class="vlabel">시공<br>상세<br>정보물</div>
<!-- pill 행 (flex column, R17 — 계단 배치) -->
<div class="pill-rows">
<!-- 행1: #fb5915, width:1088 -->
<div class="pill-row" style="width:1088px; margin-left:65px; border-color:#fb5915;">
<div class="arrow"><img src="assets/29c778b566aca6778f505874f21670de129351f8.svg" alt=""></div>
<div class="text">3차원 형상의 정보 모델과 Data Base (D/B)</div>
</div>
<!-- 행2: #e79000, width:1016 -->
<div class="pill-row" style="width:1016px; margin-left:137px; border-color:#e79000;">
<div class="arrow"><img src="assets/29c778b566aca6778f505874f21670de129351f8.svg" alt=""></div>
<div class="text">목적물, 가시설 등의 단계별 시공 시뮬레이션</div>
</div>
<!-- 행3: #e9a804, width:987 -->
<div class="pill-row" style="width:987px; margin-left:166px; border-color:#e9a804;">
<div class="arrow"><img src="assets/29c778b566aca6778f505874f21670de129351f8.svg" alt=""></div>
<div class="text">시공 및 안전교육에 도움이 되는 영상물 등 성과물</div>
</div>
<!-- 행4: #919f00, width:1016 -->
<div class="pill-row" style="width:1016px; margin-left:137px; border-color:#919f00;">
<div class="arrow"><img src="assets/29c778b566aca6778f505874f21670de129351f8.svg" alt=""></div>
<div class="text">모델 또는 D/B, 시뮬레이션으로 부터 추출한 도면</div>
</div>
<!-- 행5: #0d6361, width:1088 -->
<div class="pill-row" style="width:1088px; margin-left:65px; border-color:#0d6361;">
<div class="arrow"><img src="assets/29c778b566aca6778f505874f21670de129351f8.svg" alt=""></div>
<div class="text">모델에서 추출이 곤란한 안전, 유의사항, 개념도 등 상세 표현 도면</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,14 @@
# Frame 1171281180 — 텍스트 (TF-IDF 매칭용)
## 타이틀
시공 전 모델 기반 시공상세 정보물 이용한 시공계획 작성 지원
## 세로 라벨
시공 상세 정보물
## 항목
3차원 형상의 정보 모델과 Data Base (D/B)
목적물, 가시설 등의 단계별 시공 시뮬레이션
시공 및 안전교육에 도움이 되는 영상물 등 성과물
모델 또는 D/B, 시뮬레이션으로 부터 추출한 도면
모델에서 추출이 곤란한 안전, 유의사항, 개념도 등 상세 표현 도면

View File

@@ -0,0 +1,61 @@
# Frame 1171281181 — 현장 실효성 증대 기본사항
## 내용 설명
현장 실효성 증대를 위한 5가지 기본 요소(디지털 정보·S/W 솔루션·
PC 활용·직관적 인터페이스 등)를 방사형 다이어그램으로 제시하는
디자인. 각 요소는 현장 적용의 핵심 기반을 나타내며 동등한 5개
병렬 요소로 배치. 5가지 현장 적용 요소·디지털/S/W/PC 기반 인프라
5요소 제시에 적합. 3/4개 이하 항목·6개 이상·주체별 나열·시간
순서·2개 비교·필수요건 나열(기술/사람/자연)에는 부적합.
## 후보 키워드
현장실효성, 기본사항, 현장적용, 디지털정보, S/W솔루션, PC활용, 인터페이스
## 정제 Anchor Sets
- **field_effectiveness**: 현장실효성, 기본사항, 현장적용
- **tech_infrastructure**: 디지털정보, S/W솔루션, PC활용, 인터페이스
## 구조 매칭 정보
- **family**: diagram
- **layout**: radial-diagram-5
- **axis**: horizontal
- **relation_type**: parallel
- **cardinality**: ideal 5 / min 5 / max 5
- **slots** (6개, required 6개): title, element_1, element_2, element_3, element_4, element_5
- **source title**: 현장 실효성 증대 기본사항
- **original layout**: diagram-5
## 적합/부적합 기준
### suits
- 5가지 현장 적용 요소
- 디지털/S/W/PC 기반 인프라
- 5요소 방사형 제시
### not_suits
- 3개 또는 4개 이하 항목
- 6개 이상 항목
- 주체별 나열 (발주자/시공자/설계자)
- 시간 순서
- 2개 비교
- 필수요건 나열 (기술/사람/자연)
## 재구성 허용
- **split**: False
- **merge**: False
- **infer_missing_slot**: False
- **rewrite_label**: True
- **rewrite_body**: True
## 메타
- schema_version: template-fit-v1 mirror
- source_of_truth: structure_ontology.yaml + keyword_base.yaml
- structure_content_original_tagged_by: claude-opus-4-7 (2026-04-21)
- keyword_base_sync_at: 2026-04-22
- anchor_sets_cleaned_at: 2026-04-22

View File

@@ -0,0 +1,17 @@
# Frame 1171281181 — 현장 실효성 증대 기본사항
## 구조
- **layout**: diagram-5
- **detail**: 타이틀("현장 실효성 증대 위한 기본사항") + 5개 다이어그램 항목(디지털정보·S/W솔루션·PC·직관 등)
## 내용
현장 실효성 증대를 위한 기본사항 — 디지털 정보·S/W 솔루션·PC 활용·직관적 인터페이스 등 5가지 요소 다이어그램.
## 후보 키워드
현장실효성, 기본사항, 디지털정보, S/W솔루션, PC활용, 직관성, 5요소, 다이어그램, 인터페이스, 현장적용
## 메타
- source: texts.md + flat.md
- schema_version: analysis-v1
- tagged_by: claude-opus-4-7
- tagged_at: 2026-04-21

View File

@@ -0,0 +1,24 @@
# Frame 1171281181 — 텍스트 (TF-IDF 매칭용)
> 프레임 안의 모든 텍스트를 빠짐없이 추출.
## 타이틀
현장 실효성 증대 위한 **기본사항**
## 본문 — 다이어그램 항목들
### 항목1
시스템 내 디지털 정보물 관리
### 항목2
특정 S/W 종속성 해소
### 항목3 (중앙 강조)
현장 맞춤형
Solution
### 항목4
일반PC 사용 가능
### 항목5
직관적 정보의 이해 및 활용

View File

@@ -0,0 +1,42 @@
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import os, time
here = os.path.dirname(os.path.abspath(__file__))
renders = os.path.join(here, '_renders')
os.makedirs(renders, exist_ok=True)
opts = Options()
opts.add_argument('--headless=new')
opts.add_argument('--hide-scrollbars')
opts.add_argument('--force-device-scale-factor=1')
opts.add_argument('--window-size=1600,900')
d = webdriver.Chrome(options=opts)
p = os.path.join(here, 'index.html').replace(os.sep, '/')
d.get('file:///' + p)
time.sleep(2.0)
full_png = os.path.join(renders, '_full.png')
d.save_screenshot(full_png)
r = d.execute_script(
'const r=document.querySelector(".slide").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('slide bounds:', r)
Image.open(full_png).crop(
(int(r[0]), int(r[1]), int(r[0]+r[2]), int(r[1]+r[3]))
).save(os.path.join(renders, 'slide.png'))
b = d.execute_script(
'const r=document.querySelector(".block").getBoundingClientRect();'
'return [r.x,r.y,r.width,r.height];'
)
print('block bounds:', b)
Image.open(full_png).crop(
(int(b[0]), int(b[1]), int(b[0]+b[2]), int(b[1]+b[3]))
).save(os.path.join(renders, 'block.png'))
d.quit()
print('OK')

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

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