This commit is contained in:
Andras Schmelczer 2026-09-11 22:14:24 +01:00
commit 0c0f08b350
45 changed files with 1565 additions and 1579 deletions

View file

@ -1,5 +1,6 @@
import type { FlooringPiece, Point, SkirtingPiece } from './types';
import type { Point } from './types';
import { cutMm, degree } from './format';
import { PRECISION } from './limits';
export interface PreviewBox {
x: number;
@ -66,7 +67,7 @@ export function dimensionedOutline(
...edge,
length: Math.hypot(edge.end.x - edge.start.x, edge.end.y - edge.start.y),
}))
.filter((edge) => edge.length > 0.000001)
.filter((edge) => edge.length > PRECISION.geometry)
.sort((a, b) => b.length - a.length || a.edge - b.edge);
for (const edge of selected) {
@ -77,14 +78,14 @@ export function dimensionedOutline(
const normal = { x: orientation * direction.y, y: -orientation * direction.x };
const center = { x: (edge.start.x + edge.end.x) / 2, y: (edge.start.y + edge.end.y) / 2 };
const limit =
Math.abs(direction.y) < 1e-6
Math.abs(direction.y) < PRECISION.geometry
? blank.length
: Math.abs(direction.x) < 1e-6
: Math.abs(direction.x) < PRECISION.geometry
? blank.width
: undefined;
const text = cutMm(edge.length, limit);
const angle =
Math.abs(direction.x) > 0.000001 && Math.abs(direction.y) > 0.000001
Math.abs(direction.x) > PRECISION.geometry && Math.abs(direction.y) > PRECISION.geometry
? (Math.atan2(Math.abs(direction.y), Math.abs(direction.x)) * 180) / Math.PI
: undefined;
const angleText = angle === undefined ? '' : degree(angle);
@ -155,29 +156,6 @@ export function dimensionedOutline(
};
}
export function flooringTemplate(piece: FlooringPiece): Point[] {
if (piece.template.length) return piece.template;
return piece.shaped
? []
: [
{ x: 0, y: 0 },
{ x: piece.length, y: 0 },
{ x: piece.length, y: piece.width },
{ x: 0, y: piece.width },
];
}
export function skirtingTemplate(piece: SkirtingPiece, thickness: number): Point[] {
if (piece.template?.length === 4) return piece.template;
if (piece.leftMitre !== 0 || piece.rightMitre !== 0) return [];
return [
{ x: 0, y: 0 },
{ x: piece.length, y: 0 },
{ x: piece.length, y: thickness },
{ x: 0, y: thickness },
];
}
/** Padding changes the viewport only; all vertices stay in their original millimetres. */
export function fullPreviewBox(length: number, width: number): PreviewBox {
const padding = Math.max(length, width, 1) * 0.06;