Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 3x 3x 3x 3x 3x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 1826x 2x 1x 1x 2x | import { Vector3, Matrix4 } from "../WebGL"; import { assignBonds } from "./utils/assignBonds"; import { anumToSymbol } from "./utils/anumToSymbol"; /** * @param {string} * str * @param {ParserOptionsSpec} * options * @category Parsers */ export function CUBE(str, options) { options = options || {}; var atoms: any[][] & Record<string, any> = [[]]; var lines = str.split(/\r?\n/); var assignbonds = options.assignBonds === undefined ? true : options.assignBonds; if (lines.length < 6) return atoms; var lineArr = lines[2].replace(/^\s+/, "").replace(/\s+/g, " ").split(" "); var natoms = Math.abs(parseFloat(lineArr[0])); let cryst: Record<string, any> = {}; var origin = cryst.origin = new Vector3(parseFloat(lineArr[1]), parseFloat(lineArr[2]), parseFloat(lineArr[3])); lineArr = lines[3].replace(/^\s+/, "").replace(/\s+/g, " ").split(" "); lineArr = lines[3].replace(/^\s+/, "").replace(/\s+/g, " ").split(" "); // might have to convert from bohr units to angstroms // there is a great deal of confusion here: // n>0 means angstroms: http://www.gaussian.com/g_tech/g_ur/u_cubegen.htm // n<0 means angstroms: http://paulbourke.net/dataformats/cube/ // always assume bohr: openbabel source code // always assume angstrom: http://www.ks.uiuc.edu/Research/vmd/plugins/molfile/cubeplugin.html // we are going to go with n<0 means angstrom - note this is just the first n var convFactor = (lineArr[0] > 0) ? 0.529177 : 1; origin.multiplyScalar(convFactor); var nX = Math.abs(lineArr[0]); var xVec = new Vector3(parseFloat(lineArr[1]), parseFloat(lineArr[2]), parseFloat(lineArr[3])) .multiplyScalar(convFactor); lineArr = lines[4].replace(/^\s+/, "").replace(/\s+/g, " ").split(" "); var nY = Math.abs(lineArr[0]); var yVec = new Vector3(parseFloat(lineArr[1]), parseFloat(lineArr[2]), parseFloat(lineArr[3])) .multiplyScalar(convFactor); lineArr = lines[5].replace(/^\s+/, "").replace(/\s+/g, " ").split(" "); var nZ = Math.abs(lineArr[0]); var zVec = new Vector3(parseFloat(lineArr[1]), parseFloat(lineArr[2]), parseFloat(lineArr[3])) .multiplyScalar(convFactor); cryst.size = {x:nX, y:nY, z:nZ}; cryst.unit = new Vector3(xVec.x, yVec.y, zVec.z); Iif (xVec.y != 0 || xVec.z != 0 || yVec.x != 0 || yVec.z != 0 || zVec.x != 0 || zVec.y != 0) { //need a transformation matrix cryst.matrix4 = new Matrix4(xVec.x, yVec.x, zVec.x, 0, xVec.y, yVec.y, zVec.y, 0, xVec.z, yVec.z, zVec.z, 0, 0,0,0,1); // include translation in matrix let t = new Matrix4().makeTranslation(origin.x, origin.y, origin.z); cryst.matrix4 = cryst.matrix4.multiplyMatrices(t,cryst.matrix4); cryst.matrix = cryst.matrix4.matrix3FromTopLeft(); // all translation and scaling done by matrix, so reset origin and unit cryst.origin = new Vector3(0,0,0); cryst.unit = new Vector3(1,1,1); } atoms.modelData = [{cryst:cryst}]; // Extract atom portion; send to new GLModel... lines = lines.splice(6, natoms); var start = atoms[atoms.length-1].length; var end = start + lines.length; for (var i = start; i < end; ++i) { var atom: Record<string, any> = {}; atom.serial = i; var line = lines[i - start]; var tokens = line.replace(/^\s+/, "").replace(/\s+/g, " ").split( " "); atom.elem = anumToSymbol[tokens[0]]; atom.x = parseFloat(tokens[2]) * convFactor; atom.y = parseFloat(tokens[3]) * convFactor; atom.z = parseFloat(tokens[4]) * convFactor; atom.hetflag = true; atom.bonds = []; atom.bondOrder = []; atom.properties = {}; atoms[atoms.length-1].push(atom); } if(assignbonds) { for (let i = 0; i < atoms.length; i++) assignBonds(atoms[i]); } return atoms; }; |