• 在博客园随笔中插入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
  • 相关阅读:
    ISO Swift高德导航开发指南
    C专家编程 第7章 对内存的思考 7.8 轻松一下---“Thing King”和“页面游戏”
    Docker安装InfluxDB_用户名密码和策略使用
    mplus数据分析:增长模型潜增长模型与增长混合模型再解释
    Anaconda虚拟环境下导入opencv
    django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间
    cpu 性能分析基础
    2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析
    【支持向量机】问题梳理
    【每日一题Day344】LC2512奖励最顶尖的 K 名学生 | 哈希表+排序
  • 原文地址:https://www.cnblogs.com/dechinphy/p/3dmol.html