kr-patent-drawing-tagging · diff
git:20260915.0d6e604 to git:20260916.c7222d1
15 added, 0 removed. Audit A to A.
---
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 부분(22) 획득 (S131)" 같은 표기는 금지이고,
+ 박스 안에는 "제2 부분 획득"만 두고 22와 S131은 박스 밖에 지시선(물결) 태그로 뺀다.
+ **흐름도의 단계부호(S110, S341 등)도 예외 없이 밖으로 뺀다.**
+
+ 부호를 박스 텍스트에 섞으면 도면 텍스트와 명세서 부호 매핑 검증이 어려워지고 KIPO 도면 관행에서도 벗어난다.
+ 위 Step 3의 (a) 인라인 스타일은 검토용 시안에만 쓰고, **출원본은 (b) KIPO 정식 작도 스타일**로 낸다.
+
+ - **흐름도**: 단계부호는 주 컬럼 박스의 **좌측 바깥**(dx ≈ -62), 우측 분기 박스는 우측 바깥. 좌측은 대개 비어 있어 충돌이 없다.
+ - **여러 항목이 줄로 나열된 박스**(표 형태 개념도, 범례)는 각 줄의 y 높이에 맞춰 태그를 배치하면 지시선이 그 줄에서 나가 항목별 부호로 읽힌다. 줄 사이를 벌려 태그 간격 40px를 확보한다.
+ - **화살표가 드나드는 변에는 태그를 두지 않는다**(지시선이 화살표에 물린다). 유입 화살표가 상단 중앙이면 태그는 상단 좌측(dx ≈ 0.16w)으로.
+ - **요소 부호는 그 요소를 실제로 그린 박스에 붙인다.** 흐름도 단계 문장 안의 언급은 부호 없이 서술만 남긴다.
+ - 한 박스에 태그 2개 이상 금지. **흐름도 단계 박스는 S부호만** 단다(좌측 S부호 + 우측 요소 부호 조합도 위반). 요소 부호가 필요하면 옆에 실제 객체 박스를 세워 거기 단다.
+
## 부호 설계 연동 규칙 (실전 검증)
- 방법 단계: 전체 흐름도(도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 방식).