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