feat(shape): 다주형 코핑 하면을 오목형으로 (Level D+200 · 오목 500 · 헌치 1500)

spec §3·§4.4(2026-11-06 개정)와 3주형형상배근.md §2.2(2주형 DWG 실측)를 따른다.
- 기둥 사이 하면: Level 끝에서 헌치 수평 1500 동안 500 올라가 평탄, 다음 기둥 앞에서 내려옴
  (이전 Level + 300, 헌치 300 × 300 대체)
- 다주형 Level 폭 기본값 = D + 200 (입력값이 있으면 입력 우선). T형은 2100 유지
- 오목 평탄부가 없으면 RB-M01 오류
- 3주형 테스트는 오목형이 성립하는 20 m 코핑으로 바꿈 (P1 길이 12 m는 RB-M01)
- 2주형 DWG 치수(L 24200, D 3000) 하면 꺾임점 테스트 추가

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Opus 5.5 committed 2026-11-06 14:11:15 +09:00
1 parent 42316104df
commit 370bd3d7cd
8 files changed
+79 -34

No files matched your search

+4 -3
View File
@@ -36,7 +36,8 @@ fs.mkdirSync(out, { recursive: true });
const buf = await (await fetch('/samples/' + encodeURIComponent('운곡교P1입력.xlsx'))).arrayBuffer();
const base = parseWorkbook(XLSX.read(buf)).piers.find(p => p.name === 'P1');
if (!base) throw new Error('P1 sample missing');
const m = buildPier({ ...base, type: ${JSON.stringify(type)}, columnCount: ${type === '2주형' ? 2 : 3} });
// 3주형 needs a 20 m coping for the 오목형 spans (P1 length leaves no flat part, RB-M01).
const m = buildPier({ ...base, ...(${type === '3주형'} ? { copingLengthMm: 20000 } : {}), type: ${JSON.stringify(type)}, columnCount: ${type === '2주형' ? 2 : 3} });
const built = buildPierScene(m);
const scene = new THREE.Scene(); scene.background = new THREE.Color(0xe9eef4);
const group = new THREE.Group();
@@ -58,11 +59,11 @@ fs.mkdirSync(out, { recursive: true });
document.body.replaceChildren(renderer.domElement); document.body.style.margin = '0';
renderer.render(scene,camera);
const profile = m.copingParts[0].profile;
const raised = profile.filter(([,z]) => Math.abs(z-m.levelBottom-0.3)<1e-8).length;
const raised = profile.filter(([,z]) => Math.abs(z-m.levelBottom-0.5)<1e-8).length;
if (raised !== (m.columns.length-1)*2) throw new Error('Raised span count mismatch');
if (Math.abs(Math.min(...profile.map(p=>p[1]))-m.levelBottom)>1e-8) throw new Error('Underside below column Level');
if (!m.columns.every(c=>c.top===m.levelBottom)) throw new Error('Column connection changed');
return { type: ${JSON.stringify(type)}, raisedVertices: raised, levelBottom:m.levelBottom, interiorBottom:m.levelBottom+0.3, columns:m.columns.length, profile, screenshot:renderer.domElement.toDataURL('image/png') };
return { type: ${JSON.stringify(type)}, raisedVertices: raised, levelBottom:m.levelBottom, interiorBottom:m.levelBottom+0.5, columns:m.columns.length, profile, screenshot:renderer.domElement.toDataURL('image/png') };
})()
` });
if (res.exceptionDetails) throw new Error(res.exceptionDetails.exception?.description || res.exceptionDetails.text);