UNPKG

frame.akima

Version:

A package for Akima interpolation

199 lines (198 loc) 7.22 kB
export function createNidekFromRadii(radii) { let radiiString = '500100002039'; let previousRadius = radii[0]; let hexRadius = previousRadius.toString(16).toUpperCase().padStart(4, '0'); radiiString += hexRadius; for (let i = 1; i < radii.length; i += 1) { let radiusDifference = radii[i] - previousRadius; if (radiusDifference < 0) { radiusDifference += 256; } hexRadius = radiusDifference.toString(16).toUpperCase().padStart(2, '0'); radiiString += hexRadius; previousRadius = radii[i]; } return radiiString; } // export const appendix = definedAppendix + undefinedAppendix; export class Nidek { nidekString; radii; static createStringFromRadii(radii, print = false) { let radiiString = '500100002039'; let previousRadius = radii[0]; let hexRadius = previousRadius.toString(16).toUpperCase().padStart(4, '0'); radiiString += hexRadius; for (let i = 1; i < radii.length; i += 1) { const radiusDifference = radii[i] - previousRadius; let posRadiusDifference = radiusDifference; if (Math.abs(radiusDifference) > 128) { throw new Error(`Radius difference too large at index ${i}: ${radiusDifference}`); } if (radiusDifference < 0) { posRadiusDifference += 256; } hexRadius = posRadiusDifference .toString(16) .toUpperCase() .padStart(2, '0'); if (print) { console.log(`radius[${i}] - previousRadius: ${radii[i]} - ${previousRadius} = ${radiusDifference} (${hexRadius})`); } radiiString += hexRadius; previousRadius = radii[i]; } if (print) { console.log(`radiiString: ${radiiString}`); } return radiiString; } static getAmountOfDeviation() { return '5DC0'; } static getDefinedAppendix() { let radiiString = ''; // amount of deviation radiiString += Nidek.getAmountOfDeviation(); // Circumferential length radiiString += '0000'; // Lens material radiiString += '00'; // Frame material radiiString += '46'; // Layout mode radiiString += 'F2'; // Edge mode radiiString += '46'; // FPD radiiString += 'F200'; // PD right radiiString += '0813'; // UP right radiiString += '2039'; // Inset right radiiString += '0000'; // DBL radiiString += '0000'; // PD left radiiString += '0000'; // UP left radiiString += '05DC'; // Inset left radiiString += '0000'; // Size radiiString += '0000'; // // Axis differential right // radiiString += '00'; // // Axis differential left // radiiString += '00'; // // Difference between blocking center and optical center right // radiiString += '0008'; // // Difference between blocking center and optical center left // radiiString += '1320'; // // Difference between blocked center and optical center right // radiiString += '3900'; // // Difference between blocked center and optical center left // radiiString += '0000'; // // Full-eye or half-eye // radiiString += '00'; // // Axis Setting right // radiiString += '00'; // // Axis Setting left // radiiString += '00'; // // Blocking flag // radiiString += '05'; // // Polish Process Speed // radiiString += 'DC'; // // Polish rotation // radiiString += '00'; // // Flat polishing wheel Horizontal position // radiiString += '0000'; // // Flat polishing wheel Vertical position // radiiString += '0000'; // // S.B. polishing wheel Vertical position // radiiString += '0000'; // // S.B. polishing wheel Horizontal position // radiiString += '0000'; // // Lens type // radiiString += '00'; // // PROG EP value // radiiString += '00'; // // Bevel mode right // radiiString += '00'; // // Bevel fine adjustment right // radiiString += '0000'; // // Bevel mode left // radiiString += '00'; // // Safety bevel Width // radiiString += '00'; // // Bevel fine adjustment left // radiiString += '00'; // // Bevel fine adjustment left // radiiString += '00'; return radiiString; } static createRadiiFromString(coords) { const radii = coords.map((coord) => Math.round(Math.sqrt(coord.x ** 2 + coord.y ** 2) * 100)); return radii; } static createRadiiFromCoords(coords, print = false) { const radii = coords.map((coord, index) => { const rad = Math.round(Math.sqrt(coord.x ** 2 + coord.y ** 2) * 100); if (print) { console.log(`${rad}, `); } return rad; }); return radii; } static createStringFromCoords(coords, print = false) { const radii = Nidek.createRadiiFromCoords(coords, print); const radiusString = Nidek.createStringFromRadii(radii, print); return radiusString + Nidek.getDefinedAppendix(); // + undefinedAppendix; } constructor(nidekString) { this.nidekString = nidekString; let firstRadius = 0; let position = 12; this.radii = []; const firstRadiusHex = nidekString.substring(position, position + 4); firstRadius = parseInt(firstRadiusHex, 16); this.radii.push(firstRadius); let lastRadius = firstRadius; position += 4; let radiusLoop; for (radiusLoop = 0; radiusLoop < 999; radiusLoop += 1) { const nidekPart = nidekString.substring(position, position + 2); let incrementRadius = parseInt(nidekPart, 16); if (incrementRadius > 127) { incrementRadius -= 256; } lastRadius += incrementRadius; this.radii.push(lastRadius); position += 2; } } get Radii() { return this.radii; } get Coords() { return this.radii.map((radius, index) => { const angle = (index * 360) / this.radii.length; const x = radius * Math.cos((angle * Math.PI) / 180); const y = radius * Math.sin((angle * Math.PI) / 180); return { x: Math.round(x) / 100, y: Math.round(y) / 100 }; }); } } export const definedAppendix = Nidek.getAmountOfDeviation() + '00000046F246F200' + '0813' + '2039' + '0000' + '0000' + '0000' + '05DC' + '0000' + '0000'; export const undefinedAppendix = '000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';