feat(shape): 교좌면 EL로 받침별 코핑 상면 계단을 만든다 (W10은 정보)
입력 교좌면 EL이 있으면 그 받침 구간의 코핑 상면 = 교좌면 EL (없으면 z − h1 / z − h2). 받침블럭 바닥과 코핑 상면이 항상 맞아 블럭이 뜨거나 묻히지 않는다. seatCalc는 기울기 계산값으로 남겨 W10 비교 기준으로 쓰고, W10은 경고(W)에서 정보(I)로 바꾼다. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4ef8412d89
commit
8aedc9b969
4 files changed
+35
-7
No files matched your search
@@ -337,13 +337,15 @@ export function buildPier(input: PierInput, ctx: PierContext = {}): PierModel {
|
||||
bounds.push((frontPlaced[k].g + frontPlaced[k + 1].g) / 2);
|
||||
}
|
||||
bounds.push(L);
|
||||
const segments: Segment[] = frontPlaced.map((b, k) => ({ s0: bounds[k], s1: bounds[k + 1], top: b.z - h1 }));
|
||||
// 교좌면 EL per bearing (2026-11-10): when given, it is the coping top of that bearing's step; otherwise z − h1 (z − h2 behind).
|
||||
const seatOf = new Map(input.bearings.map((r) => [r.no, r.seatEl]));
|
||||
const segments: Segment[] = frontPlaced.map((b, k) => ({ s0: bounds[k], s1: bounds[k + 1], top: seatOf.get(b.no) ?? b.z - h1 }));
|
||||
|
||||
// Lateral step (spec §4.3, Q1·Q2 추천안): front and back tops differ by 5 mm or more in some segment.
|
||||
const backSegments: Segment[] = backPlaced.map((b,k) => ({
|
||||
s0: unequalRows ? (k === 0 ? 0 : (backPlaced[k-1].g+b.g)/2) : segments[k].s0,
|
||||
s1: unequalRows ? (k === backPlaced.length-1 ? L : (b.g+backPlaced[k+1].g)/2) : segments[k].s1,
|
||||
top: b.z-h2,
|
||||
top: seatOf.get(b.no) ?? b.z-h2,
|
||||
}));
|
||||
const stepBounds = [...new Set([0,L,...segments.slice(1).map(s=>s.s0),...backSegments.slice(1).map(s=>s.s0)])].sort((a,b)=>a-b);
|
||||
const stepSamples = stepBounds.slice(1).map((end,k)=>(stepBounds[k]+end)/2);
|
||||
@@ -478,9 +480,9 @@ export function buildPier(input: PierInput, ctx: PierContext = {}): PierModel {
|
||||
};
|
||||
const dropOf = (no: number) => soles.get(no)!.dropMm / 1000;
|
||||
// 교좌면 EL (2026-11-03): when the input gives it, the block bottom is that EL; otherwise the 두부보 상면 slope.
|
||||
const seatOf = new Map(input.bearings.map((r) => [r.no, r.seatEl]));
|
||||
// seatCalc stays the slope value (z − h1, z − h2) as the W10 reference.
|
||||
frontPlaced.forEach((b) => {
|
||||
const seatCalc = segmentTop(segments, b.g);
|
||||
const seatCalc = b.z - h1;
|
||||
const bottom = seatOf.get(b.no) ?? seatCalc;
|
||||
const skew = skewOf(b.no, b.k), drop = dropOf(b.no);
|
||||
blocks.push({ no: b.no, row: '전열', k: b.k, s: b.s, g: b.g, n: b.n, bottom, top: b.z - DIM.padThickness - drop, padTop: b.z - drop, rowSkewDeg: skew, plan: planOf(b.no, b.k, skew), seatCalc });
|
||||
|
||||
@@ -48,6 +48,7 @@ export function validateInput(input: PierInput, issues: Issue[]): boolean {
|
||||
/** Geometry-level checks (spec §10 W01–W05, W07, I01) on a built model. */
|
||||
export function validatePier(input: PierInput, model: PierModel, issues: Issue[]): void {
|
||||
// W10 (2026-11-03): the input 교좌면 EL should match the 두부보 상면 slope within 5 mm; the input wins.
|
||||
// Since 2026-11-10 the input also sets the coping top of that step, so this is information (I), not a warning.
|
||||
for (const b of model.blocks) {
|
||||
const seat = input.bearings.find((r) => r.no === b.no)?.seatEl;
|
||||
if (seat === undefined) continue;
|
||||
@@ -55,9 +56,9 @@ export function validatePier(input: PierInput, model: PierModel, issues: Issue[]
|
||||
if (Math.abs(diffMm) > 5) {
|
||||
issues.push({
|
||||
code: 'W10',
|
||||
level: 'W',
|
||||
level: 'I',
|
||||
pier: input.name,
|
||||
message: `${b.row} 받침 ${b.no}번 교좌면 EL ${seat.toFixed(3)}은(는) 두부보 상면 계산값 ${b.seatCalc.toFixed(3)}과 ${diffMm.toFixed(1)} mm 차이가 납니다 (허용 5 mm). 입력값을 씁니다.`,
|
||||
message: `${b.row} 받침 ${b.no}번 교좌면 EL ${seat.toFixed(3)}은(는) 두부보 상면 계산값 ${b.seatCalc.toFixed(3)}과 ${diffMm.toFixed(1)} mm 차이가 납니다 (허용 5 mm). 입력값으로 받침블럭 바닥과 코핑 상면을 만듭니다.`,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user