atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_library.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
22
23/*
24* This file: 'w_library.c'
25*
26* Contains:
27*
28
29 - The functions to create the molecular library
30 - The functions to read the 'Simple chemical XML' files
31
32*
33* List of functions:
34
35 int clean_xml_data (xmlDoc * doc, xmlTextReaderPtr reader);
36 int sml_preview (const char * filetoread);
37 int get_family (gchar * str);
38 int get_sml_files ();
39 int select_from_library (gboolean visible, project * this_proj, atom_search * asearch);
40 int insert_this_project_from_lib (int id, gboolean visible, project * this_proj, atom_search * asearch);
41
42 double get_z_from_periodic_table (gchar * lab);
43
44 gchar * replace_markup (char * init, char * key, char * rep);
45 gchar * substitute_string (gchar * init, gchar * o_motif, gchar * n_motif);
46 gchar * check_xml_string (gchar * init);
47 gchar * open_sml_file (const char * filetoread, int fam);
48
49 void sort_files (int num_f);
50 void fill_molecule_tree (GtkListStore * store);
51 void fill_family_tree (GtkListStore * store);
52 void insert_preview ();
53 void prepare_preview (int active, int id, gboolean visible);
54
55 G_MODULE_EXPORT void select_library_data (GtkTreeView * tree_view, GtkTreePath * path, GtkTreeViewColumn * column, gpointer data);
56 G_MODULE_EXPORT void set_library_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data);
57 G_MODULE_EXPORT void run_select_from_library (GtkDialog * lib, gint response_id, gpointer data);
58
59 GtkWidget * library_tree (GtkListStore * store, int id, gchar * name);
60
61*/
62
63#include "global.h"
64#include "bind.h"
65#include "interface.h"
66#include "project.h"
67#include "glview.h"
68#include "glwindow.h"
69#include <libxml/xmlreader.h>
70
72 {"X", i18n("Unknown"), 0, 0},
73 {"H", i18n("Hydrogen"), 1, 1.008},
74 {"He", i18n("Helium"), 2, 4.003},
75 {"Li", i18n("Lithium"), 3, 6.94},
76 {"Be", i18n("Beryllium"), 4, 9.012},
77 {"B", i18n("Boron"), 5, 10.81},
78 {"C", i18n("Carbon"), 6, 12.011},
79 {"N", i18n("Nitrogen"), 7, 14.007},
80 {"O", i18n("Oxygen"), 8, 15.999},
81 {"F", i18n("Fluorine"), 9, 18.998},
82 {"Ne", i18n("Neon"), 10, 20.18},
83 {"Na", i18n("Sodium"), 11, 22.99},
84 {"Mg", i18n("Magnesium"), 12, 24.305},
85 {"Al", i18n("Aluminium"), 13, 26.982},
86 {"Si", i18n("Silicon"), 14, 28.085},
87 {"P", i18n("Phosphorus"), 15, 30.974},
88 {"S", i18n("Sulfur"), 16, 32.06},
89 {"Cl", i18n("Chlorine"), 17, 35.45},
90 {"Ar", i18n("Argon"), 18, 39.948},
91 {"K", i18n("Potassium"), 19, 39.098},
92 {"Ca", i18n("Calcium"), 20, 40.078},
93 {"Sc", i18n("Scandium"), 21, 44.956},
94 {"Ti", i18n("Titanium"), 22, 47.867},
95 {"V", i18n("Vanadium"), 23, 50.942},
96 {"Cr", i18n("Chromium"), 24, 51.996},
97 {"Mn", i18n("Manganese"), 25, 54.938},
98 {"Fe", i18n("Iron"), 26, 55.845},
99 {"Co", i18n("Cobalt"), 27, 58.933},
100 {"Ni", i18n("Nickel"), 28, 58.693},
101 {"Cu", i18n("Copper"), 29, 63.546},
102 {"Zn", i18n("Zinc"), 30, 65.38},
103 {"Ga", i18n("Gallium"), 31, 69.723},
104 {"Ge", i18n("Germanium"), 32, 72.63},
105 {"As", i18n("Arsenic"), 33, 74.922},
106 {"Se", i18n("Selenium"), 34, 78.971},
107 {"Br", i18n("Bromine"), 35, 79.904},
108 {"Kr", i18n("Krypton"), 36, 83.798},
109 {"Rb", i18n("Rubidium"), 37, 85.468},
110 {"Sr", i18n("Strontium"), 38, 87.62},
111 {"Y", i18n("Yttrium"), 39, 88.906},
112 {"Zr", i18n("Zirconium"), 40, 91.224},
113 {"Nb", i18n("Niobium"), 41, 92.906},
114 {"Mo", i18n("Molybdenum"), 42, 95.95},
115 {"Tc", i18n("Technetium"), 43, 98},
116 {"Ru", i18n("Ruthenium"), 44, 101.07},
117 {"Rh", i18n("Rhodium"), 45, 102.906},
118 {"Pd", i18n("Palladium"), 46, 106.42},
119 {"Ag", i18n("Silver"), 47, 107.868},
120 {"Cd", i18n("Cadmium"), 48, 112.414},
121 {"In", i18n("Indium"), 49, 114.818},
122 {"Sn", i18n("Tin"), 50, 118.71},
123 {"Sb", i18n("Antimony"), 51, 121.76},
124 {"Te", i18n("Tellurium"), 52, 127.6},
125 {"I", i18n("Iodine"), 53, 126.904},
126 {"Xe", i18n("Xenon"), 54, 131.293},
127 {"Cs", i18n("Caesium"), 55, 132.905},
128 {"Ba", i18n("Barium"), 56, 137.327},
129 {"La", i18n("Lanthanum"), 57, 138.905},
130 {"Ce", i18n("Cerium"), 58, 140.116},
131 {"Pr", i18n("Praseodymium"), 59, 140.908},
132 {"Nd", i18n("Neodymium"), 60, 144.242},
133 {"Pm", i18n("Promethium"), 61, 145},
134 {"Sm", i18n("Samarium"), 62, 150.36},
135 {"Eu", i18n("Europium"), 63, 151.964},
136 {"Gd", i18n("Gadolinium"), 64, 157.25},
137 {"Tb", i18n("Terbium"), 65, 158.925},
138 {"Dy", i18n("Dysprosium"), 66, 162.5},
139 {"Ho", i18n("Holmium"), 67, 164.93},
140 {"Er", i18n("Erbium"), 68, 167.259},
141 {"Tm", i18n("Thulium"), 69, 168.934},
142 {"Yb", i18n("Ytterbium"), 70, 173.045},
143 {"Lu", i18n("Lutetium"), 71, 174.967},
144 {"Hf", i18n("Hafnium"), 72, 178.49},
145 {"Ta", i18n("Tantalum"), 73, 180.948},
146 {"W", i18n("Tungsten"), 74, 183.84},
147 {"Re", i18n("Rhenium"), 75, 186.207},
148 {"Os", i18n("Osmium"), 76, 190.23},
149 {"Ir", i18n("Iridium"), 77, 192.217},
150 {"Pt", i18n("Platinum"), 78, 195.084},
151 {"Au", i18n("Gold"), 79, 196.967},
152 {"Hg", i18n("Mercury"), 80, 200.592},
153 {"Tl", i18n("Thallium"), 81, 204.38},
154 {"Pb", i18n("Lead"), 82, 207.2},
155 {"Bi", i18n("Bismuth"), 83, 208.98},
156 {"Po", i18n("Polonium"), 84, 209},
157 {"At", i18n("Astatine"), 85, 210},
158 {"Rn", i18n("Radon"), 86, 222},
159 {"Fr", i18n("Francium"), 87, 223},
160 {"Ra", i18n("Radium"), 88, 226},
161 {"Ac", i18n("Actinium"), 89, 227},
162 {"Th", i18n("Thorium"), 90, 232.038},
163 {"Pa", i18n("Protactinium"), 91, 231.036},
164 {"U", i18n("Uranium"), 92, 238.029},
165 {"Np", i18n("Neptunium"), 93, 237},
166 {"Pu", i18n("Plutonium"), 94, 244},
167 {"Am", i18n("Americium"), 95, 243},
168 {"Cm", i18n("Curium"), 96, 247},
169 {"Bk", i18n("Berkelium"), 97, 247},
170 {"Cf", i18n("Californium"), 98, 251},
171 {"Es", i18n("Einsteinium"), 99, 252},
172 {"Fm", i18n("Fermium"), 100, 257},
173 {"Md", i18n("Mendelevium"), 101, 258},
174 {"No", i18n("Nobelium"), 102, 258},
175 {"Lr", i18n("Lawrencium"), 103, 262},
176 {"Rf", i18n("Rutherfordium"), 104, 267},
177 {"Db", i18n("Dubnium"), 105, 268},
178 {"Sg", i18n("Seaborgium"), 106, 269},
179 {"Bh", i18n("Bohrium"), 107, 270},
180 {"Hs", i18n("Hassium"), 108, 277},
181 {"Mt", i18n("Meitnerium"), 109, 278},
182 {"Ds", i18n("Darmstadtium"), 110, 281},
183 {"Rg", i18n("Roentgenium"), 111, 282},
184 {"Cn", i18n("Copernicium"), 112, 285},
185 {"Nh", i18n("Nihonium"), 113, 286},
186 {"Fl", i18n("Flerovium"), 114, 289},
187 {"Mc", i18n("Moscovium"), 115, 289},
188 {"Lv", i18n("Livermorium"), 116, 293},
189 {"Ts", i18n("Tennessine"), 117, 294},
190 {"Og", i18n("Oganesson"), 118, 294},
191 {"D", i18n("Deuterium"), 1, 2.014000}};
192
194 { i18n("Atom"), NULL, -1, 0 },
195 { NULL, "H", 1, 1 },
196 { NULL, "B", 5, 1 },
197 { NULL, "C", 6, 1 },
198 { NULL, "N", 7, 1 },
199 { NULL, "O", 8, 1 },
200 { NULL, "F", 9, 1 },
201 { NULL, "S", 16, 1 },
202 { NULL, "Cl", 17, 1 },
203 { NULL, i18n("Other ..."), -1, 1 },
204 { i18n("Library"), NULL, -1, 0 },
205 { NULL, "H<sub>2</sub>O", -1, 3 },
206 { NULL, "CH<sub>4</sub>", -1, 5 },
207 { NULL, i18n("Toluene"), -1, 15 },
208 { NULL, "Cp", -1, 10 },
209 { NULL, "C<sub>60</sub>", -1, 60},
210 { NULL, i18n("Ni-Phthalocyanine"), -1, 57 },
211 { NULL, i18n("More ..."), -1, -1 },
212 { NULL, NULL, -1, 0 }};
213
214#define FAMILY 26
215gchar * family_list[FAMILY]={i18n("Misc"),
216 i18n("Alcohols"),
217 i18n("Aldehydes"),
218 i18n("Alkanes"),
219 i18n("Alkenes"),
220 i18n("Alkynes"),
221 i18n("Amides"),
222 i18n("Amines"),
223 i18n("Amino acids"),
224 i18n("Aromatics"),
225 i18n("Carboxylic acids"),
226 i18n("Cyclic alkanes"),
227 i18n("Cyclic alkenes"),
228 i18n("Ethers"),
229 i18n("Fatty acids"),
230 i18n("Fullerenes"),
231 i18n("Heterocyclics"),
232 i18n("Macrocycles"),
233 i18n("Ketones"),
234 i18n("Nitriles"),
235 i18n("Nucleobases"),
236 i18n("Steroids"),
237 i18n("Sugars (Linears)"),
238 i18n("Sugars (Cyclics)"),
239 i18n("Sulfoxides"),
240 i18n("Thiols")};
241
242gchar * family_dir[FAMILY]={"Misc",
243 "Alcohols",
244 "Aldehydes",
245 "Alkanes",
246 "Alkenes",
247 "Alkynes",
248 "Amides",
249 "Amines",
250 "Amino_acids",
251 "Aromatics",
252 "Carboxylic_acids",
253 "Cyclic_alkanes",
254 "Cyclic_alkenes",
255 "Ethers",
256 "Fatty_acids",
257 "Fullerenes",
258 "Heterocyclics",
259 "Macrocycles",
260 "Ketones",
261 "Nitriles",
262 "Nucleobases",
263 "Steroids",
264 "Linear_sugars",
265 "Cyclic_sugars",
266 "Sulfoxides",
267 "Thiols"};
268
269#ifdef GTK3
270#ifndef G_OS_WIN32
271extern void gtk_window_change_gdk_visual (GtkWidget * win);
272#endif // G_OS_WIN32
273#endif // GTK3
274
275extern gboolean create_3d_model (int p, gboolean load);
276extern G_MODULE_EXPORT void on_realize (GtkGLArea * area, gpointer data);
277extern xmlNodePtr findnode (xmlNodePtr startnode, char * nname);
278extern int action_atoms_from_project (project * this_proj, atom_search * asearch, gboolean visible);
279extern void to_insert_in_project (int stat, int orig, project * this_proj, atom_search * asearch, gboolean visible);
280extern void create_object_from_library (int p);
282GtkListStore * family_store;
284GtkListStore * molecule_store;
285GtkTreeIter first_mol_iter;
286GtkTreeSelection * libselect[2];
290gchar ** mol_name;
291GtkWidget * lib_preview_box = NULL;
292GtkWidget * lib_preview_plot = NULL;
294gchar * other_name[5];
297
306{
307 int i;
308 for (i=0; i<120; i++)
309 {
310 if (g_strcmp0 (periodic_table_info[i].lab, lab) == 0) return periodic_table_info[i].Z;
311 }
312 return 0.0;
313}
314
323int clean_xml_data (xmlDoc * doc, xmlTextReaderPtr reader)
324{
325 xmlFreeDoc(doc);
326 xmlFreeTextReader(reader);
327 xmlCleanupParser();
328 return 0;
329}
330
340gchar * replace_markup (char * init, char * key, char * rep)
341{
342 gchar * buffer = NULL;
343 char * p = NULL;
344 int inilen = strlen(init);
345 int oldlen = strlen(key);
346 int newlen = (rep) ? strlen(rep) : 0;
347
348 // Is key in init
349 p = strstr(init, key);
350 if (! p) return g_strdup(init);
351
352 buffer = g_malloc0 ((inilen+newlen-oldlen+1)*sizeof*buffer);
353 buffer[0] = '\0';
354
355 // Copy what is before the pattern
356 strncat(buffer, init, p - init);
357
358 // Replace
359 if (rep) strcat(buffer, rep);
360
361 // Add the rest of the key
362 strcat(buffer, p+oldlen);
363 return buffer;
364}
365
375gchar * substitute_string (gchar * init, gchar * o_motif, gchar * n_motif)
376{
377 gchar * str_a, * str_b;
378 str_a = replace_markup (init, o_motif, n_motif);
379 str_b = g_strdup_printf ("%s", init);
380 while (g_strcmp0 (str_a, str_b))
381 {
382 g_free (str_b);
383 str_b = g_strdup_printf ("%s", str_a);
384 g_free (str_a);
385 str_a = replace_markup (str_b, o_motif, n_motif);
386 }
387 g_free (str_b);
388 return str_a;
389}
390
398gchar * check_xml_string (gchar * init)
399{
400 gchar * str = g_strdup_printf ("%s", substitute_string (init, "--i--", "<i>"));
401 str = g_strdup_printf ("%s", substitute_string (str, "--I--", "</i>"));
402 str = g_strdup_printf ("%s", substitute_string (str, "--b--", "<sup>"));
403 str = g_strdup_printf ("%s", substitute_string (str, "--e--", "</sup>"));
404 str = g_strdup_printf ("%s", substitute_string (str, "--c--", "<sub>"));
405 str = g_strdup_printf ("%s", substitute_string (str, "--f--", "</sub>"));
406
407 return str;
408}
409
417int sml_preview (const char * filetoread)
418{
419 int i, j, k;
420 xmlDoc * doc;
421 xmlTextReaderPtr reader;
422 xmlNodePtr racine, name_node, chem_node;
423 xmlNodePtr n_node, at_node, sp_node, coord_node;
424 xmlNodePtr spec_node, lab_node, lot_node, pbc_node;
425 xmlAttrPtr xspec;
426 xmlChar * content;
427
428 if (lib_proj != NULL) close_project (lib_proj);
429 init_project (TRUE);
431
432 reader = xmlReaderForFile(filetoread, NULL, 0);
433 doc = xmlParseFile(filetoread);
434 racine = xmlDocGetRootElement(doc);
435
436 name_node = findnode (racine -> children, "names");
437 if (name_node == NULL) return clean_xml_data (doc, reader);
438 n_node = findnode (name_node -> children, "library-name");
439 if (n_node == NULL) return clean_xml_data (doc, reader);
440 content = xmlNodeGetContent(n_node);
441 lib_proj -> name = g_strdup_printf ("%s", content);
442 xmlFree (content);
443 lib_proj -> name = check_xml_string (lib_proj -> name);
444 n_node = findnode (name_node -> children, "iupac-name");
445 if (n_node == NULL) return clean_xml_data (doc, reader);
446 o_names = 0;
447 content = xmlNodeGetContent(n_node);
448 other_name[0] = g_strdup_printf ("%s", content);
449 xmlFree (content);
450 o_names ++;
451 n_node = findnode (name_node -> children, "other-names");
452 if (n_node == NULL) return clean_xml_data (doc, reader);
453 n_node = n_node -> children;
454 for (name_node = n_node; name_node && o_names < 5; name_node = name_node->next)
455 {
456 if (name_node -> type == XML_ELEMENT_NODE)
457 {
458 content = xmlNodeGetContent(name_node);
459 other_name[o_names] = g_strdup_printf ("%s", content);
460 xmlFree (content);
461 o_names ++;
462 }
463 }
464 chem_node = findnode(racine -> children, "chemistry");
465 if (chem_node == NULL) return clean_xml_data (doc, reader);
466 at_node = findnode (chem_node -> children, "atoms");
467 if (at_node == NULL) return clean_xml_data (doc, reader);
468 content = xmlNodeGetContent(at_node);
469 lib_proj -> natomes = (int)string_to_double ((gpointer)content);
470 xmlFree (content);
471
472 sp_node = findnode (chem_node -> children, "species");
473 if (sp_node == NULL) return clean_xml_data (doc, reader);
474 spec_node = sp_node -> properties -> children;
475 if (spec_node == NULL) return clean_xml_data (doc, reader);
476 content = xmlNodeGetContent(spec_node);
477 lib_proj -> nspec = (int)string_to_double ((gpointer)content);
478 xmlFree (content);
479 if (lib_proj -> natomes < 1 || lib_proj -> nspec < 1) return clean_xml_data (doc, reader);
481 lab_node = sp_node -> children;
482 if (lab_node == NULL) return clean_xml_data (doc, reader);
483 j = 0;
484 for (i=0; i<lib_proj -> nspec; i++)
485 {
486 lab_node = findnode (lab_node, "label");
487 if (lab_node == NULL) return clean_xml_data (doc, reader);
488 content = xmlNodeGetContent(lab_node);
489 lib_proj -> chemistry -> label[i] = g_strdup_printf ("%s", content);
490 xmlFree (content);
491 xspec = lab_node -> properties;
492 if (xspec == NULL) return clean_xml_data (doc, reader);
493 while (xspec)
494 {
495 lot_node = xspec -> children;
496 if (lot_node == NULL) return clean_xml_data (doc, reader);
497 if (g_strcmp0 ("num",(char *)xspec -> name) == 0)
498 {
499 content = xmlNodeGetContent(lot_node);
500 lib_proj -> chemistry -> nsps[i] = (int)string_to_double ((gpointer)content);
501 xmlFree (content);
502 lib_proj -> chemistry -> chem_prop[CHEM_Z][i] = get_z_from_periodic_table (lib_proj -> chemistry -> label[i]);
503 k = (int)lib_proj -> chemistry -> chem_prop[CHEM_Z][i];
504 lib_proj -> chemistry -> chem_prop[CHEM_M][i] = periodic_table_info[k].M;
505 lib_proj -> chemistry -> chem_prop[CHEM_R][i] = set_radius_ (& k, & j);
506 }
507 xspec = xspec -> next;
508 }
509 lab_node = lab_node -> next;
510 }
512 initcutoffs (active_chem, lib_proj -> nspec);
513 at_node = findnode (racine -> children, "coordinates");
514 if (at_node == NULL) return clean_xml_data (doc, reader);
515 coord_node = at_node -> children;
516 if (coord_node == NULL) return clean_xml_data (doc, reader);
517 for (i=0; i<lib_proj -> natomes; i++)
518 {
519 coord_node = findnode (coord_node, "atom");
520 if (coord_node == NULL) return clean_xml_data (doc, reader);
521 xspec = coord_node -> properties;
522 if (xspec == NULL) return clean_xml_data (doc, reader);
523 while (xspec)
524 {
525 lot_node = xspec -> children;
526 if (lot_node == NULL) return clean_xml_data (doc, reader);
527 content = xmlNodeGetContent(lot_node);
528 if (g_strcmp0 ("x",(char *)xspec -> name) == 0)
529 {
530 lib_proj -> atoms[0][i].x = string_to_double ((gpointer)content);
531 }
532 else if (g_strcmp0 ("y",(char *)xspec -> name) == 0)
533 {
534 lib_proj -> atoms[0][i].y = string_to_double ((gpointer)content);
535 }
536 else if (g_strcmp0 ("z",(char *)xspec -> name) == 0)
537 {
538 lib_proj -> atoms[0][i].z = string_to_double ((gpointer)content);
539 }
540 else if (g_strcmp0 ("sp",(char *)xspec -> name) == 0)
541 {
542 lib_proj -> atoms[0][i].sp = (int)string_to_double ((gpointer)content);
543 lib_proj -> atoms[0][i].show[0] = TRUE;
544 }
545 xmlFree (content);
546 xspec = xspec -> next;
547 }
548 coord_node = coord_node -> next;
549 }
550 pbc_node = findnode (racine -> children, "lattice");
551 if (pbc_node != NULL)
552 {
553
554 }
555 xmlFreeDoc(doc);
556 xmlFreeTextReader(reader);
557 xmlCleanupParser();
558 return 1;
559}
560
569gchar * open_sml_file (const char * filetoread, int fam)
570{
571 xmlDoc * doc;
572 xmlTextReaderPtr reader;
573 const xmlChar sml[8]="scl-xml";
574 xmlChar * cdata;
575 xmlNodePtr racine, node;
576 /*
577 * build an xmlReader for that file
578 */
579 reader = xmlReaderForFile(filetoread, NULL, 0);
580 if (reader == NULL)
581 {
582 return NULL;
583 }
584 else
585 {
586 doc = xmlParseFile(filetoread);
587 if (doc == NULL) return NULL;
588 racine = xmlDocGetRootElement(doc);
589 if (g_strcmp0 ((char *)(racine -> name), (char *)sml) != 0)
590 {
591 clean_xml_data (doc, reader);
592 return NULL;
593 }
594 node = racine -> children;
595 node = findnode(node, "class");
596 cdata = xmlNodeGetContent(node);
597 if (g_strcmp0 ((gchar *)cdata, family_list[fam]) != 0)
598 {
599 xmlFree (cdata);
600 clean_xml_data (doc, reader);
601 return NULL;
602 }
603 xmlFree (cdata);
604 node = findnode (racine -> children, "names");
605 if (node == NULL)
606 {
607 clean_xml_data (doc, reader);
608 return NULL;
609 }
610 node = findnode (node -> children, "library-name");
611 if (node == NULL)
612 {
613 clean_xml_data (doc, reader);
614 return NULL;
615 }
616 cdata = xmlNodeGetContent(node);
617 xmlFreeDoc(doc);
618 xmlFreeTextReader(reader);
619 xmlCleanupParser();
620 return (gchar *)cdata;
621 }
622}
623
631int get_family (gchar * str)
632{
633 int i;
634 for (i=0; i<FAMILY; i++)
635 {
636 if (g_strcmp0 (str, _(family_list[i])) == 0) return i;
637 }
638 return -1;
639}
640
648void sort_files (int num_f)
649{
650 int i, j;
651 gchar * str = NULL;
652 for(i=0;i<num_f;i++)
653 {
654 for(j=i+1;j<num_f;j++)
655 {
656 if(g_strcmp0 (mol_name[i],mol_name[j])>0)
657 {
658 str = g_strdup_printf ("%s", mol_name[i]);
659 mol_name[i] = g_strdup_printf ("%s", mol_name[j]);
660 mol_name[j] = g_strdup_printf ("%s", str);
661 str = g_strdup_printf ("%s", sml_file_name[i]);
662 sml_file_name[i] = g_strdup_printf ("%s", sml_file_name[j]);
663 sml_file_name[j] = g_strdup_printf ("%s", str);
664 }
665 }
666 }
667 for(i=0;i<num_f;i++)
668 {
670 }
671}
672
679{
680 int val = 0;
681 gchar * str, * fsml;
682 gchar * libdir;
683#ifdef G_OS_WIN32
684 libdir = g_strdup_printf ("%s\\molecules\\%s", PACKAGE_LIB_DIR, family_dir[the_family]);
685 gchar * libwin32 = g_strdup_printf ("%s\\molecules\\%s\\*.sml", PACKAGE_LIB_DIR, family_dir[the_family]);
686 WIN32_FIND_DATA ffd;
687 HANDLE hFind = FindFirstFile (libwin32, & ffd);
688 if (hFind != INVALID_HANDLE_VALUE)
689 {
690 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
691 {
692 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
693 if (open_sml_file(str, the_family) != NULL) val ++;
694 g_free (str);
695 }
696 while (FindNextFile(hFind, &ffd) != 0)
697 {
698 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
699 {
700 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
701 if (open_sml_file(str, the_family) != NULL) val ++;
702 g_free (str);
703 }
704 }
705 FindClose(hFind);
706 }
707#else
708 libdir = g_strdup_printf ("%s/molecules/%s", PACKAGE_LIB_DIR, family_dir[the_family]);
709 DIR * d;
710 struct dirent * dir;
711 d = opendir(libdir);
712 if (d)
713 {
714 while ((dir = readdir(d)) != NULL)
715 {
716 if (dir -> d_type == DT_REG)
717 {
718 str = g_strdup_printf ("%s/%s", libdir, dir -> d_name);
719 if (open_sml_file(str, the_family) != NULL) val ++;
720 g_free (str);
721 }
722 }
723 closedir(d);
724 }
725#endif
726 if (val > 0)
727 {
728 sml_file_name = g_malloc0(val*sizeof*sml_file_name);
729 mol_name = g_malloc0(val*sizeof*mol_name);
730 val = 0;
731#ifdef G_OS_WIN32
732 hFind = FindFirstFile (libwin32, & ffd);
733 if (hFind != INVALID_HANDLE_VALUE)
734 {
735 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
736 {
737 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
738 fsml = open_sml_file(str, the_family);
739 if (fsml != NULL)
740 {
741 sml_file_name[val] = g_strdup_printf ("%s", str);
742 mol_name[val] = g_strdup_printf ("%s", fsml);
743 val ++;
744 g_free (fsml);
745 }
746 g_free (str);
747 }
748 while (FindNextFile(hFind, &ffd) != 0)
749 {
750 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
751 {
752 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
753 fsml = open_sml_file(str, the_family);
754 if (fsml != NULL)
755 {
756 sml_file_name[val] = g_strdup_printf ("%s", str);
757 mol_name[val] = g_strdup_printf ("%s", fsml);
758 val ++;
759 g_free (fsml);
760 }
761 g_free (str);
762 }
763 }
764 FindClose(hFind);
765 }
766#else
767 d = opendir (libdir);
768 if (d)
769 {
770 while ((dir = readdir(d)) != NULL)
771 {
772 if (dir -> d_type == DT_REG)
773 {
774 str = g_strdup_printf ("%s/%s", libdir, dir -> d_name);
775 fsml = open_sml_file(str, the_family);
776 if (fsml != NULL)
777 {
778 sml_file_name[val] = g_strdup_printf ("%s", str);
779 mol_name[val] = g_strdup_printf ("%s", fsml);
780 val ++;
781 g_free (fsml);
782 }
783 g_free (str);
784 }
785 }
786 closedir(d);
787 }
788#endif
789 sort_files (val);
790 }
791 return val;
792}
793
801void fill_molecule_tree (GtkListStore * store)
802{
803 GtkTreeIter mol_level;
804 int i;
805 for (i=0; i<get_sml_files (); i++)
806 {
807 if (i == 0)
808 {
809 gtk_list_store_append (store, & first_mol_iter);
810 gtk_list_store_set (store, & first_mol_iter, 0, -(i+1), 1, mol_name[i], -1);
811 }
812 else
813 {
814 gtk_list_store_append (store, & mol_level);
815 gtk_list_store_set (store, & mol_level, 0, -(i+1), 1, mol_name[i], -1);
816 }
817 }
818}
819
827void fill_family_tree (GtkListStore * store)
828{
829 GtkTreeIter family_level;
830 int i;
831 for (i=0; i<FAMILY; i++)
832 {
833 if (i == 0)
834 {
835 gtk_list_store_append (store, & first_family_iter);
836 gtk_list_store_set (store, & first_family_iter, 0, i, 1, _(family_list[i]), -1);
837 }
838 else
839 {
840 gtk_list_store_append (store, & family_level);
841 gtk_list_store_set (store, & family_level, 0, i, 1, _(family_list[i]), -1);
842 }
843 }
844}
845
852{
853 gchar * str;
854 lib_preview_plot = gtk_fixed_new ();
855 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lib_preview_box, lib_preview_plot, FALSE, FALSE, 0);
856 GtkWidget * grid = gtk_grid_new ();
857 gtk_fixed_put (GTK_FIXED(lib_preview_plot), grid, 0, 10);
858 gtk_widget_set_size_request (grid, -1, 200);
859 gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
860 gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
861 gtk_grid_set_row_spacing (GTK_GRID (grid), 1);
862 gtk_grid_set_column_spacing (GTK_GRID (grid), 1);
863
864 gtk_grid_attach (GTK_GRID (grid), lib_proj -> modelgl -> plot, 0, 0, 4, 4);
865 gtk_grid_attach (GTK_GRID (grid), markup_label(_("<i>Formula:</i>"), 100, -1, 0.0, 0.5), 5, 1, 3, 1);
866 int i;
867 for (i=0; i<lib_proj -> nspec; i++)
868 {
869 if (i > 0)
870 {
871 str = g_strdup_printf ("%s <b>%s", str, lib_proj -> chemistry -> label[i]);
872 }
873 else
874 {
875 str = g_strdup_printf ("<b>%s", lib_proj -> chemistry -> label[i]);
876 }
877 if (lib_proj -> chemistry -> nsps[i] > 1)
878 {
879 str = g_strdup_printf ("%s<sub>%d</sub>", str, lib_proj -> chemistry -> nsps[i]);
880 }
881 str = g_strdup_printf ("%s</b>", str);
882 }
883 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, -1, 0.0, 0.5), 8, 1, 3, 1);
884 gtk_grid_attach (GTK_GRID (grid),markup_label(_("<i>Molecular mass:</i>"), 100, -1, 0.0, 0.5), 5, 2, 3, 1);
885 g_free (str);
886 double mass = 0.0;
887 for (i=0; i<lib_proj -> nspec; i++)
888 {
889 mass += (lib_proj -> chemistry -> nsps[i]*lib_proj -> chemistry -> chem_prop[CHEM_M][i]);
890 }
891 str = g_strdup_printf ("<b>%.3f g/mol</b>", mass);
892 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, -1, 0.0, 0.5), 8, 2, 3, 1);
893 g_free (str);
894
895 gtk_grid_attach (GTK_GRID (grid), markup_label(_("<i>IUPAC name:</i>"), 100, -1, 0.0, 0.5), 0, 5, 3, 1);
896 str = g_strdup_printf ("<b>%s</b>", check_xml_string(other_name[0]));
897 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, 30, 0.0, 0.5), 3, 5, 11, 1);
898
899 if (o_names > 1)
900 {
901 GtkWidget * hbox = create_hbox (0);
902 gtk_fixed_put (GTK_FIXED(lib_preview_plot), hbox, 0, 230);
903 GtkWidget * vbox = create_vbox (BSEP);
904 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 0);
905 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(_("<i>Other name(s):</i>"), 100, 30, 0.0, 0.5), FALSE, FALSE, 0);
906 for (i=1; i<o_names; i++)
907 {
908 if (i > 1)
909 {
910 str = g_strdup_printf ("%s\n<b>%s</b>", str, check_xml_string(other_name[i]));
911 }
912 else
913 {
914 str = g_strdup_printf ("<b>%s</b>", check_xml_string(other_name[i]));
915 }
916 }
918 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 15);
919 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(str, 100, 30+20*(o_names-2), 0.0, 0.5), FALSE, FALSE, 0);
920 g_free (str);
921 }
923}
924
934void prepare_preview (int active, int id, gboolean visible)
935{
936 if (sml_file_name != NULL)
937 {
938 if (sml_preview (sml_file_name[id]))
939 {
941 lib_proj -> run = TRUE;
943 create_3d_model (lib_proj -> id, FALSE);
944 if (visible)
945 {
947 }
948 else
949 {
950 on_realize (NULL, lib_proj -> modelgl);
951 }
952 bonds_update = 0;
953 active_glwin = lib_proj -> modelgl;
954 active_glwin -> init = FALSE;
955 active_image = active_glwin -> anim -> last -> img;
956 lib_proj -> runc[0] = TRUE;
958 on_calc_bonds_released (NULL, NULL);
959 lib_proj -> modelgl -> anim -> last -> img -> quality = 30;
960 lib_proj -> modelgl -> anim -> last -> img -> rep = ORTHOGRAPHIC;
961 lib_proj -> modelgl -> anim -> last -> img -> xyz -> axis = NONE;
962 lib_proj -> modelgl -> anim -> last -> img -> abc -> box = NONE;
963 if (visible)
964 {
965 gtk_widget_set_size_request (lib_proj -> modelgl -> plot, 150, 150);
966 update (lib_proj -> modelgl);
967 }
968 active_project_changed (active);
969 }
970 }
971}
972
983G_MODULE_EXPORT void select_library_data (GtkTreeView * tree_view, GtkTreePath * path, GtkTreeViewColumn * column, gpointer data)
984{
985 GtkTreeIter row;
986 GtkTreeModel * model = gtk_tree_view_get_model(tree_view);
987 if (gtk_tree_model_get_iter (model, & row, path))
988 {
989 GValue val = {0, };
990 GValue vbl = {0, };
991 gtk_tree_model_get_value (model, & row, 0, & val);
992 gtk_tree_model_get_value (model, & row, 1, & vbl);
993 int i = (int)g_value_get_int (& val);
994 if (i > -1)
995 {
996 the_family = i;
997 gtk_list_store_clear (molecule_store);
999 gtk_tree_selection_select_iter (libselect[1], & first_mol_iter);
1000 prepare_preview (activep, 0, TRUE);
1001 }
1002 else
1003 {
1004 the_molecule = g_strdup_printf ("%s", (char *)g_value_get_string (& vbl));
1005 prepare_preview (activep, -i-1, TRUE);
1006 }
1007 }
1008}
1009
1021G_MODULE_EXPORT void set_library_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
1022{
1023 set_renderer_markup (mod, iter, renderer, 1);
1024}
1025
1035GtkWidget * library_tree (GtkListStore * store, int id, gchar * name)
1036{
1037 GtkWidget * scrol = create_scroll (NULL, 150, 300, GTK_SHADOW_ETCHED_IN);
1038 GtkTreeViewColumn * datacol;
1039 GtkCellRenderer * datacel;
1040 GtkWidget * dataview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
1041 datacel = gtk_cell_renderer_text_new ();
1042 datacol = gtk_tree_view_column_new_with_attributes (name, datacel, "text", 1, NULL);
1043 gtk_tree_view_column_set_cell_data_func (datacol, datacel, set_library_markup, NULL, NULL);
1044 gtk_tree_view_append_column(GTK_TREE_VIEW(dataview), datacol);
1045 gtk_tree_view_column_set_alignment (datacol, 0.5);
1046 gtk_tree_view_set_activate_on_single_click (GTK_TREE_VIEW(dataview), TRUE);
1047 g_signal_connect (G_OBJECT(dataview), "row-activated", G_CALLBACK(select_library_data), NULL);
1048 g_object_unref (store);
1049 libselect[id] = gtk_tree_view_get_selection (GTK_TREE_VIEW(dataview));
1050 gtk_tree_selection_set_mode (libselect[id], GTK_SELECTION_SINGLE);
1051 add_container_child (CONTAINER_SCR, scrol, dataview);
1052 return scrol;
1053}
1054
1055gboolean lib_res;
1057
1067G_MODULE_EXPORT void run_select_from_library (GtkDialog * lib, gint response_id, gpointer data)
1068{
1069 gboolean done = FALSE;
1070 atom_search * asearch = (atom_search *)data;
1071 project * this_proj = get_project_by_id (asearch -> proj);
1072 GtkWidget * vbox;
1073 switch (response_id)
1074 {
1075 case GTK_RESPONSE_APPLY:
1076 vbox = dialog_get_content_area ((GtkWidget *)lib);
1077 widget_set_sensitive (vbox, FALSE);
1078 if (this_proj -> modelgl) this_proj -> modelgl -> other_status = 2;
1081 if (asearch -> action == INSERT)
1082 {
1083 to_insert_in_project (FROM_LIBRARY, -1, this_proj, asearch, lib_visible);
1084 if (! lib_visible)
1085 {
1086 gboolean vis;
1087 if (this_proj -> modelgl)
1088 {
1089 vis = (this_proj -> modelgl -> atom_win) ? this_proj -> modelgl -> atom_win -> visible : FALSE;
1090 }
1091 else
1092 {
1093 vis = FALSE;
1094 }
1095 inserted_from_lib += action_atoms_from_project (this_proj, asearch, vis);
1096 }
1097 if (this_proj -> modelgl) this_proj -> modelgl -> nth_copy ++;
1098 }
1100 widget_set_sensitive (vbox, TRUE);
1101 if (asearch -> action == REPLACE) done = TRUE;
1102 break;
1103 default:
1104 if (this_proj -> modelgl)
1105 {
1106 if (this_proj -> modelgl -> mode == EDITION) asearch -> todo[0] = 0;
1107 }
1108 lib_res = 0;
1109 done = TRUE;
1110 break;
1111 }
1112 if (done) destroy_this_dialog (lib);
1113}
1114
1124int select_from_library (gboolean visible, project * this_proj, atom_search * asearch)
1125{
1126 int active = activep;
1127 int nats = this_proj -> natomes;
1128 lib_visible = visible;
1129 GtkWidget * lib = dialogmodal (_("Library"), GTK_WINDOW((this_proj -> modelgl) ? this_proj -> modelgl -> win : MainWindow));
1130#ifdef GTK3
1131#ifdef GTKGLAREA
1132#ifndef OSX
1133#ifndef G_OS_WIN32
1134 if (! atomes_visual) gtk_window_change_gdk_visual (lib);
1135#endif // G_OS_WIN32
1136#endif // OSX
1137#endif // GTKGLAREA
1138#endif // GTK3
1139 gtk_dialog_add_button (GTK_DIALOG(lib), (asearch -> action == REPLACE) ? _("Replace") : _("Insert"), GTK_RESPONSE_APPLY);
1140 GtkWidget * vbox = dialog_get_content_area (lib);
1141 GtkWidget * hbox = create_hbox (5);
1142 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1143 sml_file_name = mol_name = NULL;
1144 family_store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
1146 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, library_tree (family_store, 0, _("Family")), FALSE, FALSE, 0);
1147 molecule_store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
1148 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, library_tree (molecule_store, 1, _("Molecule")), FALSE, FALSE, 0);
1150 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, lib_preview_box, FALSE, FALSE, 10);
1151 lib_preview_plot = NULL;
1152 the_family = 0;
1153 gtk_tree_selection_select_iter (libselect[0], & first_family_iter);
1154 gtk_list_store_clear (molecule_store);
1156 gtk_tree_selection_select_iter (libselect[1], & first_mol_iter);
1157 show_the_widgets (lib);
1158 prepare_preview (active, 0, TRUE);
1159 if (this_proj -> modelgl) this_proj -> modelgl -> nth_copy = 0;
1161 run_this_gtk_dialog (lib, G_CALLBACK(run_select_from_library), asearch);
1162 active_project_changed (active);
1163 if (! nats && active_project -> natomes)
1164 {
1165 int i;
1166 if (active_image -> style == SPACEFILL)
1167 {
1168 i = OGL_STYLES + active_image -> filled_type;
1170 }
1171 else
1172 {
1173 i = active_image -> style;
1175 }
1177 }
1178 if (sml_file_name != NULL) g_free (sml_file_name);
1179 if (mol_name != NULL) g_free (mol_name);
1180 if (lib_proj != NULL) close_project (lib_proj);
1181 lib_proj = NULL;
1182 lib_preview_plot = NULL;
1183 return lib_res;
1184}
1185
1196int insert_this_project_from_lib (int id, gboolean visible, project * this_proj, atom_search * asearch)
1197{
1198 sml_file_name = mol_name = NULL;
1199 int family[6] = {0, 3, 9, 9, 15, 17};
1200 int molec[6] = {0, 8, 36, 21, 11, 0};
1201 int active = activep;
1202 int nats = this_proj -> natomes;
1203 the_family = family[id];
1204 if (get_sml_files ())
1205 {
1206 prepare_preview (active, molec[id], FALSE);
1207 if (this_proj -> modelgl) this_proj -> modelgl -> other_status = 2;
1209 if (asearch -> action == INSERT)
1210 {
1211 to_insert_in_project (FROM_LIBRARY, -1, this_proj, asearch, visible);
1212 }
1213 }
1214 active_project_changed (active);
1215 if (! nats && active_project -> natomes)
1216 {
1217 int i;
1218 if (active_image -> style == SPACEFILL)
1219 {
1220 i = OGL_STYLES + active_image -> filled_type;
1222 }
1223 else
1224 {
1225 i = active_image -> style;
1227 }
1229 }
1230 if (sml_file_name != NULL) g_free (sml_file_name);
1231 if (mol_name != NULL) g_free (mol_name);
1232 if (lib_proj != NULL) close_project (lib_proj);
1233 lib_proj = NULL;
1234 return FROM_LIBRARY;
1235}
atom_search * remove_search
Definition popup.c:174
insertion_menu mol[]
Definition w_library.c:193
Binding to the Fortran90 subroutines.
double set_radius_(int *, int *)
gchar * substitute_string(gchar *init, gchar *o_motif, gchar *n_motif)
substitute all patterns in string
Definition w_library.c:375
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
void close_project(project *to_close)
close a project
Definition close_p.c:260
ColRGBA col
Definition d_measures.c:77
int atoms[NUM_STYLES][2]
GtkTreePath * path
Definition datab.c:103
GtkTreeIter row
Definition datab.c:104
float val
Definition dlp_init.c:117
dint rep
Definition dlp_edit.c:2242
gchar * filetoread
gchar * PACKAGE_LIB_DIR
Definition global.c:89
int activep
Definition global.c:162
GtkWidget * MainWindow
Definition global.c:207
int bonds_update
Definition global.c:173
int atomes_visual
Definition global.c:168
#define i18n(String)
Definition global.c:80
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
glwin * active_glwin
Definition project.c:53
GtkWidget * create_scroll(GtkWidget *box, int dimx, int dimy, int shadow)
create a scroll window
Definition gtk-misc.c:2139
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:552
element_data periodic_table_info[]
Definition w_library.c:71
project * proj
chemical_data * active_chem
Definition project.c:48
#define BSEP
Definition global.h:261
void set_renderer_markup(GtkTreeModel *mod, GtkTreeIter *iter, GtkCellRenderer *renderer, int col)
set Pango text markup for a GtkCellRenderer
Definition gtk-misc.c:1764
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:559
#define CHEM_R
Definition global.h:318
@ CONTAINER_SCR
Definition global.h:267
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:861
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2235
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
#define CHEM_M
Definition global.h:317
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
#define CHEM_Z
Definition global.h:316
project * active_project
Definition project.c:47
void initcutoffs(chemical_data *chem, int species)
initialize bond cutoffs
Definition bdcall.c:245
image * active_image
Definition project.c:52
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:72
action
Definition glview.h:198
@ EDITION
Definition glview.h:167
@ ORTHOGRAPHIC
Definition glview.h:160
@ REPLACE
Definition glview.h:235
@ INSERT
Definition glview.h:237
@ SPACEFILL
Definition glview.h:184
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
@ FROM_LIBRARY
Definition glwin.h:80
#define OGL_STYLES
Definition glwin.h:107
void set_this_style(glwin *view, int style)
set general style for atom(s) and bond(s)
Definition m_style.c:293
Function declarations for the creation of the OpenGL window.
void init_project(gboolean alloc_box)
initialize a new project
Definition init_p.c:273
void init_atomes_analysis(project *this_proj, gboolean apply_defaults)
initialize analysis data structures for atomes
Definition initc.c:223
Messaging function declarations.
void alloc_proj_data(project *this_proj, int cid)
allocate data
Definition open_p.c:224
int inserted_from_lib
Definition w_library.c:296
Function declarations for reading atomes project file Function declarations for saving atomes proje...
void active_project_changed(int id)
change the active project
Definition update_p.c:220
Definition glwin.h:332
Definition glwin.h:350
int action_atoms_from_project(project *this_proj, atom_search *asearch, gboolean visible)
apply atom edition action to project (motion, remove, replace, insert, random move)
GtkWidget * lib_preview_box
Definition w_library.c:291
G_MODULE_EXPORT void on_realize(GtkGLArea *area, gpointer data)
gchar * check_xml_string(gchar *init)
check for, and correct tags in XML string
Definition w_library.c:398
gchar * family_list[FAMILY]
Definition w_library.c:215
GtkListStore * family_store
Definition w_library.c:282
GtkListStore * molecule_store
Definition w_library.c:284
xmlNodePtr findnode(xmlNodePtr startnode, char *nname)
find XML node
int the_family
Definition w_library.c:287
int get_sml_files()
get the library 'Simple chemical library XML' files
Definition w_library.c:678
gchar * substitute_string(gchar *init, gchar *o_motif, gchar *n_motif)
substitute all patterns in string
Definition w_library.c:375
double get_z_from_periodic_table(gchar *lab)
get Z from atom label
Definition w_library.c:305
gchar ** mol_name
Definition w_library.c:290
void fill_molecule_tree(GtkListStore *store)
fill molecule list store
Definition w_library.c:801
#define FAMILY
Definition w_library.c:214
gchar ** sml_file_name
Definition w_library.c:289
int get_family(gchar *str)
get molecular family id
Definition w_library.c:631
gboolean lib_res
Definition w_library.c:1055
G_MODULE_EXPORT void set_library_markup(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *mod, GtkTreeIter *iter, gpointer data)
set font markup in the molecular library tree store
Definition w_library.c:1021
int o_names
Definition w_library.c:295
gchar * other_name[5]
Definition w_library.c:294
void sort_files(int num_f)
sort file(s) by molecular family and name
Definition w_library.c:648
int sml_preview(const char *filetoread)
retrieve preview information from 'Simple chemical library XML' file
Definition w_library.c:417
GtkTreeIter first_family_iter
Definition w_library.c:283
project * lib_proj
Definition w_library.c:293
GtkTreeIter first_mol_iter
Definition w_library.c:285
GtkTreeSelection * libselect[2]
Definition w_library.c:286
gboolean lib_visible
Definition w_library.c:1056
void fill_family_tree(GtkListStore *store)
fill molecular family list store
Definition w_library.c:827
void prepare_preview(int active, int id, gboolean visible)
prepare library molecule preview
Definition w_library.c:934
void create_object_from_library(int p)
create object using the molecular library
GtkWidget * lib_preview_plot
Definition w_library.c:292
gboolean create_3d_model(int p, gboolean load)
Definition glwindow.c:1353
int clean_xml_data(xmlDoc *doc, xmlTextReaderPtr reader)
free XML data
Definition w_library.c:323
GtkWidget * library_tree(GtkListStore *store, int id, gchar *name)
create library tree store widget
Definition w_library.c:1035
int insert_this_project_from_lib(int id, gboolean visible, project *this_proj, atom_search *asearch)
insert object from the library
Definition w_library.c:1196
gchar * replace_markup(char *init, char *key, char *rep)
replace pattern in string
Definition w_library.c:340
void to_insert_in_project(int stat, int orig, project *this_proj, atom_search *asearch, gboolean visible)
to insert object in project
void insert_preview()
insert preview in library window and visualize
Definition w_library.c:851
G_MODULE_EXPORT void run_select_from_library(GtkDialog *lib, gint response_id, gpointer data)
select from library - running the dialog
Definition w_library.c:1067
gchar * family_dir[FAMILY]
Definition w_library.c:242
gchar * open_sml_file(const char *filetoread, int fam)
open 'Simple chemical library XML' file
Definition w_library.c:569
G_MODULE_EXPORT void select_library_data(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
select library element callback
Definition w_library.c:983
int select_from_library(gboolean visible, project *this_proj, atom_search *asearch)
select object to insert from the library
Definition w_library.c:1124
gchar * the_molecule
Definition w_library.c:288
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73