UNPKG

biojs-vis-pdbviewer

Version:

A BioJS 2.0 component to view protein structures

327 lines (324 loc) 13.3 kB
Clazz.declarePackage ("J.export"); Clazz.load (["JU.P3", "$.V3"], "J.export.___Exporter", ["java.lang.Float", "$.Short", "java.util.Hashtable", "JU.AU", "$.Lst", "$.M3", "$.Quat", "$.SB", "JU.C", "$.Logger", "$.MeshSurface"], function () { c$ = Clazz.decorateAsClass (function () { this.vwr = null; this.tm = null; this.privateKey = 0; this.jmolRenderer = null; this.out = null; this.fileName = null; this.commandLineOptions = null; this.isCartesian = false; this.g3d = null; this.backgroundColix = 0; this.screenWidth = 0; this.screenHeight = 0; this.slabZ = 0; this.depthZ = 0; this.lightSource = null; this.fixedRotationCenter = null; this.referenceCenter = null; this.cameraPosition = null; this.cameraDistance = 0; this.aperatureAngle = 0; this.scalePixelsPerAngstrom = 0; this.exportScale = 1; this.exportType = 0; this.tempP1 = null; this.tempP2 = null; this.tempP3 = null; this.center = null; this.tempV1 = null; this.tempV2 = null; this.tempV3 = null; this.isWebGL = false; this.commentChar = null; this.tempC = null; this.nText = 0; this.nImage = 0; this.lineWidthMad = 0; Clazz.instantialize (this, arguments); }, J["export"], "___Exporter"); Clazz.prepareFields (c$, function () { this.tempP1 = new JU.P3 (); this.tempP2 = new JU.P3 (); this.tempP3 = new JU.P3 (); this.center = new JU.P3 (); this.tempV1 = new JU.V3 (); this.tempV2 = new JU.V3 (); this.tempV3 = new JU.V3 (); this.tempC = new JU.P3 (); }); Clazz.makeConstructor (c$, function () { }); Clazz.defineMethod (c$, "setRenderer", function (jmolRenderer) { this.jmolRenderer = jmolRenderer; }, "J.api.JmolRendererInterface"); Clazz.defineMethod (c$, "initializeOutput", function (vwr, privateKey, g3d, params) { return this.initOutput (vwr, privateKey, g3d, params); }, "JV.Viewer,~N,JU.GData,java.util.Map"); Clazz.defineMethod (c$, "initOutput", function (vwr, privateKey, g3d, params) { this.vwr = vwr; this.tm = vwr.tm; this.isWebGL = params.get ("type").equals ("JS"); this.g3d = g3d; this.privateKey = privateKey; this.backgroundColix = vwr.getObjectColix (0); this.center.setT (this.tm.getRotationCenter ()); this.exportScale = vwr.getFloat (570425358); if ((this.screenWidth <= 0) || (this.screenHeight <= 0)) { this.screenWidth = vwr.getScreenWidth (); this.screenHeight = vwr.getScreenHeight (); }this.slabZ = g3d.getSlab (); this.depthZ = g3d.getDepth (); this.lightSource = g3d.getLightSource (); var cameraFactors = vwr.tm.getCameraFactors (); this.referenceCenter = cameraFactors[0]; this.cameraPosition = cameraFactors[1]; this.fixedRotationCenter = cameraFactors[2]; this.cameraDistance = cameraFactors[3].x; this.aperatureAngle = cameraFactors[3].y; this.scalePixelsPerAngstrom = cameraFactors[3].z; this.out = params.get ("outputChannel"); this.commandLineOptions = params.get ("params"); if (this.out != null) this.fileName = this.out.getFileName (); this.outputHeader (); return true; }, "JV.Viewer,~N,JU.GData,java.util.Map"); Clazz.defineMethod (c$, "output", function (data) { this.out.append (data); }, "~S"); Clazz.defineMethod (c$, "outputComment", function (comment) { if (this.commentChar != null) this.output (this.commentChar + comment + "\n"); }, "~S"); c$.setTempVertex = Clazz.defineMethod (c$, "setTempVertex", function (pt, offset, ptTemp) { ptTemp.setT (pt); if (offset != null) ptTemp.add (offset); }, "JU.P3,JU.P3,JU.P3"); Clazz.defineMethod (c$, "outputVertices", function (vertices, nVertices, offset) { for (var i = 0; i < nVertices; i++) { if (Float.isNaN (vertices[i].x)) continue; this.outputVertex (vertices[i], offset); this.output ("\n"); } }, "~A,~N,JU.P3"); Clazz.defineMethod (c$, "outputVertex", function (pt, offset) { J["export"].___Exporter.setTempVertex (pt, offset, this.tempP1); this.output (this.tempP1); }, "JU.P3,JU.P3"); Clazz.defineMethod (c$, "outputJmolPerspective", function () { this.outputComment (this.getJmolPerspective ()); }); Clazz.defineMethod (c$, "getJmolPerspective", function () { if (this.commentChar == null) return ""; var sb = new JU.SB (); sb.append (this.commentChar).append ("Jmol perspective:"); sb.append ("\n").append (this.commentChar).append ("screen width height dim: " + this.screenWidth + " " + this.screenHeight + " " + this.vwr.getScreenDim ()); sb.append ("\n").append (this.commentChar).append ("perspectiveDepth: " + this.vwr.getPerspectiveDepth ()); sb.append ("\n").append (this.commentChar).append ("cameraDistance(angstroms): " + this.cameraDistance); sb.append ("\n").append (this.commentChar).append ("aperatureAngle(degrees): " + this.aperatureAngle); sb.append ("\n").append (this.commentChar).append ("scalePixelsPerAngstrom: " + this.scalePixelsPerAngstrom); sb.append ("\n").append (this.commentChar).append ("light source: " + this.lightSource); sb.append ("\n").append (this.commentChar).append ("lighting: " + this.vwr.getSpecularState ().$replace ('\n', ' ')); sb.append ("\n").append (this.commentChar).append ("center: " + this.center); sb.append ("\n").append (this.commentChar).append ("rotationRadius: " + this.vwr.getFloat (570425388)); sb.append ("\n").append (this.commentChar).append ("boundboxCenter: " + this.vwr.getBoundBoxCenter ()); sb.append ("\n").append (this.commentChar).append ("translationOffset: " + this.tm.getTranslationScript ()); sb.append ("\n").append (this.commentChar).append ("zoom: " + this.vwr.getZoomPercentFloat ()); sb.append ("\n").append (this.commentChar).append ("moveto command: " + this.vwr.getOrientationText (4130, null)); sb.append ("\n"); return sb.toString (); }); Clazz.defineMethod (c$, "outputFooter", function () { }); Clazz.defineMethod (c$, "finalizeOutput", function () { return this.finalizeOutput2 (); }); Clazz.defineMethod (c$, "finalizeOutput2", function () { this.outputFooter (); if (this.out == null) return null; var ret = this.out.closeChannel (); if (this.fileName == null) return ret; if (ret != null) { JU.Logger.info (ret); return "ERROR EXPORTING FILE: " + ret; }return "OK " + this.out.getByteCount () + " " + this.jmolRenderer.getExportName () + " " + this.fileName; }); Clazz.defineMethod (c$, "getExportDate", function () { return this.vwr.apiPlatform.getDateFormat (null); }); Clazz.defineMethod (c$, "rgbFractionalFromColix", function (colix) { return this.rgbFractionalFromArgb (this.g3d.getColorArgbOrGray (colix)); }, "~N"); Clazz.defineMethod (c$, "getTriad", function (t) { return J["export"].___Exporter.round (t.x) + " " + J["export"].___Exporter.round (t.y) + " " + J["export"].___Exporter.round (t.z); }, "JU.T3"); Clazz.defineMethod (c$, "rgbFractionalFromArgb", function (argb) { var red = (argb >> 16) & 0xFF; var green = (argb >> 8) & 0xFF; var blue = argb & 0xFF; this.tempC.set (red == 0 ? 0 : (red + 1) / 256, green == 0 ? 0 : (green + 1) / 256, blue == 0 ? 0 : (blue + 1) / 256); return this.getTriad (this.tempC); }, "~N"); c$.translucencyFractionalFromColix = Clazz.defineMethod (c$, "translucencyFractionalFromColix", function (colix) { return J["export"].___Exporter.round (JU.C.getColixTranslucencyFractional (colix)); }, "~N"); c$.opacityFractionalFromColix = Clazz.defineMethod (c$, "opacityFractionalFromColix", function (colix) { return J["export"].___Exporter.round (1 - JU.C.getColixTranslucencyFractional (colix)); }, "~N"); c$.opacityFractionalFromArgb = Clazz.defineMethod (c$, "opacityFractionalFromArgb", function (argb) { var opacity = (argb >> 24) & 0xFF; return J["export"].___Exporter.round (opacity == 0 ? 0 : (opacity + 1) / 256); }, "~N"); c$.round = Clazz.defineMethod (c$, "round", function (number) { var s; return (number == 0 ? "0" : number == 1 ? "1" : (s = "" + (Math.round (number * 1000) / 1000)).startsWith ("0.") ? s.substring (1) : s.startsWith ("-0.") ? "-" + s.substring (2) : s.endsWith (".0") ? s.substring (0, s.length - 2) : s); }, "~N"); c$.round = Clazz.defineMethod (c$, "round", function (pt) { return J["export"].___Exporter.round (pt.x) + " " + J["export"].___Exporter.round (pt.y) + " " + J["export"].___Exporter.round (pt.z); }, "JU.T3"); Clazz.defineMethod (c$, "getColorList", function (i00, colixes, nVertices, bsSelected, htColixes) { var nColix = 0; var list = new JU.Lst (); var isAll = (bsSelected == null); var i0 = (isAll ? nVertices - 1 : bsSelected.nextSetBit (0)); for (var i = i0; i >= 0; i = (isAll ? i - 1 : bsSelected.nextSetBit (i + 1))) { var color = Short.$valueOf (colixes[i]); if (!htColixes.containsKey (color)) { list.addLast (color); htColixes.put (color, Integer.$valueOf (i00 + nColix++)); }} return list; }, "~N,~A,~N,JU.BS,java.util.Map"); c$.getConeMesh = Clazz.defineMethod (c$, "getConeMesh", function (centerBase, matRotateScale, colix) { var ms = new JU.MeshSurface (); var ndeg = 10; var n = Clazz.doubleToInt (360 / ndeg); ms.colix = colix; ms.vs = new Array (ms.vc = n + 1); ms.pis = JU.AU.newInt2 (ms.pc = n); for (var i = 0; i < n; i++) ms.pis[i] = [i, (i + 1) % n, n]; var d = ndeg / 180. * 3.141592653589793; for (var i = 0; i < n; i++) { var x = (Math.cos (i * d)); var y = (Math.sin (i * d)); ms.vs[i] = JU.P3.new3 (x, y, 0); } ms.vs[n] = JU.P3.new3 (0, 0, 1); if (matRotateScale != null) { ms.normals = new Array (ms.vc); for (var i = 0; i < ms.vc; i++) { matRotateScale.rotate (ms.vs[i]); ms.normals[i] = JU.V3.newV (ms.vs[i]); ms.normals[i].normalize (); ms.vs[i].add (centerBase); } }return ms; }, "JU.P3,JU.M3,~N"); Clazz.defineMethod (c$, "getRotationMatrix", function (pt1, pt2, radius) { var m = new JU.M3 (); var m1; if (pt2.x == pt1.x && pt2.y == pt1.y) { m1 = JU.M3.newM3 (null); if (pt1.z > pt2.z) m1.m11 = m1.m22 = -1; } else { this.tempV1.sub2 (pt2, pt1); this.tempV2.set (0, 0, 1); this.tempV2.cross (this.tempV2, this.tempV1); this.tempV1.cross (this.tempV1, this.tempV2); var q = JU.Quat.getQuaternionFrameV (this.tempV2, this.tempV1, null, false); m1 = q.getMatrix (); }m.m00 = radius; m.m11 = radius; m.m22 = pt2.distance (pt1); m1.mul (m); return m1; }, "JU.P3,JU.P3,~N"); Clazz.defineMethod (c$, "getRotationMatrix", function (pt1, ptZ, radius, ptX, ptY) { var m = new JU.M3 (); m.m00 = ptX.distance (pt1) * radius; m.m11 = ptY.distance (pt1) * radius; m.m22 = ptZ.distance (pt1) * 2; var q = JU.Quat.getQuaternionFrame (pt1, ptX, ptY); var m1 = q.getMatrix (); m1.mul (m); return m1; }, "JU.P3,JU.P3,~N,JU.P3,JU.P3"); Clazz.defineMethod (c$, "drawSurface", function (meshSurface, colix) { var nVertices = meshSurface.vc; if (nVertices == 0) return; var nFaces = 0; var nPolygons = meshSurface.pc; var bsPolygons = meshSurface.bsPolygons; var faceVertexMax = (meshSurface.haveQuads ? 4 : 3); var indices = meshSurface.pis; var isAll = (bsPolygons == null); var i0 = (isAll ? nPolygons - 1 : bsPolygons.nextSetBit (0)); for (var i = i0; i >= 0; i = (isAll ? i - 1 : bsPolygons.nextSetBit (i + 1))) nFaces += (faceVertexMax == 4 && indices[i].length == 4 ? 2 : 1); if (nFaces == 0) return; var vertices = meshSurface.getVertices (); var normals = meshSurface.normals; var colorSolid = (colix != 0); var colixes = (colorSolid ? null : meshSurface.vcs); var polygonColixes = (colorSolid ? meshSurface.pcs : null); var htColixes = null; var colorList = null; if (!this.isWebGL) { htColixes = new java.util.Hashtable (); if (polygonColixes != null) colorList = this.getColorList (0, polygonColixes, nPolygons, bsPolygons, htColixes); else if (colixes != null) colorList = this.getColorList (0, colixes, nVertices, null, htColixes); }this.outputSurface (vertices, normals, colixes, indices, polygonColixes, nVertices, nPolygons, nFaces, bsPolygons, faceVertexMax, colix, colorList, htColixes, meshSurface.offset); }, "JU.MeshSurface,~N"); Clazz.defineMethod (c$, "outputSurface", function (vertices, normals, colixes, indices, polygonColixes, nVertices, nPolygons, nFaces, bsPolygons, faceVertexMax, colix, colorList, htColixes, offset) { }, "~A,~A,~A,~A,~A,~N,~N,~N,JU.BS,~N,~N,JU.Lst,java.util.Map,JU.P3"); Clazz.defineMethod (c$, "drawFilledCircle", function (colixRing, colixFill, diameter, x, y, z) { if (colixRing != 0) this.drawCircle (x, y, z, diameter, colixRing, false); if (colixFill != 0) this.drawCircle (x, y, z, diameter, colixFill, true); }, "~N,~N,~N,~N,~N,~N"); Clazz.defineMethod (c$, "plotImage", function (x, y, z, image, bgcolix, width, height) { if (z < 3) z = Clazz.floatToInt (this.tm.cameraDistance); this.outputComment ("start image " + (++this.nImage)); this.g3d.plotImage (x, y, z, image, this.jmolRenderer, bgcolix, width, height); this.outputComment ("end image " + this.nImage); }, "~N,~N,~N,~O,~N,~N,~N"); Clazz.defineMethod (c$, "plotText", function (x, y, z, colix, text, font3d) { if (z < 3) z = Clazz.floatToInt (this.tm.cameraDistance); this.outputComment ("start text " + (++this.nText) + ": " + text); this.g3d.plotText (x, y, z, this.g3d.getColorArgbOrGray (colix), 0, text, font3d, this.jmolRenderer); this.outputComment ("end text " + this.nText + ": " + text); }, "~N,~N,~N,~N,~S,javajs.awt.Font"); Clazz.defineStatics (c$, "degreesPerRadian", (57.29577951308232)); });