1 /* EXTRAITS DE LA LICENCE
2 Copyright CEA, contributeurs : Damien CALISTE, laboratoire L_Sim, (2001-2011)
3
4 Adresse mèl :
5 CALISTE, damien P caliste AT cea P fr.
6
7 Ce logiciel est un programme informatique servant à visualiser des
8 structures atomiques dans un rendu pseudo-3D.
9
10 Ce logiciel est régi par la licence CeCILL soumise au droit français et
11 respectant les principes de diffusion des logiciels libres. Vous pouvez
12 utiliser, modifier et/ou redistribuer ce programme sous les conditions
13 de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
14 sur le site "http://www.cecill.info".
15
16 Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
17 pris connaissance de la licence CeCILL, et que vous en avez accepté les
18 termes (cf. le fichier Documentation/licence.fr.txt fourni avec ce logiciel).
19 */
20
21 /* LICENCE SUM UP
22 Copyright CEA, contributors: Damien CALISTE, L_Sim laboratory, (2001-2011)
23
24 E-mail address:
25 CALISTE, damien P caliste AT cea P fr.
26
27 This software is a computer program whose purpose is to visualize atomic
28 configurations in 3D.
29
30 This software is governed by the CeCILL license under French law and
31 abiding by the rules of distribution of free software. You can use,
32 modify and/ or redistribute the software under the terms of the CeCILL
33 license as circulated by CEA, CNRS and INRIA at the following URL
34 "http://www.cecill.info".
35
36 The fact that you are presently reading this means that you have had
37 knowledge of the CeCILL license and that you accept its terms. You can
38 find a copy of this licence shipped with this software at
39 Documentation/licence.en.txt.
40 */
41
42 #include <string.h>
43
44 #include <support.h>
45 #include <visu_basic.h>
46 #include <visu_rendering.h>
47 #include <visu_data.h>
48 #include <renderingMethods/renderingAtomic_ascii.h>
49 #include <coreTools/toolMatrix.h>
50 #include <coreTools/toolPhysic.h>
51 #include <extraFunctions/scalarFields.h>
52 #include <extraGtkFunctions/gtk_toolPanelWidget.h>
53 #include <extraGtkFunctions/gtk_numericalEntryWidget.h>
54 #include <extraGtkFunctions/gtk_elementComboBox.h>
55 #include <panelModules/panelSurfaces.h>
56 #include <gtk_main.h>
57 #include <visu_gtk.h>
58
59 #include <bigdft.h>
60
61 #include "bigdftplug.h"
62
63 enum
64 {
65 LR_OBJECT,
66 LR_LABEL,
67 LR_ID,
68 LR_SHOW_GRID_C,
69 LR_SHOW_GRID_F,
70 LR_COLOR,
71 LR_N_COLUMNS
72 };
73 static GtkListStore *lrdata;
74
75 /* Local methods. */
76 static void update_lzd(BigDFT_Lzd *lzd);
77
78 /* Callbacks. */
79 static void onDataLoaded(GObject *obj, VisuData *dataObj, gpointer data);
80 static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path,
81 gpointer user_data);
82
bdft_system_init()83 void bdft_system_init()
84 {
85 lrdata = gtk_list_store_new(LR_N_COLUMNS, G_TYPE_OBJECT, G_TYPE_STRING,
86 G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
87 GDK_TYPE_PIXBUF);
88
89 g_signal_connect(VISU_OBJECT_INSTANCE, "dataLoaded",
90 G_CALLBACK(onDataLoaded), NULL);
91 }
onLzdDefined(BigDFT_Lzd * lzd,gpointer data _U_)92 static void onLzdDefined(BigDFT_Lzd *lzd, gpointer data _U_)
93 {
94 update_lzd(lzd);
95 }
onDataLoaded(GObject * obj _U_,VisuData * dataObj,gpointer data _U_)96 static void onDataLoaded(GObject *obj _U_, VisuData *dataObj, gpointer data _U_)
97 {
98 BigDFT_Wf *wf;
99
100 if (!dataObj)
101 return;
102
103 wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf");
104 update_lzd(NULL);
105 if (wf)
106 g_signal_connect(G_OBJECT(wf->lzd), "defined",
107 G_CALLBACK(onLzdDefined), (gpointer)0);
108
109 DBG_fprintf(stderr, "BigDFT system: 'DataLoaded' signal OK.\n");
110 }
111
bdft_system_tab(BigDFT_Lzd * lzd)112 GtkWidget* bdft_system_tab(BigDFT_Lzd *lzd)
113 {
114 GtkWidget *wd, *ct, *vbox;
115 GtkCellRenderer *render;
116 GtkTreeViewColumn *col;
117
118 vbox = gtk_vbox_new(FALSE, 2);
119
120 ct = gtk_scrolled_window_new((GtkAdjustment*)0, (GtkAdjustment*)0);
121 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ct),
122 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
123 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct),
124 GTK_SHADOW_ETCHED_IN);
125 gtk_box_pack_start(GTK_BOX(vbox), ct, TRUE, TRUE, 0);
126 wd = gtk_tree_view_new_with_model(GTK_TREE_MODEL(lrdata));
127 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(wd), FALSE);
128 gtk_container_add(GTK_CONTAINER(ct), wd);
129 /* Columns. */
130 render = gtk_cell_renderer_text_new();
131 col = gtk_tree_view_column_new_with_attributes("", render, "markup", LR_LABEL, NULL);
132 gtk_tree_view_column_set_expand(col, TRUE);
133 render = gtk_cell_renderer_pixbuf_new();
134 gtk_tree_view_column_pack_end(col, render, FALSE);
135 gtk_tree_view_column_add_attribute(col, render, "pixbuf", LR_COLOR);
136 gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
137 render = gtk_cell_renderer_toggle_new();
138 g_signal_connect(G_OBJECT(render), "toggled",
139 G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_C);
140 col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_C, NULL);
141 gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
142 render = gtk_cell_renderer_toggle_new();
143 g_signal_connect(G_OBJECT(render), "toggled",
144 G_CALLBACK(onGridToggled), (gpointer)LR_SHOW_GRID_F);
145 col = gtk_tree_view_column_new_with_attributes("", render, "active", LR_SHOW_GRID_F, NULL);
146 gtk_tree_view_append_column(GTK_TREE_VIEW(wd), col);
147
148 update_lzd(lzd);
149
150 return vbox;
151 }
152
update_lzd(BigDFT_Lzd * lzd)153 static void update_lzd(BigDFT_Lzd *lzd)
154 {
155 GtkTreeIter iter;
156 gchar *lbl;
157 guint i;
158 GdkPixbuf *pixbuf;
159
160 gtk_list_store_clear(lrdata);
161 if (!lzd)
162 return;
163
164 /* Global region. */
165 lbl = g_strdup_printf("Global region\n<span size=\"smaller\">"
166 " %d / %d (coarse / fine grid pts)</span>",
167 lzd->parent.nvctr_c, lzd->parent.nvctr_f);
168 gtk_list_store_append(lrdata, &iter);
169 gtk_list_store_set(lrdata, &iter, LR_OBJECT, &lzd->parent,
170 LR_LABEL, lbl, LR_ID, 0, LR_SHOW_GRID_C,
171 FALSE, LR_SHOW_GRID_F, FALSE, -1);
172 g_free(lbl);
173 /* Local regions. */
174 if (lzd->nlr > 1)
175 for (i = 0; i < lzd->nlr; i++)
176 {
177 lbl = g_strdup_printf("Local region %d\n<span size=\"smaller\">"
178 " %d / %d (coarse / fine grid pts)</span>",
179 i + 1, lzd->Llr[i]->nvctr_c, lzd->Llr[i]->nvctr_f);
180 pixbuf = tool_color_get_stamp(tool_color_new_bright(i), FALSE);
181 gtk_list_store_append(lrdata, &iter);
182 gtk_list_store_set(lrdata, &iter, LR_OBJECT, lzd->Llr[i],
183 LR_LABEL, lbl, LR_ID, i + 1, LR_COLOR, pixbuf,
184 LR_SHOW_GRID_C, FALSE, LR_SHOW_GRID_F, FALSE, -1);
185 g_free(lbl);
186 g_object_unref(pixbuf);
187 }
188 }
189
onGridToggled(GtkCellRendererToggle * cell_renderer,gchar * path,gpointer user_data)190 static void onGridToggled(GtkCellRendererToggle *cell_renderer, gchar *path,
191 gpointer user_data)
192 {
193 GtkTreePath* tpath = gtk_tree_path_new_from_string(path);
194 GtkTreeIter iter;
195 gboolean valid;
196 BigDFT_Locreg *lr;
197 GArray *gcoord;
198 BigDFT_Wf *wf;
199 BigDFT_LocregIter iseg;
200 float vect[3];
201 guint nseg, tseg, ilr;
202 VisuData *dataObj;
203 VisuGlView *view;
204 gchar *lbl;
205
206 valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(lrdata), &iter, tpath);
207 gtk_tree_path_free(tpath);
208 g_return_if_fail(valid);
209
210 dataObj = visu_ui_panel_getData(VISU_UI_PANEL(panelBigDFT));
211 view = visu_ui_panel_getView(VISU_UI_PANEL(panelBigDFT));
212 g_return_if_fail(dataObj && view);
213 wf = (BigDFT_Wf*)g_object_get_data(G_OBJECT(dataObj), "BigDFT_wf");
214 g_return_if_fail(wf);
215
216 gtk_tree_model_get(GTK_TREE_MODEL(lrdata), &iter,
217 LR_OBJECT, &lr, LR_ID, &ilr, -1);
218
219 if (GPOINTER_TO_INT(user_data) == LR_SHOW_GRID_C)
220 {
221 nseg = lr->nseg_c;
222 tseg = GRID_COARSE;
223 lbl = "g";
224 }
225 else
226 {
227 nseg = lr->nseg_f;
228 tseg = GRID_FINE;
229 lbl = "G";
230 }
231
232 valid = !gtk_cell_renderer_toggle_get_active(cell_renderer);
233 gtk_list_store_set(lrdata, &iter, GPOINTER_TO_INT(user_data), valid, -1);
234 if (valid)
235 {
236 gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 2 * nseg);
237 for (valid = bigdft_lzd_iter_new(wf->lzd, &iseg, tseg, ilr); valid;
238 valid = bigdft_lzd_iter_next(&iseg))
239 {
240 vect[0] = iseg.x0;
241 vect[1] = iseg.y;
242 vect[2] = iseg.z;
243 g_array_append_val(gcoord, vect);
244 if (iseg.x1 != iseg.x0)
245 {
246 vect[0] = iseg.x1;
247 vect[1] = iseg.y;
248 vect[2] = iseg.z;
249 g_array_append_val(gcoord, vect);
250 }
251 }
252 }
253 else
254 gcoord = g_array_sized_new(FALSE, FALSE, sizeof(gfloat) * 3, 1);
255
256 bigdft_show_grid(dataObj, gcoord, lbl, ilr);
257
258 g_array_unref(gcoord);
259 g_object_unref(lr);
260
261 VISU_REDRAW_ADD;
262 }
263