Files
DOSSIER-STANDALONE/src/io/patParser.ts
T
karim ca859c4aa4 Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge
Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit
Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem,
dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en)
sowie Projektdokumentation und Probe-Harness.
2026-06-30 20:52:27 +02:00

76 lines
2.1 KiB
TypeScript

// Parser für AutoCAD .pat Schraffur-Musterdateien.
// Liefert strukturierte Linienfamilien zur späteren Übernahme in die Hatch-Bibliothek.
export interface PatLineFamily {
angle: number; // Grad
x: number;
y: number; // Ursprung
dx: number;
dy: number; // Verschiebung entlang / senkrecht
dashes: number[]; // ggf. leer (durchgezogene Familie)
}
export interface PatPattern {
name: string;
description: string;
families: PatLineFamily[];
}
// Zerlegt eine Familienzeile in numerische Tokens.
function parseNumbers(line: string): number[] {
const tokens = line.split(',');
const numbers: number[] = [];
for (const raw of tokens) {
const token = raw.trim();
if (token === '') continue;
const value = Number(token);
numbers.push(value);
}
return numbers;
}
export function parsePat(text: string): PatPattern[] {
const result: PatPattern[] = [];
// CRLF/CR vereinheitlichen.
const lines = text.replace(/\r\n?/g, '\n').split('\n');
let current: PatPattern | null = null;
for (const rawLine of lines) {
const line = rawLine.trim();
if (line === '') continue;
if (line.startsWith(';')) continue;
if (line.startsWith('*')) {
// Header: *PATTERNNAME, optional description
const body = line.slice(1);
const commaIndex = body.indexOf(',');
const name = (commaIndex >= 0 ? body.slice(0, commaIndex) : body).trim();
const description = commaIndex >= 0 ? body.slice(commaIndex + 1).trim() : '';
current = { name, description, families: [] };
result.push(current);
continue;
}
// Familienzeile nur gültig innerhalb eines Pattern-Blocks.
if (!current) continue;
const numbers = parseNumbers(line);
// Mindestens angle, x, y, dx, dy erforderlich.
if (numbers.length < 5) continue;
if (!numbers.slice(0, 5).every((n) => Number.isFinite(n))) continue;
const [angle, x, y, dx, dy] = numbers;
const dashes: number[] = [];
for (let k = 5; k < numbers.length; k++) {
if (Number.isFinite(numbers[k])) {
dashes.push(numbers[k]);
}
}
current.families.push({ angle, x, y, dx, dy, dashes });
}
return result;
}