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