UNPKG

ply-js

Version:

A TypeScript port based on python-plyfile for reading and writing .ply files

72 lines (71 loc) 3.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractDir = extractDir; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const api_1 = require("./api"); const data_1 = require("./data"); const measurements_1 = require("./measurements"); // helpers function linesFromUtf8(buf) { return buf.toString('utf8').split(/\r?\n/); } async function extractDir(samplesDir, outDir) { fs_1.default.mkdirSync(outDir, { recursive: true }); const files = fs_1.default.readdirSync(samplesDir).filter(f => f.toLowerCase().endsWith('.ply')); for (const file of files) { const src = path_1.default.join(samplesDir, file); const summary = { filename: file, size: fs_1.default.statSync(src).size, format: null, header: {}, counts: {}, aabb: null, centroid: null, pca: null, warnings: [] }; try { const raw = fs_1.default.readFileSync(src); // try ASCII first (fast) try { const lines = linesFromUtf8(raw); const ply = (0, api_1.readPlyFromLines)(lines); summary.format = 'ascii'; // extract header comments/obj_info (parser stored on PlyData) summary.header.comments = ply.comments; summary.header.obj_info = ply.objInfo; // vertex positions const v = ply.elements.find(e => e.name === 'vertex'); if (!v) throw new Error('no vertex element'); const pts = v.data.map((r) => [r.x ?? r[0], r.y ?? r[1], r.z ?? r[2]]).filter((p) => p.every((n) => typeof n === 'number')); summary.counts.vertices = pts.length; summary.aabb = (0, measurements_1.computeAABB)(pts); summary.centroid = (0, measurements_1.computeCentroid)(pts); summary.pca = (0, measurements_1.computePCA)(pts); // faces presence const fe = ply.elements.find(e => e.name === 'face' || e.name === 'polygon'); summary.counts.faces = fe ? fe.data.length : 0; } catch (e) { // fallback to binary path using PlyData.read const ply = data_1.PlyData.read(src); summary.format = ply.text ? 'ascii' : 'binary'; summary.header = { comments: ply.comments, obj_info: ply.objInfo }; const v = ply.elements.find((e) => e.name === 'vertex'); if (!v) throw new Error('no vertex element'); const pts = v.data.map((r) => [r.x ?? r[0], r.y ?? r[1], r.z ?? r[2]]).filter((p) => p.every((n) => typeof n === 'number')); summary.counts.vertices = pts.length; summary.aabb = (0, measurements_1.computeAABB)(pts); summary.centroid = (0, measurements_1.computeCentroid)(pts); summary.pca = (0, measurements_1.computePCA)(pts); const fe = ply.elements.find((e) => e.name === 'face' || e.name === 'polygon'); summary.counts.faces = fe ? fe.data.length : 0; } } catch (err) { summary.warnings.push(String(err)); } fs_1.default.writeFileSync(path_1.default.join(outDir, file + '.json'), JSON.stringify(summary, null, 2)); } } // CLI if (require.main === module) { const samples = process.argv[2] || path_1.default.join(__dirname, '..', '..', 'samples'); const out = process.argv[3] || path_1.default.join(process.cwd(), 'metadata'); extractDir(samples, out).then(() => console.log('done')).catch(err => { console.error(err); process.exit(1); }); }