使用kekule.js渲染3d分子结构-vue和js

1、原生js

kekule可以单独画一张图片,也可以使用化学小工具渲染一个可以交互的视窗,使用化学小工具还可以对分子进行编辑。

首先将smiles转换成kekule.js可以使用的mol格式(两种方法)
// 第一种方法,使用kekule.js转换,不推荐
function smilesToKekule(smiles, callback) {
    Kekule.OpenBabel.enable(function(error){
      if (!error)
      {
        // var smiles = 'c1ccccc1';
        var mol = Kekule.IO.loadFormatData(smiles, 'smi');
        // the molecule loaded from SMILES by OpenBabel has no coordinates for atoms, and you can generate them manually
        var generator = new Kekule.Calculator.ObStructure2DGenerator();
        generator.setSourceMol(mol);
        generator.executeSync(function() {
          var newMol = generator.getGeneratedMol();                    
          // console.log(newMol);                       
          callback(newMol);
        });
      }
    });
  }
  /**
   * 使用RDkit.js 将 Smiles 转 MOL2000, 前提是需要下载一个RDkit.js
   */
  function RDKitSmilesToMOL2000(smiles) {
    var mol = RDKitModule.get_mol(smiles);
    return mol.get_kekule_form();
  }
单独画一张静态的图片:

这个案例可以在官网看到:Drawing Molecule — Kekule Tutorial 2023.01 documentation

var renderType = Kekule.Render.RendererType.R2D//R3D  // 可以选择画3d还是2d的图片

// 选择一个父容器,将图片画到里面
var parentElem = document.getElementById('parent');
// 清除之前画的图片
Kekule.DomUtils.clearChildContent(parentElem);

// 创建画笔,绑定要画的分子(mol格式可以通过RDkit将smiles转换成mol格式)
RDKitSmilesToMOL2000('OC', mol => {
  var painter = new Kekule.Render.ChemObjPainter(renderType, mol);

  // 获取父容器的宽高
  var dim = Kekule.HtmlElementUtils.getElemOffsetDimension(parentElem); // get width/height of parent element
  var context = painter.createContext(parentElem, dim.width, dim.height); // create context fulfill parent element

  // 开画
  painter.draw(context, {'x': dim.width / 2, 'y': dim.height / 2});
})
渲染一个3d视窗

官方案例:Chem Viewer Widget — Kekule Tutorial 2023.01 documentation

function molRender3DView(mol) {
    // 可以交互的3D视图
    var parentElem = document.getElementById("example-3D-output");
    // 清除之前的视窗
    Kekule.DomUtils.clearChildContent(parentElem);
    var chemViewer = new Kekule.ChemWidget.Viewer(document);
    chemViewer.setDimension(paramsObj.width, paramsObj.height);
    chemViewer.setRenderType(Kekule.Render.RendererType.R3D);
    chemViewer.appendToElem(document.getElementById('example-3D-output')).setChemObj(mol);

    setInterval(() => {
      // 沿着y轴旋转
      // var dx = Math.PI / 2, dy = Math.PI /3, dz = Math.PI / 4;
      // rotate object by 90, 60 and 45 degrees on X/Y/Z axis
      chemViewer.rotate3DBy(0, 0.03, 0);
    }, 100)
  }

2、vue

kekule.js对vue的支持并不是很好,官方的很多案例在vue环境上会报错,只能通过别的途径渲染,或者可以尝试使用kekule-vue,作者目前还没有尝试过。

注意安装kekule.js的同时需要安装three.js,这样才能渲染3d视图

安装kekule.js

vue中使用npm安装kekule.js项目启动后导入的kekule对象是空对象,没法使用,如果是webpack可以通过设置解决,如果是vue-cli我尝试使用的配置无法生效,所以建议使用script标签导入。

webpack的设置

详细的关于这个问题的讨论在github上也可以看到:Using Kekule npm module with Webpack does not load Kekule properly. · Issue #36 · partridgejiang/Kekule.js · GitHub

optimization: {
  ...
  minimizer: [
    ...
    new TerserPlugin({
      ...
      mangle: {
        safari10: true,   // line 234
        reserved: ['$super', '$origin']    // add this line of code
      }
      ...
    })
    ...
  ]
  ...
}

推荐在public/index.html中使用script标签引入

注意kekule.css可以下载在本地引用,但是kekule.js必须用线上的资源,使用国内的镜像资源可以避免访问国外npm资源加载缓慢。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    ...
    <link rel="stylesheet" type="text/css" href="<%= BASE_URL %>3Dviewer/kekule.css" />
    <script src="https://npm.akass.cn/kekule/dist/kekule.min.js" exclude></script>
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= webpackConfig.name %></title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

安装three.js并与kekule.js关联

three.js可以通过npm安装

npm i three

与kekule关联,可以在app.vue中关联(或许),但是我是在渲染的组件内关联的,可以多尝试一下。

import * as THREE from 'three';
...
created() {
  Kekule.externalResourceManager.register('three.js', THREE);
},
渲染3d视窗

在vue中渲染3d视图不能使用官网提供的代码,会导致报错,下面的代码可以完成渲染任务。

function molRender3DView(mol) {
    // 父容器
    var parentElem = document.getElementById("example-3D-output");
    // 清除之前渲染的3d视图
    Kekule.DomUtils.clearChildContent(parentElem);
    // 创建新的视图
    var chemViewer = new Kekule.ChemWidget.Viewer(document);
    chemViewer.setDimension(paramsObj.width, paramsObj.height);
    chemViewer.setRenderType(Kekule.Render.RendererType.R3D);
    chemViewer.appendToElem(document.getElementById('example-3D-output')).setChemObj(mol);

    setInterval(() => {
      // 沿着y轴旋转
      // var dx = Math.PI / 2, dy = Math.PI /3, dz = Math.PI / 4;
      // rotate object by 90, 60 and 45 degrees on X/Y/Z axis
      chemViewer.rotate3DBy(0, 0.03, 0);
    }, 100)
  }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容