1 /* BuildCrystal.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
10 The above copyright notice and this permission notice shall be included in all copies or substantial portions
11 of the Software.
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19
20
21 #include "../../Config.h"
22 #include <gtk/gtk.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <math.h>
28
29 #include "../Common/Global.h"
30 #include "../Utils/Utils.h"
31 #include "../Utils/UtilsInterface.h"
32 #include "../Utils/AtomsProp.h"
33 #include "../Utils/Constants.h"
34 #include "../Geometry/GeomGlobal.h"
35 #include "../Geometry/DrawGeom.h"
36 #include "../Geometry/GeomXYZ.h"
37 #include "../Geometry/InterfaceGeom.h"
38 #include "../Geometry/MenuToolBarGeom.h"
39 #include "../Crystallography/Crystallo.h"
40
41 void define_good_factor();
42 void create_GeomXYZ_from_draw_grometry();
43
44 #define LigneT 9
45 #define ColonneT 2
46
47
48 typedef enum
49 {
50 LEFT1 = 0,
51 RIGHT1,
52 LEFT2,
53 RIGHT2,
54 LEFT3,
55 RIGHT3
56 } FragPositions;
57
58 typedef struct _DataCrystalloDlg
59 {
60 GeomDef* G;
61 GeomDef* G0;
62 gint Nb;
63 gint Nb0;
64 gint fisrtFragNumber;
65 gint nTv;
66 gint iTv[3];
67 gboolean* toRemove;
68 }DataCrystalloDlg;
69
70 typedef struct _DataWulffDlg
71 {
72 gint nMaxSurfaces;
73 gint nSurfaces;
74 gdouble** surfaces;
75 gdouble* layers;
76 gdouble TvSmall[3][3];
77 gint nTvSmall;
78 }DataWulffDlg;
79
80 typedef struct _DataSlabDlg
81 {
82 gdouble surface[3];/* h, k, l */
83 gdouble layers[3];
84 }DataSlabDlg;
85
86 /*
87 static gdouble getTorsion(GeomDef* geom, gint a1, gint a2, gint a3,gint a4)
88 {
89 gdouble C1[3]={geom[a1].X,geom[a1].Y,geom[a1].Z};
90 gdouble C2[3]={geom[a2].X,geom[a2].Y,geom[a2].Z};
91 gdouble C3[3]={geom[a3].X,geom[a3].Y,geom[a3].Z};
92 gdouble C4[3]={geom[a4].X,geom[a4].Y,geom[a4].Z};
93 return TorsionToAtoms(C4,C1,C2,C3);
94 }
95 */
96 /********************************************************************************/
isItTv(gchar * symbol)97 static gboolean isItTv(gchar* symbol)
98 {
99 static gchar tmp[BSIZE];
100 sprintf(tmp,"%s",symbol);
101 uppercase(tmp);
102 if(!strcmp(tmp,"TV")) return TRUE;
103 return FALSE;
104 }
105 /********************************************************************************/
init_wulff()106 static DataWulffDlg* init_wulff()
107 {
108 gint i,j;
109 DataWulffDlg* dataWulffDlg = g_malloc(sizeof(DataWulffDlg));
110 dataWulffDlg->nMaxSurfaces = 10;
111 dataWulffDlg->nSurfaces = 0;
112 dataWulffDlg->surfaces = g_malloc(dataWulffDlg->nMaxSurfaces*sizeof(gdouble*));
113 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++) dataWulffDlg->surfaces[i] = g_malloc(3*sizeof(gdouble));
114 dataWulffDlg->layers = g_malloc(dataWulffDlg->nMaxSurfaces*sizeof(gdouble));
115 dataWulffDlg->nTvSmall=3;
116 for(i=0;i<3;i++) for(j=0;j<3;j++) dataWulffDlg->TvSmall[i][j] = 0;
117 for(i=0;i<3;i++) dataWulffDlg->TvSmall[i][i] = 1;
118 return dataWulffDlg;
119 }
120 /********************************************************************************/
init_variables()121 static DataCrystalloDlg* init_variables()
122 {
123 DataCrystalloDlg* dataDlg = g_malloc(sizeof(DataCrystalloDlg));
124 gint j;
125 gint i;
126 dataDlg->G=NULL;
127 dataDlg->G0=NULL;
128 dataDlg->Nb = 0;
129 dataDlg->Nb0 = 0;
130 dataDlg->fisrtFragNumber = 0;
131 dataDlg->nTv = 0;
132
133 for(i=0;i<3;i++) dataDlg->iTv[i] = 0;
134
135 if(Natoms<1) return dataDlg;
136 dataDlg->fisrtFragNumber = geometry0[0].ResidueNumber;
137 dataDlg->Nb = Natoms;
138 dataDlg->G = g_malloc(dataDlg->Nb*sizeof(GeomDef));
139 for(j=0;j<dataDlg->Nb;j++)
140 {
141 dataDlg->G[j].X=geometry0[j].X;
142 dataDlg->G[j].Y=geometry0[j].Y;
143 dataDlg->G[j].Z=geometry0[j].Z;
144 dataDlg->G[j].Charge=geometry0[j].Charge;
145 dataDlg->G[j].mmType=g_strdup(geometry0[j].mmType);
146 dataDlg->G[j].pdbType=g_strdup(geometry0[j].pdbType);
147 dataDlg->G[j].Residue=g_strdup(geometry0[j].Residue);
148 dataDlg->G[j].ResidueNumber=dataDlg->fisrtFragNumber;
149 dataDlg->G[j].Prop = prop_atom_get(geometry0[j].Prop.symbol);
150 dataDlg->G[j].N = j+1;
151 //printf("%s %f %f %f \n",dataDlg->G[j].Prop.symbol,dataDlg->G[j].X,dataDlg->G[j].Y,dataDlg->G[j].Z);
152 dataDlg->G[j].typeConnections = NULL;
153 }
154 dataDlg->nTv = 0;
155 for(j=0;j<dataDlg->Nb;j++)
156 if(isItTv(dataDlg->G[j].Prop.symbol))
157 {
158 dataDlg->iTv[dataDlg->nTv] = j;
159 dataDlg->nTv++;
160 }
161 dataDlg->Nb0 = Natoms-dataDlg->nTv;
162 dataDlg->G0 = g_malloc(dataDlg->Nb0*sizeof(GeomDef));
163 i = 0;
164 for(j=0;j<dataDlg->Nb;j++)
165 {
166 if(isItTv(dataDlg->G[j].Prop.symbol)) continue;
167 dataDlg->G0[i].X=dataDlg->G[j].X;
168 dataDlg->G0[i].Y=dataDlg->G[j].Y;
169 dataDlg->G0[i].Z=dataDlg->G[j].Z;
170 dataDlg->G0[i].Charge=dataDlg->G[j].Charge;
171 dataDlg->G0[i].mmType=g_strdup(dataDlg->G[j].mmType);
172 dataDlg->G0[i].pdbType=g_strdup(dataDlg->G[j].pdbType);
173 dataDlg->G0[i].Residue=g_strdup(dataDlg->G[j].Residue);
174 dataDlg->G0[i].ResidueNumber=dataDlg->fisrtFragNumber;
175 dataDlg->G0[i].Prop = prop_atom_get(dataDlg->G[j].Prop.symbol);
176 dataDlg->G0[i].N = i+1;
177 dataDlg->G0[i].typeConnections = NULL;
178 i++;
179 }
180 dataDlg->toRemove = g_malloc(dataDlg->Nb*sizeof(gboolean));
181 for(j=0;j<dataDlg->Nb;j++) dataDlg->toRemove[j] = FALSE;
182 return dataDlg;
183 }
184 /********************************************************************************/
init_slab()185 static DataSlabDlg* init_slab()
186 {
187 gint i;
188 DataSlabDlg* dataSlabDlg = g_malloc(sizeof(DataSlabDlg));
189 for(i=0;i<3;i++) dataSlabDlg->surface[i] = 1;
190 for(i=0;i<3;i++) dataSlabDlg->layers[i] = 2;
191 return dataSlabDlg;
192 }
193 /********************************************************************************/
init_crystal()194 static Crystal* init_crystal()
195 {
196 Crystal* crystal = g_malloc(sizeof(Crystal));
197 gint i;
198 gdouble orig[3];
199
200 initCrystal(crystal);
201
202 if(Natoms<1) return crystal;
203
204 get_origine_molecule_drawgeom(orig);
205 //fprintf(stderr,"init_cryt %f %f %f\n",orig[0], orig[1], orig[2]);
206
207 for(i=0;i<Natoms;i++)
208 {
209 CrystalloAtom* a = g_malloc(sizeof(CrystalloAtom));
210 a->C[0] = geometry0[i].X;
211 a->C[1] = geometry0[i].Y;
212 a->C[2] = geometry0[i].Z;
213
214
215 a->charge = geometry0[i].Charge;
216 a->residueNumber = geometry0[i].ResidueNumber;
217
218 sprintf(a->symbol,"%s",geometry0[i].Prop.symbol);
219 sprintf(a->mmType,"%s",geometry0[i].mmType);
220 sprintf(a->pdbType,"%s",geometry0[i].pdbType);
221 sprintf(a->residueName,"%s",geometry0[i].Residue);
222
223 //DEBUG
224 //if(isItTv(a->symbol))
225 {
226 gint j;
227 for(j=0;j<3;j++) a->C[j] += orig[j];
228 for(j=0;j<3;j++) a->C[j] *= BOHR_TO_ANG;
229 //fprintf(stderr,"TV %f %f %f\n",a->C[0], a->C[1], a->C[2]);
230 }
231 crystal->atoms=g_list_append(crystal->atoms, (gpointer) a);
232 }
233 return crystal;
234 }
235 /*****************************************************************************/
deleteDataDlg(DataCrystalloDlg * dataDlg)236 static void deleteDataDlg(DataCrystalloDlg* dataDlg)
237 {
238 if(!dataDlg) return;
239
240 if(dataDlg->Nb!=0)
241 {
242 gint i;
243 if(dataDlg->G)
244 for (i=0;i<dataDlg->Nb;i++)
245 {
246 g_free(dataDlg->G[i].Prop.symbol);
247 g_free(dataDlg->G[i].Prop.name);
248 g_free(dataDlg->G[i].mmType);
249 g_free(dataDlg->G[i].pdbType);
250 g_free(dataDlg->G[i].Residue);
251 if(dataDlg->G[i].typeConnections) g_free(dataDlg->G[i].typeConnections);
252 }
253
254 if(dataDlg->G) g_free(dataDlg->G);
255 }
256 dataDlg->Nb=0;
257 dataDlg->G = NULL;
258 if(dataDlg->Nb0!=0)
259 {
260 gint i;
261 if(dataDlg->G0)
262 for (i=0;i<dataDlg->Nb0;i++)
263 {
264 g_free(dataDlg->G0[i].Prop.symbol);
265 g_free(dataDlg->G0[i].Prop.name);
266 g_free(dataDlg->G0[i].mmType);
267 g_free(dataDlg->G0[i].pdbType);
268 g_free(dataDlg->G0[i].Residue);
269 if(dataDlg->G0[i].typeConnections) g_free(dataDlg->G0[i].typeConnections);
270 }
271
272 if(dataDlg->G0) g_free(dataDlg->G0);
273 }
274 dataDlg->Nb0=0;
275 dataDlg->G0 = NULL;
276 if(dataDlg->toRemove) g_free(dataDlg->toRemove);
277 }
278 /*****************************************************************************/
destroy_dlg(GtkWidget * Dlg,gpointer data)279 static void destroy_dlg(GtkWidget* Dlg,gpointer data)
280 {
281 DataCrystalloDlg* dataDlg = g_object_get_data(G_OBJECT (Dlg), "DataDlg");
282 DataWulffDlg* dataWulffDlg = g_object_get_data(G_OBJECT (Dlg), "DataWulffDlg");
283 Crystal* crystal = g_object_get_data(G_OBJECT (Dlg), "Crystal");
284
285 if(crystal)
286 {
287 freeCrystal(crystal);
288 g_free(crystal);
289 }
290 if(dataWulffDlg)
291 {
292 gint i;
293 if(dataWulffDlg->layers) g_free(dataWulffDlg->layers);
294 if(dataWulffDlg->surfaces)
295 {
296 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++) if(dataWulffDlg->surfaces[i]) g_free(dataWulffDlg->surfaces[i]);
297 g_free(dataWulffDlg->surfaces);
298 }
299 g_free(dataWulffDlg);
300 }
301 if(dataDlg) deleteDataDlg(dataDlg);
302
303 delete_child(Dlg);
304
305 activate_rotation();
306 }
307 /*****************************************************************************/
define_geometry_to_draw_from_crystal(Crystal * crystal)308 static void define_geometry_to_draw_from_crystal(Crystal* crystal)
309 {
310 gint i;
311 gint j;
312 gdouble C[3] = {0.0,0.0,0.0};
313 gint n;
314 GList *l = NULL;
315 gdouble orig[3];
316 get_origine_molecule_drawgeom(orig);
317
318 //fprintf(stderr,"%f %f %f\n",orig[0], orig[1], orig[2]);
319
320 Free_One_Geom(geometry0,Natoms);
321 Free_One_Geom(geometry ,Natoms);
322 geometry0 = NULL;
323 geometry = NULL;
324
325 Natoms = crystalloNumberOfAtoms(crystal->atoms);
326 if(Natoms<1) return;
327 //reset_origine_molecule_drawgeom();
328 geometry0 = g_malloc((Natoms)*sizeof(GeomDef));
329 geometry = g_malloc((Natoms)*sizeof(GeomDef));
330
331
332 n = 0;
333 for(l = g_list_first(crystal->atoms); l != NULL; l = l->next)
334 {
335 CrystalloAtom* a = (CrystalloAtom*)l->data;
336
337 geometry0[n].Charge = a->charge;
338 geometry0[n].Prop = prop_atom_get(a->symbol);
339 geometry0[n].mmType = g_strdup(a->mmType);
340 geometry0[n].pdbType = g_strdup(a->pdbType);
341 geometry0[n].Residue = g_strdup(a->residueName);
342 geometry0[n].ResidueNumber = a->residueNumber;
343 geometry0[n].show = TRUE;
344 geometry0[n].Layer = HIGH_LAYER;
345 geometry0[n].Variable = TRUE;
346 geometry0[n].N = n+1;
347 geometry0[n].typeConnections = NULL;
348
349 geometry[n].Charge = a->charge;
350 geometry[n].Prop = prop_atom_get(a->symbol);
351 geometry[n].mmType = g_strdup(a->mmType);
352 geometry[n].pdbType = g_strdup(a->pdbType);
353 geometry[n].Residue = g_strdup(a->residueName);
354 geometry[n].ResidueNumber = a->residueNumber;
355 geometry[n].show = TRUE;
356 geometry[n].Layer = HIGH_LAYER;
357 geometry[n].Variable = TRUE;
358 geometry[n].N = n+1;
359 geometry[n].typeConnections = NULL;
360
361 // DEBUG
362 //if(isItTv(a->symbol))
363 {
364 geometry0[n].X = a->C[0]/BOHR_TO_ANG-orig[0];
365 geometry0[n].Y = a->C[1]/BOHR_TO_ANG-orig[1];
366 geometry0[n].Z = a->C[2]/BOHR_TO_ANG-orig[2];
367
368 geometry[n].X = a->C[0]/BOHR_TO_ANG-orig[0];
369 geometry[n].Y = a->C[1]/BOHR_TO_ANG-orig[1];
370 geometry[n].Z = a->C[2]/BOHR_TO_ANG-orig[2];
371 //fprintf(stderr,"TV %f %f %f\n",a->C[0], a->C[1], a->C[2]);
372 }
373
374 n++;
375 }
376 Natoms = n;
377 if(n>0)
378 {
379 geometry0 = g_realloc(geometry0,(Natoms)*sizeof(GeomDef));
380 geometry = g_realloc(geometry,(Natoms)*sizeof(GeomDef));
381 }
382
383 for(i=0;i<(gint)Natoms;i++)
384 {
385 geometry[i].typeConnections = g_malloc(Natoms*sizeof(gint));
386 for(j=0;j<(gint)Natoms;j++) geometry[i].typeConnections[j] = 0;
387 geometry0[i].typeConnections = g_malloc(Natoms*sizeof(gint));
388 for(j=0;j<(gint)Natoms;j++) geometry0[i].typeConnections[j] = 0;
389 }
390 for(i=0;i<(gint)Natoms;i++) geometry[i].N = geometry0[i].N = i+1;
391
392 RebuildGeom = TRUE;
393 }
394 /********************************************************************************/
define_geometry_to_draw(DataCrystalloDlg * dataDlg)395 static void define_geometry_to_draw(DataCrystalloDlg* dataDlg)
396 {
397 gint i;
398 gint j;
399 gdouble C[3] = {0.0,0.0,0.0};
400 gint n;
401
402 Free_One_Geom(geometry0,Natoms);
403 Free_One_Geom(geometry ,Natoms);
404 Natoms = 0;
405 geometry0 = NULL;
406 geometry = NULL;
407
408 Natoms = dataDlg->Nb;
409 if(Natoms<1) return;
410 //reset_origine_molecule_drawgeom();
411 geometry0 = g_malloc((Natoms)*sizeof(GeomDef));
412 geometry = g_malloc((Natoms)*sizeof(GeomDef));
413 n = 0;
414 for(i=0;i<dataDlg->Nb;i++)
415 {
416 geometry0[n].X = dataDlg->G[i].X;
417 geometry0[n].Y = dataDlg->G[i].Y;
418 geometry0[n].Z = dataDlg->G[i].Z;
419 geometry0[n].Charge = dataDlg->G[i].Charge;
420 geometry0[n].Prop = prop_atom_get(dataDlg->G[i].Prop.symbol);
421 geometry0[n].mmType = g_strdup(dataDlg->G[i].mmType);
422 geometry0[n].pdbType = g_strdup(dataDlg->G[i].pdbType);
423 geometry0[n].Residue = g_strdup(dataDlg->G[i].Residue);
424 geometry0[n].ResidueNumber = dataDlg->G[i].ResidueNumber;
425 geometry0[n].show = TRUE;
426 geometry0[n].Layer = HIGH_LAYER;
427 geometry0[n].Variable = TRUE;
428
429
430 geometry0[n].N = i+1;
431 geometry0[n].typeConnections = NULL;
432
433 geometry[n].X = dataDlg->G[i].X;
434 geometry[n].Y = dataDlg->G[i].Y;
435 geometry[n].Z = dataDlg->G[i].Z;
436 geometry[n].Charge = dataDlg->G[i].Charge;
437 geometry[n].Prop = prop_atom_get(dataDlg->G[i].Prop.symbol);
438 geometry[n].mmType = g_strdup(geometry0[n].mmType);
439 geometry[n].pdbType = g_strdup(geometry0[n].pdbType);
440 geometry[n].Residue = g_strdup(geometry0[n].Residue);
441 geometry[n].ResidueNumber = dataDlg->G[i].ResidueNumber;
442 geometry[n].show = TRUE;
443 geometry[n].N = i+1;
444 geometry[n].typeConnections = NULL;
445 geometry[n].Layer = HIGH_LAYER;
446 geometry[n].Variable = TRUE;
447 C[0] += dataDlg->G[i].X;
448 C[1] += dataDlg->G[i].Y;
449 C[2] += dataDlg->G[i].Z;
450 n++;
451 }
452 Natoms = n;
453 if(n>0)
454 {
455 geometry0 = g_realloc(geometry0,(Natoms)*sizeof(GeomDef));
456 geometry = g_realloc(geometry,(Natoms)*sizeof(GeomDef));
457 }
458
459 for(i=0;i<(gint)Natoms;i++)
460 {
461 geometry[i].typeConnections = g_malloc(Natoms*sizeof(gint));
462 for(j=0;j<(gint)Natoms;j++) geometry[i].typeConnections[j] = 0;
463 geometry0[i].typeConnections = g_malloc(Natoms*sizeof(gint));
464 for(j=0;j<(gint)Natoms;j++) geometry0[i].typeConnections[j] = 0;
465 }
466 for(i=0;i<(gint)Natoms;i++) geometry[i].N = geometry0[i].N = i+1;
467
468 RebuildGeom = TRUE;
469 }
470 /********************************************************************************/
getTvVector(DataCrystalloDlg * dataDlg,gchar * what,gdouble Tv[])471 static gboolean getTvVector(DataCrystalloDlg* dataDlg, gchar* what, gdouble Tv[])
472 {
473 GeomDef* G = dataDlg->G;
474 gint* iTv = dataDlg->iTv;
475 gint nTv = dataDlg->nTv;
476 gint k = 0;
477 gboolean Ok = FALSE;
478 gint j;
479 gdouble orig[3];
480 get_origine_molecule_drawgeom(orig);
481
482 if(dataDlg->nTv<1) return FALSE;
483 j = dataDlg->iTv[0];
484 if(strstr(what,"LEFT 1"))
485 {
486 Tv[0] = -(G[j].X+orig[0]);
487 Tv[1] = -(G[j].Y+orig[1]);
488 Tv[2] = -(G[j].Z+orig[2]);
489 return TRUE;
490 }
491 if(strstr(what,"RIGHT 1"))
492 {
493 Tv[0] = (G[j].X+orig[0]);
494 Tv[1] = (G[j].Y+orig[1]);
495 Tv[2] = (G[j].Z+orig[2]);
496 return TRUE;
497 }
498 if(nTv<2) return FALSE;
499
500 j = iTv[1];
501 if(strstr(what,"LEFT 2"))
502 {
503 Tv[0] = -(G[j].X+orig[0]);
504 Tv[1] = -(G[j].Y+orig[1]);
505 Tv[2] = -(G[j].Z+orig[2]);
506 return TRUE;
507 }
508 if(strstr(what,"RIGHT 2"))
509 {
510 Tv[0] = (G[j].X+orig[0]);
511 Tv[1] = (G[j].Y+orig[1]);
512 Tv[2] = (G[j].Z+orig[2]);
513 return TRUE;
514 }
515 if(strstr(what,"L1-L2"))
516 {
517 Tv[0] =-(G[iTv[0]].X+orig[0])-(G[iTv[1]].X+orig[0]);
518 Tv[1] =-(G[iTv[0]].Y+orig[1])-(G[iTv[1]].Y+orig[1]);
519 Tv[2] =-(G[iTv[0]].Z+orig[2])-(G[iTv[1]].Z+orig[2]);
520 return TRUE;
521 }
522 if(strstr(what,"L1-R2"))
523 {
524 Tv[0] =-(G[iTv[0]].X+orig[0])+(G[iTv[1]].X+orig[0]);
525 Tv[1] =-(G[iTv[0]].Y+orig[1])+(G[iTv[1]].Y+orig[1]);
526 Tv[2] =-(G[iTv[0]].Z+orig[2])+(G[iTv[1]].Z+orig[2]);
527 return TRUE;
528 }
529 if(strstr(what,"L2-R1"))
530 {
531 Tv[0] =(G[iTv[0]].X+orig[0])-(G[iTv[1]].X+orig[0]);
532 Tv[1] =(G[iTv[0]].Y+orig[1])-(G[iTv[1]].Y+orig[1]);
533 Tv[2] =(G[iTv[0]].Z+orig[2])-(G[iTv[1]].Z+orig[2]);
534 return TRUE;
535 }
536 if(strstr(what,"R1-R2"))
537 {
538 Tv[0] =(G[iTv[0]].X+orig[0])+(G[iTv[1]].X+orig[0]);
539 Tv[1] =(G[iTv[0]].Y+orig[1])+(G[iTv[1]].Y+orig[1]);
540 Tv[2] =(G[iTv[0]].Z+orig[2])+(G[iTv[1]].Z+orig[2]);
541 return TRUE;
542 }
543
544 if(nTv<2) return FALSE;
545 j = iTv[2];
546 if(strstr(what,"LEFT 3"))
547 {
548 Tv[0] = -(G[j].X+orig[0]);
549 Tv[1] = -(G[j].Y+orig[1]);
550 Tv[2] = -(G[j].Z+orig[2]);
551 return TRUE;
552 }
553 if(strstr(what,"RIGHT 3"))
554 {
555 Tv[0] = (G[j].X+orig[0]);
556 Tv[1] = (G[j].Y+orig[1]);
557 Tv[2] = (G[j].Z+orig[2]);
558 return TRUE;
559 }
560 if(strstr(what,"L1-L3"))
561 {
562 Tv[0] =-(G[iTv[0]].X+orig[0])-(G[iTv[2]].X+orig[0]);
563 Tv[1] =-(G[iTv[0]].Y+orig[1])-(G[iTv[2]].Y+orig[1]);
564 Tv[2] =-(G[iTv[0]].Z+orig[2])-(G[iTv[2]].Z+orig[2]);
565 return TRUE;
566 }
567 if(strstr(what,"L1-R3"))
568 {
569 Tv[0] =-(G[iTv[0]].X+orig[0])+(G[iTv[2]].X+orig[0]);
570 Tv[1] =-(G[iTv[0]].Y+orig[1])+(G[iTv[2]].Y+orig[1]);
571 Tv[2] =-(G[iTv[0]].Z+orig[2])+(G[iTv[2]].Z+orig[2]);
572 return TRUE;
573 }
574 if(strstr(what,"L2-L3"))
575 {
576 Tv[0] =-(G[iTv[1]].X+orig[0])-(G[iTv[2]].X+orig[0]);
577 Tv[1] =-(G[iTv[1]].Y+orig[1])-(G[iTv[2]].Y+orig[1]);
578 Tv[2] =-(G[iTv[1]].Z+orig[2])-(G[iTv[2]].Z+orig[2]);
579 return TRUE;
580 }
581 if(strstr(what,"L2-R3"))
582 {
583 Tv[0] =-(G[iTv[1]].X+orig[0])+(G[iTv[2]].X+orig[0]);
584 Tv[1] =-(G[iTv[1]].Y+orig[1])+(G[iTv[2]].Y+orig[1]);
585 Tv[2] =-(G[iTv[1]].Z+orig[2])+(G[iTv[2]].Z+orig[2]);
586 return TRUE;
587 }
588 if(strstr(what,"L3-R1"))
589 {
590 Tv[0] =-(G[iTv[2]].X+orig[0])+(G[iTv[0]].X+orig[0]);
591 Tv[1] =-(G[iTv[2]].Y+orig[1])+(G[iTv[0]].Y+orig[1]);
592 Tv[2] =-(G[iTv[2]].Z+orig[2])+(G[iTv[0]].Z+orig[2]);
593 return TRUE;
594 }
595 if(strstr(what,"L3-R2"))
596 {
597 Tv[0] =-(G[iTv[2]].X+orig[0])+(G[iTv[1]].X+orig[0]);
598 Tv[1] =-(G[iTv[2]].Y+orig[1])+(G[iTv[1]].Y+orig[1]);
599 Tv[2] =-(G[iTv[2]].Z+orig[2])+(G[iTv[1]].Z+orig[2]);
600 return TRUE;
601 }
602 if(strstr(what,"R1-R3"))
603 {
604 Tv[0] =(G[iTv[0]].X+orig[0])+(G[iTv[2]].X+orig[0]);
605 Tv[1] =(G[iTv[0]].Y+orig[1])+(G[iTv[2]].Y+orig[1]);
606 Tv[2] =(G[iTv[0]].Z+orig[2])+(G[iTv[2]].Z+orig[2]);
607 return TRUE;
608 }
609 if(strstr(what,"R2-R3"))
610 {
611 Tv[0] =(G[iTv[1]].X+orig[0])+(G[iTv[2]].X+orig[0]);
612 Tv[1] =(G[iTv[1]].Y+orig[1])+(G[iTv[2]].Y+orig[1]);
613 Tv[2] =(G[iTv[1]].Z+orig[2])+(G[iTv[2]].Z+orig[2]);
614 return TRUE;
615 }
616 return FALSE;
617
618 }
619 /********************************************************************************/
getNumFrag(gchar * what,gint fisrtFragNumber)620 static gint getNumFrag(gchar* what, gint fisrtFragNumber)
621 {
622 gint k = 0;
623 gboolean Ok = FALSE;
624 gint j;
625 gint ll;
626 if(strstr(what,"LEFT 1")) return fisrtFragNumber+1;
627 if(strstr(what,"RIGHT 1")) return fisrtFragNumber+2;
628 if(strstr(what,"LEFT 2")) return fisrtFragNumber+3;
629 if(strstr(what,"RIGHT 2")) return fisrtFragNumber+4;
630 if(strstr(what,"LEFT 3")) return fisrtFragNumber+5;
631 if(strstr(what,"RIGHT 3")) return fisrtFragNumber+6;
632 ll = fisrtFragNumber+6;
633 if(strstr(what,"L1-L2")) return ll+1;
634 if(strstr(what,"L1-L3")) return ll+2;
635 if(strstr(what,"L1-R2")) return ll+3;
636 if(strstr(what,"L1-R3")) return ll+4;
637 if(strstr(what,"L2-R1")) return ll+5;
638 if(strstr(what,"L2-R3")) return ll+6;
639 if(strstr(what,"L2-L3")) return ll+7;
640 if(strstr(what,"L3-R1")) return ll+8;
641 if(strstr(what,"L3-R2")) return ll+9;
642 if(strstr(what,"R1-R2")) return ll+10;
643 if(strstr(what,"R1-R3")) return ll+11;
644 if(strstr(what,"R2-R3")) return ll+12;
645 return ll+13;
646 }
647 /********************************************************************************/
add_fragment(DataCrystalloDlg * dataDlg,gchar * what)648 static void add_fragment(DataCrystalloDlg* dataDlg, gchar* what)
649 {
650 gint i;
651 gint j;
652 gint nAtomsNew= 0;
653 gdouble Tv[3];
654 gint numFrag = 0;
655
656 G_CONST_RETURN gchar* t;
657
658 if(dataDlg->nTv<1) return;
659 nAtomsNew= dataDlg->Nb0;
660 if(nAtomsNew<1) return;
661
662 if(!getTvVector(dataDlg, what, Tv)) return;
663 if(dataDlg->Nb>0) dataDlg->G = g_realloc(dataDlg->G,(dataDlg->Nb+nAtomsNew)*sizeof(GeomDef));
664 else dataDlg->G = g_malloc((nAtomsNew)*sizeof(GeomDef));
665
666 if(dataDlg->Nb>0) dataDlg->toRemove = g_realloc(dataDlg->toRemove,(dataDlg->Nb+nAtomsNew)*sizeof(gboolean));
667 else dataDlg->toRemove = g_malloc((nAtomsNew)*sizeof(gboolean));
668
669 Ddef = FALSE;
670 //printf("Tv= %f %f %f\n",G[numTv].X,G[numTv].Y,G[numTv].Z);
671
672 numFrag = getNumFrag(what, dataDlg->fisrtFragNumber);
673 j=dataDlg->Nb-1;
674 for(i=0;i<dataDlg->Nb0;i++)
675 {
676 j++;
677 dataDlg->G[j].X=dataDlg->G0[i].X+Tv[0];
678 dataDlg->G[j].Y=dataDlg->G0[i].Y+Tv[1];
679 dataDlg->G[j].Z=dataDlg->G0[i].Z+Tv[2];
680 dataDlg->G[j].Charge=dataDlg->G0[i].Charge;
681 dataDlg->G[j].mmType=g_strdup(dataDlg->G0[i].mmType);
682 dataDlg->G[j].pdbType=g_strdup(dataDlg->G0[i].pdbType);
683 dataDlg->G[j].Residue=g_strdup(dataDlg->G0[i].Residue);
684 dataDlg->G[j].ResidueNumber=numFrag;
685
686 dataDlg->G[j].Prop = prop_atom_get(dataDlg->G0[i].Prop.symbol);
687 dataDlg->G[j].N = j+1;
688 dataDlg->G[j].typeConnections = NULL;
689 dataDlg->toRemove[j] = FALSE;
690 }
691
692 dataDlg->Nb += nAtomsNew;
693
694 define_geometry_to_draw(dataDlg);
695 //define_good_factor();
696 unselect_all_atoms();
697
698 reset_all_connections();
699
700 reset_charges_multiplicities();
701 drawGeom();
702 set_optimal_geom_view();
703 create_GeomXYZ_from_draw_grometry();
704 }
705 /********************************************************************************/
build_crystal(GtkWidget * button,gpointer data)706 static void build_crystal(GtkWidget *button,gpointer data)
707 {
708 GtkWidget* Dlg = g_object_get_data(G_OBJECT (button), "WinDlg");
709 DataCrystalloDlg* dataDlg = g_object_get_data(G_OBJECT (Dlg), "DataDlg");
710 gchar fragName[BSIZE];
711 sprintf(fragName,"%s",(gchar*)data);
712 uppercase(fragName);
713 add_fragment(dataDlg, fragName);
714 }
715 /********************************************************************************************************/
add_buttons(GtkWidget * Dlg,GtkWidget * box)716 static void add_buttons(GtkWidget *Dlg,GtkWidget* box)
717 {
718 GtkWidget* Table;
719 GtkWidget* button;
720 GtkWidget* frame;
721 guint i;
722 guint j;
723 /* GtkStyle *button_style;*/
724 /* GtkStyle *style;*/
725
726 static char *Symb[LigneT][ColonneT]={
727 {"Left 1","Right 1"},
728 {"Left 2","Right 2"},
729 {"Left 3","Right 3"},
730 {"L1-L2","L1-L3"},
731 {"L1-R2","L1-R3"},
732 {"L2-L3","L2-R1"},
733 {"L2-R3","L3-R1"},
734 {"L3-R2","R1-R2"},
735 {"R1-R3","R2-R3"},
736 };
737 frame = gtk_frame_new (NULL);
738 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
739 gtk_container_set_border_width (GTK_CONTAINER (frame), 1);
740
741 gtk_container_add(GTK_CONTAINER(box),frame);
742 gtk_widget_show (frame);
743
744 Table = gtk_table_new(LigneT,ColonneT,TRUE);
745 gtk_container_add(GTK_CONTAINER(frame),Table);
746 /* button_style = gtk_widget_get_style(Dlg); */
747
748 for ( i = 0;i<LigneT;i++)
749 for ( j = 0;j<ColonneT;j++)
750 {
751 gchar tmp[BSIZE];
752 sprintf(tmp,"%s",Symb[i][j]);
753 button = gtk_button_new_with_label(tmp);
754 g_object_set_data(G_OBJECT (button), "WinDlg",Dlg);
755
756 /* style=set_button_style(button_style,button,"H");*/
757 g_signal_connect(G_OBJECT(button), "clicked",(GCallback)build_crystal,(gpointer )Symb[i][j]);
758 gtk_table_attach(GTK_TABLE(Table),button,j,j+1,i,i+1,
759 (GtkAttachOptions)(GTK_FILL | GTK_EXPAND) ,
760 (GtkAttachOptions)(GTK_FILL | GTK_EXPAND),
761 1,1);
762 }
763
764 g_object_set_data(G_OBJECT (Dlg), "FrameCrystal",frame);
765
766 }
767 /**********************************************************************/
build_crystal_dlg()768 void build_crystal_dlg()
769 {
770 GtkWidget *Dlg;
771 GtkWidget *Button;
772 GtkWidget *hbox;
773 GtkWidget *frame;
774 GtkWidget *vboxframe;
775 gint nTv = 0;
776
777 DataCrystalloDlg* dataDlg = init_variables();
778
779 if(dataDlg->nTv == 0 )
780 {
781 gchar* t = g_strdup_printf(_("Sorry, You must read/build a molecule with at least one Tv vector."));
782 GtkWidget* w = Message(t,_("Error"),TRUE);
783 g_free(t);
784 return;
785 }
786 Dlg = gtk_dialog_new();
787 gtk_window_set_title(GTK_WINDOW(Dlg),_("Build Crystal"));
788 gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
789 gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
790 g_object_set_data(G_OBJECT(Dlg), "DataDlg", dataDlg);
791
792
793 add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build Crystal "));
794
795 g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroy_dlg,NULL);
796
797 frame = gtk_frame_new (NULL);
798 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
799 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
800 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), frame,TRUE,TRUE,0);
801 gtk_widget_show (frame);
802
803 vboxframe = create_vbox(frame);
804
805 hbox = create_hbox_false(vboxframe);
806 add_buttons(Dlg,hbox);
807
808 hbox = create_hbox_false(vboxframe);
809
810
811
812 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
813 gtk_widget_realize(Dlg);
814 Button = create_button(Dlg,_("Close"));
815 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
816 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroy_dlg,GTK_OBJECT(Dlg));
817
818 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
819 gtk_widget_grab_default(Button);
820 gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
821 gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
822 gtk_widget_show_now(Dlg);
823
824 /* fit_windows_position(GeomDlg, Dlg);*/
825
826 }
827
828 /********************************************************************************/
build_supercell_simple(GtkWidget * Dlg,gpointer data)829 static void build_supercell_simple(GtkWidget *Dlg,gpointer data)
830 {
831 Crystal* crystal = g_object_get_data(G_OBJECT (Dlg), "Crystal");
832 GtkWidget* entry[3];
833 entry[0] = g_object_get_data(G_OBJECT (Dlg), "Entry1");
834 entry[1] = g_object_get_data(G_OBJECT (Dlg), "Entry2");
835 entry[2] = g_object_get_data(G_OBJECT (Dlg), "Entry3");
836 G_CONST_RETURN gchar* str;
837 gint i[3] = {0,0,0};
838 gint k;
839
840 for(k=0;k<3;k++)
841 if(entry[k])
842 {
843 str = gtk_entry_get_text(GTK_ENTRY(entry[k]));
844 if(str) i[k] = atoi(str);
845 }
846 //printf("NbAv = %d \n",Nb);
847 if(crystal)
848 {
849 if(buildSuperCellSimple(&crystal->atoms, i[0], i[1], i[2]))
850 crystalloRemoveAtomsWithSmallDistance(&crystal->atoms);
851 }
852
853 //printf("NbAp = %d \n",Nb);
854 define_geometry_to_draw_from_crystal(crystal);
855 //define_good_factor();
856 unselect_all_atoms();
857
858 reset_all_connections();
859
860 reset_charges_multiplicities();
861 drawGeom();
862 set_optimal_geom_view();
863 create_GeomXYZ_from_draw_grometry();
864 destroy_dlg(Dlg,data);
865 }
866 /********************************************************************************/
add_number_of_cells_entrys(GtkWidget * Wins,GtkWidget * vbox,gint nTv)867 static void add_number_of_cells_entrys(GtkWidget *Wins,GtkWidget *vbox, gint nTv)
868 {
869 GtkWidget* entry;
870 GtkWidget* sep;
871 GtkWidget *table = gtk_table_new(5,4,FALSE);
872 GtkWidget* entry1 = NULL;
873 GtkWidget* entry2 = NULL;
874 GtkWidget* entry3 = NULL;
875 GtkWidget* label = NULL;
876 gint i;
877 gint j;
878
879 if(nTv<1) return;
880
881 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
882
883 /*----------------------------------------------------------------------------------*/
884 i = 0;
885 j = 0;
886 add_label_table(table,_("A repeats"),(gushort)i,(gushort)j);
887 j = 1;
888 label = gtk_label_new(":");
889 gtk_table_attach(GTK_TABLE(table),label, j,j+1,i,i+1,
890 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,
891 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
892 1,1);
893 j = 2;
894 entry1 = gtk_entry_new();
895 gtk_entry_set_text(GTK_ENTRY(entry1),"2");
896 gtk_widget_set_size_request(GTK_WIDGET(entry1),(gint)(ScreenHeight*0.2),-1);
897 gtk_table_attach(GTK_TABLE(table),entry1, j,j+4,i,i+1,
898 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
899 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
900 1,1);
901 g_object_set_data(G_OBJECT(Wins), "Entry1", entry1);
902 if(nTv<2) return;
903 /*----------------------------------------------------------------------------------*/
904 i++;
905 j = 0;
906 add_label_table(table,_("B repeats"),(gushort)i,(gushort)j);
907 j = 1;
908 label = gtk_label_new(":");
909 gtk_table_attach(GTK_TABLE(table),label, j,j+1,i,i+1,
910 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,
911 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
912 1,1);
913 j = 2;
914 entry1 = gtk_entry_new();
915 gtk_entry_set_text(GTK_ENTRY(entry1),"2");
916 gtk_widget_set_size_request(GTK_WIDGET(entry1),(gint)(ScreenHeight*0.2),-1);
917 gtk_table_attach(GTK_TABLE(table),entry1, j,j+4,i,i+1,
918 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
919 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
920 1,1);
921 g_object_set_data(G_OBJECT(Wins), "Entry2", entry1);
922 if(nTv<2) return;
923 /*----------------------------------------------------------------------------------*/
924 i++;
925 j = 0;
926 add_label_table(table,_("C repeats"),(gushort)i,(gushort)j);
927 j = 1;
928 label = gtk_label_new(":");
929 gtk_table_attach(GTK_TABLE(table),label, j,j+1,i,i+1,
930 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,
931 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
932 1,1);
933 j = 2;
934 entry1 = gtk_entry_new();
935 gtk_entry_set_text(GTK_ENTRY(entry1),"2");
936 gtk_widget_set_size_request(GTK_WIDGET(entry1),(gint)(ScreenHeight*0.2),-1);
937 gtk_table_attach(GTK_TABLE(table),entry1, j,j+4,i,i+1,
938 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
939 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
940 1,1);
941 g_object_set_data(G_OBJECT(Wins), "Entry3", entry1);
942 /*----------------------------------------------------------------------------------*/
943
944 gtk_widget_show_all(table);
945 }
946 /**********************************************************************/
build_supercell_simple_dlg()947 void build_supercell_simple_dlg()
948 {
949 GtkWidget *Dlg;
950 GtkWidget *Button;
951 GtkWidget *hbox;
952 GtkWidget *vbox;
953 GtkWidget *frame;
954 GtkWidget *vboxframe;
955 gint nTv = 0;
956
957 Crystal* crystal = init_crystal();
958 nTv = crystalloNumberOfTv(crystal->atoms);
959 if(nTv == 0 )
960
961 {
962 gchar* t = g_strdup_printf(_("Sorry, You must read/build a molecule with at least one Tv vector."));
963 GtkWidget* w = Message(t,_("Error"),TRUE);
964 g_free(t);
965 freeCrystal(crystal);
966 g_free(crystal);
967 return;
968 }
969 Dlg = gtk_dialog_new();
970 gtk_window_set_title(GTK_WINDOW(Dlg),_("Build SuperCell"));
971 gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
972 gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
973 g_object_set_data(G_OBJECT(Dlg), "Crystal", crystal);
974
975
976 add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build SuperCell "));
977 g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroy_dlg,NULL);
978
979 frame = gtk_frame_new (NULL);
980 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
981 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
982 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), frame,TRUE,TRUE,0);
983 gtk_widget_show (frame);
984
985 vboxframe = create_vbox(frame);
986 add_number_of_cells_entrys(Dlg, vboxframe, nTv);
987
988 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
989 gtk_widget_realize(Dlg);
990 Button = create_button(Dlg,_("Close"));
991 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
992 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroy_dlg,GTK_OBJECT(Dlg));
993 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
994 gtk_widget_grab_default(Button);
995
996 Button = create_button(Dlg,_("OK"));
997 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
998 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)build_supercell_simple,GTK_OBJECT(Dlg));
999 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1000 gtk_widget_grab_default(Button);
1001
1002 gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
1003 gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
1004
1005 gtk_widget_show_now(Dlg);
1006
1007 /* fit_windows_position(GeomDlg, Dlg);*/
1008
1009 }
1010 /********************************************************************************/
build_supercell(GtkWidget * Dlg,gpointer data)1011 static void build_supercell(GtkWidget *Dlg,gpointer data)
1012 {
1013 Crystal* crystal = g_object_get_data(G_OBJECT (Dlg), "Crystal");
1014 GtkWidget* entry;
1015 gint P[3][3];
1016 gdouble p[3];
1017 gchar tmp[BSIZE];
1018 G_CONST_RETURN gchar* str;
1019 gint i,j;
1020
1021 for(i=0;i<3;i++)
1022 {
1023 p[i] = 0.0;
1024 for(j=0;j<3;j++)
1025 {
1026 P[i][j] = 0;
1027 sprintf(tmp,"EntryRot%d%d", i,j);
1028 entry = g_object_get_data(G_OBJECT (Dlg), tmp);
1029 if(entry)
1030 {
1031 str = gtk_entry_get_text(GTK_ENTRY(entry));
1032 if(str) P[i][j] = atoi(str);
1033 }
1034 }
1035 sprintf(tmp,"EntryShift%d", i);
1036 entry = g_object_get_data(G_OBJECT (Dlg), tmp);
1037 if(entry)
1038 {
1039 str = gtk_entry_get_text(GTK_ENTRY(entry));
1040 if(str) p[i] = atof(str);
1041 }
1042 }
1043 //printf("NbAv = %d \n",Nb);
1044 if(crystal && buildSuperCell(&crystal->atoms, P,p))
1045 crystalloRemoveAtomsWithSmallDistance(&crystal->atoms);
1046
1047 //printf("NbAp = %d \n",Nb);
1048 define_geometry_to_draw_from_crystal(crystal);
1049 //define_good_factor();
1050 unselect_all_atoms();
1051
1052 reset_all_connections();
1053
1054 reset_charges_multiplicities();
1055 drawGeom();
1056 set_optimal_geom_view();
1057 create_GeomXYZ_from_draw_grometry();
1058 destroy_dlg(Dlg,data);
1059 }
1060 /********************************************************************************/
add_rotshift_matrix_entrys(GtkWidget * Wins,GtkWidget * vbox,gint nTv)1061 static void add_rotshift_matrix_entrys(GtkWidget *Wins,GtkWidget *vbox, gint nTv)
1062 {
1063 GtkWidget* entry;
1064 GtkWidget* sep;
1065 GtkWidget *table = gtk_table_new(8,4,FALSE);
1066 GtkWidget* entryRot[3][3];
1067 GtkWidget* entryShift[3];
1068 GtkWidget* label = NULL;
1069 gint i;
1070 gint j;
1071 gchar tmp[BSIZE];
1072
1073 for(i=0;i<3;i++) entryShift[i] = NULL;
1074 for(i=0;i<3;i++) for(j=0;j<3;j++) entryRot[i][j] = NULL;
1075
1076 if(nTv<1) return;
1077
1078 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
1079
1080 /*----------------------------------------------------------------------------------*/
1081 i = 0;
1082 j = 0;
1083 label = gtk_label_new("Rotation matrix P(Integer) ");
1084 gtk_table_attach(GTK_TABLE(table),label, j,j+3,i,i+1,
1085 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,
1086 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1087 1,1);
1088 j=3;
1089 label = gtk_label_new("Origin shift p (Real)");
1090 gtk_table_attach(GTK_TABLE(table),label, j,j+1,i,i+1,
1091 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,
1092 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1093 1,1);
1094 /*----------------------------------------------------------------------------------*/
1095 for(i=0;i<3;i++)
1096 {
1097 if(nTv<i+1) break;
1098 for(j=0;j<3;j++)
1099 {
1100 entryRot[i][j] = gtk_entry_new();
1101 if(i==j) gtk_entry_set_text(GTK_ENTRY(entryRot[i][j]),"2");
1102 else gtk_entry_set_text(GTK_ENTRY(entryRot[i][j]),"0");
1103 gtk_table_attach(GTK_TABLE(table),entryRot[i][j], j,j+1,i+1,i+2,
1104 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1105 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1106 1,1);
1107 sprintf(tmp,"EntryRot%d%d", i,j);
1108 g_object_set_data(G_OBJECT(Wins), tmp, entryRot[i][j]);
1109 }
1110 entryShift[i] = gtk_entry_new();
1111 gtk_entry_set_text(GTK_ENTRY(entryShift[i]),"0.0");
1112 j = 3;
1113 gtk_table_attach(GTK_TABLE(table),entryShift[i], j,j+1,i+1,i+2,
1114 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1115 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1116 1,1);
1117 sprintf(tmp,"EntryShift%d", i);
1118 g_object_set_data(G_OBJECT(Wins), tmp, entryShift[i]);
1119 }
1120 /*----------------------------------------------------------------------------------*/
1121 i = 4;
1122 j = 0;
1123 label = gtk_label_new(" ");
1124 gtk_label_set_markup(GTK_LABEL(label), "<b>a'</b>= P<sub>11</sub> <b>a</b> + P<sub>21</sub> <b>b</b> + P<sub>31</sub> <b>c</b>");
1125 gtk_table_attach(GTK_TABLE(table),label, j,j+2,i,i+1,
1126 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1127 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1128 1,1);
1129 i++;
1130 j = 0;
1131 label = gtk_label_new(" ");
1132 gtk_label_set_markup(GTK_LABEL(label), "<b>b'</b>= P<sub>12</sub> <b>a</b> + P<sub>22</sub> <b>b</b> + P<sub>32</sub> <b>c</b>");
1133 gtk_table_attach(GTK_TABLE(table),label, j,j+2,i,i+1,
1134 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1135 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1136 1,1);
1137 j=2;
1138 label = gtk_label_new(" ");
1139 gtk_label_set_markup(GTK_LABEL(label), "Origin shifted by <b>p</b>= p<sub>1</sub><b>a</b> + p<sub>2</sub> <b>b</b> + p<sub>3</sub> <b>c</b>");
1140 gtk_table_attach(GTK_TABLE(table),label, j,j+2,i,i+1,
1141 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1142 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1143 1,1);
1144 i++;
1145 j = 0;
1146 label = gtk_label_new(" ");
1147 gtk_label_set_markup(GTK_LABEL(label), "<b>c'</b>= P<sub>13</sub> <b>a</b> + P<sub>23</sub> <b>b</b> + P<sub>33</sub> <b>c</b>");
1148 gtk_table_attach(GTK_TABLE(table),label, j,j+2,i,i+1,
1149 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1150 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1151 1,1);
1152 /*----------------------------------------------------------------------------------*/
1153 gtk_widget_show_all(table);
1154 }
1155 /**********************************************************************/
build_supercell_dlg()1156 void build_supercell_dlg()
1157 {
1158 GtkWidget *Dlg;
1159 GtkWidget *Button;
1160 GtkWidget *hbox;
1161 GtkWidget *vbox;
1162 GtkWidget *frame;
1163 GtkWidget *vboxframe;
1164 gint nTv = 0;
1165
1166 Crystal* crystal = init_crystal();
1167 nTv = crystalloNumberOfTv(crystal->atoms);
1168 if(nTv == 0 )
1169
1170 {
1171 gchar* t = g_strdup_printf(_("Sorry, You must read/build a molecule with at least one Tv vector."));
1172 GtkWidget* w = Message(t,_("Error"),TRUE);
1173 g_free(t);
1174 freeCrystal(crystal);
1175 g_free(crystal);
1176 return;
1177 }
1178 Dlg = gtk_dialog_new();
1179 gtk_window_set_title(GTK_WINDOW(Dlg),_("Build SuperCell"));
1180 gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
1181 gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
1182 g_object_set_data(G_OBJECT(Dlg), "Crystal", crystal);
1183
1184
1185 add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build SuperCell "));
1186 g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroy_dlg,NULL);
1187
1188 frame = gtk_frame_new (NULL);
1189 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
1190 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
1191 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), frame,TRUE,TRUE,0);
1192 gtk_widget_show (frame);
1193
1194 vboxframe = create_vbox(frame);
1195 add_rotshift_matrix_entrys(Dlg, vboxframe, nTv);
1196
1197 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
1198 gtk_widget_realize(Dlg);
1199 Button = create_button(Dlg,_("Close"));
1200 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1201 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroy_dlg,GTK_OBJECT(Dlg));
1202 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1203 gtk_widget_grab_default(Button);
1204
1205 Button = create_button(Dlg,_("OK"));
1206 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1207 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)build_supercell,GTK_OBJECT(Dlg));
1208 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1209 gtk_widget_grab_default(Button);
1210
1211 gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
1212 gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
1213
1214 gtk_widget_show_now(Dlg);
1215
1216 /* fit_windows_position(GeomDlg, Dlg);*/
1217
1218 }
1219 /********************************************************************************/
build_wulff(GtkWidget * Dlg,gpointer data)1220 static void build_wulff(GtkWidget *Dlg,gpointer data)
1221 {
1222 GtkWidget*** entrys = g_object_get_data(G_OBJECT (Dlg), "Entrys");
1223 DataWulffDlg* dataWulffDlg = g_object_get_data(G_OBJECT (Dlg), "DataWulffDlg");
1224 Crystal* crystal = g_object_get_data(G_OBJECT (Dlg), "Crystal");
1225
1226 G_CONST_RETURN gchar* str;
1227 gint i,k;
1228 gdouble radius = -1;
1229 gint nSteps[3] = {1,1,1};
1230
1231 if(!entrys) return;
1232 if(!dataWulffDlg) return;
1233
1234
1235 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++) for(k=0;k<3;k++) dataWulffDlg->surfaces[i][k] = 0;
1236 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++) dataWulffDlg->layers[i] = 0;
1237
1238 /* printf("nMaxSurfaces = %d\n", dataWulffDlg->nMaxSurfaces);*/
1239 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++)
1240 {
1241 for(k=0;k<4;k++)
1242 if(entrys[i][k])
1243 {
1244 str = gtk_entry_get_text(GTK_ENTRY(entrys[i][k]));
1245 if(!str|| strlen(str)<1) continue;
1246 if(k<3) dataWulffDlg->surfaces[i][k] = atof(str);
1247 if(k==3) dataWulffDlg->layers[i] = atof(str);
1248 }
1249 }
1250 dataWulffDlg->nSurfaces=0;
1251 for(i=0;i<dataWulffDlg->nMaxSurfaces;i++)
1252 if(fabs(dataWulffDlg->layers[i])>1e-14) dataWulffDlg->nSurfaces++;
1253 else break;
1254
1255 createWulffCluster(&crystal->atoms, dataWulffDlg->nSurfaces, dataWulffDlg->surfaces, dataWulffDlg->layers);
1256
1257 define_geometry_to_draw_from_crystal(crystal);
1258 unselect_all_atoms();
1259 reset_all_connections();
1260 reset_charges_multiplicities();
1261 drawGeom();
1262 set_optimal_geom_view();
1263 create_GeomXYZ_from_draw_grometry();
1264 destroy_dlg(Dlg,data);
1265 }
1266 /********************************************************************************/
add_wulff_parameters_entrys(GtkWidget * Wins,GtkWidget * vbox,gint nTv,gint nMaxSurfaces)1267 static void add_wulff_parameters_entrys(GtkWidget *Wins,GtkWidget *vbox, gint nTv, gint nMaxSurfaces)
1268 {
1269 GtkWidget* entry;
1270 GtkWidget* sep;
1271 GtkWidget *table = gtk_table_new(nMaxSurfaces+3,4,FALSE);
1272 GtkWidget*** entrys = NULL;
1273 gint i;
1274 gint j;
1275 gchar* labels[4] = { "h","k","l","#Layers"};
1276
1277 if(nTv!=3) return;
1278 entrys = g_malloc(nMaxSurfaces*sizeof(GtkWidget**));
1279 for(i=0;i<nMaxSurfaces;i++) entrys[i] = g_malloc(4*sizeof(GtkWidget*));
1280
1281 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
1282 i=0;
1283 for(j=0;j<4;j++) add_label_table(table,labels[j],(gushort)i,(gushort)j);
1284
1285 for(i=1;i<=nMaxSurfaces;i++)
1286 for(j=0;j<4;j++)
1287 {
1288 gint k = i-1;
1289 entrys[k][j] = gtk_entry_new();
1290 gtk_widget_set_size_request(GTK_WIDGET(entrys[k][j]),(gint)(ScreenHeight*0.15),-1);
1291 gtk_table_attach(GTK_TABLE(table),entrys[k][j], j,j+1,i,i+1,
1292 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1293 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1294 1,1);
1295 }
1296 if(nMaxSurfaces>=1)
1297 {
1298 gchar* str[]={"0","0","1","1.0"};
1299 i=0;
1300 for(j=0;j<4;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1301 }
1302 if(nMaxSurfaces>=2)
1303 {
1304 gchar* str[]={"1","-1","0","1.0"};
1305 i=1;
1306 for(j=0;j<4;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1307 }
1308 if(nMaxSurfaces>=3)
1309 {
1310 gchar* str[]={"0","1","0","1.0"};
1311 i=2;
1312 for(j=0;j<4;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1313 }
1314 if(nMaxSurfaces>=4)
1315 {
1316 gchar* str[]={"1","0","0","1.0"};
1317 i=3;
1318 for(j=0;j<4;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1319 }
1320 g_object_set_data(G_OBJECT(Wins), "Entrys", entrys);
1321 gtk_widget_show_all(table);
1322 }
1323 /**********************************************************************/
build_wulff_dlg()1324 void build_wulff_dlg()
1325 {
1326 GtkWidget *Dlg;
1327 GtkWidget *Button;
1328 GtkWidget *hbox;
1329 GtkWidget *vbox;
1330 GtkWidget *frame;
1331 GtkWidget *vboxframe;
1332 gint nTv;
1333 Crystal* crystal = init_crystal();
1334
1335 nTv = crystalloNumberOfTv(crystal->atoms);
1336
1337 DataWulffDlg* dataWulffDlg = init_wulff();
1338
1339 if(nTv != 3 )
1340 {
1341 gchar* t = g_strdup_printf(_("Sorry, You must read/build a molecule with 3 Tv vector."));
1342 GtkWidget* w = Message(t,_("Error"),TRUE);
1343 g_free(t);
1344 return;
1345 }
1346 Dlg = gtk_dialog_new();
1347 gtk_window_set_title(GTK_WINDOW(Dlg),_("Build Cluster using Wulff construction"));
1348 gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
1349 gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
1350 g_object_set_data(G_OBJECT(Dlg), "Crystal", crystal);
1351 g_object_set_data(G_OBJECT(Dlg), "DataWulffDlg", dataWulffDlg);
1352
1353
1354 add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build Wulff"));
1355 g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroy_dlg,NULL);
1356
1357 frame = gtk_frame_new (NULL);
1358 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
1359 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
1360 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), frame,TRUE,TRUE,0);
1361 gtk_widget_show (frame);
1362
1363 vboxframe = create_vbox(frame);
1364 add_wulff_parameters_entrys(Dlg, vboxframe, nTv, dataWulffDlg->nMaxSurfaces);
1365
1366 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
1367 gtk_widget_realize(Dlg);
1368 Button = create_button(Dlg,_("Close"));
1369 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1370 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroy_dlg,GTK_OBJECT(Dlg));
1371 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1372 gtk_widget_grab_default(Button);
1373
1374 Button = create_button(Dlg,_("OK"));
1375 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1376 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)build_wulff,GTK_OBJECT(Dlg));
1377 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1378 gtk_widget_grab_default(Button);
1379
1380 gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
1381 gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
1382
1383 gtk_widget_show_now(Dlg);
1384
1385 /* fit_windows_position(GeomDlg, Dlg);*/
1386
1387 }
1388 /********************************************************************************/
add_slab_parameters_entrys(GtkWidget * Wins,GtkWidget * vbox)1389 static void add_slab_parameters_entrys(GtkWidget *Wins,GtkWidget *vbox)
1390 {
1391 GtkWidget* entry;
1392 GtkWidget* sep;
1393 GtkWidget *table = gtk_table_new(5,4,FALSE);
1394 GtkWidget*** entrys = NULL;
1395 GtkWidget* entryEmptySpace = NULL;
1396 gint i;
1397 gint j;
1398 gint nL=2;
1399 gchar* labelshkl[3] = { "h","k","l"};
1400 gchar* labelsXYZ[3] = { "x repeats","y repeats","z repeats"};
1401 GtkWidget* surfaceXYButton = NULL;
1402 GtkWidget* hseparator = NULL;
1403
1404
1405 entrys = g_malloc(nL*sizeof(GtkWidget**));
1406 for(i=0;i<nL;i++) entrys[i] = g_malloc(3*sizeof(GtkWidget*));
1407
1408 gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
1409 i=0;
1410 for(j=0;j<3;j++) add_label_table(table,labelshkl[j],(gushort)i,(gushort)j);
1411 i=2;
1412 for(j=0;j<3;j++) add_label_table(table,labelsXYZ[j],(gushort)i,(gushort)j);
1413
1414 i=1;
1415 for(j=0;j<3;j++)
1416 {
1417 gint k = i-1;
1418 entrys[k][j] = gtk_entry_new();
1419 gtk_widget_set_size_request(GTK_WIDGET(entrys[k][j]),(gint)(ScreenHeight*0.15),-1);
1420 gtk_table_attach(GTK_TABLE(table),entrys[k][j], j,j+1,i,i+1,
1421 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1422 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1423 1,1);
1424 }
1425 i=3;
1426 for(j=0;j<3;j++)
1427 {
1428 gint k = i-2;
1429 entrys[k][j] = gtk_entry_new();
1430 gtk_widget_set_size_request(GTK_WIDGET(entrys[k][j]),(gint)(ScreenHeight*0.15),-1);
1431 gtk_table_attach(GTK_TABLE(table),entrys[k][j], j,j+1,i,i+1,
1432 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1433 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1434 1,1);
1435 }
1436 {
1437 gchar* str[]={"1","1","1"};
1438 i=0;
1439 for(j=0;j<3;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1440 }
1441 {
1442 gchar* str[]={"1","1","2"};
1443 i=1;
1444 for(j=0;j<3;j++) gtk_entry_set_text(GTK_ENTRY(entrys[i][j]),str[j]);
1445 }
1446 g_object_set_data(G_OBJECT(Wins), "Entrys", entrys);
1447
1448 i=4;
1449 j=0;
1450 add_label_table(table,"EmptySpace size",(gushort)i,(gushort)j);
1451 entryEmptySpace = gtk_entry_new();
1452 gtk_widget_set_size_request(GTK_WIDGET(entryEmptySpace),(gint)(ScreenHeight*0.15),-1);
1453 i =4;
1454 j=1;
1455 gtk_table_attach(GTK_TABLE(table),entryEmptySpace, j,j+1,i,i+1,
1456 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1457 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1458 1,1);
1459 gtk_entry_set_text(GTK_ENTRY(entryEmptySpace),"2");
1460 i=4;
1461 j=2;
1462 add_label_table(table," * Cell zise",(gushort)i,(gushort)j);
1463 g_object_set_data(G_OBJECT(Wins), "EntryEmptySpace", entryEmptySpace);
1464
1465 i =5;
1466 j=0;
1467 hseparator = gtk_hseparator_new ();
1468 gtk_table_attach(GTK_TABLE(table),hseparator,j,j+3,i,i+1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),3,3);
1469
1470 surfaceXYButton = gtk_check_button_new_with_label (_("Surface normal to z axis"));
1471 gtk_widget_show (surfaceXYButton);
1472 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (surfaceXYButton), TRUE);
1473 i =6;
1474 j=0;
1475 gtk_table_attach(GTK_TABLE(table),surfaceXYButton, j,j+3,i,i+1,
1476 (GtkAttachOptions)(GTK_FILL|GTK_EXPAND),
1477 (GtkAttachOptions)(GTK_FILL|GTK_SHRINK),
1478 1,1);
1479 g_object_set_data(G_OBJECT(Wins), "SurfaceXYButton", surfaceXYButton);
1480
1481 gtk_widget_show_all(table);
1482 }
1483 /********************************************************************************/
build_slab(GtkWidget * Dlg,gpointer data)1484 static void build_slab(GtkWidget *Dlg,gpointer data)
1485 {
1486 GtkWidget*** entrys = g_object_get_data(G_OBJECT (Dlg), "Entrys");
1487 GtkWidget* entryEmptySpace = g_object_get_data(G_OBJECT (Dlg), "EntryEmptySpace");
1488 DataSlabDlg* dataSlabDlg = g_object_get_data(G_OBJECT (Dlg), "DataSlabDlg");
1489 Crystal* crystal = g_object_get_data(G_OBJECT (Dlg), "Crystal");
1490 GtkWidget* surfaceXYButton = g_object_get_data(G_OBJECT (Dlg), "SurfaceXYButton");
1491 gboolean surfaceXY = TRUE;
1492 gint nL = 2;
1493 gdouble emptySpace = 2;
1494
1495 G_CONST_RETURN gchar* str;
1496 gint i,k;
1497 gdouble radius = -1;
1498 gint nSteps[3] = {1,1,1};
1499
1500 if(!entrys) return;
1501 if(!dataSlabDlg) return;
1502
1503
1504 for(k=0;k<3;k++) dataSlabDlg->surface[k] = 1;
1505 for(k=0;k<3;k++) dataSlabDlg->layers[k] = 1;
1506
1507 for(i=0;i<nL;i++)
1508 {
1509 for(k=0;k<3;k++)
1510 if(entrys[i][k])
1511 {
1512 str = gtk_entry_get_text(GTK_ENTRY(entrys[i][k]));
1513 if(!str|| strlen(str)<1) continue;
1514 if(i==0) dataSlabDlg->surface[k] = atof(str);
1515 if(i==1) dataSlabDlg->layers[k] = atof(str);
1516 }
1517 }
1518 if(entryEmptySpace)
1519 {
1520 str = gtk_entry_get_text(GTK_ENTRY(entryEmptySpace));
1521 if(str && strlen(str)>0) emptySpace = atof(str);
1522 }
1523 surfaceXY = GTK_TOGGLE_BUTTON (surfaceXYButton)->active;
1524
1525 createSlab(&crystal->atoms, dataSlabDlg->surface, dataSlabDlg->layers, emptySpace, surfaceXY);
1526
1527 define_geometry_to_draw_from_crystal(crystal);
1528 unselect_all_atoms();
1529 reset_all_connections();
1530 reset_charges_multiplicities();
1531 drawGeom();
1532 set_optimal_geom_view();
1533 create_GeomXYZ_from_draw_grometry();
1534 destroy_dlg(Dlg,data);
1535 }
1536 /**********************************************************************/
build_slab_dlg()1537 void build_slab_dlg()
1538 {
1539 GtkWidget *Dlg;
1540 GtkWidget *Button;
1541 GtkWidget *hbox;
1542 GtkWidget *vbox;
1543 GtkWidget *frame;
1544 GtkWidget *vboxframe;
1545 gint nTv;
1546 Crystal* crystal = init_crystal();
1547
1548 nTv = crystalloNumberOfTv(crystal->atoms);
1549
1550 DataSlabDlg* dataSlabDlg = init_slab();
1551
1552 if(nTv != 3 )
1553 {
1554 gchar* t = g_strdup_printf(_("Sorry, You must read/build a molecule with 3 Tv vector."));
1555 GtkWidget* w = Message(t,_("Error"),TRUE);
1556 g_free(t);
1557 return;
1558 }
1559 Dlg = gtk_dialog_new();
1560 gtk_window_set_title(GTK_WINDOW(Dlg),_("Build a slab"));
1561 gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
1562 gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
1563 g_object_set_data(G_OBJECT(Dlg), "Crystal", crystal);
1564 g_object_set_data(G_OBJECT(Dlg), "DataSlabDlg", dataSlabDlg);
1565
1566
1567 add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build Slab"));
1568 g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroy_dlg,NULL);
1569
1570 frame = gtk_frame_new (NULL);
1571 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
1572 gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
1573 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), frame,TRUE,TRUE,0);
1574 gtk_widget_show (frame);
1575
1576 vboxframe = create_vbox(frame);
1577 add_slab_parameters_entrys(Dlg, vboxframe);
1578
1579 gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
1580 gtk_widget_realize(Dlg);
1581 Button = create_button(Dlg,_("Close"));
1582 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1583 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroy_dlg,GTK_OBJECT(Dlg));
1584 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1585 gtk_widget_grab_default(Button);
1586
1587 Button = create_button(Dlg,_("OK"));
1588 gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 2);
1589 g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)build_slab,GTK_OBJECT(Dlg));
1590 GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
1591 gtk_widget_grab_default(Button);
1592
1593 gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
1594 gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
1595
1596 gtk_widget_show_now(Dlg);
1597
1598 /*fit_windows_position(GeomDlg, Dlg);*/
1599
1600 }
1601 /********************************************************************************/
wrap_atoms_to_cell()1602 gboolean wrap_atoms_to_cell()
1603 {
1604 Crystal* crystal = init_crystal();
1605 gint nTv = crystalloNumberOfTv(crystal->atoms);
1606 gboolean ok = FALSE;
1607 if(nTv != 0 )
1608 {
1609 ok = crystalloSetCartnAtomsInBox(crystal->atoms);
1610 if(ok) crystalloRemoveAtomsWithSmallDistance(&crystal->atoms);
1611
1612 //printf("NbAp = %d \n",Nb);
1613 define_geometry_to_draw_from_crystal(crystal);
1614 //define_good_factor();
1615 unselect_all_atoms();
1616
1617 reset_all_connections();
1618
1619 reset_charges_multiplicities();
1620 drawGeom();
1621 set_optimal_geom_view();
1622 create_GeomXYZ_from_draw_grometry();
1623 }
1624 freeCrystal(crystal);
1625 g_free(crystal);
1626 return ok;
1627 }
1628 /***************************************************************************/
help_references_crystallography()1629 void help_references_crystallography()
1630 {
1631 gchar* temp;
1632 temp = g_strdup_printf(
1633 _(
1634 " * Prototype crystals are collected using :\n"
1635 " The Structure of Materials, Marc De Graef and Michael McHenry, Cambridge University Press;\n"
1636 " M. J. Mehl, D. Hicks, C. Toher, O. Levy, R. M. Hanson, G. L. W. Hart, and S. Curtarolo,\n"
1637 " http://som.web.cmu.edu \n"
1638 " The AFLOW Library of Crystallographic Prototypes: Part 1, Comp. Mat. Sci. 136, S1-S828 (2017).\n"
1639 " https://doi.org/10.1016/j.commatsci.2017.01.017 and http://aflow.org/CrystalDatabase\n"
1640 " http://www.catalysthub.net/\n"
1641 " http://www.crystallography.net\n"
1642 " \n"
1643 " * Slab building implementation is based on method described in :\n"
1644 " Theory and implementation behind:Universal surface creation - smallest unitcell.\n"
1645 " Bjarke Brink Buus, Jakob Howalt & Thomas Bligaard.\n"
1646 " wiki.fysik.dtu.dk/ase/_downloads/general_surface.pdf.\n"
1647 " \n"
1648 " * Spglib is used to compute space group, to make reduction and to standardize the cell :\n"
1649 " https://atztogo.github.io/spglib/index.html and references cited in this web page\n"
1650 " See also : a software library for crystal symmetry search”\n"
1651 " Atsushi Togo and Isao Tanaka, https://arxiv.org/abs/1808.01590 (written at version 1.10.4)\n"
1652 " \n"
1653 " * To generate kpoints for band structure calculations, Gabedit use :\n"
1654 " the methode described in : Hinuma et al. Comput. Mat. Science 128 (2017) 140–184\n"
1655 " and library\n"
1656 )
1657 );
1658 Message(temp,_("Info"),FALSE);
1659 g_free(temp);
1660 }
1661 /********************************************************************************/
reduce_cell(GabeditCrystalloReductionType type)1662 static gboolean reduce_cell(GabeditCrystalloReductionType type)
1663 {
1664 gdouble symprec=get_symprec_from_geomdlg();
1665 Crystal* crystal = init_crystal();
1666 gint nTv = crystalloNumberOfTv(crystal->atoms);
1667 gboolean ok = FALSE;
1668 if(nTv == 3 )
1669 {
1670 ok = crystalloReduceCell(&crystal->atoms, symprec, type);
1671 if(ok) crystalloRemoveAtomsWithSmallDistance(&crystal->atoms);
1672
1673 //printf("NbAp = %d \n",Nb);
1674 define_geometry_to_draw_from_crystal(crystal);
1675 //define_good_factor();
1676 unselect_all_atoms();
1677
1678 reset_all_connections();
1679
1680 reset_charges_multiplicities();
1681 drawGeom();
1682 set_optimal_geom_view();
1683 create_GeomXYZ_from_draw_grometry();
1684 }
1685 freeCrystal(crystal);
1686 g_free(crystal);
1687 return ok;
1688 }
1689 /********************************************************************************/
reduce_cell_niggli()1690 gboolean reduce_cell_niggli()
1691 {
1692 return reduce_cell(GABEDIT_CRYSTALLO_REDUCTION_NIGGLI);
1693 }
1694 /********************************************************************************/
reduce_cell_delaunay()1695 gboolean reduce_cell_delaunay()
1696 {
1697 return reduce_cell(GABEDIT_CRYSTALLO_REDUCTION_DELAUNAY);
1698 }
1699 /********************************************************************************/
reduce_cell_primitive()1700 gboolean reduce_cell_primitive()
1701 {
1702 return reduce_cell(GABEDIT_CRYSTALLO_REDUCTION_PRIMITIVE);
1703 }
1704 /***************************************************************************/
compute_space_symmetry_group()1705 void compute_space_symmetry_group()
1706 {
1707 gchar* temp;
1708 char groupName[20];
1709 gdouble symprec=get_symprec_from_geomdlg();
1710 Crystal* crystal = init_crystal();
1711 gint numGroup = crystalloGetSpaceSymmetryGroup(crystal->atoms, groupName, symprec);
1712 freeCrystal(crystal);
1713 g_free(crystal);
1714 temp = g_strdup_printf(
1715 " Group name = %s (%d)\n"
1716 , groupName, numGroup
1717 );
1718 Message(temp,_("Info"),FALSE);
1719 g_free(temp);
1720 }
1721 /***************************************************************************/
compute_symmetry_info()1722 void compute_symmetry_info()
1723 {
1724 gchar* temp;
1725 gdouble symprec=get_symprec_from_geomdlg();
1726 Crystal* crystal = init_crystal();
1727 temp = crystalloGetSymmetryInfo(crystal, symprec);
1728 freeCrystal(crystal);
1729 g_free(crystal);
1730
1731 if(strstr(temp,"Error")) Message(temp,_("Error"),FALSE);
1732 else MessageTxt(temp,_("Info"));
1733 g_free(temp);
1734 }
1735 /***************************************************************************/
standardize_cell(gint to_primitive,gint no_idealize,gdouble symprec)1736 void standardize_cell(gint to_primitive, gint no_idealize, gdouble symprec)
1737 {
1738 Crystal* crystal = init_crystal();
1739 gboolean ok = crystalloStandardizeCell(&crystal->atoms, to_primitive, no_idealize, symprec);
1740
1741 if(ok)
1742 {
1743 ok = crystalloSetCartnAtomsInBox(crystal->atoms);
1744 if(ok) crystalloRemoveAtomsWithSmallDistance(&crystal->atoms);
1745
1746 //printf("NbAp = %d \n",Nb);
1747 define_geometry_to_draw_from_crystal(crystal);
1748 //define_good_factor();
1749 unselect_all_atoms();
1750
1751 reset_all_connections();
1752
1753 reset_charges_multiplicities();
1754 drawGeom();
1755 set_optimal_geom_view();
1756 create_GeomXYZ_from_draw_grometry();
1757 }
1758 freeCrystal(crystal);
1759 g_free(crystal);
1760 }
1761 /***************************************************************************/
standardize_cell_primitive()1762 void standardize_cell_primitive()
1763 {
1764 gdouble symprec=get_symprec_from_geomdlg();
1765 gint to_primitive = 1;
1766 gint no_idealize = 0;
1767 standardize_cell(to_primitive, no_idealize, symprec);
1768 }
1769 /***************************************************************************/
standardize_cell_conventional()1770 void standardize_cell_conventional()
1771 {
1772 gdouble symprec=get_symprec_from_geomdlg();
1773 gint to_primitive = 0;
1774 gint no_idealize = 0;
1775 standardize_cell(to_primitive, no_idealize, symprec);
1776 }
1777 /********************************************************************************/
setSymmetryPrecision(GtkWidget * GeomDlg,G_CONST_RETURN gchar * value)1778 void setSymmetryPrecision(GtkWidget* GeomDlg, G_CONST_RETURN gchar* value)
1779 {
1780 gchar* s;
1781
1782 if(!GeomDlg) return;
1783
1784 s = g_object_get_data(G_OBJECT(GeomDlg), "SymPrecision");
1785 if(s) g_free(s);
1786 s = g_strdup(value);
1787 g_object_set_data(G_OBJECT(GeomDlg), "SymPrecision",s);
1788 }
1789 /********************************************************************************/
setSymPrec(GtkWidget * button,GtkWidget * entry)1790 static void setSymPrec(GtkWidget* button, GtkWidget* entry)
1791 {
1792 gint i;
1793 gint k;
1794 G_CONST_RETURN gchar *strEntry;
1795 gdouble symprec = 1e-4;
1796 static gchar s[BSIZE];
1797
1798 if(!GeomDlg) return;
1799
1800 strEntry = gtk_entry_get_text(GTK_ENTRY(entry));
1801 if(strlen(strEntry)<1) return;
1802 setSymmetryPrecision(GeomDlg, strEntry);
1803 }
1804 /********************************************************************************/
setSymPrecDlg()1805 void setSymPrecDlg()
1806 {
1807 GtkWidget *winDlg;
1808 GtkWidget *button;
1809 GtkWidget *hbox;
1810 GtkWidget *label;
1811 GtkWidget *entry;
1812 GtkWidget *frame;
1813 GtkWidget *vboxframe;
1814 gchar* tmp = NULL;
1815
1816 if(!GeomDlg) return;
1817 winDlg = gtk_dialog_new();
1818 gtk_window_set_title(GTK_WINDOW(winDlg),_("Set symmetry precision for crystallography tools"));
1819 gtk_window_set_position(GTK_WINDOW(winDlg),GTK_WIN_POS_CENTER);
1820 gtk_window_set_transient_for(GTK_WINDOW(winDlg),GTK_WINDOW(GeomDlg));
1821
1822 add_child(GeomDlg,winDlg,gtk_widget_destroy,_(" Sym. Prec. "));
1823 g_signal_connect(G_OBJECT(winDlg),"delete_event",(GCallback)delete_child,NULL);
1824
1825 frame = gtk_frame_new (NULL);
1826 gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
1827
1828 gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
1829 gtk_box_pack_start( GTK_BOX(GTK_DIALOG(winDlg)->vbox), frame,TRUE,TRUE,0);
1830
1831 gtk_widget_show (frame);
1832
1833 vboxframe = create_vbox(frame);
1834 hbox=create_hbox_false(vboxframe);
1835 label = gtk_label_new(_(" Symmetry Precision : "));
1836 gtk_box_pack_start( GTK_BOX(hbox), label,TRUE,TRUE,0);
1837 entry = gtk_entry_new();
1838 tmp = g_object_get_data(G_OBJECT(GeomDlg), "SymPrecision");
1839
1840 if(tmp) gtk_entry_set_text(GTK_ENTRY(entry),tmp);
1841 else gtk_entry_set_text(GTK_ENTRY(entry),"1e-4");
1842
1843 gtk_box_pack_start( GTK_BOX(hbox), entry,TRUE,TRUE,0);
1844
1845 gtk_widget_realize(winDlg);
1846
1847 button = create_button(winDlg,_("Cancel"));
1848 gtk_box_pack_start( GTK_BOX(GTK_DIALOG(winDlg)->action_area), button,TRUE,TRUE,0);
1849 g_signal_connect_swapped(G_OBJECT(button), "clicked",(GCallback)delete_child,GTK_OBJECT(winDlg));
1850 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1851
1852 button = create_button(winDlg,_("OK"));
1853 gtk_box_pack_start( GTK_BOX(GTK_DIALOG(winDlg)->action_area), button,TRUE,TRUE,0);
1854 g_signal_connect(G_OBJECT(button), "clicked",(GCallback)setSymPrec,entry);
1855 g_signal_connect_swapped(G_OBJECT(button), "clicked",(GCallback)delete_child,GTK_OBJECT(winDlg));
1856 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1857 gtk_widget_grab_default(button);
1858
1859 gtk_widget_show_all(winDlg);
1860 }
1861 /***************************************************************************/
compute_kpoints_path()1862 void compute_kpoints_path()
1863 {
1864 gchar* temp;
1865 gdouble symprec=get_symprec_from_geomdlg();
1866 Crystal* crystal = init_crystal();
1867 temp = getVASPKPointsPath(crystal, symprec);
1868 freeCrystal(crystal);
1869 g_free(crystal);
1870
1871 if(strstr(temp,"Error")) Message(temp,_("Error"),FALSE);
1872 else MessageTxt(temp,_("Info"));
1873 g_free(temp);
1874 }
1875 /***************************************************************************/
1876