횡단설계(B06) 다음을 상세설계 → 수량산출 → 설계도서 순으로 재배열하고, 폴더 번호가 흐름과 일치하도록 이름을 맞바꾼다. - B08_DesignDetail → B07_DesignDetail, B07_Quantity → B08_Quantity (파일 접두어·식별자·라우트·locale 키 전량 스왑) - STAGE_KEYS 4=DESIGN_DETAIL, 5=QUANTITY 스왑 + 라우터 stage 리터럴 교체 - CAD 마운트 /b08-cad → /b07-cad (main.py·vite proxy·iframe URL), openwebcad Toolbar 라벨 B07로 수정 후 재빌드 - 유지: openwebcad postMessage 프로토콜 aislo:b08:*·패키지명(내부 식별자) - 기존 프로젝트 storage 폴더 rename + project_manifest 갱신, DB project_workflow_stages stage_no 4↔5 행 스왑 완료 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
export function containRectangle(
|
|
containedRectMinX: number,
|
|
containedRectMinY: number,
|
|
containedRectMaxX: number,
|
|
containedRectMaxY: number,
|
|
wrapperRectMinX: number,
|
|
wrapperRectMinY: number,
|
|
wrapperRectMaxX: number,
|
|
wrapperRectMaxY: number,
|
|
): { minX: number; minY: number; maxX: number; maxY: number } {
|
|
// Calculate the width and height of the wrapper rectangle
|
|
const wrapperWidth = wrapperRectMaxX - wrapperRectMinX;
|
|
const wrapperHeight = wrapperRectMaxY - wrapperRectMinY;
|
|
|
|
// Calculate the width and height of the contained rectangle
|
|
const containedWidth = containedRectMaxX - containedRectMinX;
|
|
const containedHeight = containedRectMaxY - containedRectMinY;
|
|
|
|
// Edge case: if contained dimensions are zero, just center as a point
|
|
if (containedWidth === 0 || containedHeight === 0) {
|
|
const centerX = wrapperRectMinX + wrapperWidth / 2;
|
|
const centerY = wrapperRectMinY + wrapperHeight / 2;
|
|
return {
|
|
minX: centerX,
|
|
minY: centerY,
|
|
maxX: centerX,
|
|
maxY: centerY,
|
|
};
|
|
}
|
|
|
|
// Compute scale factor so contained rect fits within wrapper, maintaining aspect ratio
|
|
const scale = Math.min(
|
|
wrapperWidth / containedWidth,
|
|
wrapperHeight / containedHeight,
|
|
);
|
|
|
|
// Compute final displayed dimensions
|
|
const displayWidth = containedWidth * scale;
|
|
const displayHeight = containedHeight * scale;
|
|
|
|
// Compute offsets to center the scaled rectangle
|
|
const offsetX = wrapperRectMinX + (wrapperWidth - displayWidth) / 2;
|
|
const offsetY = wrapperRectMinY + (wrapperHeight - displayHeight) / 2;
|
|
|
|
// Return the final coordinates of the scaled and centered rectangle
|
|
return {
|
|
minX: offsetX,
|
|
minY: offsetY,
|
|
maxX: offsetX + displayWidth,
|
|
maxY: offsetY + displayHeight,
|
|
};
|
|
}
|