fix(floor-plan): PDF 외곽선 추출 기준을 지붕 투영면 → 1층 외벽 외주(壁芯)로 변경

[작업내용] :
- 캔버스 '외벽선'은 벽면인데 프롬프트가 처마(軒の出) 포함 지붕 투영면을 추출해 평면도 치수보다 사방 처마 출폭만큼 길게 표시되던 문제 수정 (2026-05-29 지붕투영면 결정을 사용자 지시로 번복)
- BASE_PROMPT: 平面図(1F) 외벽 외주를 치수선(壁芯) 기준으로 추출, 처마·케라바 가산 금지, 屋根伏図는 지붕형상 판별·처마 출폭 확인용(평면도 부재 시 軒の出 감산 fallback), 포치·발코니 제외
- buildPrompt 페이지 힌트 문구도 외벽 외곽선 기준으로 정합
- 실호출 검증(박공지붕_1.pdf): 양 provider(fable-5/gemini-3.1) 정점 단위 동일 10점 폴리곤, 면적 72.0㎡ = 求積図 구획 합계 일치, 처마 가산 소멸

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
nalpari 2026-07-02 15:02:17 +09:00
parent 22d690655b
commit 584c0a3238

View File

@ -28,15 +28,16 @@ const isRateLimited = (key) => {
return false return false
} }
const BASE_PROMPT = `당신은 일본 주택 건축 도면에서 "지붕 투영면(屋根伏図 footprint)" 외곽선을 추출하는 전문가입니다. const BASE_PROMPT = `당신은 일본 주택 건축 도면에서 1층 외벽(外壁) 외곽선을 추출하는 전문가입니다.
첨부된 PDF 에서 지붕을 위에서 내려다본 외곽(처마 끝선 포함) 폴리곤 좌표를 추출하여 JSON 으로만 응답하세요. 첨부된 PDF 에서 건물을 위에서 내려다본 1 외벽 외주 폴리곤 좌표를 추출하여 JSON 으로만 응답하세요.
[도면 종류 식별 매우 중요] [도면 종류 식별 매우 중요]
- 추출 대상: 屋根伏図(지붕평면도) 있으면 지붕 외곽선(처마/軒先·케라바/ケラバ 끝선 포함) 사용합니다. - 추출 대상: 平面図(1/1 평면도) 외벽 외주 폴리곤입니다. 치수선(寸法線) 적힌 숫자(통상 壁芯 기준) 일치하도록 좌표를 구성하세요.
- 屋根伏図 없으면 平面図(1/1 평면도) 외벽 외주에 처마 출폭(軒の出) 더한 지붕 투영 외곽을 추정합니다. - 처마(軒の出/軒先)·케라바(ケラバ) 지붕 돌출분을 절대 더하지 마세요. 지붕 투영면이 아니라 벽면 외곽을 추출합니다.
- 平面図 없고 屋根伏図(지붕평면도) 있으면, 지붕 외곽의 변에서 도면에 적힌 처마 출폭(軒の出) 빼서 외벽 외주를 추정합니다.
- 절대 사용 금지: 立面図(입면도)·配置図(배치도)·求積図(면적도)·断面図(단면도). 도면들에서는 윤곽을 추출하지 마세요. - 절대 사용 금지: 立面図(입면도)·配置図(배치도)·求積図(면적도)·断面図(단면도). 도면들에서는 윤곽을 추출하지 마세요.
- 도머(ドーマー)·천창·개구부(開口部) 지붕 돌출/구멍은 외곽선에 포함하지 마세요(외곽 윤곽이 아닙니다). - 현관 포치·バルコニー 외벽 몸체 바깥의 부속 돌출과 도머(ドーマー)·천창 지붕 요소는 외곽선에 포함하지 마세요.
- 평면도가 여러 층이면 1(1F) 기준으로 지붕 투영을 판단합니다. - 평면도가 여러 층이면 1(1F) 외벽을 기준으로 합니다.
[축척·치수 결정 우선순위] [축척·치수 결정 우선순위]
1. 도면에 적힌 寸法線(치수선) 실제 mm 숫자를 최우선 근거로 좌표를 환산합니다. 1. 도면에 적힌 寸法線(치수선) 실제 mm 숫자를 최우선 근거로 좌표를 환산합니다.
@ -52,7 +53,7 @@ const BASE_PROMPT = `당신은 일본 주택 건축 도면에서 "지붕 투영
4. 자기교차가 없는 단순 폴리곤이어야 하며, 정점은 3 이상이어야 합니다. 4. 자기교차가 없는 단순 폴리곤이어야 하며, 정점은 3 이상이어야 합니다.
5. L자·凹凸(요철) 평면의 모든 꺾임을 정점으로 보존하고, 직각(直角) 가까운 코너는 직각으로 간주합니다(비스듬히 근사 금지). 5. L자·凹凸(요철) 평면의 모든 꺾임을 정점으로 보존하고, 직각(直角) 가까운 코너는 직각으로 간주합니다(비스듬히 근사 금지).
6. 분리된 복수 () 있으면 가장 건물 하나만 반환하고, 별동은 notes 기재합니다. 6. 분리된 복수 () 있으면 가장 건물 하나만 반환하고, 별동은 notes 기재합니다.
7. 지붕 투영을 추출할 없으면 outerline 배열로 반환하고 notes 사유를 적습니다. 7. 외벽 외주를 추출할 없으면 outerline 배열로 반환하고 notes 사유를 적습니다.
[지붕형상 판독 屋根伏図 ·軒先 + 立面図 보조] [지붕형상 판독 屋根伏図 ·軒先 + 立面図 보조]
- 屋根伏図의 (용마루) 위치·개수와 軒先(처마) 흘러내리는 방향으로 지붕 유형을 판별합니다. - 屋根伏図의 (용마루) 위치·개수와 軒先(처마) 흘러내리는 방향으로 지붕 유형을 판별합니다.
@ -90,13 +91,13 @@ const buildPrompt = ({ pageMode, facadePages, floorPages, splitInfo } = {}) => {
if (splitInfo.floorCount > 0) segs.push(`평면도/지붕평면도 ${splitInfo.floorCount}`) if (splitInfo.floorCount > 0) segs.push(`평면도/지붕평면도 ${splitInfo.floorCount}`)
if (splitInfo.facadeCount > 0) segs.push(`입면도 ${splitInfo.facadeCount}`) if (splitInfo.facadeCount > 0) segs.push(`입면도 ${splitInfo.facadeCount}`)
const compo = `첨부 PDF 는 ${segs.join('과 ')}으로 구성됩니다(평면도가 앞).` const compo = `첨부 PDF 는 ${segs.join('과 ')}으로 구성됩니다(평면도가 앞).`
return `${BASE_PROMPT}\n\n${compo}곽선은 평면도/지붕평면도 페이지에서 추출하세요. 입면도 페이지는 외곽선 추출에 쓰지 말고, 높이·층수와 지붕 棟방향·경사 방향(지붕형상 판별) 참고로만 사용하세요.` return `${BASE_PROMPT}\n\n${compo}벽 외곽선은 평면도 페이지에서 추출하세요(지붕평면도 페이지는 지붕형상 판별·처마 출폭 확인용). 입면도 페이지는 외곽선 추출에 쓰지 말고, 높이·층수와 지붕 棟방향·경사 방향(지붕형상 판별) 참고로만 사용하세요.`
} }
if (pageMode === 'specify' && (facadePages || floorPages)) { if (pageMode === 'specify' && (facadePages || floorPages)) {
const hints = [] const hints = []
if (floorPages) hints.push(`평면도(平面図)·지붕평면도(屋根伏図) 페이지: ${floorPages}`) if (floorPages) hints.push(`평면도(平面図)·지붕평면도(屋根伏図) 페이지: ${floorPages}`)
if (facadePages) hints.push(`입면도(立面図) 페이지: ${facadePages}`) if (facadePages) hints.push(`입면도(立面図) 페이지: ${facadePages}`)
return `${BASE_PROMPT}\n\n페이지 힌트: ${hints.join(' / ')}. 입면도 페이지는 외곽선 추출에 쓰지 말고 높이·층수와 지붕 棟방향·경사 방향(지붕형상 판별) 참고로만 사용하세요. 지붕 투영 외곽선은 지정된 평면도/지붕평면도 페이지 기준으로 추출하세요.` return `${BASE_PROMPT}\n\n페이지 힌트: ${hints.join(' / ')}. 입면도 페이지는 외곽선 추출에 쓰지 말고 높이·층수와 지붕 棟방향·경사 방향(지붕형상 판별) 참고로만 사용하세요. 외벽 외곽선은 지정된 평면도 페이지 기준으로 추출하세요(지붕평면도 페이지는 지붕형상 판별·처마 출폭 확인용).`
} }
return BASE_PROMPT return BASE_PROMPT
} }