2 #include <gcontainer/gcontainer.h>
9 #define G_SQRT3 1.732050808
15 typedef struct _Piston Piston
;
19 gdouble D1
, D2
, D3
, D4
, D5
, D6
, D7
;
21 gdouble LD2
, LD3
, LD5
, LD6
, LD7
;
25 static void fill_piston_model (Piston
*piston
);
26 static void add_piston_path (AdgCanvas
*canvas
,
28 static void add_piston_dimensions (AdgCanvas
*canvas
,
30 static void piston_path_extern (AdgEntity
*entity
,
32 static void piston_expose (GtkWidget
*widget
,
33 GdkEventExpose
*event
,
35 static void piston_to_ps (AdgCanvas
*canvas
);
39 main(gint argc
, gchar
**argv
)
43 GtkWidget
*button_box
;
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
),
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
),
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
);
97 static void fill_piston_model(Piston
*piston
)
117 static void add_piston_path(AdgCanvas
*canvas
, Piston
*piston
)
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
)
129 double D1
, D2
, D3
, D4
, D5
, D6
, D7
;
130 double LD2
, LD3
, LD5
, LD6
, LD7
;
158 adg_ldim_new_full_explicit(A
- B
- LD2
, -D1
/ 2.0, A
- B
,
159 -D3
/ 2.0 + CHAMFER
, CPML_DIR_UP
, 0.0,
161 g_containerable_add(G_CONTAINERABLE(canvas
), G_CHILDABLE(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,
168 g_containerable_add(G_CONTAINERABLE(canvas
), G_CHILDABLE(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
));
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
));
192 x
= A
- B
+ LD3
- CHAMFER
;
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
));
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
));
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
));
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
));
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
));
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
));
245 x
= A
- B
- LD2
+ y
* G_SQRT3
;
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
)
257 double D1
, D2
, D3
, D4
, D5
, D6
, D7
;
258 double LD2
, LD3
, LD5
, LD6
, LD7
;
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);
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
;
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);
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);
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
);
312 piston_expose(GtkWidget
*widget
,
313 GdkEventExpose
*event
, AdgCanvas
*canvas
)
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,
327 adg_container_set_model_transformation(ADG_CONTAINER(canvas
), &matrix
);
329 /* Rendering process */
330 adg_entity_render(ADG_ENTITY(canvas
), cr
);
335 static void piston_to_ps(AdgCanvas
*canvas
)
337 cairo_surface_t
*surface
;
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
);
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
);