UNPKG

3dmol

Version:

JavaScript/TypeScript molecular visualization library

70 lines (60 loc) 2.31 kB
import { ParserOptionsSpec } from "./ParserOptionsSpec"; /** * This parses the ChemDoodle json file format. Although this is registered * for the json file extension, other chemical json file formats exist that * this can not parse. Check which one you have and do not assume that * .json can be parsed * * @param {string} str * @param {ParserOptionsSpec} options * @category Parsers */ export function CDJSON(str: string, options: ParserOptionsSpec) { var atoms: any[][] & Record<string, any> = [[]]; if (typeof str === "string") { // Str is usually automatically parsed by JQuery str = JSON.parse(str); } var molecules = (str as any).m; var atomsInFile = molecules[0].a; // Assumes there is at least one var bondsInFile = molecules[0].b; // molecule and ignores any more // Ignores any shapes var styles = molecules[0].s; var parseStyle = options !== undefined && options.parseStyle !== undefined ? options.parseStyle : styles !== undefined; var offset = atoms[atoms.length - 1].length; // When adding atoms their index will be // Offset by the number of existing atoms for (var i = 0; i < atomsInFile.length; i++) { var currentAtom = atomsInFile[i]; var atom: Record<string, any> = {}; atom.id = currentAtom.i; // Probably won't exist. Doesn't seem to // break anything. atom.x = currentAtom.x; atom.y = currentAtom.y; atom.z = currentAtom.z || 0; // Default value if file is 2D atom.bonds = []; atom.bondOrder = []; var elem = currentAtom.l || "C"; atom.elem = elem[0].toUpperCase() + elem.substring(1).toLowerCase(); atom.serial = atoms[atoms.length - 1].length; if (parseStyle) { atom.style = styles[currentAtom.s || 0]; } atoms[atoms.length - 1].push(atom); } for (let i = 0; i < bondsInFile.length; i++) { let currentBond = bondsInFile[i]; let beginIndex = currentBond.b + offset; let endIndex = currentBond.e + offset; let bondOrder = currentBond.o || 1; let firstAtom = atoms[atoms.length - 1][beginIndex]; let secondAtom = atoms[atoms.length - 1][endIndex]; firstAtom.bonds.push(endIndex); firstAtom.bondOrder.push(bondOrder); secondAtom.bonds.push(beginIndex); secondAtom.bondOrder.push(bondOrder); } return atoms; }