한국 특허 도면부호 태깅 (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. 실행
두 가지 스타일 엔진 중 선택:
# (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로 변환하여 태깅본과 같은 폴더에 저장:
구분(시스템/데이터/방법 단계) | 부호 | 명칭 | 등장 도면 | 관련 청구항.
배치 엔진 (스크립트 내장 규칙)
- 박스 검출: threshold(200) 반전 → findContours → 크기 필터(폭 ≥ max(80px, 3%W),
높이 ≥ max(40px, 4%H)) → IoU>0.75 중복 제거(테두리 이중 컨투어 해소). 점선 박스는
검출되지 않음(의도된 동작 — 그룹은 멤버 union으로 처리).
- 충돌감지 폴백 배치: 후보 위치를 순서대로 시도하고, 원본 이미지의 어두운 픽셀
(<128) 또는 기존 라벨과 겹치면 다음 후보로:
내부 우측 중앙 → 내부 우하단 → 내부 우상단 → 외부 상단 우측 → 외부 하단 우측 → 외부 우측.
중앙정렬 라벨이 넓은 박스에서도 안전.
- 그룹 대표 부호: 점선 그룹의 A/B/C 인스턴스 박스에 a/b/c 접미 부호를 달지 말고
그룹 우상단 외측에 대표 부호 1개. 쌍 개념 그룹은
"250, 251" 병기.
- 폰트: 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 방식).
1---2name: kr-patent-drawing-tagging3description: 한국 특허 도면 PNG에 도면부호를 직접 그려 넣는(태깅하는) 스킬. 확정된 부호 체계 (kr-patent-symbol-design)와 박스별 매핑(kr-patent-drawing-mapping의 지시서)을 입력받아, cv2 박스 자동검출 + 어두운 픽셀 충돌감지 폴백 배치로 부호 텍스트를 도면 이미지 위에 삽입하여 태깅본 PNG를 생성한다. 매핑표(md+xlsx)까지 함께 산출. "도면에 부호 넣어줘", "도면부호 태깅", "PNG에 부호 삽입", "태깅본 만들어", "부호 그려 넣어", "도면에 번호 박아줘", "reference numeral overlay" 같은 표현이 보이거나, 무부호 블록도/흐름도 도면에 부호를 입혀 출원용 도면을 만들려는 맥락에서 사용. (부호 체계 설계=symbol-design, 박스↔부호 매핑표만=drawing-mapping, 본 스킬=이미지에 실제 삽입.)4---56# 한국 특허 도면부호 태깅 (PNG 직접 삽입)78## 무엇을 하는가910무부호 도면 PNG(블록도·파이프라인도·흐름도)에 도면부호를 **이미지 위에 직접 그려 넣어**11태깅본 PNG를 만든다. 검증된 파이프라인 (사건 C, 도면 14장 / 부호 98개 실전 검증):1213```14도면 시각 판독 → 부호 체계 확정 → 도면별 anchor 설정(JSON) 작성15→ scripts/tag_drawings.py 실행 (cv2 박스검출 + 최근접 매칭 + 충돌감지 배치)16→ 태깅본 전수 육안 검증 (Read로 이미지 확인) → 어긋난 도면만 설정 수정 후 재실행17→ 부호매핑표 md/xlsx 산출18```1920## 작업 순서2122### Step 1. 입력 확보23- 도면 PNG 폴더 (숫자 파일명 `1.png`, `2.png`, … 권장)24- 확정된 부호 체계 (없으면 kr-patent-symbol-design 먼저 호출)25- **모든 도면을 Read로 시각 판독**하여 각 박스의 위치를 파악해 둔다 (anchor 좌표의 근거).2627### Step 2. 설정 JSON 작성2829`examples/example_config.json` 을 복사하여 사건별로 작성. 도면마다:3031| 필드 | 의미 |32|---|---|33| `solo` | 태깅할 단독 박스 `[fx, fy, "부호"]` — fx/fy는 박스 중심의 이미지 폭·높이 대비 비율(0~1). 시각 판독 시 표시 좌표 ÷ 표시 크기로 추정 |34| `cyl` | 실린더(DB 등) — 내부 하단 중앙에 배치 |35| `container` | 최대 면적 박스(예: 제어부 컨테이너) 부호 — 내부 우상단 |36| `groups` | 점선 그룹: `sym`(대표 부호), `members`(멤버 박스 locator 좌표 — 검출 소진용, 무부호), `tagged`(예외적으로 부호 붙일 멤버 `[idx, "부호"]`) |37| `copy_only` | true면 무수정 복사 (부호가 이미 인쇄된 도면) |3839anchor는 대략적이어도 된다 — 스크립트가 검출 박스와 **최근접 매칭**하므로 박스 중심에서40다소 어긋나도 올바르게 붙는다. 박스가 밀집한 도면만 정확히.4142### Step 3. 실행4344두 가지 스타일 엔진 중 선택:4546```bash47# (a) 인라인 스타일 — 박스 내부 라벨 옆에 숫자48python scripts/tag_drawings.py --config <사건별 config.json>4950# (b) KIPO 정식 작도 스타일 — 박스 외부 숫자 + 구불선 지시선 (레퍼런스: 사건 B 작도본)51python scripts/tag_drawings_leader.py --config <사건별 config.json>52```5354leader 엔진(v2) config 확장: figure별 `pad_top/left/right/bottom`(캔버스 여백 확장 px),55solo 항목 4번째 요소로 배치 방향(`above/below/right/right_upper/left/above_left`),56groups에 `"sides"`, tagged 항목 3번째 요소로 방향 지정. 1차 실행 리포트의 강제배치(False)57항목을 보고 pad·방향을 넣어 재실행하는 2-pass가 표준. 실전 config:58`대학 고객 사건\사건 C_사건수임\도면부호태깅\config_leader.json`5960- 출력: `out_dir\도NN.png` + 콘솔에 도면별 부호 수·문제 리포트61- 한글 경로의 cv2 imread 실패 → 스크립트가 `np.fromfile + imdecode`로 처리 (내장됨)6263### Step 4. 전수 육안 검증 (필수)6465태깅본 전부를 Read로 열어 (1) 부호가 올바른 박스에 붙었는지, (2) 라벨 텍스트와 겹치지66않는지 확인. 문제 도면만 anchor 수정 후 재실행. **검증 없이 납품 금지.**6768### Step 5. 매핑표 산출6970부호매핑표(md)를 작성하고 xlsx로 변환하여 태깅본과 같은 폴더에 저장:71구분(시스템/데이터/방법 단계) | 부호 | 명칭 | 등장 도면 | 관련 청구항.7273## 배치 엔진 (스크립트 내장 규칙)74751. **박스 검출**: threshold(200) 반전 → findContours → 크기 필터(폭 ≥ max(80px, 3%W),76 높이 ≥ max(40px, 4%H)) → IoU>0.75 중복 제거(테두리 이중 컨투어 해소). 점선 박스는77 검출되지 않음(의도된 동작 — 그룹은 멤버 union으로 처리).782. **충돌감지 폴백 배치**: 후보 위치를 순서대로 시도하고, 원본 이미지의 어두운 픽셀79 (<128) 또는 기존 라벨과 겹치면 다음 후보로:80 내부 우측 중앙 → 내부 우하단 → 내부 우상단 → 외부 상단 우측 → 외부 하단 우측 → 외부 우측.81 중앙정렬 라벨이 넓은 박스에서도 안전.823. **그룹 대표 부호**: 점선 그룹의 A/B/C 인스턴스 박스에 a/b/c 접미 부호를 달지 말고83 그룹 우상단 외측에 대표 부호 1개. 쌍 개념 그룹은 `"250, 251"` 병기.844. **폰트**: malgunbd.ttf, 크기 = max(28, min(W/90, 박스높이×0.40)).8586## 부호 설계 연동 규칙 (실전 검증)8788- 방법 단계: 전체 흐름도(도2류)의 인쇄된 S110~S160은 그대로 두고(`copy_only`),89 세부 도면의 연산 박스는 **도면별 SN10 방식**(도3→S310·S320…, 도12→S1210…)이90 슬롯 고갈 없이 확장 가능.91- 동일 객체·동일 연산은 도면이 달라도 **같은 부호 재사용** (예: 후행 판정 S410이92 도4·도5 양쪽 등장). 단, 청구항 한정이 다른 유사 연산은 별도 부호 (도3 선별 S34093 vs 도4 유효후보 선별 S420 — 청구항 2 vs 3).94- 단계 부호(S)는 동사형(연산) 박스에만, 숫자 부호는 명사형(데이터·장치) 박스에만.95- 데이터 계열은 200번대로 파이프라인 순서에 맞춰 십 단위 그룹화(210 영상 → 240 캡션96 → 260 실제 용어 → 290 진척도), 장치·자원은 100번대.9798## 산출물99100| 산출물 | 비고 |101|---|---|102| `도면부호태깅\도NN.png` | 태깅본 (원본 무수정 보존) |103| `부호매핑표.md` / `.xlsx` | 작도자 지시서 겸 consistency-check 입력 |104| 사건별 config.json | 재실행·수정용으로 보존 |105106## 후속 스킬 연동107108- **kr-patent-symbol-design** (선행): 부호 골격 확정109- **kr-patent-drawing-mapping** (선행·선택): 박스↔부호 매핑 지시서. 본 스킬 config의 원천110- **kr-patent-spec-drafting**: 태깅된 부호를 본문에서 "수신부(110)" 식으로 인용111- **kr-patent-consistency-check**: 매핑표 전 부호의 본문 최소 1회 등장 검증112- 출원용 TIFF 필요 시 `topatent` 명령 (PNG→1-bit Group4 600DPI)113114## 컴파운딩 루프 (개선 메모)115116### 누적 학습 항목117- (2026-07-03, 사건 C) 초판을 "내부 우측 중앙" 고정 배치로 만들면 중앙정렬118 라벨이 넓은 박스에서 대량 겹침 발생 → 충돌감지 폴백이 필수. 첫 실행부터 폴백 체인 사용.119- (2026-07-03, 사건 C) 그룹 멤버 a/b/c 접미 부호(250a/250b/250c)는 스택 박스120 간격이 좁아 배치 불가 + 한국 실무상 불필요 → 그룹 대표 부호 1개 방식으로 전환.121- (2026-07-03, 사건 C) MISS 0·원거리 0 리포트여도 배치 겹침은 잡지 못함 —122 자동 리포트는 매칭 품질만 보장하므로 육안 검증 단계 생략 금지.123- (2026-07-07, 사건 C) 사용자가 정식 작도본(사건 B tif)을 보고 "이렇게 태깅"124 요청 → 인라인 숫자가 아니라 **박스 외부 숫자 + 구불선 지시선**이 KIPO 작도 관행.125 tag_drawings_leader.py(v2)로 전면 재태깅. 무부호 원본(src_dir)이 남아 있으면 지우기 작업126 없이 재생성이 가장 깨끗 — 원본 폴더는 보존할 것.127- (2026-07-07) 점선그룹 테두리 추정은 union 가장자리에서 큰 공백을 만나면 스캔 중단해야 함128 (도7에서 위쪽 별개 실선 박스를 점선 테두리로 오인했었음 → gap-stop 스캔으로 수정).129- (2026-07-07) 지시선이 점선 테두리를 가로질러 내부 박스에 닿는 것은 정상 관행(레퍼런스의130 201/121 스타일) — path 충돌로 forced 플래그가 떠도 육안 정상이면 납품 가능.131- (2026-07-07) 이미지 가장자리에 붙은 최우측 박스(260류)·최상단/최좌측 점선그룹은132 pad_right/pad_top/pad_left 캔버스 확장 없이는 부호가 잘림. 특허 도면에서 여백 추가는133 자유이므로 pad 확장이 정답.134- (2026-07-07, 사건 C) **도면의 drawio 소스가 존재하면 PNG 픽셀 오버레이가 아니라135 drawio XML 자체에 부호 텍스트 셀 + 지시선 엣지를 삽입할 것** — 사용자가 나중에 drawio에서136 도면을 수정·재내보내기 해도 부호가 유지된다. 방법: reftag 텍스트 셀(fontStyle=1) 재배치 +137 `curved=1;endArrow=none` 엣지에 S-곡선 waypoint 2개(수직벡터 ±6 오프셋)로 구불선 근사.138 드로잉 좌표는 XML mxGeometry에서 직접 취득(박스 라벨/id로 매칭), 캔버스가 무한이라 pad 불필요.139 검증은 draw.io CLI 내보내기: `draw.io.exe -x -f png -s 3 -b 20 -o out.png in.drawio`.140 실전 스크립트: 대학 고객 사건 사건폴더 `도면부호태깅\add_leaders_drawio.py` (per-figure SPEC 방식).