atomes 1.1.14
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-2024 by CNRS and University of Strasbourg */
15
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", "Unknown", 0, 0},
73 {"H", "Hydrogen", 1, 1.008},
74 {"He", "Helium", 2, 4.003},
75 {"Li", "Lithium", 3, 6.94},
76 {"Be", "Beryllium", 4, 9.012},
77 {"B", "Boron", 5, 10.81},
78 {"C", "Carbon", 6, 12.011},
79 {"N", "Nitrogen", 7, 14.007},
80 {"O", "Oxygen", 8, 15.999},
81 {"F", "Fluorine", 9, 18.998},
82 {"Ne", "Neon", 10, 20.18},
83 {"Na", "Sodium", 11, 22.99},
84 {"Mg", "Magnesium", 12, 24.305},
85 {"Al", "Aluminium", 13, 26.982},
86 {"Si", "Silicon", 14, 28.085},
87 {"P", "Phosphorus", 15, 30.974},
88 {"S", "Sulfur", 16, 32.06},
89 {"Cl", "Chlorine", 17, 35.45},
90 {"Ar", "Argon", 18, 39.948},
91 {"K", "Potassium", 19, 39.098},
92 {"Ca", "Calcium", 20, 40.078},
93 {"Sc", "Scandium", 21, 44.956},
94 {"Ti", "Titanium", 22, 47.867},
95 {"V", "Vanadium", 23, 50.942},
96 {"Cr", "Chromium", 24, 51.996},
97 {"Mn", "Manganese", 25, 54.938},
98 {"Fe", "Iron", 26, 55.845},
99 {"Co", "Cobalt", 27, 58.933},
100 {"Ni", "Nickel", 28, 58.693},
101 {"Cu", "Copper", 29, 63.546},
102 {"Zn", "Zinc", 30, 65.38},
103 {"Ga", "Gallium", 31, 69.723},
104 {"Ge", "Germanium", 32, 72.63},
105 {"As", "Arsenic", 33, 74.922},
106 {"Se", "Selenium", 34, 78.971},
107 {"Br", "Bromine", 35, 79.904},
108 {"Kr", "Krypton", 36, 83.798},
109 {"Rb", "Rubidium", 37, 85.468},
110 {"Sr", "Strontium", 38, 87.62},
111 {"Y", "Yttrium", 39, 88.906},
112 {"Zr", "Zirconium", 40, 91.224},
113 {"Nb", "Niobium", 41, 92.906},
114 {"Mo", "Molybdenum", 42, 95.95},
115 {"Tc", "Technetium", 43, 98},
116 {"Ru", "Ruthenium", 44, 101.07},
117 {"Rh", "Rhodium", 45, 102.906},
118 {"Pd", "Palladium", 46, 106.42},
119 {"Ag", "Silver", 47, 107.868},
120 {"Cd", "Cadmium", 48, 112.414},
121 {"In", "Indium", 49, 114.818},
122 {"Sn", "Tin", 50, 118.71},
123 {"Sb", "Antimony", 51, 121.76},
124 {"Te", "Tellurium", 52, 127.6},
125 {"I", "Iodine", 53, 126.904},
126 {"Xe", "Xenon", 54, 131.293},
127 {"Cs", "Caesium", 55, 132.905},
128 {"Ba", "Barium", 56, 137.327},
129 {"La", "Lanthanum", 57, 138.905},
130 {"Ce", "Cerium", 58, 140.116},
131 {"Pr", "Praseodymium", 59, 140.908},
132 {"Nd", "Neodymium", 60, 144.242},
133 {"Pm", "Promethium", 61, 145},
134 {"Sm", "Samarium", 62, 150.36},
135 {"Eu", "Europium", 63, 151.964},
136 {"Gd", "Gadolinium", 64, 157.25},
137 {"Tb", "Terbium", 65, 158.925},
138 {"Dy", "Dysprosium", 66, 162.5},
139 {"Ho", "Holmium", 67, 164.93},
140 {"Er", "Erbium", 68, 167.259},
141 {"Tm", "Thulium", 69, 168.934},
142 {"Yb", "Ytterbium", 70, 173.045},
143 {"Lu", "Lutetium", 71, 174.967},
144 {"Hf", "Hafnium", 72, 178.49},
145 {"Ta", "Tantalum", 73, 180.948},
146 {"W", "Tungsten", 74, 183.84},
147 {"Re", "Rhenium", 75, 186.207},
148 {"Os", "Osmium", 76, 190.23},
149 {"Ir", "Iridium", 77, 192.217},
150 {"Pt", "Platinum", 78, 195.084},
151 {"Au", "Gold", 79, 196.967},
152 {"Hg", "Mercury", 80, 200.592},
153 {"Tl", "Thallium", 81, 204.38},
154 {"Pb", "Lead", 82, 207.2},
155 {"Bi", "Bismuth", 83, 208.98},
156 {"Po", "Polonium", 84, 209},
157 {"At", "Astatine", 85, 210},
158 {"Rn", "Radon", 86, 222},
159 {"Fr", "Francium", 87, 223},
160 {"Ra", "Radium", 88, 226},
161 {"Ac", "Actinium", 89, 227},
162 {"Th", "Thorium", 90, 232.038},
163 {"Pa", "Protactinium", 91, 231.036},
164 {"U", "Uranium", 92, 238.029},
165 {"Np", "Neptunium", 93, 237},
166 {"Pu", "Plutonium", 94, 244},
167 {"Am", "Americium", 95, 243},
168 {"Cm", "Curium", 96, 247},
169 {"Bk", "Berkelium", 97, 247},
170 {"Cf", "Californium", 98, 251},
171 {"Es", "Einsteinium", 99, 252},
172 {"Fm", "Fermium", 100, 257},
173 {"Md", "Mendelevium", 101, 258},
174 {"No", "Nobelium", 102, 258},
175 {"Lr", "Lawrencium", 103, 262},
176 {"Rf", "Rutherfordium", 104, 267},
177 {"Db", "Dubnium", 105, 268},
178 {"Sg", "Seaborgium", 106, 269},
179 {"Bh", "Bohrium", 107, 270},
180 {"Hs", "Hassium", 108, 277},
181 {"Mt", "Meitnerium", 109, 278},
182 {"Ds", "Darmstadtium", 110, 281},
183 {"Rg", "Roentgenium", 111, 282},
184 {"Cn", "Copernicium", 112, 285},
185 {"Nh", "Nihonium", 113, 286},
186 {"Fl", "Flerovium", 114, 289},
187 {"Mc", "Moscovium", 115, 289},
188 {"Lv", "Livermorium", 116, 293},
189 {"Ts", "Tennessine", 117, 294},
190 {"Og", "Oganesson", 118, 294},
191 {"D", "Deuterium", 1, 2.014000}};
192
194 { "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, "Other ...", -1, 1 },
204 { "Library", NULL, -1, 0 },
205 { NULL, "H<sub>2</sub>O", -1, 3 },
206 { NULL, "CH<sub>4</sub>", -1, 5 },
207 { NULL, "Toluene", -1, 15 },
208 { NULL, "Cp", -1, 10 },
209 { NULL, "C<sub>60</sub>", -1, 60},
210 { NULL, "Ni-Phthalocyanine", -1, 57 },
211 { NULL, "More ...", -1, -1 },
212 { NULL, NULL, -1, 0 }};
213
214#define FAMILY 26
215gchar * family_list[FAMILY]={"Misc",
216 "Alcohols",
217 "Aldehydes",
218 "Alkanes",
219 "Alkenes",
220 "Alkynes",
221 "Amides",
222 "Amines",
223 "Amino acids",
224 "Aromatics",
225 "Carboxylic acids",
226 "Cyclic alkanes",
227 "Cyclic alkenes",
228 "Ethers",
229 "Fatty acids",
230 "Fullerenes",
231 "Heterocyclics",
232 "Macrocycles",
233 "Ketones",
234 "Nitriles",
235 "Nucleobases",
236 "Steroids",
237 "Sugars (Linears)",
238 "Sugars (Cyclics)",
239 "Sulfoxides",
240 "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
274extern gboolean create_3d_model (int p, gboolean load);
275extern G_MODULE_EXPORT void on_realize (GtkGLArea * area, gpointer data);
276extern xmlNodePtr findnode (xmlNodePtr startnode, char * nname);
277extern int action_atoms_from_project (project * this_proj, atom_search * asearch, gboolean visible);
278extern void to_insert_in_project (int stat, int orig, project * this_proj, atom_search * asearch, gboolean visible);
279extern void create_object_from_library (int p);
281GtkListStore * family_store;
283GtkListStore * molecule_store;
284GtkTreeIter first_mol_iter;
285GtkTreeSelection * libselect[2];
289gchar ** mol_name;
290GtkWidget * lib_preview_box = NULL;
291GtkWidget * lib_preview_plot = NULL;
293gchar * other_name[5];
296
305{
306 int i;
307 for (i=0; i<120; i++)
308 {
309 if (g_strcmp0 (periodic_table_info[i].lab, lab) == 0) return periodic_table_info[i].Z;
310 }
311 return 0.0;
312}
313
322int clean_xml_data (xmlDoc * doc, xmlTextReaderPtr reader)
323{
324 xmlFreeDoc(doc);
325 xmlFreeTextReader(reader);
326 xmlCleanupParser();
327 return 0;
328}
329
339gchar * replace_markup (char * init, char * key, char * rep)
340{
341 char * buffer = NULL;
342 char * p = NULL;
343 int inilen = strlen(init);
344 int oldlen = strlen(key);
345 int newlen = 0;
346 if (rep) newlen = strlen(rep);
347
348 // Is key in init
349 if (!(p = strstr(init, key))) return init;
350 buffer = g_malloc0((inilen+newlen-oldlen+1)*sizeof*buffer);
351
352 strncpy (buffer + strlen(buffer), init, p - init);
353 if (rep)
354 {
355 sprintf (buffer + strlen(buffer), "%s", rep);
356 //strcpy (buffer + strlen(buffer), rep);
357 }
358 sprintf (buffer + strlen(buffer), "%s", p + oldlen);
359 //strcpy (buffer + strlen(buffer), p + oldlen);
360 return g_strdup_printf ("%s", buffer);
361}
362
372gchar * substitute_string (gchar * init, gchar * o_motif, gchar * n_motif)
373{
374 gchar * str_a, * str_b;
375 str_a = g_strdup_printf ("%s", replace_markup (init, o_motif, n_motif));
376 str_b = g_strdup_printf ("%s", init);
377 while (g_strcmp0 (str_a, str_b))
378 {
379 str_b = g_strdup_printf ("%s", str_a);
380 str_a = g_strdup_printf ("%s", replace_markup (str_a, o_motif, n_motif));
381 }
382 g_free (str_b);
383 return str_a;
384}
385
393gchar * check_xml_string (gchar * init)
394{
395 gchar * str = g_strdup_printf ("%s", substitute_string (init, "--i--", "<i>"));
396 str = g_strdup_printf ("%s", substitute_string (str, "--I--", "</i>"));
397 str = g_strdup_printf ("%s", substitute_string (str, "--b--", "<sup>"));
398 str = g_strdup_printf ("%s", substitute_string (str, "--e--", "</sup>"));
399 str = g_strdup_printf ("%s", substitute_string (str, "--c--", "<sub>"));
400 str = g_strdup_printf ("%s", substitute_string (str, "--f--", "</sub>"));
401
402 return str;
403}
404
412int sml_preview (const char * filetoread)
413{
414 int i, j, k;
415 xmlDoc * doc;
416 xmlTextReaderPtr reader;
417 xmlNodePtr racine, name_node, chem_node;
418 xmlNodePtr n_node, at_node, sp_node, coord_node;
419 xmlNodePtr spec_node, lab_node, lot_node, pbc_node;
420 xmlAttrPtr xspec;
421
422 if (lib_proj != NULL) close_project (lib_proj);
423 init_project (TRUE);
425
426 reader = xmlReaderForFile(filetoread, NULL, 0);
427 doc = xmlParseFile(filetoread);
428 racine = xmlDocGetRootElement(doc);
429
430 name_node = findnode (racine -> children, "names");
431 if (name_node == NULL) return clean_xml_data (doc, reader);
432 n_node = findnode (name_node -> children, "library-name");
433 if (n_node == NULL) return clean_xml_data (doc, reader);
434 lib_proj -> name = g_strdup_printf ("%s", (gchar *)xmlNodeGetContent(n_node));
435 lib_proj -> name = check_xml_string (lib_proj -> name);
436 n_node = findnode (name_node -> children, "iupac-name");
437 if (n_node == NULL) return clean_xml_data (doc, reader);
438 o_names = 0;
439 other_name[0] = g_strdup_printf ("%s", (gchar *)xmlNodeGetContent(n_node));
440 o_names ++;
441 n_node = findnode (name_node -> children, "other-names");
442 if (n_node == NULL) return clean_xml_data (doc, reader);
443 n_node = n_node -> children;
444 for (name_node = n_node; name_node && o_names < 5; name_node = name_node->next)
445 {
446 if (name_node -> type == XML_ELEMENT_NODE)
447 {
448 other_name[o_names] = g_strdup_printf ("%s", (gchar *)xmlNodeGetContent(name_node));
449 o_names ++;
450 }
451 }
452 chem_node = findnode(racine -> children, "chemistry");
453 if (chem_node == NULL) return clean_xml_data (doc, reader);
454 at_node = findnode (chem_node -> children, "atoms");
455 if (at_node == NULL) return clean_xml_data (doc, reader);
456 lib_proj -> natomes = (int)atof((char *)xmlNodeGetContent(at_node));
457
458 sp_node = findnode (chem_node -> children, "species");
459 if (sp_node == NULL) return clean_xml_data (doc, reader);
460 spec_node = sp_node -> properties -> children;
461 if (spec_node == NULL) return clean_xml_data (doc, reader);
462 lib_proj -> nspec = (int)atof((char *)xmlNodeGetContent(spec_node));
463 if (lib_proj -> natomes < 1 || lib_proj -> nspec < 1) return clean_xml_data (doc, reader);
465 lab_node = sp_node -> children;
466 if (lab_node == NULL) return clean_xml_data (doc, reader);
467 j = 0;
468 for (i=0; i<lib_proj -> nspec; i++)
469 {
470 lab_node = findnode (lab_node, "label");
471 if (lab_node == NULL) return clean_xml_data (doc, reader);
472 lib_proj -> chemistry -> label[i] = g_strdup_printf ("%s", (char *)xmlNodeGetContent(lab_node));
473 xspec = lab_node -> properties;
474 if (xspec == NULL) return clean_xml_data (doc, reader);
475 while (xspec)
476 {
477 lot_node = xspec -> children;
478 if (lot_node == NULL) return clean_xml_data (doc, reader);
479 if (g_strcmp0 ("num",(char *)xspec -> name) == 0)
480 {
481 lib_proj -> chemistry -> nsps[i] = (int)atof((char *)xmlNodeGetContent(lot_node));
483 k = (int)lib_proj -> chemistry -> chem_prop[CHEM_Z][i];
484 lib_proj -> chemistry -> chem_prop[CHEM_M][i] = periodic_table_info[k].M;
485 lib_proj -> chemistry -> chem_prop[CHEM_R][i] = set_radius_ (& k, & j);
486 }
487 xspec = xspec -> next;
488 }
489 lab_node = lab_node -> next;
490 }
492 initcutoffs (active_chem, lib_proj -> nspec);
493 at_node = findnode (racine -> children, "coordinates");
494 if (at_node == NULL) return clean_xml_data (doc, reader);
495 coord_node = at_node -> children;
496 if (coord_node == NULL) return clean_xml_data (doc, reader);
497 for (i=0; i<lib_proj -> natomes; i++)
498 {
499 coord_node = findnode (coord_node, "atom");
500 if (coord_node == NULL) return clean_xml_data (doc, reader);
501 xspec = coord_node -> properties;
502 if (xspec == NULL) return clean_xml_data (doc, reader);
503 while (xspec)
504 {
505 lot_node = xspec -> children;
506 if (lot_node == NULL) return clean_xml_data (doc, reader);
507 if (g_strcmp0 ("x",(char *)xspec -> name) == 0)
508 {
509 lib_proj -> atoms[0][i].x = atof((char *)xmlNodeGetContent(lot_node));
510 }
511 else if (g_strcmp0 ("y",(char *)xspec -> name) == 0)
512 {
513 lib_proj -> atoms[0][i].y = atof((char *)xmlNodeGetContent(lot_node));
514 }
515 else if (g_strcmp0 ("z",(char *)xspec -> name) == 0)
516 {
517 lib_proj -> atoms[0][i].z = atof((char *)xmlNodeGetContent(lot_node));
518 }
519 else if (g_strcmp0 ("sp",(char *)xspec -> name) == 0)
520 {
521 lib_proj -> atoms[0][i].sp = (int)atof((char *)xmlNodeGetContent(lot_node));
522 lib_proj -> atoms[0][i].show[0] = TRUE;
523 }
524 xspec = xspec -> next;
525 }
526 coord_node = coord_node -> next;
527 }
528 pbc_node = findnode (racine -> children, "lattice");
529 if (pbc_node != NULL)
530 {
531
532 }
533 xmlFreeDoc(doc);
534 xmlFreeTextReader(reader);
535 xmlCleanupParser();
536 return 1;
537}
538
547gchar * open_sml_file (const char * filetoread, int fam)
548{
549 xmlDoc * doc;
550 xmlTextReaderPtr reader;
551 const xmlChar sml[8]="scl-xml";
552 xmlChar * cdata;
553 xmlNodePtr racine, node;
554 /*
555 * build an xmlReader for that file
556 */
557 reader = xmlReaderForFile(filetoread, NULL, 0);
558 if (reader == NULL)
559 {
560 return NULL;
561 }
562 else
563 {
564 doc = xmlParseFile(filetoread);
565 if (doc == NULL) return NULL;
566 racine = xmlDocGetRootElement(doc);
567 if (g_strcmp0 ((char *)(racine -> name), (char *)sml) != 0)
568 {
569 clean_xml_data (doc, reader);
570 return NULL;
571 }
572 node = racine -> children;
573 node = findnode(node, "class");
574 cdata = xmlNodeGetContent(node);
575 if (g_strcmp0 ((gchar *)cdata, family_list[fam]) != 0)
576 {
577 clean_xml_data (doc, reader);
578 return NULL;
579 }
580 node = findnode (racine -> children, "names");
581 if (node == NULL)
582 {
583 clean_xml_data (doc, reader);
584 return NULL;
585 }
586 node = findnode (node -> children, "library-name");
587 if (node == NULL)
588 {
589 clean_xml_data (doc, reader);
590 return NULL;
591 }
592 cdata = xmlNodeGetContent(node);
593 xmlFreeDoc(doc);
594 xmlFreeTextReader(reader);
595 xmlCleanupParser();
596 return (gchar *)cdata;
597 }
598}
599
607int get_family (gchar * str)
608{
609 int i;
610 for (i=0; i<FAMILY; i++)
611 {
612 if (g_strcmp0 (str,family_list[i]) == 0) return i;
613 }
614 return -1;
615}
616
624void sort_files (int num_f)
625{
626 int i, j;
627 gchar * str = NULL;
628 for(i=0;i<num_f;i++)
629 {
630 for(j=i+1;j<num_f;j++)
631 {
632 if(g_strcmp0 (mol_name[i],mol_name[j])>0)
633 {
634 str = g_strdup_printf ("%s", mol_name[i]);
635 mol_name[i] = g_strdup_printf ("%s", mol_name[j]);
636 mol_name[j] = g_strdup_printf ("%s", str);
637 str = g_strdup_printf ("%s", sml_file_name[i]);
638 sml_file_name[i] = g_strdup_printf ("%s", sml_file_name[j]);
639 sml_file_name[j] = g_strdup_printf ("%s", str);
640 }
641 }
642 }
643 for(i=0;i<num_f;i++)
644 {
646 }
647}
648
655{
656 int val = 0;
657 gchar * str, * fsml;
658 gchar * libdir;
659#ifdef G_OS_WIN32
660 libdir = g_strdup_printf ("%s\\molecules\\%s", PACKAGE_LIB_DIR, family_dir[the_family]);
661 gchar * libwin32 = g_strdup_printf ("%s\\molecules\\%s\\*.sml", PACKAGE_LIB_DIR, family_dir[the_family]);
662 WIN32_FIND_DATA ffd;
663 HANDLE hFind = FindFirstFile (libwin32, & ffd);
664 if (hFind != INVALID_HANDLE_VALUE)
665 {
666 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
667 {
668 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
669 if (open_sml_file(str, the_family) != NULL) val ++;
670 g_free (str);
671 }
672 while (FindNextFile(hFind, &ffd) != 0)
673 {
674 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
675 {
676 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
677 if (open_sml_file(str, the_family) != NULL) val ++;
678 g_free (str);
679 }
680 }
681 FindClose(hFind);
682 }
683#else
684 libdir = g_strdup_printf ("%s/molecules/%s", PACKAGE_LIB_DIR, family_dir[the_family]);
685 DIR * d;
686 struct dirent * dir;
687 d = opendir(libdir);
688 if (d)
689 {
690 while ((dir = readdir(d)) != NULL)
691 {
692 if (dir -> d_type == DT_REG)
693 {
694 str = g_strdup_printf ("%s/%s", libdir, dir -> d_name);
695 if (open_sml_file(str, the_family) != NULL) val ++;
696 g_free (str);
697 }
698 }
699 closedir(d);
700 }
701#endif
702 if (val > 0)
703 {
704 sml_file_name = g_malloc0 (val*sizeof*sml_file_name);
705 mol_name = g_malloc0 (val*sizeof*mol_name);
706 val = 0;
707#ifdef G_OS_WIN32
708 hFind = FindFirstFile (libwin32, & ffd);
709 if (hFind != INVALID_HANDLE_VALUE)
710 {
711 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
712 {
713 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
714 fsml = open_sml_file(str, the_family);
715 if (fsml != NULL)
716 {
717 sml_file_name[val] = g_strdup_printf ("%s", str);
718 mol_name[val] = g_strdup_printf ("%s", fsml);
719 val ++;
720 g_free (fsml);
721 }
722 g_free (str);
723 }
724 while (FindNextFile(hFind, &ffd) != 0)
725 {
726 if (ffd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
727 {
728 str = g_strdup_printf ("%s\\%s", libdir, (char *)ffd.cFileName);
729 fsml = open_sml_file(str, the_family);
730 if (fsml != NULL)
731 {
732 sml_file_name[val] = g_strdup_printf ("%s", str);
733 mol_name[val] = g_strdup_printf ("%s", fsml);
734 val ++;
735 g_free (fsml);
736 }
737 g_free (str);
738 }
739 }
740 FindClose(hFind);
741 }
742#else
743 d = opendir (libdir);
744 if (d)
745 {
746 while ((dir = readdir(d)) != NULL)
747 {
748 if (dir -> d_type == DT_REG)
749 {
750 str = g_strdup_printf ("%s/%s", libdir, dir -> d_name);
751 fsml = open_sml_file(str, the_family);
752 if (fsml != NULL)
753 {
754 sml_file_name[val] = g_strdup_printf ("%s", str);
755 mol_name[val] = g_strdup_printf ("%s", fsml);
756 val ++;
757 g_free (fsml);
758 }
759 g_free (str);
760 }
761 }
762 closedir(d);
763 }
764#endif
765 sort_files (val);
766 }
767 return val;
768}
769
777void fill_molecule_tree (GtkListStore * store)
778{
779 GtkTreeIter mol_level;
780 int i;
781 for (i=0; i<get_sml_files (); i++)
782 {
783 if (i == 0)
784 {
785 gtk_list_store_append (store, & first_mol_iter);
786 gtk_list_store_set (store, & first_mol_iter, 0, -(i+1), 1, mol_name[i], -1);
787 }
788 else
789 {
790 gtk_list_store_append (store, & mol_level);
791 gtk_list_store_set (store, & mol_level, 0, -(i+1), 1, mol_name[i], -1);
792 }
793 }
794}
795
803void fill_family_tree (GtkListStore * store)
804{
805 GtkTreeIter family_level;
806 int i;
807 for (i=0; i<FAMILY; i++)
808 {
809 if (i == 0)
810 {
811 gtk_list_store_append (store, & first_family_iter);
812 gtk_list_store_set (store, & first_family_iter, 0, i, 1, family_list[i], -1);
813 }
814 else
815 {
816 gtk_list_store_append (store, & family_level);
817 gtk_list_store_set (store, & family_level, 0, i, 1, family_list[i], -1);
818 }
819 }
820}
821
828{
829 gchar * str;
830 lib_preview_plot = gtk_fixed_new ();
831 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lib_preview_box, lib_preview_plot, FALSE, FALSE, 10);
832 GtkWidget * grid = gtk_grid_new ();
833 gtk_fixed_put (GTK_FIXED(lib_preview_plot), grid, 0, 10);
834 gtk_widget_set_size_request (grid, -1, 200);
835 gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
836 gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
837 gtk_grid_set_row_spacing (GTK_GRID (grid), 1);
838 gtk_grid_set_column_spacing (GTK_GRID (grid), 1);
839
840 gtk_grid_attach (GTK_GRID (grid), lib_proj -> modelgl -> plot, 0, 0, 4, 4);
841 gtk_grid_attach (GTK_GRID (grid), markup_label("<i>Formula:</i>", 100, -1, 0.0, 0.5), 5, 1, 3, 1);
842 int i;
843 for (i=0; i<lib_proj -> nspec; i++)
844 {
845 if (i > 0)
846 {
847 str = g_strdup_printf ("%s <b>%s", str, lib_proj -> chemistry -> label[i]);
848 }
849 else
850 {
851 str = g_strdup_printf ("<b>%s", lib_proj -> chemistry -> label[i]);
852 }
853 if (lib_proj -> chemistry -> nsps[i] > 1)
854 {
855 str = g_strdup_printf ("%s<sub>%d</sub>", str, lib_proj -> chemistry -> nsps[i]);
856 }
857 str = g_strdup_printf ("%s</b>", str);
858 }
859 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, -1, 0.0, 0.5), 8, 1, 3, 1);
860 gtk_grid_attach (GTK_GRID (grid),markup_label("<i>Molecular mass:</i>", 100, -1, 0.0, 0.5), 5, 2, 3, 1);
861 g_free (str);
862 double mass = 0.0;
863 for (i=0; i<lib_proj -> nspec; i++)
864 {
865 mass += (lib_proj -> chemistry -> nsps[i]*lib_proj -> chemistry -> chem_prop[CHEM_M][i]);
866 }
867 str = g_strdup_printf ("<b>%.3f g/mol</b>", mass);
868 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, -1, 0.0, 0.5), 8, 2, 3, 1);
869 g_free (str);
870
871 gtk_grid_attach (GTK_GRID (grid), markup_label("<i>IUPAC name:</i>", 100, -1, 0.0, 0.5), 0, 5, 3, 1);
872 str = g_strdup_printf ("<b>%s</b>", check_xml_string(other_name[0]));
873 gtk_grid_attach (GTK_GRID (grid), markup_label(str, 100, 30, 0.0, 0.5), 3, 5, 11, 1);
874
875 if (o_names > 1)
876 {
877 GtkWidget * hbox = create_hbox (0);
878 gtk_fixed_put (GTK_FIXED(lib_preview_plot), hbox, 0, 230);
879 GtkWidget * vbox = create_vbox (BSEP);
880 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 0);
881 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label("<i>Other name(s):</i>", 100, 30, 0.0, 0.5), FALSE, FALSE, 0);
882 for (i=1; i<o_names; i++)
883 {
884 if (i > 1)
885 {
886 str = g_strdup_printf ("%s\n<b>%s</b>", str, check_xml_string(other_name[i]));
887 }
888 else
889 {
890 str = g_strdup_printf ("<b>%s</b>", check_xml_string(other_name[i]));
891 }
892 }
894 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, vbox, FALSE, FALSE, 15);
895 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, markup_label(str, 100, 30+20*(o_names-2), 0.0, 0.5), FALSE, FALSE, 0);
896 g_free (str);
897 }
899}
900
910void prepare_preview (int active, int id, gboolean visible)
911{
912 if (sml_file_name != NULL)
913 {
914 if (sml_preview (sml_file_name[id]))
915 {
917 lib_proj -> run = TRUE;
919 create_3d_model (lib_proj -> id, FALSE);
920 if (visible)
921 {
923 }
924 else
925 {
926 on_realize (NULL, lib_proj -> modelgl);
927 }
928 bonds_update = 0;
929 active_glwin = lib_proj -> modelgl;
930 active_glwin -> init = FALSE;
931 active_image = active_glwin -> anim -> last -> img;
932 lib_proj -> runc[0] = TRUE;
933 on_calc_bonds_released (NULL, NULL);
934 lib_proj -> modelgl -> anim -> last -> img -> quality = 30;
935 lib_proj -> modelgl -> anim -> last -> img -> rep = ORTHOGRAPHIC;
936 lib_proj -> modelgl -> anim -> last -> img -> box_axis[AXIS] = NONE;
937 lib_proj -> modelgl -> anim -> last -> img -> box_axis[BOX] = NONE;
938 if (visible)
939 {
940 gtk_widget_set_size_request (lib_proj -> modelgl -> plot, 150, 150);
941 update (lib_proj -> modelgl);
942 }
943 active_project_changed (active);
944 }
945 }
946}
947
958G_MODULE_EXPORT void select_library_data (GtkTreeView * tree_view, GtkTreePath * path, GtkTreeViewColumn * column, gpointer data)
959{
960 GtkTreeIter row;
961 GtkTreeModel * model = gtk_tree_view_get_model(tree_view);
962 if (gtk_tree_model_get_iter (model, & row, path))
963 {
964 GValue val = {0, };
965 GValue vbl = {0, };
966 gtk_tree_model_get_value (model, & row, 0, & val);
967 gtk_tree_model_get_value (model, & row, 1, & vbl);
968 int i = (int)g_value_get_int (& val);
969 if (i > -1)
970 {
971 the_family = i;
972 gtk_list_store_clear (molecule_store);
974 gtk_tree_selection_select_iter (libselect[1], & first_mol_iter);
975 prepare_preview (activep, 0, TRUE);
976 }
977 else
978 {
979 the_molecule = g_strdup_printf ("%s", (char *)g_value_get_string (& vbl));
980 prepare_preview (activep, -i-1, TRUE);
981 }
982 }
983}
984
996G_MODULE_EXPORT void set_library_markup (GtkTreeViewColumn * col, GtkCellRenderer * renderer, GtkTreeModel * mod, GtkTreeIter * iter, gpointer data)
997{
998 gchar * str = NULL;
999 gtk_tree_model_get (mod, iter, 1, & str, -1);
1000 g_object_set (renderer, "markup", str, NULL, NULL);
1001 g_free (str);
1002}
1003
1013GtkWidget * library_tree (GtkListStore * store, int id, gchar * name)
1014{
1015 GtkWidget * scrol = create_scroll (NULL, 150, 300, GTK_SHADOW_ETCHED_IN);
1016 GtkTreeViewColumn * datacol;
1017 GtkCellRenderer * datacel;
1018 GtkWidget * dataview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
1019 datacel = gtk_cell_renderer_text_new ();
1020 datacol = gtk_tree_view_column_new_with_attributes (name, datacel, "text", 1, NULL);
1021 gtk_tree_view_column_set_cell_data_func (datacol, datacel, set_library_markup, NULL, NULL);
1022 gtk_tree_view_append_column(GTK_TREE_VIEW(dataview), datacol);
1023 gtk_tree_view_column_set_alignment (datacol, 0.5);
1024 gtk_tree_view_set_activate_on_single_click (GTK_TREE_VIEW(dataview), TRUE);
1025 g_signal_connect (G_OBJECT(dataview), "row-activated", G_CALLBACK(select_library_data), NULL);
1026 g_object_unref (store);
1027 libselect[id] = gtk_tree_view_get_selection (GTK_TREE_VIEW(dataview));
1028 gtk_tree_selection_set_mode (libselect[id], GTK_SELECTION_SINGLE);
1029 add_container_child (CONTAINER_SCR, scrol, dataview);
1030 return scrol;
1031}
1032
1033gboolean lib_res;
1035
1045G_MODULE_EXPORT void run_select_from_library (GtkDialog * lib, gint response_id, gpointer data)
1046{
1047 gboolean done = FALSE;
1048 atom_search * asearch = (atom_search *)data;
1049 project * this_proj = get_project_by_id (asearch -> proj);
1050 GtkWidget * vbox;
1051 switch (response_id)
1052 {
1053 case GTK_RESPONSE_APPLY:
1054 vbox = dialog_get_content_area ((GtkWidget *)lib);
1055 widget_set_sensitive (vbox, FALSE);
1056 if (this_proj -> modelgl) this_proj -> modelgl -> other_status = 2;
1059 if (asearch -> action == INSERT)
1060 {
1061 to_insert_in_project (FROM_LIBRARY, -1, this_proj, asearch, lib_visible);
1062 if (! lib_visible)
1063 {
1064 gboolean vis;
1065 if (this_proj -> modelgl)
1066 {
1067 vis = (this_proj -> modelgl -> atom_win) ? this_proj -> modelgl -> atom_win -> visible : FALSE;
1068 }
1069 else
1070 {
1071 vis = FALSE;
1072 }
1073 inserted_from_lib += action_atoms_from_project (this_proj, asearch, vis);
1074 }
1075 if (this_proj -> modelgl) this_proj -> modelgl -> nth_copy ++;
1076 }
1078 widget_set_sensitive (vbox, TRUE);
1079 if (asearch -> action == REPLACE) done = TRUE;
1080 break;
1081 default:
1082 if (this_proj -> modelgl)
1083 {
1084 if (this_proj -> modelgl -> mode == EDITION) asearch -> todo[0] = 0;
1085 }
1086 lib_res = 0;
1087 done = TRUE;
1088 break;
1089 }
1090 if (done) destroy_this_dialog (lib);
1091}
1092
1102int select_from_library (gboolean visible, project * this_proj, atom_search * asearch)
1103{
1104 int active = activep;
1105 lib_visible = visible;
1106 GtkWidget * lib = dialogmodal ("Library", GTK_WINDOW((this_proj -> modelgl) ? this_proj -> modelgl -> win : MainWindow));
1107#ifdef GTK3
1108#ifdef GTKGLAREA
1109#ifndef G_OS_WIN32
1110 if (! atomes_visual) gtk_window_change_gdk_visual (lib);
1111#endif // G_OS_WIN32
1112#endif // GTKGLAREA
1113#endif // GTK3
1114 gtk_dialog_add_button (GTK_DIALOG(lib), (asearch -> action == REPLACE) ? "Replace" : "Insert", GTK_RESPONSE_APPLY);
1115 GtkWidget * vbox = dialog_get_content_area (lib);
1116 GtkWidget * hbox = create_hbox (5);
1117 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1118 sml_file_name = mol_name = NULL;
1119 family_store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
1121 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, library_tree (family_store, 0, "Family"), FALSE, FALSE, 0);
1122 molecule_store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
1123 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, library_tree (molecule_store, 1, "Molecule"), FALSE, FALSE, 0);
1125 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, lib_preview_box, FALSE, FALSE, 0);
1126 lib_preview_plot = NULL;
1127 the_family = 0;
1128 gtk_tree_selection_select_iter (libselect[0], & first_family_iter);
1129 gtk_list_store_clear (molecule_store);
1131 gtk_tree_selection_select_iter (libselect[1], & first_mol_iter);
1132 show_the_widgets (lib);
1133 prepare_preview (active, 0, TRUE);
1134 if (this_proj -> modelgl) this_proj -> modelgl -> nth_copy = 0;
1136 run_this_gtk_dialog (lib, G_CALLBACK(run_select_from_library), asearch);
1137 active_project_changed (active);
1138 if (sml_file_name != NULL) g_free (sml_file_name);
1139 if (mol_name != NULL) g_free (mol_name);
1140 if (lib_proj != NULL) close_project (lib_proj);
1141 lib_proj = NULL;
1142 lib_preview_plot = NULL;
1143 return lib_res;
1144}
1145
1156int insert_this_project_from_lib (int id, gboolean visible, project * this_proj, atom_search * asearch)
1157{
1158 sml_file_name = mol_name = NULL;
1159 int family[6] = {0, 3, 9, 9, 15, 17};
1160 int molec[6] = {0, 8, 36, 21, 11, 0};
1161 int active = activep;
1162 the_family = family[id];
1163 if (get_sml_files ())
1164 {
1165 prepare_preview (active, molec[id], FALSE);
1166 if (this_proj -> modelgl) this_proj -> modelgl -> other_status = 2;
1168 if (asearch -> action == INSERT)
1169 {
1170 to_insert_in_project (FROM_LIBRARY, -1, this_proj, asearch, visible);
1171 }
1172 }
1173 active_project_changed (active);
1174 if (sml_file_name != NULL) g_free (sml_file_name);
1175 if (mol_name != NULL) g_free (mol_name);
1176 if (lib_proj != NULL) close_project (lib_proj);
1177 lib_proj = NULL;
1178 return FROM_LIBRARY;
1179}
Binding to the Fortran90 subroutines.
double set_radius_(int *, int *)
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
void close_project(project *to_close)
close a project
Definition close_p.c:96
void label(cairo_t *cr, double val, int axe, int p, project *this_proj)
draw axis label
Definition labels.c:56
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:2239
gchar * filetoread
int activep
Definition global.c:159
GtkWidget * MainWindow
Definition global.c:214
int bonds_update
Definition global.c:169
int atomes_visual
Definition global.c:165
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:472
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:1940
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:490
project * proj
chemical_data * active_chem
Definition project.c:48
#define BSEP
Definition global.h:217
G_MODULE_EXPORT void on_calc_bonds_released(GtkWidget *widg, gpointer data)
compute bonding properties
Definition bdcall.c:471
#define CHEM_R
Definition global.h:271
@ CONTAINER_SCR
Definition global.h:223
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:805
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
Definition gtk-misc.c:1565
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:279
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:186
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2041
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:793
#define CHEM_M
Definition global.h:270
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2010
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:206
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:781
#define CHEM_Z
Definition global.h:269
project * active_project
Definition project.c:47
void initcutoffs(chemical_data *chem, int species)
initialize bond cutoffs
Definition bdcall.c:207
image * active_image
Definition project.c:52
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:169
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:439
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:66
action
Definition glview.h:189
@ EDITION
Definition glview.h:158
@ ORTHOGRAPHIC
Definition glview.h:151
@ REPLACE
Definition glview.h:225
@ INSERT
Definition glview.h:227
@ NONE
Definition glview.h:172
#define BOX
Definition glwin.h:54
@ FROM_LIBRARY
Definition glwin.h:80
#define AXIS
Definition glwin.h:55
Function declarations for the creation of the OpenGL window.
void init_project(gboolean alloc_box)
initialize a new project
Definition init_p.c:72
Messaging function declarations.
void alloc_proj_data(project *this_proj, int cid)
allocate data
Definition open_p.c:206
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:175
float M
Definition global.h:801
int d
Definition tab-1.c:95
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:290
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:393
gchar * family_list[FAMILY]
Definition w_library.c:215
GtkListStore * family_store
Definition w_library.c:281
GtkListStore * molecule_store
Definition w_library.c:283
xmlNodePtr findnode(xmlNodePtr startnode, char *nname)
find XML node
int the_family
Definition w_library.c:286
atom_search * remove_search
Definition popup.c:174
int get_sml_files()
get the library 'Simple chemical library XML' files
Definition w_library.c:654
gchar * substitute_string(gchar *init, gchar *o_motif, gchar *n_motif)
substitute all patterns in string
Definition w_library.c:372
double get_z_from_periodic_table(gchar *lab)
get Z from atom label
Definition w_library.c:304
element_data periodic_table_info[]
Definition w_library.c:71
gchar ** mol_name
Definition w_library.c:289
void fill_molecule_tree(GtkListStore *store)
fill molecule list store
Definition w_library.c:777
#define FAMILY
Definition w_library.c:214
gchar ** sml_file_name
Definition w_library.c:288
int get_family(gchar *str)
get molecular family id
Definition w_library.c:607
gboolean lib_res
Definition w_library.c:1033
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:996
int o_names
Definition w_library.c:294
gchar * other_name[5]
Definition w_library.c:293
void sort_files(int num_f)
sort file(s) by molecular family and name
Definition w_library.c:624
int sml_preview(const char *filetoread)
retrieve preview information from 'Simple chemical library XML' file
Definition w_library.c:412
int inserted_from_lib
Definition w_library.c:295
GtkTreeIter first_family_iter
Definition w_library.c:282
project * lib_proj
Definition w_library.c:292
GtkTreeIter first_mol_iter
Definition w_library.c:284
GtkTreeSelection * libselect[2]
Definition w_library.c:285
gboolean lib_visible
Definition w_library.c:1034
void fill_family_tree(GtkListStore *store)
fill molecular family list store
Definition w_library.c:803
void prepare_preview(int active, int id, gboolean visible)
prepare library molecule preview
Definition w_library.c:910
void create_object_from_library(int p)
create object using the molecular library
GtkWidget * lib_preview_plot
Definition w_library.c:291
gboolean create_3d_model(int p, gboolean load)
Definition glwindow.c:1228
int clean_xml_data(xmlDoc *doc, xmlTextReaderPtr reader)
free XML data
Definition w_library.c:322
GtkWidget * library_tree(GtkListStore *store, int id, gchar *name)
create library tree store widget
Definition w_library.c:1013
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:1156
gchar * replace_markup(char *init, char *key, char *rep)
replace pattern in string
Definition w_library.c:339
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:827
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:1045
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:547
G_MODULE_EXPORT void select_library_data(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
select library element callback
Definition w_library.c:958
insertion_menu mol[]
Definition w_library.c:193
int select_from_library(gboolean visible, project *this_proj, atom_search *asearch)
select object to insert from the library
Definition w_library.c:1102
gchar * the_molecule
Definition w_library.c:287
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73