Updated "GNU Library General License" to "GNU Lesser General License
[adg.git] / demo / adg-demo.c
blobe7f7d08e987ceb51a7d547d42d2d6f86b2955406
1 #include <adg/adg.h>
2 #include <gcontainer/gcontainer.h>
3 #include <gtk/gtk.h>
4 #include <math.h>
5 #include <cairo-ps.h>
8 #ifndef G_SQRT3
9 #define G_SQRT3 1.732050808
10 #endif
12 #define CHAMFER 0.3
15 typedef struct _Piston Piston;
17 struct _Piston {
18 gdouble A, B, C;
19 gdouble D1, D2, D3, D4, D5, D6, D7;
20 gdouble RD34, RD56;
21 gdouble LD2, LD3, LD5, LD6, LD7;
25 static void fill_piston_model (Piston *piston);
26 static void add_piston_path (AdgCanvas *canvas,
27 Piston *piston);
28 static void add_piston_dimensions (AdgCanvas *canvas,
29 Piston *piston);
30 static void piston_path_extern (AdgEntity *entity,
31 Piston *piston);
32 static void piston_expose (GtkWidget *widget,
33 GdkEventExpose *event,
34 AdgCanvas *canvas);
35 static void piston_to_ps (AdgCanvas *canvas);
38 int
39 main(gint argc, gchar **argv)
41 GtkWidget *window;
42 GtkWidget *vbox;
43 GtkWidget *button_box;
44 GtkWidget *widget;
45 AdgCanvas *canvas;
46 Piston model;
48 gtk_init(&argc, &argv);
50 /* Fill the model structure with some data */
51 fill_piston_model(&model);
53 /* Create the canvas and populate it */
54 canvas = adg_canvas_new();
55 add_piston_path(canvas, &model);
56 add_piston_dimensions(canvas, &model);
58 /* User interface stuff */
59 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
60 g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
62 vbox = gtk_vbox_new(FALSE, 0);
64 widget = gtk_drawing_area_new();
65 gtk_widget_set_size_request(widget, 790, 240);
66 g_signal_connect(widget, "expose-event", G_CALLBACK(piston_expose),
67 canvas);
68 gtk_container_add(GTK_CONTAINER(vbox), widget);
70 button_box = gtk_hbutton_box_new();
71 gtk_container_set_border_width(GTK_CONTAINER(button_box), 5);
72 gtk_box_set_spacing(GTK_BOX(button_box), 5);
73 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END);
74 gtk_box_pack_end(GTK_BOX(vbox), button_box, FALSE, TRUE, 0);
76 widget = gtk_button_new_from_stock(GTK_STOCK_SAVE);
77 gtk_container_add(GTK_CONTAINER(button_box), widget);
79 widget = gtk_button_new_from_stock(GTK_STOCK_PRINT);
80 g_signal_connect_swapped(widget, "clicked", G_CALLBACK(piston_to_ps),
81 canvas);
82 gtk_container_add(GTK_CONTAINER(button_box), widget);
84 widget = gtk_button_new_from_stock(GTK_STOCK_QUIT);
85 g_signal_connect(widget, "clicked", G_CALLBACK(gtk_main_quit), NULL);
86 gtk_container_add(GTK_CONTAINER(button_box), widget);
88 gtk_container_add(GTK_CONTAINER(window), vbox);
89 gtk_widget_show_all(window);
91 gtk_main();
93 return 0;
97 static void fill_piston_model(Piston *piston)
99 piston->A = 62.3;
100 piston->B = 20.6;
101 piston->C = 2;
102 piston->D1 = 9.3;
103 piston->D2 = 6.5;
104 piston->D3 = 11.9;
105 piston->D4 = 6.5;
106 piston->D5 = 4.5;
107 piston->D6 = 7.2;
108 piston->D7 = 3.0;
109 piston->RD34 = 1.0;
110 piston->LD2 = 7.0;
111 piston->LD3 = 3.5;
112 piston->LD5 = 5.0;
113 piston->LD6 = 1.0;
114 piston->LD7 = 0.5;
117 static void add_piston_path(AdgCanvas *canvas, Piston *piston)
119 AdgEntity *entity;
121 entity = adg_path_new(ADG_CALLBACK(piston_path_extern), piston);
123 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
126 static void add_piston_dimensions(AdgCanvas *canvas, Piston *piston)
128 double A, B, C;
129 double D1, D2, D3, D4, D5, D6, D7;
130 double LD2, LD3, LD5, LD6, LD7;
131 double RD34, RD56;
132 AdgEntity *entity;
133 double x, y;
135 A = piston->A;
136 B = piston->B;
137 C = piston->C;
138 D1 = piston->D1;
139 D2 = piston->D2;
140 D3 = piston->D3;
141 D4 = piston->D4;
142 D5 = piston->D5;
143 D6 = piston->D6;
144 D7 = piston->D7;
145 LD2 = piston->LD2;
146 LD3 = piston->LD3;
147 LD5 = piston->LD5;
148 LD6 = piston->LD6;
149 LD7 = piston->LD7;
150 RD34 = piston->RD34;
151 RD56 = piston->RD56;
154 /* North */
156 /* LD2 */
157 entity =
158 adg_ldim_new_full_explicit(A - B - LD2, -D1 / 2.0, A - B,
159 -D3 / 2.0 + CHAMFER, CPML_DIR_UP, 0.0,
160 -D3 / 2.0);
161 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
163 /* LD3 */
164 entity =
165 adg_ldim_new_full_explicit(A - B, -D3 / 2.0 + CHAMFER, A - B + LD3,
166 -D3 / 2.0 + CHAMFER, CPML_DIR_UP, 0.0,
167 -D3 / 2.0);
168 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
171 /* South */
173 /* B */
174 entity =
175 adg_ldim_new_full_explicit(A - B, D3 / 2.0 - CHAMFER, A, D7 / 2.0,
176 CPML_DIR_DOWN, 0.0, D3 / 2.0);
177 adg_dim_set_tolerances(ADG_DIM(entity), "+0.1", NULL);
178 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
180 /* A */
181 entity =
182 adg_ldim_new_full_explicit(0.0, D1 / 2.0, A, D7 / 2.0,
183 CPML_DIR_DOWN, 0.0, D3 / 2.0);
184 adg_dim_set_tolerances(ADG_DIM(entity), "+0.05", "-0.05");
185 adg_dim_set_level(ADG_DIM(entity), 2.0);
186 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
189 /* East */
191 /* D3 */
192 x = A - B + LD3 - CHAMFER;
193 entity =
194 adg_ldim_new_full_explicit(x, -D3 / 2.0, x, D3 / 2.0,
195 CPML_DIR_RIGHT, A, 0.0);
196 adg_dim_set_tolerances(ADG_DIM(entity), "-0.25", NULL);
197 adg_dim_set_level(ADG_DIM(entity), 5.0);
198 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
200 /* D6 */
201 x = A - C + LD6;
202 entity =
203 adg_ldim_new_full_explicit(x, -D6 / 2.0, x, D6 / 2.0,
204 CPML_DIR_RIGHT, A, 0.0);
205 adg_dim_set_tolerances(ADG_DIM(entity), "-0.1", NULL);
206 adg_dim_set_level(ADG_DIM(entity), 4.0);
207 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
209 /* D4 */
210 x = A - C - LD5;
211 entity =
212 adg_ldim_new_full_explicit(x, -D4 / 2.0, x, D4 / 2.0,
213 CPML_DIR_RIGHT, A, 0.0);
214 adg_dim_set_level(ADG_DIM(entity), 3.0);
215 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
217 /* D5 */
218 x = A - C;
219 entity =
220 adg_ldim_new_full_explicit(x, -D5 / 2.0, x, D5 / 2.0,
221 CPML_DIR_RIGHT, A, 0.0);
222 adg_dim_set_tolerances(ADG_DIM(entity), "-0.1", NULL);
223 adg_dim_set_level(ADG_DIM(entity), 2.0);
224 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
226 /* D7 */
227 entity =
228 adg_ldim_new_full_explicit(A, -D7 / 2.0, A, D7 / 2.0,
229 CPML_DIR_RIGHT, A, 0.0);
230 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
233 /* West */
235 /* D1 */
236 entity =
237 adg_ldim_new_full_explicit(0.0, -D1 / 2.0, 0.0, D1 / 2.0,
238 CPML_DIR_LEFT, 0.0, 0.0);
239 adg_dim_set_tolerances(ADG_DIM(entity), "+0.05", "-0.05");
240 adg_dim_set_level(ADG_DIM(entity), 2.0);
241 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
243 /* D2 */
244 y = (D1 - D2) / 2.0;
245 x = A - B - LD2 + y * G_SQRT3;
246 entity =
247 adg_ldim_new_full_explicit(x, -D2 / 2.0, x, D2 / 2.0,
248 CPML_DIR_LEFT, 0.0, 0.0);
249 adg_dim_set_tolerances(ADG_DIM(entity), "-0.1", NULL);
250 g_containerable_add(G_CONTAINERABLE(canvas), G_CHILDABLE(entity));
254 static void piston_path_extern(AdgEntity *entity, Piston *piston)
256 double A, B, C;
257 double D1, D2, D3, D4, D5, D6, D7;
258 double LD2, LD3, LD5, LD6, LD7;
259 double RD34, RD56;
260 AdgPath *path;
261 double x, y;
263 A = piston->A;
264 B = piston->B;
265 C = piston->C;
266 D1 = piston->D1;
267 D2 = piston->D2;
268 D3 = piston->D3;
269 D4 = piston->D4;
270 D5 = piston->D5;
271 D6 = piston->D6;
272 D7 = piston->D7;
273 LD2 = piston->LD2;
274 LD3 = piston->LD3;
275 LD5 = piston->LD5;
276 LD6 = piston->LD6;
277 LD7 = piston->LD7;
278 RD34 = piston->RD34;
279 RD56 = piston->RD56;
281 path = ADG_PATH(entity);
283 adg_path_move_to(path, 0, D1 / 2.0);
284 adg_path_line_to(path, A - B - LD2, D1 / 2.0);
285 y = (D1 - D2) / 2.0;
286 adg_path_line_to(path, A - B - LD2 + y * G_SQRT3, D1 / 2.0 - y);
287 adg_path_line_to(path, A - B, D2 / 2.0);
288 adg_path_line_to(path, A - B, D3 / 2.0 - CHAMFER);
289 adg_path_line_to(path, A - B + CHAMFER, D3 / 2.0);
290 adg_path_line_to(path, A - B + LD3 - CHAMFER, D3 / 2.0);
291 adg_path_line_to(path, A - B + LD3, D3 / 2.0 - CHAMFER);
292 x = A - B + LD3 + RD34;
293 y = D4 / 2.0 + RD34;
294 adg_path_arc(path, x, y, RD34, G_PI, 3.0 * G_PI_2);
295 adg_path_line_to(path, A - C - LD5, D4 / 2.0);
296 y = (D4 - D5) / 2.0;
297 adg_path_line_to(path, A - C - LD5 + y, D4 / 2.0 - y);
298 adg_path_line_to(path, A - C, D5 / 2.0);
299 adg_path_line_to(path, A - C, D6 / 2.0);
300 adg_path_line_to(path, A - C + LD6, D6 / 2.0);
301 x = C - LD7 - LD6;
302 y = x / G_SQRT3;
303 adg_path_line_to(path, A - C + LD6 + x, D6 / 2.0 - y);
304 adg_path_line_to(path, A - LD7, D7 / 2.0);
305 adg_path_line_to(path, A, D7 / 2.0);
307 adg_path_chain_ymirror(path);
308 adg_path_close(path);
311 static void
312 piston_expose(GtkWidget *widget,
313 GdkEventExpose *event, AdgCanvas *canvas)
315 cairo_t *cr;
316 gint width, height;
317 double scale;
318 AdgMatrix matrix;
320 cr = gdk_cairo_create(widget->window);
321 width = widget->allocation.width;
322 height = widget->allocation.height;
323 scale = (double) (width - 80.0) / 80.0;
325 cairo_matrix_init(&matrix, scale, 0.0, 0.0, scale, scale + 71.0,
326 12.0 * scale);
327 adg_container_set_model_transformation(ADG_CONTAINER(canvas), &matrix);
329 /* Rendering process */
330 adg_entity_render(ADG_ENTITY(canvas), cr);
332 cairo_destroy(cr);
335 static void piston_to_ps(AdgCanvas *canvas)
337 cairo_surface_t *surface;
338 cairo_t *cr;
339 AdgMatrix matrix;
340 double scale;
342 /* Surface creation: A4 size */
343 surface = cairo_ps_surface_create("test.ps", 595, 842);
344 cairo_ps_surface_dsc_comment(surface,
345 "%%Title: Automatic Drawing Generation (Adg) demo");
346 cairo_ps_surface_dsc_comment(surface,
347 "%%Copyright: Copyright (C) 2006 Fontana Nicola");
348 cairo_ps_surface_dsc_comment(surface, "%%Orientation: Portrait");
350 cairo_ps_surface_dsc_begin_setup(surface);
352 cairo_ps_surface_dsc_begin_page_setup(surface);
353 cairo_ps_surface_dsc_comment(surface,
354 "%%IncludeFeature: *PageSize A4");
356 cr = cairo_create(surface);
357 cairo_surface_destroy(surface);
359 scale = 9.0;
360 cairo_matrix_init(&matrix, scale, 0.0, 0.0, scale, 100.0,
361 4.5 * scale + 100.0);
362 adg_container_set_model_transformation(ADG_CONTAINER(canvas), &matrix);
363 cairo_scale(cr, 70.0, 70.0);
365 /* Rendering process */
366 adg_entity_render(ADG_ENTITY(canvas), cr);
368 cairo_show_page(cr);
369 cairo_destroy(cr);