Задача следующая. Требуется отрисовать молекулу или кристалл в формате векторной графики. Причем, файл не просто должен иметь расширение SVG или подобное ему, а содержать удобные графические примитивы: атомы и связи. Это нужно для удобства дальнейшего редактирования, например, вот такого:
Преимущества в том, что рисунок масштабируется от маленького формата Graphical Abstract до размеров постера A0. На нём можно разместить стрелки движения атомов в ходе реакции, подписать важные фрагменты и убрать акценты с малозначимых деталей.
Нам поможет программа MOLDEN - a pre- and post processing program of molecular and electronic structure. Molden понимает множество форматов выходных файлов от квантовохимических и структурных программ: PDB, CIF и т.п. Выглядит он так:
Открываем файл со структурой, поворачиваем её наилучшим образом и экспортируем в PostScript. Откроем получившийся файл текстовым редактором и увидим:
%!PS-Adobe-2.0 EPSF-2.0
%%Title: Molden
%%For: Schaft
%%Creator: Drs G Schaftenaar
%%DocumentFonts: Courier
%%Pages (atend)
%%BoundingBox: 0 0 612 792
%%EndComments
%
%###### User Preferences ############
%
%---- SIZE AND ORIENTATION OF THE PLOT ---
%
/size { 0.24 } def
%---- These number can be negative -------
/originx { 39.0 } def
/originy { 753.0 } def
/angle { -90.0 } def
%For Portrait use
%/originx { 40.0 } def
%/originy { 240.0 } def
%/angle { 0.0 } def
%and BoundingBox: 25 255 535 765
%
%---- COLORS FOR DENSITY CONTOURS -------
%
/poscontour { 18 } def
/negcontour { 19 } def
...
Это описание графики, к счастью, не на низком уровне, а на уровне тех самых графических объектов, которыми мы собрались оперировать.
/titleandlogo {false} def % мы заменили true на false для отключения печати логотипа
Атомы отрисовываются процедурой /doatom, а связи - процедурой /dorod. Упростим эти процедуры, чтобы уменьшить число графических примитивов и сделать рисунок легче.
% процедура рисует концентрические круги - атом
/doatom
{ gsave
rx ry translate
90 -1 1 % поставив здесь 90 -10 1 мы существенно упростим рисунок
{ gsave
dup cos hue exch satu exch sethsbcolor sin dup scale
newpath
0 0 rad 0 360 arc
closepath fill grestore } for
grestore } def
% процедура рисует связь
/shadedrod
{ gsave
x1 y1 translate
x2 x1 neg add
y2 y1 neg add
{atan neg rotate} stopped not {
87 -3 0 % здесь можно поставить 87 -20 0
{dup
gsave
newpath
cos 1.0 cosb 0.5 mul neg add mul
hue exch satu exch sethsbcolor
sin 1.0 scale
1 cosb scale
0 0 hd 0 180 arcn
x2 x1 neg add dup mul
y2 y1 neg add dup mul
add sqrt
0 cosb eq {/cosb 1.0 def} if 0 exch cosb div translate
0 0 hd 180 360 arc
closepath fill
grestore } for
} if
grestore } def
При большом желании можно переписать эти процедуры полностью на свой вкус, понадобится учебник языка PostScript и несколько проб. Я ограничился минимальной правкой с одной лишь целью - кардинально уменьшить число кругов и линий, так потом проще редактировать файл в программе Inkscape. Радикальное упрощение позволяет создать такой рисунок:
А способ, описаный выше - вот такой:
А способ, описаный выше - вот такой:




Комментариев нет:
Отправить комментарий