mono/packages/cad/dist-in/lib/geometry/dxf.js
2026-01-27 08:55:42 +01:00

44 lines
4.0 KiB
JavaScript

import * as fs from 'fs';
import { DxfParser } from 'dxf-parser';
import { sync as write } from '@polymech/fs/write';
function distanceBetweenPoints(p1, p2) {
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
}
function arcLength(radius, startAngle, endAngle) {
return Math.abs(endAngle - startAngle) * radius;
}
function calculateEntityLength(entity) {
switch (entity.type) {
//case 'LINE':
// return distanceBetweenPoints(entity.start!, entity.end!);
case 'LWPOLYLINE':
case 'LINE':
let length = 0;
for (let i = 0; i < entity.vertices.length - 1; i++) {
try {
length += distanceBetweenPoints(entity.vertices[i], entity.vertices[i + 1]);
}
catch (e) {
console.log('error', entity, e);
}
}
return length;
case 'CIRCLE':
return 2 * Math.PI * entity.radius;
case 'ARC':
return arcLength(entity.radius, entity.startAngle, entity.endAngle);
default:
return 0;
}
}
function calculateTotalDxfEntitiesLength(filePath) {
const parser = new DxfParser();
const dxfData = parser.parseSync(fs.readFileSync(filePath, 'utf-8'));
const ret = dxfData.entities.reduce((totalLength, entity) => {
const length = calculateEntityLength(entity);
return totalLength + length;
}, 0);
write(filePath + '.json', JSON.stringify(dxfData, null, 2));
return ret;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9nZW9tZXRyeS9keGYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV0QyxPQUFPLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBYWxELFNBQVMscUJBQXFCLENBQUMsRUFBNEIsRUFBRSxFQUE0QjtJQUNyRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsTUFBYyxFQUFFLFVBQWtCLEVBQUUsUUFBZ0I7SUFDbkUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBaUI7SUFDNUMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsY0FBYztRQUNkLCtEQUErRDtRQUMvRCxLQUFLLFlBQVksQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDUCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQztvQkFDRCxNQUFNLElBQUkscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUVuQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLEtBQUssUUFBUTtZQUNULE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU8sQ0FBQztRQUN4QyxLQUFLLEtBQUs7WUFDTixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTyxFQUFFLE1BQU0sQ0FBQyxVQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVMsQ0FBQyxDQUFDO1FBQzNFO1lBQ0ksT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLCtCQUErQixDQUFDLFFBQWdCO0lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBbUIsRUFBRSxNQUFpQixFQUFFLEVBQUU7UUFDM0UsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsT0FBTyxXQUFXLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNOLEtBQUssQ0FBRSxRQUFRLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzVELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQyJ9