ply-js
Version:
A TypeScript port based on python-plyfile for reading and writing .ply files
72 lines (71 loc) • 3.87 kB
JavaScript
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); });
}
;