Connecting scripts with Mnova objects

Top  Previous  Next

Connecting scripts with Mnova objects

mestrelab-logom-horz-white_tiny prev-chm next-chm

简单访问 NMR 图谱

到目前为止,我们所展示的示例肯定不是非常有用。在 Mnova 中编写脚本的好处在于,它可用于操作 Mnova 中的对象(如波谱、分子、图片等)并自动执行重复性任务。本节将介绍如何在脚本框架内访问 NMR 图谱。

 

请看以下代码片段:

 

/*globals Application, File, TextStream*/

/*jslint indent:4, plusplus: true*/

 

function dumpSpectrum() {

 "use strict";

 //获取活动频谱

 var d、dumpStream、colCount、rowCount、r、c、

 spec = Application.nmr.activeSpectrum()、

 dumpFile = new File("C:/mnova/dump.txt");

 

 //函数 isValid 通知所获得的频谱是否正确

 if (spec.isValid()) {

 if (dumpFile.open(File.WriteOnly)) {

 dumpStream = new TextStream(dumpFile);

 try {

 //转储频谱信息

 dumpStream.writeln("Solvent:\t", spec.solvent);

 //转储每个维度的信息

 for (d = 1; d <= spec.dimCount; d++) {

 dumpStream.writeln("Dimension:\t", d);

 dumpStream.writeln("Frequency:\t", spec.frequency());

 dumpStream.writeln("Lowest Frequency:\t", spec.hz());

 dumpStream.writeln("Nucleus:\t", spec.nucleus(d));

 dumpStream.writeln("Spectral Size:\t", spec.count(d));

 }

 //转储波谱点的值

 if (spec.dimCount === 1) {

 rowCount = spec.count();

 for (r = 0; r < rowCount; r++) {

 dumpStream.writeln(spec.real(r), "\t", spec.imag(r));

 }

 } else if (spec.dimCount === 2) {

 colCount = spec.count(1);

 rowCount = spec.count(2);

 for (r = 0; r < rowCount; r++) {

 for (c = 0; c < colCount; c++) {

 dumpStream.write(spec.real(r,c));

 if (c < colCount - 1) {

 dumpStream.write("\t");

 }

 }

 dumpStream.writeln();

 }

 }

 } finally {

 dumpFile.close();

 }

 }

 }

}

 

首先要注意的是nmr对象。该对象允许访问 NMR 插件框架,因此可以访问 Mnova 中的 NMR 波谱。 例如,通过spec = Application.nmr.activeSpectrum()function 可以选择 Mnova 中的当前有效波谱。从这一点,您可以读取 NMR 图谱的相关信息,例如点数、谱宽等。

 

现在我们来看一个更全面的示例,逐步说明如何访问 Mnova 页面中的所有对象。

访问多个对象:布局脚本

 

作为一个示例,我们将创建一个脚本,用于组织页面中的不同对象。出于显而易见的原因,这个脚本将被称为布局脚本。

首先,打开一个波谱、一个分子和一张图片(例如,可以是贵公司的徽标)。 下图显示了本示例的初始条件:

 

embim34

 

这里的目标是创建一个脚本,将这 3 个对象排列在一起,使图片位于页面左侧,而波谱和分子则移到图片旁边。

 

// <图形用户界面 menuname="布局 "shortcut="Ctrl+2" tooltip="Layout" />

function layout() {

 

 var i, item, width, height、

 w = mainWindow.activeWindow()、

 p = w.curPage()、

 n = p.itemCount();

 

 for(i = 0; i < n; i++) {

 

 item = p.item(i);

 width = item.width;

 height = item.height;

 

 switch(item.name) {

 case "NMR Spectrum":

 item.left = p.left + 50;

 item.right = p.right - 10;

 item.top = p.top + 20;

 item.bottom = p.bottom;

 断开;

 

 case "分子":

 item.left = p.left + 50;

 item.right = item.left + width;

 item.top = p.top;

 item.bottom = p.top + height;

 断开;

 

 case "图像":

 item.left = p.left;

 item.right = item.left + width;

 item.top = p.top;

 item.bottom = item.top + height;

 断开;

 }

 }

 w.update();

}

 

Mnova 中的每个对象都包含在页面中,而页面又包含在文档中。因此,我们首先要访问的是文档。这可以在这一行中完成:

 

w = mainWindow.activeWindow()、

 

基本上,我们通过 应用程序对象访问文档窗口。

有了文档后,我们就可以通过 Page 对象轻松访问当前活动页面,如下所示:

 

p = w.curPage()、

 

现在,我们可以浏览该页面中包含的所有对象了。对于每个对象,我们都会在切换命令中检查其确切类型,然后相应地调整对象的位置。这就是本例的结果。

层

调整布局脚本

 

现在我们将修改布局脚本,以实现以下两个目标:

1.从文件中加载图像

2.执行脚本时在页面上自动显示图谱标题

 

首先,我们将演示如何从磁盘加载图片。为此,您必须使用序列化对象。例如,假设图片位于c:/mnova/logo.png,则可以使用以下代码:

 

serialization.open("c:/mnova/logo.png");

 

接下来是如何在页面上显示一些参数(波谱宽度、溶剂、核)。为此,有必要创建一个专门的 NMR 波谱对象,而不是使用每个项目对象中的默认属性。请参见以下代码片段:

 

"<b>频率(兆赫):</b> {0}<br/>\

 <b>波谱宽度(赫兹):</b> {1}<br/>\

 <b>溶剂:</b> {2}<br/>\

 <b>Nucleus: </b> {3}".format(specItem.frequency().toFixed(4)、

 specItem.scaleWidth().toFixed(2)、

 specItem.solvent、

 specItem.nucleus())、

 true

 );

 

将脚本保存到 Mnova 脚本文件夹后(请注意,脚本文件必须与要调用的函数名称相同,在本例中,脚本名称必须为 "layout2.qs"),然后重新启动程序,就可以按照 "选项/自定义 "菜单将其添加到工具栏中。

 

自定义工具栏

 

这将显示 "自定义工具栏 "对话框。然后,点击 "New Tab(新建标签)"按钮创建一个新工具栏,并点击 "Rename(重命名)"按钮更改其名称(脚本工具栏)。

 

脚本工具栏 1

 

接着,在 "命令 "菜单(位于窗口左侧)中找到 "脚本 "图标(布局),点击 "添加 "按钮,将 "布局 "脚本添加到脚本工具栏的 "新组 "中。

 

脚本工具栏 2

 

最后,点击 "确定",你就可以在 "新工具栏 "中看到 "布局 "图标了。

 

新工具栏

 

您还可以在 "自定义上下文菜单 "对话框中按照类似步骤在任何现有的上下文菜单中引入脚本。

 

自定义 NMR 处理

 

通过脚本处理 NMR 图谱有两种方法:

1.通过处理模板

2.使用处理界面

 

1 处理模板

 

Mnova 可通过脚本使用处理模板(使用全处理功能生成)处理一维或二维 NMR 图谱。正如您在下面的示例中看到的,您可以(通过简单的脚本)处理任何类型的频谱(1H、13C、1D 或 2D)。您只需为每个实验创建处理模板即可。在下面的示例中,我们创建了 3 个不同的处理模板,一个用于处理 1H-NMR 图谱 (1H.mnp),第二个用于处理 13C-NMR 图谱 (13C.mnp),最后一个用于处理 COSY 图谱 (COSY.mnp)。正如您在脚本中看到的,这三个模板都保存在 c:/mnova/(当然您也可以更改路径和模板文件的名称)。

 

 

**globals Application*/

/*缩进:4*/

 

函数 procTemplate() {

 "use strict";

 var procFileName、

 spec = Application.nmr.activeSpectrum();

 

 if (!spec.isValid()) {

 返回;

 }

 如果(spec.dimCount === 1){

 if (spec.nucleus() === "1H"){

 procFileName = "c:/mnova/1H.mnp";

 } else if (spec.nucleus() === "13C"){

 procFileName = "c:/mnova/13C.mnp";

 }

 } else if (spec.dimCount === 2) {

 if (spec.nucleus(1) === "1H" && spec.nucleus(2) === "1H"){

 procFileName = "c:/mnova/COSY.mnp";

 }

 }

 if (procFileName) {

 Application.nmr.processSpectrum(spec, procFileName);

 }

}

 

2 处理界面

 

处理界面可以更改或应用 Mnova 中的任何处理操作。

例如,让我们制作一个简单的脚本,设置指数加权函数:

 

/*globals Application*/

/*jslint 缩进:4*/

 

函数 myProcess() {

 "严格使用";

 var spec = Application.nmr.activeSpectrum()、

 p = spec.proc;

 p.setParameter("Apodization[1].Apply", true);

 p.setParameter("Apodization[1].Exp.Apply", true);

 p.setParameter("Apodization[1].Exp.Value", 0.5);

 spec.process(p);

 Application.mainWindow.activeDocument.update();

}

 

创建表示当前活动频谱的频谱对象后,我们将创建一个处理变量 (p),表示对该特定频谱的处理操作。创建新对象后,我们可以使用 getParameter 和 setParameter 函数读取或更改其值。例如,在本示例中,我们首先将 "Apodization "属性设置为 true(否则将不应用 "Apodization"),然后将指数函数设置为 true,再将线展宽设置为 0.5 Hz。

最后,我们将处理对象赋值给频谱对象(p =spec.proc;),并调用spec.process(); 实际应用所有处理操作。

 

:有关脚本文档的详细信息,请查看 Mnova 安装文件夹,地址为

C:\Program Files\Mestrelab Research S.L\MestReNova\documents\scripts