• 在博客园随笔中插入3D分子模型


    技术背景

    博主对前端技术不甚了解,只是想在博客中直接展示一些已有的分子结构,而且需要是可以交互的。而我们了解到通过3Dmol这样的前端工具可以实现,通过在博客园随笔中直接引入3Dmol的js最新脚本,然后在当前页构建一个容器,最后在容器中以字符串的形式填进去分子结构,比如可以填充一个xyz文件所定义的3D分子结构。由于不需要安装什么特定的软件(假设你已经生成好了一系列的分子模型用于展示,否则可以参考前面这篇博客用openbabel去生成一些特定的分子结构),我们直接上前端代码吧。

    解决方案

    解决方案主要参考了参考链接1文章中的内容,非常简单,只需三步走。首先,我们直接在Markdown模式的编辑器下直接引入3Dmol的最新js脚本:

    然后创建一个容器,这里我们设定了大小和居中:

    <div id="container-01" class="mol-container">div>

    最后,我们再写一个js:

    这样我们就完成了一个二氧化碳CO2" role="presentation">CO2的结构展示,实现效果如下所示:

    当然,类似的我们还可以修改显示效果,比如把背景改成黑色,然后改成一个棍子模型:

    "container-02" class="mol-container">
    <style>
    .mol-container {
    width: 75%;
    height: 400px;
    position: relative;
    margin: 0 auto;
    }
    style>
    <script>
    $(function() {
    let element = $('#container-02');
    let config = { backgroundColor : 'black' };
    let viewer = $3Dmol.createViewer( element, config );
    viewer.addModel("3\n\nC 0 0 0\nO 1.16 0 0\nO -1.16 0 0", "xyz");
    viewer.addUnitCell();
    viewer.setStyle({stick:{}});
    viewer.zoomTo();
    viewer.render();
    });
    script>

    比较神奇的是,虽然3Dmol没有直接支持球棍模型,但是如果我们把球模型和棍子模型一结合,就自然产生了一个球棍模型:

    "container-03" class="mol-container">
    <style>
    .mol-container {
    width: 75%;
    height: 400px;
    position: relative;
    margin: 0 auto;
    }
    style>
    <script>
    $(function() {
    let element = $('#container-03');
    let config = { backgroundColor : 'black' };
    let viewer = $3Dmol.createViewer( element, config );
    viewer.addModel("3\n\nC 0 0 0\nO 1.16 0 0\nO -1.16 0 0", "xyz");
    viewer.addUnitCell();
    viewer.setStyle({stick:{radius:0.1},sphere:{radius:0.45}});
    viewer.zoomTo();
    viewer.render();
    });
    script>

    当然,加载普通的蛋白质结构,更是不在话下:

    "container-04" class="mol-container">
    <style>
    .mol-container {
    width: 75%;
    height: 400px;
    position: relative;
    margin: 0 auto;
    }
    style>
    <script>
    $(function() {
    let element = $('#container-04');
    let config = { backgroundColor : 'black' };
    let viewer = $3Dmol.createViewer( element, config );
    let pdbUri = 'https://files-cdn.cnblogs.com/files/dechinphy/protein.sh?t=1669043795';
    jQuery.ajax( pdbUri, {
    success: function(data) {
    let v = viewer;
    v.addModel( data, "pdb" ); /* load data */
    v.setStyle({}, {cartoon: {color: 'spectrum'}}); /* style all atoms */
    v.zoomTo(); /* set camera */
    v.render(); /* render scene */
    v.zoom(1.2, 1000); /* slight zoom */
    },
    error: function(hdr, status, err) {
    console.error( "Failed to load PDB " + pdbUri + ": " + err );
    },
    });
    });
    script>

    值得注意的是,3Dmol使用jQuery.ajax从外部去读取文件时,只能加载同域名下的文件,正如原文所说:

    By default, Javascript will only be allowed to load data from the same domain as the web page from which it has been invoked (i.e. if your web page is being served from "my.domain.com" then javascript on that web page will only be able to load data from "my.domain.com"). This is a standard security restriction called "Cross-origin resource sharing" CORS - there are ways around this restriction, however for the sake of this tutorial we assume that the external PDB data file resides on your server.

    因此,我们需要把pdb文件上传到博客园的文件系统中。而又因为博客园的文件系统仅支持几种特定的文件类型,因此我使用的方法是把pdb文件改名为一个sh文件,再传到博客园的文件系统中。由于读取的时候都是用字符串读取,再转义成pdb文件,所以并不影响执行,最终的效果如下所示:

    总结概要

    前端作为一项重要技术,其本身就旨在给用户更好的展示效果和更好的交互模式,然而很多时候再博客中我们只能够采用一些截图的方法来保存我们的结果,然后再放到博客的内容中。而这样操作会带来很大程度上的失真,尤其是生物化学中常见的分子结构的展示,如果直接截图则无法更加全面的展示其结构内容。而3Dmol这个工具则使能了我们使用js的技术,将一个分子的3D模型集成到我们的博客内容中,从很大程度上优化了展示的效果。

    版权声明

    本文首发链接为:https://www.cnblogs.com/dechinphy/p/3dmol.html

    作者ID:DechinPhy

    更多原著文章请参考:https://www.cnblogs.com/dechinphy/

    打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

    腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

    CSDN同步链接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343

    51CTO同步链接:https://blog.51cto.com/u_15561675

    参考链接

    1. https://zhuanlan.zhihu.com/p/293139166
    2. https://3dmol.org/doc/tutorial-code.html
  • 相关阅读:
    EN 12101-8:2011烟雾和热量控制系统防烟挡板—CE认证
    腾讯云CVM标准型S5性能如何?CPU采用什么型号?
    移动端开发
    【谈薪】校招社招如何谈薪
    Q-REG论文阅读
    C++笔记之popen()和std_system()和std_async()执行系统命令比较
    在Github上封神的JDK源码,看完竟吊打了面试官,厉害了
    jsPDF + html2canvas A4分页截断 完美解决方案(含代码 + 案例)
    Spring中子线程获取RequestAttributes
    【操作系统】十分钟了解关于TCP/IP网络的基础知识(二)ARP、路由器、DHCP、DNS以及TCP/IP
  • 原文地址:https://www.cnblogs.com/dechinphy/p/3dmol.html