воскресенье, 5 августа 2018 г.

Молекулярные структуры в векторной графике

Задача следующая. Требуется отрисовать молекулу или кристалл в формате векторной графики. Причем, файл не просто должен иметь расширение 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. Радикальное упрощение позволяет создать такой рисунок:
А способ, описаный выше - вот такой:


Комментариев нет:

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