---
name: kr-patent-drawing-tagging
description: >
  한국 특허 도면 PNG에 도면부호를 직접 그려 넣는(태깅하는) 스킬. 확정된 부호 체계
  (kr-patent-symbol-design)와 박스별 매핑(kr-patent-drawing-mapping의 지시서)을 입력받아,
  cv2 박스 자동검출 + 어두운 픽셀 충돌감지 폴백 배치로 부호 텍스트를 도면 이미지 위에
  삽입하여 태깅본 PNG를 생성한다. 매핑표(md+xlsx)까지 함께 산출. "도면에 부호 넣어줘",
  "도면부호 태깅", "PNG에 부호 삽입", "태깅본 만들어", "부호 그려 넣어", "도면에 번호 박아줘",
  "reference numeral overlay" 같은 표현이 보이거나, 무부호 블록도/흐름도 도면에 부호를
  입혀 출원용 도면을 만들려는 맥락에서 사용. (부호 체계 설계=symbol-design,
  박스↔부호 매핑표만=drawing-mapping, 본 스킬=이미지에 실제 삽입.)
---

# 한국 특허 도면부호 태깅 (PNG 직접 삽입)

## 무엇을 하는가

무부호 도면 PNG(블록도·파이프라인도·흐름도)에 도면부호를 **이미지 위에 직접 그려 넣어**
태깅본 PNG를 만든다. 검증된 파이프라인 (사건 C, 도면 14장 / 부호 98개 실전 검증):

```
도면 시각 판독 → 부호 체계 확정 → 도면별 anchor 설정(JSON) 작성
→ scripts/tag_drawings.py 실행 (cv2 박스검출 + 최근접 매칭 + 충돌감지 배치)
→ 태깅본 전수 육안 검증 (Read로 이미지 확인) → 어긋난 도면만 설정 수정 후 재실행
→ 부호매핑표 md/xlsx 산출
```

## 작업 순서

### Step 1. 입력 확보
- 도면 PNG 폴더 (숫자 파일명 `1.png`, `2.png`, … 권장)
- 확정된 부호 체계 (없으면 kr-patent-symbol-design 먼저 호출)
- **모든 도면을 Read로 시각 판독**하여 각 박스의 위치를 파악해 둔다 (anchor 좌표의 근거).

### Step 2. 설정 JSON 작성

`examples/example_config.json` 을 복사하여 사건별로 작성. 도면마다:

| 필드 | 의미 |
|---|---|
| `solo` | 태깅할 단독 박스 `[fx, fy, "부호"]` — fx/fy는 박스 중심의 이미지 폭·높이 대비 비율(0~1). 시각 판독 시 표시 좌표 ÷ 표시 크기로 추정 |
| `cyl` | 실린더(DB 등) — 내부 하단 중앙에 배치 |
| `container` | 최대 면적 박스(예: 제어부 컨테이너) 부호 — 내부 우상단 |
| `groups` | 점선 그룹: `sym`(대표 부호), `members`(멤버 박스 locator 좌표 — 검출 소진용, 무부호), `tagged`(예외적으로 부호 붙일 멤버 `[idx, "부호"]`) |
| `copy_only` | true면 무수정 복사 (부호가 이미 인쇄된 도면) |

anchor는 대략적이어도 된다 — 스크립트가 검출 박스와 **최근접 매칭**하므로 박스 중심에서
다소 어긋나도 올바르게 붙는다. 박스가 밀집한 도면만 정확히.

### Step 3. 실행

두 가지 스타일 엔진 중 선택:

```bash
# (a) 인라인 스타일 — 박스 내부 라벨 옆에 숫자
python scripts/tag_drawings.py --config <사건별 config.json>

# (b) KIPO 정식 작도 스타일 — 박스 외부 숫자 + 구불선 지시선 (레퍼런스: 사건 B 작도본)
python scripts/tag_drawings_leader.py --config <사건별 config.json>
```

leader 엔진(v2) config 확장: figure별 `pad_top/left/right/bottom`(캔버스 여백 확장 px),
solo 항목 4번째 요소로 배치 방향(`above/below/right/right_upper/left/above_left`),
groups에 `"sides"`, tagged 항목 3번째 요소로 방향 지정. 1차 실행 리포트의 강제배치(False)
항목을 보고 pad·방향을 넣어 재실행하는 2-pass가 표준. 실전 config:
`대학 고객 사건\사건 C_사건수임\도면부호태깅\config_leader.json`

- 출력: `out_dir\도NN.png` + 콘솔에 도면별 부호 수·문제 리포트
- 한글 경로의 cv2 imread 실패 → 스크립트가 `np.fromfile + imdecode`로 처리 (내장됨)

### Step 4. 전수 육안 검증 (필수)

태깅본 전부를 Read로 열어 (1) 부호가 올바른 박스에 붙었는지, (2) 라벨 텍스트와 겹치지
않는지 확인. 문제 도면만 anchor 수정 후 재실행. **검증 없이 납품 금지.**

### Step 5. 매핑표 산출

부호매핑표(md)를 작성하고 xlsx로 변환하여 태깅본과 같은 폴더에 저장:
구분(시스템/데이터/방법 단계) | 부호 | 명칭 | 등장 도면 | 관련 청구항.

## 배치 엔진 (스크립트 내장 규칙)

1. **박스 검출**: threshold(200) 반전 → findContours → 크기 필터(폭 ≥ max(80px, 3%W),
   높이 ≥ max(40px, 4%H)) → IoU>0.75 중복 제거(테두리 이중 컨투어 해소). 점선 박스는
   검출되지 않음(의도된 동작 — 그룹은 멤버 union으로 처리).
2. **충돌감지 폴백 배치**: 후보 위치를 순서대로 시도하고, 원본 이미지의 어두운 픽셀
   (<128) 또는 기존 라벨과 겹치면 다음 후보로:
   내부 우측 중앙 → 내부 우하단 → 내부 우상단 → 외부 상단 우측 → 외부 하단 우측 → 외부 우측.
   중앙정렬 라벨이 넓은 박스에서도 안전.
3. **그룹 대표 부호**: 점선 그룹의 A/B/C 인스턴스 박스에 a/b/c 접미 부호를 달지 말고
   그룹 우상단 외측에 대표 부호 1개. 쌍 개념 그룹은 `"250, 251"` 병기.
4. **폰트**: malgunbd.ttf, 크기 = max(28, min(W/90, 박스높이×0.40)).

## 부호 설계 연동 규칙 (실전 검증)

- 방법 단계: 전체 흐름도(도2류)의 인쇄된 S110~S160은 그대로 두고(`copy_only`),
  세부 도면의 연산 박스는 **도면별 SN10 방식**(도3→S310·S320…, 도12→S1210…)이
  슬롯 고갈 없이 확장 가능.
- 동일 객체·동일 연산은 도면이 달라도 **같은 부호 재사용** (예: 후행 판정 S410이
  도4·도5 양쪽 등장). 단, 청구항 한정이 다른 유사 연산은 별도 부호 (도3 선별 S340
  vs 도4 유효후보 선별 S420 — 청구항 2 vs 3).
- 단계 부호(S)는 동사형(연산) 박스에만, 숫자 부호는 명사형(데이터·장치) 박스에만.
- 데이터 계열은 200번대로 파이프라인 순서에 맞춰 십 단위 그룹화(210 영상 → 240 캡션
  → 260 실제 용어 → 290 진척도), 장치·자원은 100번대.

## 산출물

| 산출물 | 비고 |
|---|---|
| `도면부호태깅\도NN.png` | 태깅본 (원본 무수정 보존) |
| `부호매핑표.md` / `.xlsx` | 작도자 지시서 겸 consistency-check 입력 |
| 사건별 config.json | 재실행·수정용으로 보존 |

## 후속 스킬 연동

- **kr-patent-symbol-design** (선행): 부호 골격 확정
- **kr-patent-drawing-mapping** (선행·선택): 박스↔부호 매핑 지시서. 본 스킬 config의 원천
- **kr-patent-spec-drafting**: 태깅된 부호를 본문에서 "수신부(110)" 식으로 인용
- **kr-patent-consistency-check**: 매핑표 전 부호의 본문 최소 1회 등장 검증
- 출원용 TIFF 필요 시 `topatent` 명령 (PNG→1-bit Group4 600DPI)

## 컴파운딩 루프 (개선 메모)

### 누적 학습 항목
- (2026-07-03, 사건 C) 초판을 "내부 우측 중앙" 고정 배치로 만들면 중앙정렬
  라벨이 넓은 박스에서 대량 겹침 발생 → 충돌감지 폴백이 필수. 첫 실행부터 폴백 체인 사용.
- (2026-07-03, 사건 C) 그룹 멤버 a/b/c 접미 부호(250a/250b/250c)는 스택 박스
  간격이 좁아 배치 불가 + 한국 실무상 불필요 → 그룹 대표 부호 1개 방식으로 전환.
- (2026-07-03, 사건 C) MISS 0·원거리 0 리포트여도 배치 겹침은 잡지 못함 —
  자동 리포트는 매칭 품질만 보장하므로 육안 검증 단계 생략 금지.
- (2026-07-07, 사건 C) 사용자가 정식 작도본(사건 B tif)을 보고 "이렇게 태깅"
  요청 → 인라인 숫자가 아니라 **박스 외부 숫자 + 구불선 지시선**이 KIPO 작도 관행.
  tag_drawings_leader.py(v2)로 전면 재태깅. 무부호 원본(src_dir)이 남아 있으면 지우기 작업
  없이 재생성이 가장 깨끗 — 원본 폴더는 보존할 것.
- (2026-07-07) 점선그룹 테두리 추정은 union 가장자리에서 큰 공백을 만나면 스캔 중단해야 함
  (도7에서 위쪽 별개 실선 박스를 점선 테두리로 오인했었음 → gap-stop 스캔으로 수정).
- (2026-07-07) 지시선이 점선 테두리를 가로질러 내부 박스에 닿는 것은 정상 관행(레퍼런스의
  201/121 스타일) — path 충돌로 forced 플래그가 떠도 육안 정상이면 납품 가능.
- (2026-07-07) 이미지 가장자리에 붙은 최우측 박스(260류)·최상단/최좌측 점선그룹은
  pad_right/pad_top/pad_left 캔버스 확장 없이는 부호가 잘림. 특허 도면에서 여백 추가는
  자유이므로 pad 확장이 정답.
- (2026-07-07, 사건 C) **도면의 drawio 소스가 존재하면 PNG 픽셀 오버레이가 아니라
  drawio XML 자체에 부호 텍스트 셀 + 지시선 엣지를 삽입할 것** — 사용자가 나중에 drawio에서
  도면을 수정·재내보내기 해도 부호가 유지된다. 방법: reftag 텍스트 셀(fontStyle=1) 재배치 +
  `curved=1;endArrow=none` 엣지에 S-곡선 waypoint 2개(수직벡터 ±6 오프셋)로 구불선 근사.
  드로잉 좌표는 XML mxGeometry에서 직접 취득(박스 라벨/id로 매칭), 캔버스가 무한이라 pad 불필요.
  검증은 draw.io CLI 내보내기: `draw.io.exe -x -f png -s 3 -b 20 -o out.png in.drawio`.
  실전 스크립트: 대학 고객 사건 사건폴더 `도면부호태깅\add_leaders_drawio.py` (per-figure SPEC 방식).
