Merge origin/master with current Pierzainer development

Preserve local abutment, cast-in-place rebar and compact header features alongside remote drawing, ground-link and quantity workspaces. Adapt drawing and takeoff consumers to generated solplate plans, retain current P1 regression coverage, and resolve bearing-detail annotation collisions.

Validation: 122 test files / 975 tests passed; production build passed; 10 browser integration checks passed.
This commit is contained in:
ypshim committed 2026-11-06 17:10:33 +09:00
commit f51865c57b
2645 files changed
+64918 -4910

No files matched your search

+4 -3
View File
@@ -50,11 +50,12 @@ export interface ColumnInput {
* the other values stay as in COLUMN_P1.
*/
export function columnInputFor(model: PierModel, base: ColumnInput = COLUMN_P1, columnIndex = 0): ColumnInput {
if (!model.footings.length) throw new Error('현장타설말뚝 기둥은 전용 배근 입력을 사용합니다. 확대기초 정착 규칙은 적용하지 않습니다.');
// No footing (현장타설말뚝, merged 2026-11-06 with origin's guard): Hc still runs to the column bottom (= 지반고) and Hf is 0.
// The cast-in-place rebar itself comes from cast-layout.ts; callers only use the footing rules when a footing exists.
const col = model.columns[columnIndex];
const globalS = col.s + model.stretches[col.k].base;
const seg = model.segments.find((g) => globalS >= g.s0 - 1e-9 && globalS <= g.s1 + 1e-9) ?? model.segments[0];
const footing = model.footings.find(f => f.k === col.k && Math.abs(f.s - col.s) <= f.length / 2)!;
const footing = model.footings.find(f => f.k === col.k && Math.abs(f.s - col.s) <= f.length / 2);
const Hc = Math.round((col.top - col.bottom) * 1000 * 10) / 10;
const hcop = Math.round((seg.top - col.top) * 1000 * 10) / 10;
// C3 (상면 3단) = the lowest coping top −127 (C1 cover) −2·s_lay (상면 주철근 단 간격 input); P1 was 43.170 at 57.2.
@@ -64,7 +65,7 @@ export function columnInputFor(model: PierModel, base: ColumnInput = COLUMN_P1,
// e_top: the coping middle level (Level 하면 + 계단 상면)/2 is the top of P3 and P6 (승인 2026-10-23).
const eTop = Math.round((seg.top - (col.top + seg.top) / 2) * 10000) / 10;
return { ...base, ...model.columnRebar, footing: model.footingRebar, Hc, hcop, eP1, eTop, D: model.columnDiameterMm,
Hf: (footing.top - footing.bottom) * 1000, bothEndZones: model.columns.length > 1 };
Hf: footing ? (footing.top - footing.bottom) * 1000 : 0, bothEndZones: model.columns.length > 1 };
}
export const COLUMN_P1: ColumnInput = {