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.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
// 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;
|
||||
}
|
||||
Reference in New Issue
Block a user