32 #if !defined(WIN32) && !defined(QUARTZ)
33 # include <gdk/gdkx.h>
68 # include <cairo-win32.h>
70 # include <cairo-quartz.h>
72 # include <cairo-xlib.h>
77 #define DPRINTF(...) do { if (DEBUG) printf(__VA_ARGS__); } while (0)
83 #define GERBV_PROJECT_FILE_EXT ".gvp"
84 const char *gerbv_project_file_name = N_(
"Gerbv Project");
85 const char *gerbv_project_file_pat =
"*" GERBV_PROJECT_FILE_EXT;
88 static void callbacks_units_changed (gerbv_gui_unit_t unit);
89 static void callbacks_update_statusbar_coordinates (gint x, gint y);
90 static void callbacks_update_ruler_scales (
void);
91 static void callbacks_render_type_changed (
void);
92 static void show_no_layers_warning (
void);
94 static double screen_units(
double);
95 static const char *screen_units_str(
void);
97 static double line_length(
double,
double,
double,
double);
98 static double arc_length(
double,
double);
102 static void aperture_report(gerbv_aperture_t *[],
int,
104 static void drill_report(gerbv_aperture_t *[],
int);
109 static void analyze_window_size_restore(GtkWidget *);
110 static void analyze_window_size_store(GtkWidget *, gpointer);
112 static void update_selected_object_message (gboolean userTriedToSelect);
115 gchar *utf8_strncpy(gchar *dst,
const gchar *src, gsize byte_len)
118 glong char_len = g_utf8_strlen(src, byte_len - 1);
119 return g_utf8_strncpy(dst, src, char_len);
122 void utf8_snprintf(gchar *dst, gsize byte_len,
const gchar *fmt, ...)
127 gchar *str = g_strdup_vprintf(fmt, ap);
129 utf8_strncpy(dst, str, byte_len);
135 static void show_no_layers_warning (
void) {
136 gchar *str = g_new(gchar, MAX_DISTLEN);
137 utf8_strncpy(str, _(
"No layers are currently loaded. A layer must be loaded first."), MAX_DISTLEN - 7);
138 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
"<b>%s</b>", str);
155 _(
"Do you want to close any open layers "
156 "and start a new project?"),
157 _(
"Starting a new project will cause all currently "
158 "open layers to be closed. Any unsaved changes "
160 FALSE, NULL, GTK_STOCK_CLOSE, GTK_STOCK_CANCEL))
165 callbacks_update_layer_tree ();
166 selection_clear (&screen.selectionInfo);
167 update_selected_object_message (FALSE);
174 render_refresh_rendered_image_on_screen();
191 _(
"Do you want to close any open layers and load "
192 "an existing project?"),
193 _(
"Loading a project will cause all currently open "
194 "layers to be closed. Any unsaved changes "
196 FALSE, NULL, GTK_STOCK_CLOSE, GTK_STOCK_CANCEL)) {
206 main_open_project_from_filename (
mainProject, project_filename);
221 GSList *fns_is_mod = NULL;
222 GSList *fns_cnt = NULL;
223 GSList *fns_lay_num = NULL;
228 if (filenames == NULL)
233 for (GSList *fn = filenames; fn; fn = fn->next) {
234 gboolean is_project = FALSE;
241 render_refresh_rendered_image_on_screen();
242 callbacks_update_layer_tree();
249 for (GSList *fn = filenames; fn; fn = fn->next) {
255 if (strlen(fpn) == strlen(fn->data)
256 && 0 == g_ascii_strncasecmp(fpn, fn->data,
262 cnt = g_slist_append(cnt, GINT_TO_POINTER(c));
269 for (GSList *fn = filenames; fn; fn = fn->next) {
270 if (strlen(fpn) == strlen(fn->data)
271 && 0 == g_ascii_strncasecmp(fpn, fn->data,
273 fns = g_slist_append(fns, fn->data);
274 fns_is_mod = g_slist_append(fns_is_mod,
278 fns_cnt = g_slist_append(fns_cnt,
279 g_slist_nth_data(cnt,
283 fns_lay_num = g_slist_append(fns_lay_num,
284 GINT_TO_POINTER(fidx));
291 answer = GTK_RESPONSE_NONE;
292 if (g_slist_length(fns) > 0)
294 fns_cnt, fns_lay_num);
298 case GTK_RESPONSE_CANCEL:
299 case GTK_RESPONSE_NONE:
300 case GTK_RESPONSE_DELETE_EVENT:
304 case GTK_RESPONSE_YES:
305 for (GSList *fn = fns; fn; fn = fn->next) {
306 if (fn->data != NULL)
309 g_slist_nth_data (fns_lay_num,
310 g_slist_position (fns,
315 case GTK_RESPONSE_OK:
318 for (GSList *fn = filenames; fn; fn = fn->next) {
319 if (NULL != g_slist_find (fns, fn->data))
327 for (GSList *fn = filenames; fn; fn = fn->next) {
328 if (0 == GPOINTER_TO_INT(g_slist_nth_data(cnt,
329 g_slist_position(filenames, fn))))
334 g_slist_free(fns_is_mod);
335 g_slist_free(fns_cnt);
336 g_slist_free(fns_lay_num);
340 render_refresh_rendered_image_on_screen();
341 callbacks_update_layer_tree();
355 gtk_file_chooser_dialog_new (
356 _(
"Open Gerbv project, Gerber, drill, "
357 "or pick&place files"),
358 NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
359 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
360 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
363 gtk_file_chooser_set_select_multiple(
364 (GtkFileChooser *)screen.win.gerber, TRUE);
365 gtk_file_chooser_set_current_folder(
367 gtk_widget_show (screen.win.gerber);
368 if (gtk_dialog_run ((GtkDialog*)screen.win.gerber) ==
369 GTK_RESPONSE_ACCEPT) {
370 fns = gtk_file_chooser_get_filenames(
371 GTK_FILE_CHOOSER (screen.win.gerber));
375 (GtkFileChooser *)screen.win.gerber);
377 gtk_widget_destroy (screen.win.gerber);
380 g_slist_free_full (fns, g_free);
385 callbacks_revert_activate (GtkMenuItem *menuitem, gpointer user_data)
388 selection_clear (&screen.selectionInfo);
389 update_selected_object_message (FALSE);
390 render_refresh_rendered_image_on_screen ();
391 callbacks_update_layer_tree ();
396 callbacks_save_project_activate (GtkMenuItem *menuitem,
402 callbacks_generic_save_activate (menuitem, (gpointer) CALLBACKS_SAVE_PROJECT_AS);
403 callbacks_update_layer_tree();
409 callbacks_save_layer_activate (GtkMenuItem *menuitem,
423 callbacks_update_layer_tree();
427 callbacks_update_layer_tree();
430 struct l_image_info {
441 gint i, filecount, img;
444 struct l_image_info {
449 images=(
struct l_image_info *)g_new0(
struct l_image_info,1);
452 case CALLBACKS_SAVE_FILE_DRILLM:
455 case CALLBACKS_SAVE_FILE_RS274XM:
459 GERB_COMPILE_ERROR(_(
"Unknown Layer type for merge"));
462 DPRINTF(
"Looking for matching files\n");
470 images = (
struct l_image_info *)g_renew(
struct l_image_info, images, img+1);
474 GERB_COMPILE_ERROR(_(
"Not Enough Files of same type to merge"));
477 DPRINTF(
"Now merging files\n");
478 for (i = 0; i < img; ++i) {
481 thisTransform=images[i].transform;
482 if (NULL == thisTransform)
483 thisTransform = &identityTransform;
496 visible_file_name(gchar **file_name, gchar **dir_name,
498 const gchar *file_extension,
499 const gchar *untitled_file_extension)
501 unsigned int count = 0;
509 if (first_vis_file == NULL) {
513 *dir_name = g_path_get_dirname (
517 if (++count == 2 && file_name) {
518 *file_name = g_strdup_printf(
"%s%s",
519 pgettext(
"file name",
521 untitled_file_extension);
526 if (count == 1 && file_name)
527 *file_name = g_strdup_printf(
"%s%s",
528 first_vis_file->
name, file_extension);
535 callbacks_generic_save_activate (GtkMenuItem *menuitem,
538 gchar *new_file_name = NULL;
539 gchar *file_name = NULL;
540 gchar *dir_name = NULL;
541 gboolean error_visible_layers = FALSE;
542 gchar *windowTitle = NULL;
545 gint processType = GPOINTER_TO_INT (user_data);
546 GtkFileFilter *filter;
547 GtkSpinButton *spin_but;
548 GtkTooltips *tooltips;
551 GtkWidget *svg_layers_check;
552 GtkWidget *svg_cairo_check;
554 static gboolean svg_layers = FALSE;
557 if (file_index < 0) {
559 _(
"Please select a layer and try again."),
567 screen.win.gerber = gtk_file_chooser_dialog_new (
"", NULL,
568 GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL, NULL);
569 GtkFileChooser *file_chooser_p =
570 GTK_FILE_CHOOSER(screen.win.gerber);
571 gtk_file_chooser_set_do_overwrite_confirmation (file_chooser_p, TRUE);
573 hbox = gtk_hbox_new (0, 0);
574 spin_but = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range (0, 0, 1));
575 svg_layers_check = gtk_check_button_new_with_label (_(
"Export as Inkscape layers"));
576 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (svg_layers_check), svg_layers);
577 svg_cairo_check = gtk_check_button_new_with_label (_(
"Use Cairo SVG (legacy)"));
579 label = gtk_label_new (
"");
580 tooltips = gtk_tooltips_new ();
581 gtk_box_pack_end (GTK_BOX(hbox), GTK_WIDGET(spin_but), 0, 0, 1);
582 gtk_box_pack_end (GTK_BOX(hbox), label, 0, 0, 5);
583 gtk_box_pack_end (GTK_BOX(GTK_DIALOG(screen.win.gerber)->vbox),
584 svg_cairo_check, 0, 0, 2);
585 gtk_box_pack_end (GTK_BOX(GTK_DIALOG(screen.win.gerber)->vbox),
586 svg_layers_check, 0, 0, 2);
587 gtk_box_pack_end (GTK_BOX(GTK_DIALOG(screen.win.gerber)->vbox),
590 switch (processType) {
591 case CALLBACKS_SAVE_PROJECT_AS:
592 windowTitle = g_strdup (_(
"Save project as..."));
598 file_name = g_strdup_printf(
"%s%s",
599 pgettext(
"file name",
"untitled"),
600 GERBV_PROJECT_FILE_EXT);
604 filter = gtk_file_filter_new ();
605 gtk_file_filter_set_name (filter, _(gerbv_project_file_name));
606 gtk_file_filter_add_pattern (filter, gerbv_project_file_pat);
607 gtk_file_chooser_add_filter (file_chooser_p, filter);
609 filter = gtk_file_filter_new ();
610 gtk_file_filter_set_name (filter, _(
"All"));
611 gtk_file_filter_add_pattern (filter,
"*");
612 gtk_file_chooser_add_filter (file_chooser_p, filter);
615 case CALLBACKS_SAVE_FILE_PS:
616 windowTitle = g_strdup_printf (
617 _(
"Export visible layers to %s file as..."),
619 if (0 == visible_file_name(&file_name, &dir_name, -1,
621 error_visible_layers = TRUE;
627 case CALLBACKS_SAVE_FILE_PDF:
628 windowTitle = g_strdup_printf (
629 _(
"Export visible layers to %s file as..."),
631 if (0 == visible_file_name(&file_name, &dir_name, -1,
633 error_visible_layers = TRUE;
639 case CALLBACKS_SAVE_FILE_SVG:
640 windowTitle = g_strdup_printf (
641 _(
"Export visible layers to %s file as..."),
643 if (0 == visible_file_name(&file_name, &dir_name, -1,
645 error_visible_layers = TRUE;
649 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(svg_layers_check),
650 _(
"Create one Inkscape layer per visible gerber layer"), NULL);
651 gtk_widget_show_all (svg_layers_check);
653 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(svg_cairo_check),
654 _(
"Use Cairo's SVG surface (larger files, legacy behavior)"), NULL);
655 gtk_widget_show_all (svg_cairo_check);
659 case CALLBACKS_SAVE_FILE_DXF:
660 windowTitle = g_strdup_printf (
661 _(
"Export \"%s\" layer #%d to DXF file as..."),
662 act_file->
name, file_index + 1);
663 file_name = g_strconcat (act_file->
name,
".dxf", NULL);
666 case CALLBACKS_SAVE_FILE_PNG:
667 windowTitle = g_strdup_printf (
668 _(
"Export visible layers to %s file as..."),
670 if (0 == visible_file_name(&file_name, &dir_name, -1,
672 error_visible_layers = TRUE;
676 gtk_label_set_text (GTK_LABEL(label), _(
"DPI:"));
677 gtk_spin_button_set_range (spin_but, 0, 6000);
678 gtk_spin_button_set_increments (spin_but, 10, 100);
679 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(label),
680 _(
"DPI value, autoscaling if 0"), NULL);
681 gtk_tooltips_set_tip (tooltips, GTK_WIDGET(spin_but),
682 _(
"DPI value, autoscaling if 0"), NULL);
683 gtk_spin_button_set_value (spin_but, dpi);
684 gtk_widget_show_all (hbox);
687 case CALLBACKS_SAVE_FILE_RS274X:
688 windowTitle = g_strdup_printf(
689 _(
"Export \"%s\" layer #%d to "
690 "RS-274X file as..."),
691 act_file->
name, file_index+1);
694 file_name = g_strconcat (act_file->
name,
".gbr", NULL);
696 file_name = g_strdup (act_file->
name);
700 case CALLBACKS_SAVE_FILE_RS274XM:
701 windowTitle = g_strdup (_(
"Export merged visible layers to "
702 "RS-274X file as..."));
703 if (2 > visible_file_name(&file_name, &dir_name,
705 error_visible_layers = TRUE;
709 case CALLBACKS_SAVE_FILE_DRILL:
710 windowTitle = g_strdup_printf(
711 _(
"Export \"%s\" layer #%d to "
712 "Excellon drill file as..."),
713 act_file->
name, file_index+1);
716 file_name = g_strconcat (act_file->
name,
".drl", NULL);
718 file_name = g_strdup (act_file->
name);
722 case CALLBACKS_SAVE_FILE_DRILLM:
723 windowTitle = g_strdup (_(
"Export merged visible layers to "
724 "Excellon drill file as..."));
725 if (2 > visible_file_name(&file_name, &dir_name,
727 error_visible_layers = TRUE;
730 case CALLBACKS_SAVE_FILE_IDRILL:
731 windowTitle = g_strdup_printf(
732 _(
"Export \"%s\" layer #%d to ISEL NCP drill file as..."),
733 act_file->
name, file_index+1);
734 file_name = g_strconcat (act_file->
name,
".ncp", NULL);
738 case CALLBACKS_SAVE_FILE_GEDA_PCB:
739 windowTitle = g_strdup_printf (
740 _(
"Export \"%s\" layer #%d to gEDA PCB file as..."),
741 act_file->
name, file_index + 1);
742 file_name = g_strconcat (act_file->
name,
".pcb", NULL);
745 case CALLBACKS_SAVE_LAYER_AS:
746 windowTitle = g_strdup_printf (_(
"Save \"%s\" layer #%d as..."),
747 act_file->
name, file_index+1);
748 file_name = g_strdup (act_file->
name);
753 if (file_name != NULL) {
754 gtk_file_chooser_set_current_name (file_chooser_p, file_name);
757 if (dir_name != NULL) {
758 gtk_file_chooser_set_current_folder (file_chooser_p, dir_name);
762 gtk_dialog_add_buttons (GTK_DIALOG(screen.win.gerber),
763 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
764 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
767 gtk_window_set_title (GTK_WINDOW(screen.win.gerber), windowTitle);
768 g_free (windowTitle);
770 if (error_visible_layers) {
771 switch (processType) {
772 case CALLBACKS_SAVE_FILE_RS274XM:
774 _(
"Not enough Gerber layers are visible"),
775 _(
"Two or more Gerber layers must be visible "
776 "for export with merge."),
777 FALSE, NULL, NULL, GTK_STOCK_CANCEL);
779 case CALLBACKS_SAVE_FILE_DRILLM:
781 _(
"Not enough Excellon layers are visible"),
782 _(
"Two or more Excellon layers must be visible "
783 "for export with merge."),
784 FALSE, NULL, NULL, GTK_STOCK_CANCEL);
788 _(
"No layers are visible"), _(
"One or more "
789 "layers must be visible for export."),
790 FALSE, NULL, NULL, GTK_STOCK_CANCEL);
793 gtk_widget_destroy (screen.win.gerber);
794 callbacks_update_layer_tree ();
799 gtk_widget_show (screen.win.gerber);
800 if (gtk_dialog_run (GTK_DIALOG(screen.win.gerber)) == GTK_RESPONSE_ACCEPT) {
801 new_file_name = gtk_file_chooser_get_filename (file_chooser_p);
802 dpi = gtk_spin_button_get_value_as_int (spin_but);
803 svg_layers = gtk_toggle_button_get_active (
804 GTK_TOGGLE_BUTTON (svg_layers_check));
806 GTK_TOGGLE_BUTTON (svg_cairo_check));
808 gtk_widget_destroy (screen.win.gerber);
810 if (!new_file_name) {
811 callbacks_update_layer_tree ();
816 switch (processType) {
817 case CALLBACKS_SAVE_PROJECT_AS:
818 main_save_as_project_from_filename (
mainProject, new_file_name);
819 rename_main_window(new_file_name, NULL);
821 case CALLBACKS_SAVE_FILE_PS:
825 case CALLBACKS_SAVE_FILE_PDF:
829 case CALLBACKS_SAVE_FILE_SVG:
833 case CALLBACKS_SAVE_FILE_DXF:
837 _(
"\"%s\" layer #%d saved as DXF in \"%s\""),
838 act_file->
name, file_index + 1,
842 case CALLBACKS_SAVE_FILE_PNG:
856 bb.
left - (w*GERBV_DEFAULT_BORDER_COEFF)/2.0,
857 bb.
top - (h*GERBV_DEFAULT_BORDER_COEFF)/2.0,
859 w*dpi*(1 + GERBV_DEFAULT_BORDER_COEFF),
860 h*dpi*(1 + GERBV_DEFAULT_BORDER_COEFF),
863 &renderInfo, new_file_name);
867 case CALLBACKS_SAVE_LAYER_AS:
869 file_index, new_file_name);
875 g_free (act_file->
name);
876 act_file->
name = g_path_get_basename (new_file_name);
879 case CALLBACKS_SAVE_FILE_RS274X:
884 _(
"\"%s\" layer #%d saved as Gerber in \"%s\""),
885 act_file->
name, file_index + 1,
889 case CALLBACKS_SAVE_FILE_DRILL:
894 _(
"\"%s\" layer #%d saved as drill in \"%s\""),
895 act_file->
name, file_index + 1,
899 case CALLBACKS_SAVE_FILE_IDRILL:
903 _(
"\"%s\" layer #%d saved as ISEL NCP drill "
904 "in \"%s\""), act_file->
name, file_index + 1,
908 case CALLBACKS_SAVE_FILE_GEDA_PCB:
912 _(
"\"%s\" layer #%d saved as gEDA PCB "
913 "in \"%s\""), act_file->
name, file_index + 1,
917 case CALLBACKS_SAVE_FILE_RS274XM: {
922 new_file_name, image, &t)) {
923 GERB_MESSAGE (_(
"Merged visible Gerber layers "
924 "and saved in \"%s\""),
931 case CALLBACKS_SAVE_FILE_DRILLM: {
936 new_file_name, image, &t);
938 GERB_MESSAGE (_(
"Merged visible drill layers "
939 "and saved in \"%s\""),
946 g_free (new_file_name);
947 callbacks_update_layer_tree ();
953 #if GTK_CHECK_VERSION(2,10,0)
956 callbacks_begin_print (GtkPrintOperation *operation, GtkPrintContext *context,
957 gpointer user_data) {
958 gtk_print_operation_set_n_pages (operation, 1);
964 callbacks_print_render_page (GtkPrintOperation *operation,
965 GtkPrintContext *context,
969 GtkPrintSettings *pSettings = gtk_print_operation_get_print_settings (operation);
972 (gint) gtk_print_context_get_width (context),
973 (gint) gtk_print_context_get_height (context)};
978 gdouble xres = gtk_print_context_get_dpi_x (context);
979 gdouble yres = gtk_print_context_get_dpi_y (context);
980 gdouble scalePercentage = gtk_print_settings_get_scale (pSettings);
984 gerbv_render_translate_to_fit_display (
mainProject, &renderInfo);
985 cr = gtk_print_context_get_cairo_context (context);
986 gerbv_render_all_layers_to_cairo_target_for_vector_output (
mainProject, cr, &renderInfo);
991 callbacks_print_activate (GtkMenuItem *menuitem, gpointer user_data)
993 GtkPrintOperation *print;
996 print = gtk_print_operation_new ();
998 g_signal_connect (print,
"begin_print", G_CALLBACK (callbacks_begin_print), NULL);
999 g_signal_connect (print,
"draw_page", G_CALLBACK (callbacks_print_render_page), NULL);
1003 (void) gtk_print_operation_run (print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
1004 (GtkWindow *) screen.win.topLevelWindow , NULL);
1006 g_object_unref (print);
1012 callbacks_fullscreen_toggled (GtkMenuItem *menuitem, gpointer user_data)
1015 GdkWindowState state = gdk_window_get_state (gtk_widget_get_window(screen.win.topLevelWindow));
1016 if(state & GDK_WINDOW_STATE_FULLSCREEN)
1017 gtk_window_unfullscreen (GTK_WINDOW(screen.win.topLevelWindow));
1019 gtk_window_fullscreen (GTK_WINDOW(screen.win.topLevelWindow));
1024 callbacks_show_toolbar_toggled (GtkMenuItem *menuitem, gpointer user_data)
1026 gtk_widget_set_visible (user_data, GTK_CHECK_MENU_ITEM(menuitem)->active);
1031 callbacks_show_sidepane_toggled (GtkMenuItem *menuitem, gpointer user_data)
1033 gtk_widget_set_visible (user_data, GTK_CHECK_MENU_ITEM(menuitem)->active);
1038 callbacks_show_selection_on_invisible (GtkMenuItem *menuitem, gpointer user_data)
1041 render_refresh_rendered_image_on_screen();
1046 callbacks_show_cross_on_drill_holes (GtkMenuItem *menuitem, gpointer user_data)
1049 render_refresh_rendered_image_on_screen();
1059 int i = GPOINTER_TO_INT(user_data);
1062 case LAYER_SELECTED:
1066 if (0 <= i && i <= mainProject->last_loaded) {
1085 callbacks_update_layer_tree ();
1088 render_refresh_rendered_image_on_screen ();
1090 render_recreate_composite_surface ();
1091 callbacks_force_expose_event_for_screen ();
1097 callbacks_zoom_in_activate (GtkMenuItem *menuitem,
1100 render_zoom_display (ZOOM_IN, 0, 0, 0);
1105 callbacks_zoom_out_activate (GtkMenuItem *menuitem,
1108 render_zoom_display (ZOOM_OUT, 0, 0, 0);
1113 callbacks_fit_to_window_activate (GtkMenuItem *menuitem,
1117 render_refresh_rendered_image_on_screen();
1129 return _(
"Warning");
1148 gerbv_aperture_list_t *aperture_list;
1156 GString *general_report_str = g_string_new(NULL);
1157 if (stat->layer_count == 0) {
1158 g_string_printf(general_report_str,
1159 _(
"No Gerber layers visible!"));
1161 if (stat->error_list->error_text == NULL) {
1162 g_string_printf(general_report_str,
1163 ngettext(
"No errors found in %d visible "
1165 "No errors found in %d visible "
1170 g_string_printf(general_report_str,
1171 ngettext(
"Found errors in %d visible "
1173 "Found errors in %d visible "
1180 GtkWidget *general_label = gtk_label_new(general_report_str->str);
1181 g_string_free(general_report_str, TRUE);
1182 gtk_misc_set_alignment(GTK_MISC(general_label), 0, 0);
1183 gtk_misc_set_padding(GTK_MISC(general_label), 7, 7);
1184 gtk_label_set_selectable(GTK_LABEL(general_label), TRUE);
1186 struct table *general_table;
1188 general_table = table_new_with_columns(3,
1189 _(
"Layer"), G_TYPE_UINT, _(
"Type"), G_TYPE_STRING,
1190 _(
"Description"), G_TYPE_STRING);
1191 table_set_column_align(general_table, 0, 1.0);
1197 || !files[i]->isVisible
1201 table_add_row(general_table, i + 1,
1202 _(
"RS-274X file"), files[i]->fullPathname);
1204 str = g_strdup_printf(_(
"%g x %g %s"),
1205 screen_units(fabs(files[i]->image->
info->max_x -
1207 screen_units(fabs(files[i]->image->
info->max_y -
1209 screen_units_str());
1210 table_add_row(general_table, i + 1, _(
"Bounding size"), str);
1214 if (stat->layer_count > 0
1215 && stat->error_list->error_text != NULL) {
1218 err_list = err_list->next) {
1220 if (i != err_list->layer - 1)
1223 table_add_row(general_table, err_list->layer,
1224 error_type_string(err_list->type),
1225 err_list->error_text);
1231 GtkWidget *G_report_window = gtk_scrolled_window_new(NULL, NULL);
1232 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(G_report_window),
1233 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1235 struct table *G_table =
1236 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1237 pgettext(
"table",
"Count"), G_TYPE_UINT,
1238 _(
"Note"), G_TYPE_STRING);
1239 table_set_column_align(G_table, 0, 1.0);
1240 table_set_column_align(G_table, 1, 1.0);
1241 gtk_tree_view_set_headers_clickable(
1242 GTK_TREE_VIEW(G_table->widget), TRUE);
1262 table_add_row(G_table,
"", stat->G_unknown, _(
"unknown G-codes"));
1264 table_set_sortable(G_table);
1265 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
1268 GtkWidget *D_report_window = gtk_scrolled_window_new(NULL, NULL);
1269 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(D_report_window),
1270 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1272 struct table *D_table =
1273 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1274 pgettext(
"table",
"Count"), G_TYPE_UINT,
1275 _(
"Note"), G_TYPE_STRING);
1276 table_set_column_align(D_table, 0, 1.0);
1277 table_set_column_align(D_table, 1, 1.0);
1278 gtk_tree_view_set_headers_clickable(
1279 GTK_TREE_VIEW(D_table->widget), TRUE);
1283 table_add_row(D_table,
"", stat->D_unknown, _(
"unknown D-codes"));
1284 table_add_row(D_table,
"", stat->D_error, _(
"D-code errors"));
1286 table_set_sortable(D_table);
1287 gtk_container_add(GTK_CONTAINER(D_report_window), D_table->widget);
1290 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
1291 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
1292 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1294 struct table *M_table =
1295 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1296 pgettext(
"table",
"Count"), G_TYPE_UINT,
1297 _(
"Note"), G_TYPE_STRING);
1298 table_set_column_align(M_table, 0, 1.0);
1299 table_set_column_align(M_table, 1, 1.0);
1300 gtk_tree_view_set_headers_clickable(
1301 GTK_TREE_VIEW(M_table->widget), TRUE);
1305 table_add_row(M_table,
"", stat->M_unknown, _(
"unknown M-codes"));
1307 table_set_sortable(M_table);
1308 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
1311 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
1312 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
1313 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1315 struct table *misc_table =
1316 table_new_with_columns(2, _(
"Code"), G_TYPE_STRING,
1317 pgettext(
"table",
"Count"), G_TYPE_UINT);
1318 table_set_column_align(misc_table, 1, 1.0);
1319 gtk_tree_view_set_headers_clickable(
1320 GTK_TREE_VIEW(misc_table->widget), TRUE);
1321 table_add_row(misc_table,
"X", stat->X);
1322 table_add_row(misc_table,
"Y", stat->Y);
1323 table_add_row(misc_table,
"I", stat->I);
1324 table_add_row(misc_table,
"J", stat->J);
1325 table_add_row(misc_table,
"*", stat->star);
1326 table_add_row(misc_table, _(
"Unknown"), stat->unknown);
1328 table_set_sortable(misc_table);
1329 gtk_container_add(GTK_CONTAINER(misc_report_window),
1330 misc_table->widget);
1333 GtkWidget *aperture_def_report_window =
1334 gtk_scrolled_window_new(NULL, NULL);
1335 gtk_scrolled_window_set_policy(
1336 GTK_SCROLLED_WINDOW(aperture_def_report_window),
1337 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1339 if (stat->aperture_list->number == -1) {
1340 GtkWidget *aperture_def_label = gtk_label_new(
1341 _(
"No aperture definitions found in active Gerber file(s)!"));
1342 gtk_misc_set_alignment(GTK_MISC(aperture_def_label), 0, 0);
1343 gtk_misc_set_padding(GTK_MISC(aperture_def_label), 7, 7);
1344 gtk_label_set_selectable(GTK_LABEL(aperture_def_label), TRUE);
1345 gtk_scrolled_window_add_with_viewport(
1346 GTK_SCROLLED_WINDOW(aperture_def_report_window),
1347 aperture_def_label);
1349 struct table *aperture_def_table = table_new_with_columns(6,
1350 _(
"Layer"), G_TYPE_UINT,
1351 _(
"D code"), G_TYPE_STRING,
1352 _(
"Aperture"), G_TYPE_STRING,
1353 _(
"Param[0]"), G_TYPE_DOUBLE,
1354 _(
"Param[1]"), G_TYPE_DOUBLE,
1355 _(
"Param[2]"), G_TYPE_DOUBLE);
1356 table_set_column_align(aperture_def_table, 0, 1.0);
1357 table_set_column_align(aperture_def_table, 1, 1.0);
1358 gtk_tree_view_set_headers_clickable(
1359 GTK_TREE_VIEW(aperture_def_table->widget), TRUE);
1360 gtk_tree_view_set_search_column(
1361 GTK_TREE_VIEW(aperture_def_table->widget), 1);
1363 GString *gstr = g_string_new(NULL);
1364 for (aperture_list = stat->aperture_list;
1365 aperture_list != NULL;
1366 aperture_list = aperture_list->next) {
1367 g_string_printf(gstr,
"D%d", aperture_list->number);
1368 table_add_row(aperture_def_table,
1369 aperture_list->layer,
1372 aperture_list->type)),
1373 aperture_list->parameter[0],
1374 aperture_list->parameter[1],
1375 aperture_list->parameter[2]);
1377 g_string_free(gstr, TRUE);
1378 table_set_sortable(aperture_def_table);
1379 gtk_container_add(GTK_CONTAINER(aperture_def_report_window),
1380 aperture_def_table->widget);
1384 GtkWidget *aperture_usage_report_window =
1385 gtk_scrolled_window_new(NULL, NULL);
1386 gtk_scrolled_window_set_policy(
1387 GTK_SCROLLED_WINDOW(aperture_usage_report_window),
1388 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1390 unsigned int aperture_count = 0;
1392 if (stat->D_code_list->number == -1) {
1393 GtkWidget *aperture_usage_label = gtk_label_new(
1394 _(
"No apertures used in Gerber file(s)!"));
1395 gtk_misc_set_alignment(GTK_MISC(aperture_usage_label), 0, 0);
1396 gtk_misc_set_padding(GTK_MISC(aperture_usage_label), 7, 7);
1397 gtk_label_set_selectable(GTK_LABEL(aperture_usage_label), TRUE);
1398 gtk_scrolled_window_add_with_viewport(
1399 GTK_SCROLLED_WINDOW(aperture_usage_report_window),
1400 aperture_usage_label);
1402 struct table *aperture_usage_table = table_new_with_columns(2,
1403 _(
"Code"), G_TYPE_STRING,
1404 pgettext(
"table",
"Count"), G_TYPE_UINT);
1405 table_set_column_align(aperture_usage_table, 0, 1.0);
1406 table_set_column_align(aperture_usage_table, 1, 1.0);
1407 gtk_tree_view_set_headers_clickable(
1408 GTK_TREE_VIEW(aperture_usage_table->widget), TRUE);
1410 GString *gstr = g_string_new(NULL);
1411 for (aperture_list = stat->D_code_list;
1412 aperture_list != NULL;
1413 aperture_list = aperture_list->next) {
1414 g_string_printf(gstr,
"D%d", aperture_list->number);
1415 table_add_row(aperture_usage_table,
1417 aperture_list->count);
1418 aperture_count += aperture_list->count;
1420 g_string_free(gstr, TRUE);
1421 table_add_row(aperture_usage_table, _(
"Total"), aperture_count);
1422 table_set_sortable(aperture_usage_table);
1423 gtk_container_add( GTK_CONTAINER(aperture_usage_report_window),
1424 aperture_usage_table->widget);
1428 GtkWidget *analyze_active_gerbers;
1429 analyze_active_gerbers = gtk_dialog_new_with_buttons(
1430 _(
"Gerber codes report on visible layers"),
1431 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1432 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1433 gtk_container_set_border_width(GTK_CONTAINER (analyze_active_gerbers), 5);
1435 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_gerbers),
1436 GTK_RESPONSE_ACCEPT);
1437 g_signal_connect_after (G_OBJECT(analyze_active_gerbers),
1439 G_CALLBACK (gtk_widget_destroy),
1440 GTK_WIDGET(analyze_active_gerbers));
1443 GtkWidget *general_report_window =
1444 gtk_scrolled_window_new(NULL, NULL);
1445 gtk_scrolled_window_set_policy(
1446 GTK_SCROLLED_WINDOW(general_report_window),
1447 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1449 GtkWidget *vbox = gtk_vbox_new(0, 0);
1450 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1451 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1452 gtk_scrolled_window_add_with_viewport(
1453 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1456 GtkWidget *notebook = gtk_notebook_new();
1458 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1459 GTK_WIDGET(general_report_window),
1460 gtk_label_new(_(
"General")));
1462 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1463 GTK_WIDGET(G_report_window),
1464 gtk_label_new(_(
"G codes")));
1466 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1467 GTK_WIDGET(D_report_window),
1468 gtk_label_new(_(
"D codes")));
1470 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1471 GTK_WIDGET(M_report_window),
1472 gtk_label_new(_(
"M codes")));
1474 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1475 GTK_WIDGET(misc_report_window),
1476 gtk_label_new(_(
"Misc. codes")));
1478 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1479 GTK_WIDGET(aperture_def_report_window),
1480 gtk_label_new(_(
"Aperture definitions")));
1482 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1483 GTK_WIDGET(aperture_usage_report_window),
1484 gtk_label_new(_(
"Aperture usage")));
1488 GTK_CONTAINER(GTK_DIALOG(analyze_active_gerbers)->vbox),
1489 GTK_WIDGET(notebook));
1491 if (screen.settings) {
1492 analyze_window_size_restore(analyze_active_gerbers);
1493 g_signal_connect (G_OBJECT(analyze_active_gerbers),
"response",
1494 G_CALLBACK (analyze_window_size_store),
1495 GTK_WIDGET(analyze_active_gerbers));
1497 gtk_window_set_default_size(GTK_WINDOW(analyze_active_gerbers),
1501 gtk_widget_show_all(analyze_active_gerbers);
1523 GString *general_report_str = g_string_new(NULL);
1524 if (stat->layer_count == 0) {
1525 g_string_printf(general_report_str,
1526 _(
"No drill layers visible!"));
1528 if (stat->error_list->error_text == NULL) {
1529 g_string_printf(general_report_str,
1530 ngettext(
"No errors found in %d visible "
1532 "No errors found in %d visible "
1537 g_string_printf(general_report_str,
1538 ngettext(
"Found errors found in %d visible "
1540 "Found errors found in %d visible "
1547 GtkWidget *general_label = gtk_label_new(general_report_str->str);
1548 g_string_free(general_report_str, TRUE);
1549 gtk_misc_set_alignment(GTK_MISC(general_label), 0, 0);
1550 gtk_misc_set_padding(GTK_MISC(general_label), 7, 7);
1551 gtk_label_set_selectable(GTK_LABEL(general_label), TRUE);
1553 struct table *general_table;
1555 general_table = table_new_with_columns(3,
1556 _(
"Layer"), G_TYPE_UINT, _(
"Type"), G_TYPE_STRING,
1557 _(
"Description"), G_TYPE_STRING);
1558 table_set_column_align(general_table, 0, 1.0);
1564 || !files[i]->isVisible
1568 table_add_row(general_table, i + 1,
1569 _(
"Excellon file"), files[i]->fullPathname);
1571 str = g_strdup_printf(_(
"%g x %g %s"),
1572 screen_units(fabs(files[i]->image->
info->max_x -
1574 screen_units(fabs(files[i]->image->
info->max_y -
1576 screen_units_str());
1577 table_add_row(general_table, i + 1, _(
"Bounding size"), str);
1581 if (stat->layer_count > 0
1582 && stat->error_list->error_text != NULL) {
1585 err_list = err_list->next) {
1587 if (i != err_list->layer - 1)
1590 table_add_row(general_table, err_list->layer,
1591 error_type_string(err_list->type),
1592 err_list->error_text);
1598 GtkWidget *G_report_window = gtk_scrolled_window_new(NULL, NULL);
1599 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(G_report_window),
1600 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1602 struct table *G_table =
1603 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1604 pgettext(
"table",
"Count"), G_TYPE_UINT,
1605 _(
"Note"), G_TYPE_STRING);
1606 table_set_column_align(G_table, 0, 1.0);
1607 table_set_column_align(G_table, 1, 1.0);
1608 gtk_tree_view_set_headers_clickable(
1609 GTK_TREE_VIEW(G_table->widget), TRUE);
1624 table_add_row(G_table,
"", stat->G_machine_only, _(
"machine-only G-codes (ignored)"));
1625 table_add_row(G_table,
"", stat->G_unknown, _(
"unknown G-codes"));
1627 table_set_sortable(G_table);
1628 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
1631 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
1632 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
1633 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1635 struct table *M_table =
1636 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1637 pgettext(
"table",
"Count"), G_TYPE_UINT,
1638 _(
"Note"), G_TYPE_STRING);
1639 table_set_column_align(M_table, 0, 1.0);
1640 table_set_column_align(M_table, 1, 1.0);
1641 gtk_tree_view_set_headers_clickable(
1642 GTK_TREE_VIEW(M_table->widget), TRUE);
1660 table_add_row(M_table,
"", stat->M_machine_only, _(
"machine-only M-codes (ignored)"));
1661 table_add_row(M_table,
"", stat->M_unknown, _(
"unknown M-codes"));
1663 table_set_sortable(M_table);
1664 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
1667 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
1668 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
1669 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1671 struct table *misc_table =
1672 table_new_with_columns(2,
1674 pgettext(
"table",
"Count"), G_TYPE_STRING,
1675 _(
"Code"), G_TYPE_STRING);
1676 table_set_column_align(misc_table, 0, 1.0);
1677 str = g_strdup_printf(
"%d", stat->comment);
1678 table_add_row(misc_table, str,_(
"Comments"));
1680 str = g_strdup_printf(
"%d", stat->unknown);
1681 table_add_row(misc_table, str, _(
"Unknown codes"));
1683 str = g_strdup_printf(
"%d", stat->R);
1684 table_add_row(misc_table, str, _(
"Repeat hole (R)"));
1686 if (stat->detect != NULL ) {
1687 table_add_row(misc_table,
"", stat->detect);
1690 table_set_sortable(misc_table);
1691 gtk_container_add(GTK_CONTAINER(misc_report_window),
1692 misc_table->widget);
1695 GtkWidget *drill_usage_report_window =
1696 gtk_scrolled_window_new(NULL, NULL);
1697 gtk_scrolled_window_set_policy(
1698 GTK_SCROLLED_WINDOW(drill_usage_report_window),
1699 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1701 struct table *drill_usage_table = table_new_with_columns(4,
1702 _(
"Drill no."), G_TYPE_UINT,
1703 _(
"Dia."), G_TYPE_DOUBLE,
1704 _(
"Units"), G_TYPE_STRING,
1705 pgettext(
"table",
"Count"), G_TYPE_UINT);
1707 table_set_column_align(drill_usage_table, 0, 1.0);
1708 table_set_column_align(drill_usage_table, 3, 1.0);
1709 gtk_tree_view_set_headers_clickable(
1710 GTK_TREE_VIEW(drill_usage_table->widget), TRUE);
1718 table_add_row(drill_usage_table,
1725 table_set_sortable(drill_usage_table);
1726 gtk_container_add(GTK_CONTAINER(drill_usage_report_window),
1727 drill_usage_table->widget);
1730 GtkWidget *analyze_active_drill;
1731 analyze_active_drill = gtk_dialog_new_with_buttons(
1732 _(
"Drill codes report on visible layers"),
1733 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1734 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1735 gtk_container_set_border_width (GTK_CONTAINER (analyze_active_drill), 5);
1737 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_drill),
1738 GTK_RESPONSE_ACCEPT);
1739 g_signal_connect_after (G_OBJECT(analyze_active_drill),
1741 G_CALLBACK (gtk_widget_destroy),
1742 GTK_WIDGET(analyze_active_drill));
1745 GtkWidget *general_report_window =
1746 gtk_scrolled_window_new(NULL, NULL);
1747 gtk_scrolled_window_set_policy(
1748 GTK_SCROLLED_WINDOW(general_report_window),
1749 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1751 GtkWidget *vbox = gtk_vbox_new(0, 0);
1752 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1753 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1754 gtk_scrolled_window_add_with_viewport(
1755 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1758 GtkWidget *notebook = gtk_notebook_new();
1760 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1761 GTK_WIDGET(general_report_window),
1762 gtk_label_new(_(
"General")));
1764 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1765 GTK_WIDGET(G_report_window),
1766 gtk_label_new(_(
"G codes")));
1768 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1769 GTK_WIDGET(M_report_window),
1770 gtk_label_new(_(
"M codes")));
1772 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1773 GTK_WIDGET(misc_report_window),
1774 gtk_label_new(_(
"Misc. codes")));
1776 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1777 GTK_WIDGET(drill_usage_report_window),
1778 gtk_label_new(_(
"Drill usage")));
1781 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(analyze_active_drill)->vbox),
1782 GTK_WIDGET(notebook));
1784 if (screen.settings) {
1785 analyze_window_size_restore(analyze_active_drill);
1786 g_signal_connect (G_OBJECT(analyze_active_drill),
"response",
1787 G_CALLBACK (analyze_window_size_store),
1788 GTK_WIDGET(analyze_active_drill));
1790 gtk_window_set_default_size(GTK_WINDOW(analyze_active_drill),
1794 gtk_widget_show_all(analyze_active_drill);
1801 callbacks_control_gerber_options_activate (GtkMenuItem *menuitem,
1809 callbacks_online_manual_activate (GtkMenuItem *menuitem,
1826 gboolean layers_dirty = FALSE;
1836 _(
"Do you want to close all open layers and quit the program?"),
1837 _(
"Quitting the program will cause any unsaved changes "
1839 FALSE, NULL, GTK_STOCK_QUIT, GTK_STOCK_CANCEL)) {
1845 if (screen.settings && !screen.background_is_from_project) {
1849 clr = bg->red/257<<16 | bg->green/257<<8 | bg->blue/257;
1850 g_settings_set_uint (screen.settings,
"background-color", clr);
1854 if (screen.settings) {
1855 GtkWindow *win = GTK_WINDOW(screen.win.topLevelWindow);
1860 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED & gdk_window_get_state (
1861 gtk_widget_get_window (GTK_WIDGET(win))));
1862 g_settings_set_boolean (screen.settings,
"window-maximized", is_max);
1865 gtk_window_get_size (win, (gint *)xy, (gint *)(xy+1));
1866 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1868 g_settings_set_value (screen.settings,
"window-size", var);
1870 gtk_window_get_position (win, (gint *)xy, (gint *)(xy+1));
1871 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1873 g_settings_set_value (screen.settings,
"window-position", var);
1893 GtkWidget *aboutdialog1;
1895 gchar *translators = _(
"translator-credits");
1897 gchar *
string = g_strdup_printf(_(
1898 "Gerbv — a Gerber (RS-274/X) viewer\n"
1901 "Compiled on %s at %s\n"
1903 "Gerbv was originally developed as part of the gEDA Project "
1904 "but is now separately maintained.\n"
1906 "For more information see:\n"
1907 " gerbv homepage: https://gerbv.github.io/\n"
1908 " gerbv repository: https://github.com/gerbv/gerbv"),
1909 VERSION, __DATE__, __TIME__);
1911 #if GTK_CHECK_VERSION(2,6,0)
1912 gchar *license = g_strdup_printf(_(
1913 "Gerbv — a Gerber (RS-274/X) viewer\n"
1915 "Copyright (C) 2000—2007 Stefan Petersen\n"
1917 "This program is free software: you can redistribute it and/or modify\n"
1918 "it under the terms of the GNU General Public License as published by\n"
1919 "the Free Software Foundation, either version 2 of the License, or\n"
1920 "(at your option) any later version.\n"
1922 "This program is distributed in the hope that it will be useful,\n"
1923 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1924 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1925 "GNU General Public License for more details.\n\n"
1926 "You should have received a copy of the GNU General Public License\n"
1927 "along with this program. If not, see <http://www.gnu.org/licenses/>."));
1929 #include "authors.c"
1934 aboutdialog1 = gtk_about_dialog_new ();
1935 gtk_container_set_border_width (GTK_CONTAINER (aboutdialog1), 5);
1936 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (aboutdialog1), VERSION);
1937 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (aboutdialog1), _(
"Gerbv"));
1939 gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (aboutdialog1), translators);
1940 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (aboutdialog1),
string);
1941 gtk_about_dialog_set_license(GTK_ABOUT_DIALOG (aboutdialog1), license);
1944 a_size =
sizeof(authors_string_array)/
sizeof(authors_string_array[0]);
1945 a = g_new(gchar *, a_size);
1946 for (i = 0; i < a_size; i++)
1947 a[i] = _(authors_string_array[i]);
1949 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG (aboutdialog1), (
const gchar **)a);
1950 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG (aboutdialog1),
"https://gerbv.github.io/");
1953 g_signal_connect (G_OBJECT(aboutdialog1),
"response",
1954 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(aboutdialog1));
1959 aboutdialog1 = gtk_message_dialog_new ( GTK_WINDOW (screen.win.topLevelWindow),
1960 GTK_DIALOG_DESTROY_WITH_PARENT,
1966 gtk_window_set_title ( GTK_WINDOW (aboutdialog1), _(
"About Gerbv"));
1969 g_signal_connect_swapped (aboutdialog1,
"response",
1970 G_CALLBACK (gtk_widget_destroy),
1975 gtk_widget_show_all(GTK_WIDGET(aboutdialog1));
1993 GtkWidget *bugs_dialog = gtk_dialog_new_with_buttons(_(
"Known bugs in Gerbv"),
1995 GTK_DIALOG_DESTROY_WITH_PARENT,
1996 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1998 gtk_container_set_border_width (GTK_CONTAINER (bugs_dialog), 5);
1999 gtk_dialog_set_default_response (GTK_DIALOG(bugs_dialog),
2000 GTK_RESPONSE_ACCEPT);
2001 g_signal_connect (G_OBJECT(bugs_dialog),
"response",
2002 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(bugs_dialog));
2005 GString *bugs_string = g_string_new(NULL);
2006 for (i=0; bugs_string_array[i] != NULL; i++) {
2008 g_string_append_printf(bugs_string,
"%s\n",
2009 (bugs_string_array[i][0] ==
'\0') ?
"" : _(bugs_string_array[i]));
2013 GtkWidget *bugs_label = gtk_label_new (bugs_string->str);
2014 g_string_free(bugs_string, TRUE);
2015 gtk_misc_set_alignment(GTK_MISC(bugs_label), 0, 0);
2016 gtk_misc_set_padding(GTK_MISC(bugs_label), 7, 7);
2019 GtkWidget *bugs_window = gtk_scrolled_window_new (NULL, NULL);
2020 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bugs_window),
2021 GTK_WIDGET(bugs_label));
2022 gtk_widget_set_size_request(bugs_window, 600, 300);
2023 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(bugs_dialog)->vbox),
2024 GTK_WIDGET(bugs_window));
2026 gtk_widget_show_all(GTK_WIDGET(bugs_dialog));
2027 gtk_dialog_run(GTK_DIALOG(bugs_dialog));
2032 gdouble callbacks_calculate_actual_distance (gdouble inputDimension) {
2033 return screen_units(inputDimension);
2037 void callbacks_update_ruler_pointers (
void) {
2038 double xPosition, yPosition;
2042 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2043 xPosition = callbacks_calculate_actual_distance (xPosition);
2044 yPosition = callbacks_calculate_actual_distance (yPosition);
2046 g_object_set (G_OBJECT (screen.win.hRuler),
"position", xPosition, NULL);
2047 g_object_set (G_OBJECT (screen.win.vRuler),
"position", yPosition, NULL);
2052 callbacks_render_type_changed () {
2053 static gboolean isChanging = FALSE;
2059 GtkCheckMenuItem *check_item = screen.win.menu_view_render_group[type];
2060 DPRINTF(
"%s(): type = %d, check_item = %p\n", __FUNCTION__, type, check_item);
2061 gtk_check_menu_item_set_active (check_item, TRUE);
2062 gtk_combo_box_set_active (screen.win.sidepaneRenderComboBox, type);
2064 render_refresh_rendered_image_on_screen();
2070 callbacks_units_changed (gerbv_gui_unit_t unit)
2072 static gboolean isChanging = FALSE;
2080 if (unit == GERBV_MILS || unit == GERBV_MMS || unit == GERBV_INS) {
2081 gtk_combo_box_set_active (
2082 GTK_COMBO_BOX (screen.win.statusUnitComboBox),
2084 gtk_check_menu_item_set_active (
2085 screen.win.menu_view_unit_group[unit], TRUE);
2088 callbacks_update_ruler_scales ();
2089 callbacks_update_statusbar_coordinates (screen.last_x, screen.last_y);
2091 if (screen.tool == MEASURE)
2092 callbacks_update_statusbar_measured_distance (
2093 screen.measure_last_x,
2094 screen.measure_last_y);
2101 callbacks_update_ruler_scales (
void) {
2102 double xStart, xEnd, yStart, yEnd;
2111 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2112 xStart = callbacks_calculate_actual_distance (xStart);
2113 xEnd = callbacks_calculate_actual_distance (xEnd);
2114 yStart = callbacks_calculate_actual_distance (yStart);
2115 yEnd = callbacks_calculate_actual_distance (yEnd);
2119 if (screen.win.hRuler)
2120 gtk_ruler_set_range (GTK_RULER (screen.win.hRuler), xStart, xEnd, 0, xEnd - xStart);
2122 if (screen.win.vRuler)
2123 gtk_ruler_set_range (GTK_RULER (screen.win.vRuler), yEnd, yStart, 0, yEnd - yStart);
2127 void callbacks_update_scrollbar_limits (
void){
2133 GtkAdjustment *hAdjust = (GtkAdjustment *)screen.win.hAdjustment;
2134 GtkAdjustment *vAdjust = (GtkAdjustment *)screen.win.vAdjustment;
2137 hAdjust->page_increment = hAdjust->page_size;
2138 hAdjust->step_increment = hAdjust->page_size / 10.0;
2140 vAdjust->page_increment = vAdjust->page_size;
2141 vAdjust->step_increment = vAdjust->page_size / 10.0;
2146 callbacks_update_scrollbar_positions ();
2150 void callbacks_update_scrollbar_positions (
void){
2151 gdouble positionX,positionY;
2154 if (positionX < ((GtkAdjustment *)screen.win.hAdjustment)->lower)
2155 positionX = ((GtkAdjustment *)screen.win.hAdjustment)->lower;
2156 if (positionX > (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size))
2157 positionX = (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size);
2158 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.hAdjustment, positionX);
2160 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->upper - screenRenderInfo.
lowerLeftY -
2161 ((GtkAdjustment *)screen.win.vAdjustment)->page_size +
2162 ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2163 if (positionY < ((GtkAdjustment *)screen.win.vAdjustment)->lower)
2164 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2165 if (positionY > (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size))
2166 positionY = (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size);
2167 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.vAdjustment, positionY);
2172 callbacks_scrollbar_button_released (GtkWidget *widget, GdkEventButton *event){
2175 screen.state = NORMAL;
2176 render_refresh_rendered_image_on_screen();
2182 callbacks_scrollbar_button_pressed (GtkWidget *widget, GdkEventButton *event){
2184 screen.state = SCROLLBAR;
2189 void callbacks_hadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2192 if (screen.state == SCROLLBAR) {
2193 screenRenderInfo.
lowerLeftX = gtk_adjustment_get_value (adjustment);
2198 void callbacks_vadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2201 if (screen.state == SCROLLBAR) {
2202 screenRenderInfo.
lowerLeftY = adjustment->upper -
2203 (gtk_adjustment_get_value (adjustment) + adjustment->page_size) + adjustment->lower;
2209 callbacks_layer_tree_visibility_toggled (gint index)
2214 callbacks_update_layer_tree ();
2216 render_refresh_rendered_image_on_screen ();
2218 render_recreate_composite_surface ();
2219 callbacks_force_expose_event_for_screen ();
2225 callbacks_get_col_num_from_tree_view_col (GtkTreeViewColumn *col)
2230 g_return_val_if_fail ( col != NULL, -1 );
2231 g_return_val_if_fail ( col->tree_view != NULL, -1 );
2232 cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view));
2233 num = g_list_index(cols, (gpointer) col);
2240 callbacks_add_layer_button_clicked (GtkButton *button, gpointer user_data)
2247 callbacks_unselect_all_tool_buttons (
void) {
2252 callbacks_switch_to_normal_tool_cursor (gint toolNumber)
2254 GdkWindow *drawing_area_window = screen.drawing_area->window;
2257 switch (toolNumber) {
2259 gdk_window_set_cursor(drawing_area_window, GERBV_DEF_CURSOR);
2262 cursor = gdk_cursor_new(GDK_FLEUR);
2263 gdk_window_set_cursor(drawing_area_window, cursor);
2264 gdk_cursor_destroy(cursor);
2267 cursor = gdk_cursor_new(GDK_SIZING);
2268 gdk_window_set_cursor(drawing_area_window, cursor);
2269 gdk_cursor_destroy(cursor);
2272 cursor = gdk_cursor_new(GDK_CROSSHAIR);
2273 gdk_window_set_cursor(drawing_area_window, cursor);
2274 gdk_cursor_destroy(cursor);
2283 callbacks_switch_to_correct_cursor (
void)
2285 GdkWindow *drawing_area_window = screen.drawing_area->window;
2288 if (screen.state == IN_MOVE) {
2289 cursor = gdk_cursor_new(GDK_FLEUR);
2290 gdk_window_set_cursor(drawing_area_window, cursor);
2291 gdk_cursor_destroy(cursor);
2294 else if (screen.state == IN_ZOOM_OUTLINE) {
2295 cursor = gdk_cursor_new(GDK_SIZING);
2296 gdk_window_set_cursor(drawing_area_window, cursor);
2297 gdk_cursor_destroy(cursor);
2300 callbacks_switch_to_normal_tool_cursor (screen.tool);
2305 callbacks_change_tool (GtkButton *button, gpointer user_data) {
2306 gint toolNumber = GPOINTER_TO_INT (user_data);
2309 if (screen.win.updatingTools)
2311 screen.win.updatingTools = TRUE;
2312 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), FALSE);
2313 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), FALSE);
2314 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), FALSE);
2315 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), FALSE);
2316 switch (toolNumber) {
2318 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), TRUE);
2319 screen.tool = POINTER;
2320 screen.state = NORMAL;
2321 utf8_strncpy(screen.statusbar.diststr,
2322 _(
"Click to select objects in the active layer. "
2323 "Middle click and drag to pan."),
2327 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), TRUE);
2329 screen.state = NORMAL;
2330 utf8_strncpy(screen.statusbar.diststr,
2331 _(
"Click and drag to pan. Right click and drag to zoom."),
2335 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), TRUE);
2337 screen.state = NORMAL;
2338 utf8_strncpy(screen.statusbar.diststr,
2339 _(
"Click and drag to zoom in. Shift+click to zoom out."),
2344 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), TRUE);
2345 screen.tool = MEASURE;
2346 screen.state = NORMAL;
2347 utf8_strncpy(screen.statusbar.diststr,
2348 _(
"Click and drag to measure a distance or select two apertures."),
2352 screen.measure_start_x = 0;
2353 screen.measure_start_y = 0;
2354 screen.measure_stop_x = 0;
2355 screen.measure_stop_y = 0;
2358 if (selection_length (&screen.selectionInfo) == 2) {
2359 gerbv_selection_item_t item[2];
2362 item[0] = selection_get_item_by_index(
2363 &screen.selectionInfo, 0);
2364 item[1] = selection_get_item_by_index(
2365 &screen.selectionInfo, 1);
2366 net[0] = item[0].net;
2367 net[1] = item[1].net;
2369 if ((net[0]->aperture_state ==
2370 net[1]->aperture_state)
2371 && (net[0]->aperture_state ==
2373 screen.measure_start_x = net[0]->
stop_x;
2374 screen.measure_start_y = net[0]->
stop_y;
2376 &screen.measure_start_x,
2377 &screen.measure_start_y,
2381 screen.measure_stop_x = net[1]->
stop_x;
2382 screen.measure_stop_y = net[1]->
stop_y;
2384 &screen.measure_stop_x,
2385 &screen.measure_stop_y,
2397 callbacks_switch_to_normal_tool_cursor (toolNumber);
2399 screen.win.updatingTools = FALSE;
2400 callbacks_force_expose_event_for_screen();
2405 callbacks_select_layer_row (gint rowIndex)
2407 GtkTreeSelection *selection;
2409 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2410 ((GtkTreeView *) screen.win.layerTree);
2412 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2414 if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store),
2415 &iter, NULL, rowIndex)) {
2416 gtk_tree_selection_select_iter (selection, &iter);
2429 GtkTreeSelection *selection;
2431 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2432 ((GtkTreeView *) screen.win.layerTree);
2436 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2437 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
2438 while (gtk_tree_model_iter_nth_child ((GtkTreeModel *)list_store,
2440 if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
2451 callbacks_remove_layer_button_clicked (GtkButton *button, gpointer user_data)
2455 if ((index >= 0) && (index <= mainProject->last_loaded)) {
2456 render_remove_selected_objects_belonging_to_layer (
2457 &screen.selectionInfo,
2459 update_selected_object_message (FALSE);
2462 callbacks_update_layer_tree ();
2464 index = MAX(0, index - 1);
2465 callbacks_select_layer_row (index);
2468 render_refresh_rendered_image_on_screen ();
2470 render_recreate_composite_surface ();
2471 callbacks_force_expose_event_for_screen ();
2478 callbacks_move_layer_down_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2479 callbacks_move_layer_down_button_clicked(NULL, NULL);
2480 gtk_widget_grab_focus (screen.win.layerTree);
2485 callbacks_move_layer_down_button_clicked (GtkButton *button, gpointer user_data) {
2488 show_no_layers_warning ();
2492 if (index < mainProject->last_loaded) {
2493 gerbv_change_layer_order (
mainProject, index, index + 1);
2494 callbacks_update_layer_tree ();
2495 callbacks_select_layer_row (index + 1);
2498 render_refresh_rendered_image_on_screen ();
2501 render_recreate_composite_surface ();
2502 callbacks_force_expose_event_for_screen ();
2509 callbacks_move_layer_up_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2510 callbacks_move_layer_up_button_clicked (NULL, NULL);
2511 gtk_widget_grab_focus (screen.win.layerTree);
2516 callbacks_move_layer_up_button_clicked (GtkButton *button, gpointer user_data) {
2519 show_no_layers_warning ();
2523 gerbv_change_layer_order (
mainProject, index, index - 1);
2524 callbacks_update_layer_tree ();
2525 callbacks_select_layer_row (index - 1);
2527 render_refresh_rendered_image_on_screen();
2530 render_recreate_composite_surface ();
2531 callbacks_force_expose_event_for_screen ();
2537 void callbacks_layer_tree_row_inserted (GtkTreeModel *tree_model, GtkTreePath *path,
2538 GtkTreeIter *oIter, gpointer user_data) {
2539 gint *indices=NULL,oldPosition,newPosition;
2541 if ((!screen.win.treeIsUpdating)&&(path != NULL)) {
2542 indices = gtk_tree_path_get_indices (path);
2544 newPosition = indices[0];
2548 if (oldPosition < newPosition)
2552 gerbv_change_layer_order (
mainProject, oldPosition, newPosition);
2555 render_refresh_rendered_image_on_screen();
2558 render_recreate_composite_surface ();
2559 callbacks_force_expose_event_for_screen ();
2562 GtkTreeSelection *selection;
2564 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2565 ((GtkTreeView *) screen.win.layerTree);
2567 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
2568 if (gtk_tree_model_get_iter ((GtkTreeModel *)list_store, &iter, path))
2569 gtk_tree_selection_select_iter (selection, &iter);
2576 callbacks_show_color_picker_dialog (gint index){
2577 screen.win.colorSelectionDialog = NULL;
2578 GtkColorSelectionDialog *cs= (GtkColorSelectionDialog *) gtk_color_selection_dialog_new (_(
"Select a color"));
2579 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2581 screen.win.colorSelectionDialog = (GtkWidget *) cs;
2582 screen.win.colorSelectionIndex = index;
2588 gtk_color_selection_set_has_opacity_control (colorsel, TRUE);
2591 gtk_widget_show_all((GtkWidget *)cs);
2592 if (gtk_dialog_run ((GtkDialog*)cs) == GTK_RESPONSE_OK) {
2593 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2594 gint rowIndex = screen.win.colorSelectionIndex;
2598 gdk_colormap_alloc_color(gdk_colormap_get_system(), &
mainProject->
file[rowIndex]->
color, FALSE, TRUE);
2608 callbacks_update_layer_tree ();
2609 render_refresh_rendered_image_on_screen();
2611 gtk_widget_destroy ((GtkWidget *)cs);
2612 screen.win.colorSelectionDialog = NULL;
2617 callbacks_invert_layer_clicked (GtkButton *button, gpointer user_data) {
2620 show_no_layers_warning ();
2624 render_refresh_rendered_image_on_screen ();
2625 callbacks_update_layer_tree ();
2630 callbacks_change_layer_color_clicked (GtkButton *button, gpointer user_data) {
2633 show_no_layers_warning ();
2636 callbacks_show_color_picker_dialog (index);
2640 callbacks_change_background_color_clicked (GtkButton *button, gpointer user_data) {
2641 callbacks_show_color_picker_dialog (-1);
2646 callbacks_reload_layer_clicked (GtkButton *button, gpointer user_data)
2651 show_no_layers_warning ();
2655 render_remove_selected_objects_belonging_to_layer (
2657 update_selected_object_message (FALSE);
2660 render_refresh_rendered_image_on_screen ();
2661 callbacks_update_layer_tree();
2665 callbacks_change_layer_edit_clicked (GtkButton *button, gpointer userData)
2673 show_no_layers_warning ();
2689 if (files[i] && files[i]->isVisible)
2694 transforms[j] = NULL;
2696 interface_show_layer_edit_dialog(transforms, screen.unit);
2697 g_free (transforms);
2698 render_refresh_rendered_image_on_screen ();
2699 callbacks_update_layer_tree ();
2704 callbacks_change_layer_format_clicked (GtkButton *button, gpointer user_data)
2706 gerbv_HID_Attribute *attr = NULL;
2709 gerbv_HID_Attr_Val * results = NULL;
2714 show_no_layers_warning ();
2717 DPRINTF(
"%s(): index = %d\n", __FUNCTION__, index);
2722 type = N_(
"Unknown type");
2724 if (attr == NULL || n == 0)
2727 _(
"Format editing is currently only supported for Excellon drill file formats."),
2733 DPRINTF(
"%s(): n = %d, attr = %p\n", __FUNCTION__, n, attr);
2738 _(
"This layer has changed!"),
2739 _(
"Editing the file type will reload the layer, "
2740 "destroying your changes. Click OK to edit "
2741 "the file type and destroy your changes, "
2742 "or Cancel to leave."),
2743 TRUE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL);
2744 if (rc == 0)
return;
2747 results = (gerbv_HID_Attr_Val *) malloc (n *
sizeof (gerbv_HID_Attr_Val));
2748 if (results == NULL)
2749 GERB_FATAL_ERROR(
"%s(): malloc failed", __FUNCTION__);
2752 if (attribute_interface_dialog (attr, n, results,
2753 _(
"Edit file format"),
2761 DPRINTF(
"%s(): reloading layer\n", __func__);
2764 for (i = 0; i < n; i++)
2766 if (results[i].str_value)
2767 free (results[i].str_value);
2772 render_refresh_rendered_image_on_screen();
2773 callbacks_update_layer_tree();
2778 callbacks_file_drop_event(GtkWidget *widget, GdkDragContext *dc,
2779 gint x, gint y, GtkSelectionData *data,
2780 guint info, guint time, gpointer p)
2782 gchar **uris, **uri;
2785 uris = gtk_selection_data_get_uris(data);
2789 for (uri = uris; *uri; uri++) {
2790 const char *prefix_str =
2796 if (g_strrstr(*uri, prefix_str) == *uri)
2797 fns = g_slist_append(fns, g_uri_unescape_string(
2798 *uri + strlen(prefix_str), NULL));
2802 g_slist_free_full(fns, g_free);
2810 callbacks_layer_tree_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
2814 if(event->keyval == GDK_space){
2817 GtkTreeViewColumn *col;
2821 tree = (GtkTreeView *) screen.win.layerTree;
2822 gtk_tree_view_get_cursor (tree, &path, &col);
2824 indices = gtk_tree_path_get_indices (path);
2826 idx = callbacks_get_col_num_from_tree_view_col (col);
2828 callbacks_show_color_picker_dialog (indices[0]);
2831 gtk_tree_path_free (path);
2840 callbacks_layer_tree_button_press (GtkWidget *widget, GdkEventButton *event,
2845 GtkTreeViewColumn *col;
2849 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model (
2850 (GtkTreeView *) screen.win.layerTree);
2852 if (event->button == 1) {
2853 if (gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget,
2854 event->x, event->y, &path, &col, &x, &y)
2855 && gtk_tree_model_get_iter ((GtkTreeModel *)list_store,
2857 indices = gtk_tree_path_get_indices (path);
2859 switch (callbacks_get_col_num_from_tree_view_col (col)) {
2861 callbacks_select_layer_row (indices[0]);
2862 callbacks_layer_tree_visibility_toggled (indices[0]);
2865 callbacks_show_color_picker_dialog (indices[0]);
2875 gtk_menu_popup (GTK_MENU (screen.win.layerTreePopupMenu),
2876 NULL, NULL, NULL, NULL,
2877 event->button, event->time);
2886 callbacks_update_layer_tree (
void)
2888 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2889 ((GtkTreeView *) screen.win.layerTree);
2892 GtkTreeSelection *selection;
2893 gint oldSelectedRow;
2895 if (screen.win.treeIsUpdating)
2898 screen.win.treeIsUpdating = TRUE;
2901 if (oldSelectedRow < 0)
2904 gtk_list_store_clear (list_store);
2907 GdkPixbuf *pixbuf, *blackPixbuf;
2908 unsigned char red, green, blue, alpha;
2917 red = (
unsigned char) (file->
color.red * 255 / G_MAXUINT16);
2918 green = (
unsigned char) (file->
color.green * 255 / G_MAXUINT16);
2919 blue = (
unsigned char) (file->
color.blue *255 / G_MAXUINT16);
2920 alpha = (
unsigned char) (file->
alpha * 255 / G_MAXUINT16);
2922 color = red*(256*256*256) + green*(256*256) + blue*256 + alpha;
2923 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2924 gdk_pixbuf_fill (pixbuf, color);
2926 blackPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2927 color = 100*(256*256*256) + 100*(256*256) + 100*256 + 150;
2928 gdk_pixbuf_fill (blackPixbuf, color);
2931 gdk_pixbuf_copy_area (pixbuf, 1, 1, 18, 13, blackPixbuf, 1, 1);
2932 g_object_unref(pixbuf);
2934 gtk_list_store_append (list_store, &iter);
2936 gchar startChar[2],*modifiedCode;
2940 gint numberOfModifications = 0;
2943 numberOfModifications++;
2948 numberOfModifications++;
2951 > GERBV_PRECISION_LINEAR_INCH
2953 > GERBV_PRECISION_LINEAR_INCH) {
2955 numberOfModifications++;
2958 > GERBV_PRECISION_LINEAR_INCH
2960 > GERBV_PRECISION_LINEAR_INCH) {
2962 numberOfModifications++;
2965 > GERBV_PRECISION_ANGLE_RAD) {
2967 numberOfModifications++;
2969 if (numberOfModifications > 1)
2971 if (numberOfModifications == 0)
2972 modifiedCode = g_strdup (
"");
2974 modifiedCode = g_strdup (startChar);
2981 layerName = g_strconcat (
"*",
"<i>", file->
name,
2985 layerName = g_strdup (file->
name);
2988 gtk_list_store_set (list_store, &iter,
2995 g_free (modifiedCode);
2997 g_object_unref(blackPixbuf);
3000 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
3005 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
3006 if (gtk_tree_model_iter_nth_child ((GtkTreeModel *) list_store,
3007 &iter, NULL, oldSelectedRow)) {
3008 gtk_tree_selection_select_iter (selection, &iter);
3012 gtk_widget_set_sensitive (screen.win.curLayerMenuItem, showItems);
3013 gtk_widget_set_sensitive (screen.win.curAnalyzeMenuItem, showItems);
3014 gtk_widget_set_sensitive (screen.win.curEditMenuItem, showItems);
3015 for (
unsigned int i = 0;
3016 i < G_N_ELEMENTS(screen.win.curFileMenuItem); i++) {
3017 gtk_widget_set_sensitive (screen.win.curFileMenuItem[i], showItems);
3019 screen.win.treeIsUpdating = FALSE;
3024 callbacks_display_object_properties_clicked (GtkButton *button, gpointer user_data)
3029 if (index < 0 || selection_length (&screen.selectionInfo) == 0) {
3031 _(
"Objects must be selected using the pointer tool "
3032 "before you can view the object properties."),
3037 for (i = 0; i < selection_length (&screen.selectionInfo); i++){
3038 gerbv_selection_item_t sItem =
3039 selection_get_item_by_index (&screen.selectionInfo, i);
3049 g_message (_(
"Object type: Polygon"));
3070 g_message (
"---------------------------------------");
3077 GdkPixmap *renderedPixmap = gdk_pixmap_new (NULL, renderInfo->
displayWidth,
3084 while( now - 30 < start) {
3086 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3087 gerbv_render_to_pixmap_using_gdk (
mainProject, renderedPixmap, renderInfo, NULL, NULL);
3089 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3091 g_message(_(
"FAST (=GDK) mode benchmark: %d redraws "
3092 "in %ld seconds (%g redraws/second)"),
3093 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3094 gdk_pixmap_unref(renderedPixmap);
3101 while( now - 30 < start) {
3103 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3104 cairo_surface_t *cSurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
3106 cairo_t *cairoTarget = cairo_create (cSurface);
3107 gerbv_render_all_layers_to_cairo_target (
mainProject, cairoTarget, renderInfo);
3108 cairo_destroy (cairoTarget);
3109 cairo_surface_destroy (cSurface);
3111 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3113 g_message(_(
"NORMAL (=Cairo) mode benchmark: %d redraws "
3114 "in %ld seconds (%g redraws/second)"),
3115 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3120 callbacks_benchmark_clicked (GtkButton *button, gpointer user_data)
3127 _(
"Application will be unresponsive for 1 minute! "
3128 "Run performance benchmark?"),
3129 FALSE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL))
3132 GERB_COMPILE_WARNING(_(
"Running full zoom benchmark..."));
3133 while (g_main_context_iteration(NULL, FALSE)) {}
3138 callbacks_support_benchmark (&renderInfo);
3140 GERB_COMPILE_WARNING(_(
"Running x5 zoom benchmark..."));
3141 while (g_main_context_iteration(NULL, FALSE)) {}
3149 callbacks_support_benchmark (&renderInfo);
3154 callbacks_edit_object_properties_clicked (GtkButton *button, gpointer user_data){
3158 callbacks_live_edit (GtkWidget *button, gpointer user_data){
3159 GtkDialog *toplevel = GTK_DIALOG(gtk_widget_get_toplevel (button));
3160 gtk_dialog_response(toplevel, GTK_RESPONSE_APPLY);
3164 callbacks_move_objects_clicked (GtkButton *button, gpointer user_data){
3166 gerbv_image_move_selected_objects (screen.selectionInfo.selectedNodeArray, -0.050, 0.050);
3167 callbacks_update_layer_tree();
3168 selection_clear (&screen.selectionInfo);
3169 update_selected_object_message (FALSE);
3170 render_refresh_rendered_image_on_screen ();
3175 callbacks_reduce_object_area_clicked (GtkButton *button, gpointer user_data){
3177 gerbv_image_reduce_area_of_selected_objects (screen.selectionInfo.selectedNodeArray, 0.20, 3, 3, 0.01);
3178 selection_clear (&screen.selectionInfo);
3179 update_selected_object_message (FALSE);
3180 render_refresh_rendered_image_on_screen ();
3185 callbacks_delete_objects_clicked (GtkButton *button, gpointer user_data)
3187 if (selection_length (&screen.selectionInfo) == 0) {
3189 _(
"No object is currently selected"),
3190 _(
"Objects must be selected using the pointer tool "
3191 "before they can be deleted."),
3203 _(
"Do you want to permanently delete "
3204 "the selected objects from <i>visible</i> layers?"),
3205 _(
"Gerbv currently has no undo function, so "
3206 "this action cannot be undone. This action "
3207 "will not change the saved file unless you "
3208 "save the file afterwards."),
3210 GTK_STOCK_DELETE, GTK_STOCK_CANCEL)) {
3216 for (i = 0; i < selection_length (&screen.selectionInfo);) {
3217 gerbv_selection_item_t sel_item =
3218 selection_get_item_by_index (&screen.selectionInfo, i);
3229 selection_clear_item_by_index (&screen.selectionInfo, i);
3232 update_selected_object_message (FALSE);
3234 render_refresh_rendered_image_on_screen ();
3235 callbacks_update_layer_tree();
3240 callbacks_drawingarea_configure_event (GtkWidget *widget, GdkEventConfigure *event)
3242 GdkDrawable *drawable = widget->window;
3248 int x_off=0, y_off=0;
3250 if (GDK_IS_WINDOW(widget->window)) {
3252 GdkWindow *window = GDK_WINDOW(widget->window);
3253 gdk_window_get_internal_paint_info (window, &drawable, &x_off, &y_off);
3255 if (screen.windowSurface)
3256 cairo_surface_destroy ((cairo_surface_t *)
3257 screen.windowSurface);
3259 #if defined(WIN32) || defined(QUARTZ)
3260 cairo_t *cairoTarget = gdk_cairo_create (GDK_WINDOW(widget->window));
3262 screen.windowSurface = cairo_get_target (cairoTarget);
3265 screen.windowSurface = cairo_surface_reference (screen.windowSurface);
3266 cairo_destroy (cairoTarget);
3268 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3269 screen.windowSurface = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3270 GDK_DRAWABLE_XID (drawable),
3271 GDK_VISUAL_XVISUAL (visual),
3280 render_refresh_rendered_image_on_screen();
3286 callbacks_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *event)
3289 GdkPixmap *new_pixmap;
3290 GdkGC *gc = gdk_gc_new(widget->window);
3295 new_pixmap = gdk_pixmap_new(widget->window,
3296 widget->allocation.width,
3297 widget->allocation.height,
3302 gdk_draw_rectangle(new_pixmap, gc, TRUE,
3303 event->area.x, event->area.y,
3304 event->area.width, event->area.height);
3310 if (screen.pixmap != NULL) {
3311 gdk_draw_pixmap(new_pixmap,
3312 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3314 event->area.x - screen.off_x,
3315 event->area.y - screen.off_y,
3316 event->area.x, event->area.y,
3317 event->area.width, event->area.height);
3323 gdk_draw_pixmap(widget->window,
3324 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3326 event->area.x, event->area.y,
3327 event->area.x, event->area.y,
3328 event->area.width, event->area.height);
3330 gdk_pixmap_unref(new_pixmap);
3336 if (screen.state == IN_ZOOM_OUTLINE) {
3337 render_draw_zoom_outline(screen.centered_outline_zoom);
3339 else if (screen.state == IN_MEASURE) {
3342 if (screen.tool == MEASURE && screen.state != IN_MEASURE) {
3351 int x_off=0, y_off=0;
3352 GdkDrawable *drawable = widget->window;
3354 if (GDK_IS_WINDOW(widget->window)) {
3356 GdkWindow *window = GDK_WINDOW(widget->window);
3357 gdk_window_get_internal_paint_info (window,
3358 &drawable, &x_off, &y_off);
3360 gdk_drawable_get_size (drawable, &width, &height);
3362 #if defined(WIN32) || defined(QUARTZ)
3364 cr = gdk_cairo_create (GDK_WINDOW(widget->window));
3366 cairo_surface_t *buffert;
3368 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3369 buffert = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3370 GDK_DRAWABLE_XID (drawable),
3371 GDK_VISUAL_XVISUAL (visual),
3372 event->area.width,
event->area.height);
3373 cr = cairo_create (buffert);
3375 cairo_translate (cr, -event->area.x + screen.off_x, -event->area.y + screen.off_y);
3376 render_project_to_cairo_target (cr);
3378 #if !defined(WIN32) && !defined(QUARTZ)
3379 cairo_surface_destroy (buffert);
3382 if (screen.tool == MEASURE)
3389 callbacks_screen2board(gdouble *X, gdouble *Y, gint x, gint y) {
3403 const char *gerbv_coords_pattern_mils_str = N_(
"%8.2f %8.2f");
3407 callbacks_update_statusbar_coordinates (gint x, gint y)
3411 callbacks_screen2board (&X, &Y, x, y);
3413 switch (screen.unit) {
3415 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3416 _(gerbv_coords_pattern_mils_str),
3417 COORD2MILS (X), COORD2MILS (Y));
3420 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3422 COORD2MMS (X), COORD2MMS (Y));
3425 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3427 COORD2INS (X), COORD2INS (Y));
3434 update_selected_object_message (gboolean userTriedToSelect)
3436 if (screen.tool != POINTER)
3439 gint selectionLength = selection_length (&screen.selectionInfo);
3441 if (selectionLength == 0) {
3442 if (userTriedToSelect) {
3445 gchar *str = g_new(gchar, MAX_DISTLEN);
3447 _(
"No object selected. Objects can "
3448 "only be selected in the active "
3451 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3455 utf8_strncpy(screen.statusbar.diststr,
3456 _(
"Click to select objects in the "
3457 "active layer. Middle click and drag "
3462 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3463 ngettext(
"%d object are currently selected",
3464 "%d objects are currently selected",
3465 selectionLength), selectionLength);
3473 callbacks_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
3476 GdkModifierType state;
3479 gdk_window_get_pointer (event->window, &x, &y, &state);
3483 state =
event->state;
3486 switch (screen.state) {
3488 if (screen.last_x != 0 || screen.last_y != 0) {
3490 screen.off_x += x - screen.last_x;
3491 screen.off_y += y - screen.last_y;
3495 callbacks_force_expose_event_for_screen ();
3496 callbacks_update_scrollbar_positions ();
3501 case IN_ZOOM_OUTLINE: {
3502 if (screen.last_x || screen.last_y)
3503 render_draw_zoom_outline(screen.centered_outline_zoom);
3506 render_draw_zoom_outline(screen.centered_outline_zoom);
3512 callbacks_screen2board(&(screen.measure_stop_x),
3513 &(screen.measure_stop_y), x, y);
3521 case IN_SELECTION_DRAG: {
3522 if (screen.last_x || screen.last_y)
3523 render_draw_selection_box_outline();
3526 render_draw_selection_box_outline();
3534 callbacks_update_statusbar_coordinates (x, y);
3535 callbacks_update_ruler_pointers ();
3541 callbacks_drawingarea_button_press_event (GtkWidget *widget, GdkEventButton *event)
3543 GdkWindow *drawing_area_window = screen.drawing_area->window;
3546 switch (event->button) {
3548 if (screen.tool == POINTER) {
3552 screen.state = IN_SELECTION_DRAG;
3553 screen.start_x =
event->x;
3554 screen.start_y =
event->y;
3556 else if (screen.tool == PAN) {
3558 screen.state = IN_MOVE;
3559 screen.last_x =
event->x;
3560 screen.last_y =
event->y;
3562 else if (screen.tool == ZOOM) {
3563 screen.state = IN_ZOOM_OUTLINE;
3565 screen.start_x =
event->x;
3566 screen.start_y =
event->y;
3567 screen.centered_outline_zoom =
event->state;
3569 else if (screen.tool == MEASURE) {
3570 screen.state = IN_MEASURE;
3571 callbacks_screen2board(&(screen.measure_start_x), &(screen.measure_start_y),
3572 event->x, event->y);
3573 screen.measure_stop_x = screen.measure_start_x;
3574 screen.measure_stop_y = screen.measure_start_y;
3576 callbacks_force_expose_event_for_screen ();
3580 screen.state = IN_MOVE;
3581 screen.last_x =
event->x;
3582 screen.last_y =
event->y;
3583 cursor = gdk_cursor_new(GDK_FLEUR);
3584 gdk_window_set_cursor(drawing_area_window, cursor);
3585 gdk_cursor_destroy(cursor);
3588 if (screen.tool == POINTER) {
3591 if (selection_length (&screen.selectionInfo) == 0) {
3594 (index <= mainProject->last_loaded) &&
3596 render_fill_selection_buffer_from_mouse_click(
3598 index, SELECTION_REPLACE);
3600 selection_clear (&screen.selectionInfo);
3601 update_selected_object_message (FALSE);
3602 render_refresh_rendered_image_on_screen ();
3607 if (selection_length (&screen.selectionInfo) != 0) {
3608 update_selected_object_message (TRUE);
3609 gtk_menu_popup(GTK_MENU(screen.win.drawWindowPopupMenu), NULL, NULL, NULL, NULL,
3610 event->button, event->time);
3615 screen.state = IN_ZOOM_OUTLINE;
3616 screen.start_x =
event->x;
3617 screen.start_y =
event->y;
3618 screen.centered_outline_zoom =
event->state & GDK_SHIFT_MASK;
3619 cursor = gdk_cursor_new(GDK_SIZING);
3620 gdk_window_set_cursor(drawing_area_window, cursor);
3621 gdk_cursor_destroy(cursor);
3625 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3628 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3633 callbacks_switch_to_correct_cursor ();
3641 GtkMenuItem **menu_items = (GtkMenuItem **) screen.win.curEditAlingItem;
3642 gerbv_selection_item_t si[2];
3643 int id[2] = {-1, -1};
3647 if (selection_length (sel_info) == 2) {
3648 si[0] = selection_get_item_by_index(sel_info, 0);
3649 si[1] = selection_get_item_by_index(sel_info, 1);
3652 if (f[i]->image == si[0].image)
3655 if (f[i]->image == si[1].image)
3660 if (
id[0]*
id[1] >= 0 &&
id[0] !=
id[1]) {
3666 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3667 id[0]+1, f[
id[0]]->name,
3668 id[1]+1, f[
id[1]]->name);
3669 gtk_menu_item_set_label (menu_items[0], str);
3672 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3673 id[1]+1, f[
id[1]]->name,
3674 id[0]+1, f[
id[0]]->name);
3675 gtk_menu_item_set_label (menu_items[1], str);
3678 gtk_widget_set_sensitive (
3679 screen.win.curEditAlingMenuItem, TRUE);
3686 gtk_widget_set_sensitive (screen.win.curEditAlingMenuItem, FALSE);
3687 gtk_menu_item_set_label (menu_items[0],
"");
3688 gtk_menu_item_set_label (menu_items[1],
"");
3697 GtkMenuItem *menu_item, gpointer user_data)
3700 gerbv_selection_item_t item[2];
3703 int align_second_to_first = GPOINTER_TO_INT(user_data);
3707 if (selection_length (sel_info) != 2)
3710 item[0] = selection_get_item_by_index(sel_info, 0);
3711 item[1] = selection_get_item_by_index(sel_info, 1);
3716 if (fi[0] == NULL || fi[1] == NULL || fi[0] == fi[1])
3720 for (i = 0; i < 2; i++) {
3739 x[i] = net->
cirseg->cp_x;
3740 y[i] = net->
cirseg->cp_y;
3743 GERB_COMPILE_ERROR (_(
"Can't align by this "
3749 GERB_COMPILE_ERROR (_(
"Can't align by this "
3758 if (align_second_to_first) {
3766 render_refresh_rendered_image_on_screen ();
3767 callbacks_update_layer_tree ();
3776 if (event->type != GDK_BUTTON_RELEASE)
3779 switch (screen.state) {
3783 render_refresh_rendered_image_on_screen ();
3784 callbacks_switch_to_normal_tool_cursor (screen.tool);
3787 case IN_ZOOM_OUTLINE:
3788 if ((event->state & GDK_SHIFT_MASK) != 0) {
3789 render_zoom_display (ZOOM_OUT_CMOUSE, 0,
3790 event->x, event->y);
3795 else if ((fabs(screen.start_x - event->x) < 4.0) &&
3796 (fabs(screen.start_y - event->y) < 4.0)) {
3797 render_zoom_display (ZOOM_IN_CMOUSE, 0,
3798 event->x, event->y);
3802 callbacks_switch_to_normal_tool_cursor (screen.tool);
3805 case IN_SELECTION_DRAG:
3811 enum selection_action sel_action = SELECTION_REPLACE;
3813 if (event->state & GDK_SHIFT_MASK)
3814 sel_action = SELECTION_ADD;
3815 else if (event->state & GDK_CONTROL_MASK)
3816 sel_action = SELECTION_TOGGLE;
3819 if ((fabs((
double)(screen.last_x - screen.start_x)) < 5)
3820 && (fabs((
double)(screen.last_y - screen.start_y)) < 5)) {
3821 render_fill_selection_buffer_from_mouse_click (
3822 event->x, event->y, index,
3825 render_fill_selection_buffer_from_mouse_drag (
3827 screen.start_x, screen.start_y,
3832 update_selected_object_message (TRUE);
3834 check_align_files_possibility (&screen.selectionInfo);
3836 render_refresh_rendered_image_on_screen ();
3843 screen.state = NORMAL;
3850 callbacks_window_key_press_event (GtkWidget *widget, GdkEventKey *event)
3852 switch (event->keyval) {
3854 if (screen.tool == POINTER) {
3855 selection_clear (&screen.selectionInfo);
3856 update_selected_object_message (FALSE);
3861 screen.state = NORMAL;
3862 render_refresh_rendered_image_on_screen();
3874 callbacks_window_key_release_event (GtkWidget *widget, GdkEventKey *event)
3882 callbacks_window_scroll_event(GtkWidget *widget, GdkEventScroll *event)
3884 switch (event->direction) {
3886 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3888 case GDK_SCROLL_DOWN:
3889 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3891 case GDK_SCROLL_LEFT:
3893 case GDK_SCROLL_RIGHT:
3912 if (GTK_IS_LABEL(screen.win.statusMessageLeft)) {
3913 gtk_label_set_text(GTK_LABEL(screen.win.statusMessageLeft), screen.statusbar.coordstr);
3915 if (GTK_IS_LABEL(screen.win.statusMessageRight)) {
3916 gtk_label_set_markup(GTK_LABEL(screen.win.statusMessageRight), screen.statusbar.diststr);
3922 callbacks_update_statusbar_measured_distance (gdouble dx, gdouble dy){
3923 gdouble delta = hypot(dx, dy);
3925 if (screen.unit == GERBV_MILS) {
3926 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3927 _(
"Measured distance: %8.2f mils (%8.2f x, %8.2f y)"),
3928 COORD2MILS(delta), COORD2MILS(dx), COORD2MILS(dy));
3930 else if (screen.unit == GERBV_MMS) {
3931 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3932 _(
"Measured distance: %8.3f mm (%8.3f x, %8.3f y)"),
3933 COORD2MMS(delta), COORD2MMS(dx), COORD2MMS(dy));
3936 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3937 _(
"Measured distance: %4.5f inches (%4.5f x, %4.5f y)"),
3938 COORD2INS(delta), COORD2INS(dx), COORD2INS(dy));
3945 callbacks_sidepane_render_type_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3948 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3950 if (type < 0 || type == screenRenderInfo.
renderType)
3954 callbacks_render_type_changed ();
3959 callbacks_viewmenu_rendertype_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3965 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3968 callbacks_render_type_changed ();
3973 callbacks_viewmenu_units_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3974 gerbv_gui_unit_t unit = GPOINTER_TO_INT(user_data);
3976 if (unit < 0 || unit == screen.unit)
3979 DPRINTF(
"%s(): unit = %d, screen.unit = %d\n", __FUNCTION__, unit, screen.unit);
3981 callbacks_units_changed (unit);
3986 callbacks_statusbar_unit_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3987 gerbv_gui_unit_t unit = gtk_combo_box_get_active (widget);
3988 int force_change = GPOINTER_TO_INT (user_data);
3990 if (!force_change && (unit < 0 || unit == screen.unit))
3993 callbacks_units_changed (unit);
3998 callbacks_clear_messages_button_clicked (GtkButton *button, gpointer user_data) {
3999 GtkTextBuffer *textbuffer;
4000 GtkTextIter start, end;
4002 screen.length_sum = 0;
4004 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
4005 gtk_text_buffer_get_start_iter(textbuffer, &start);
4006 gtk_text_buffer_get_end_iter(textbuffer, &end);
4007 gtk_text_buffer_delete (textbuffer, &start, &end);
4012 callbacks_handle_log_messages(
const gchar *log_domain, GLogLevelFlags log_level,
4013 const gchar *message, gpointer user_data)
4015 GtkTextBuffer *textbuffer = NULL;
4018 GtkTextMark *StartMark = NULL, *StopMark = NULL;
4019 GtkTextIter StartIter, StopIter;
4020 GtkWidget *dialog, *label;
4022 if (!screen.win.messageTextView)
4025 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
4028 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4032 StartMark = gtk_text_buffer_create_mark(textbuffer,
4033 "NewTextStart", &iter, TRUE);
4035 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4039 tag = gtk_text_buffer_create_tag(textbuffer,
"black_foreground",
4040 "foreground",
"black", NULL);
4041 tag = gtk_text_buffer_create_tag(textbuffer,
"blue_foreground",
4042 "foreground",
"blue", NULL);
4043 tag = gtk_text_buffer_create_tag(textbuffer,
"red_foreground",
4044 "foreground",
"red", NULL);
4045 tag = gtk_text_buffer_create_tag(textbuffer,
"darkred_foreground",
4046 "foreground",
"darkred", NULL);
4047 tag = gtk_text_buffer_create_tag(textbuffer,
"darkblue_foreground",
4048 "foreground",
"darkblue", NULL);
4049 tag = gtk_text_buffer_create_tag (textbuffer,
"darkgreen_foreground",
4050 "foreground",
"darkgreen", NULL);
4051 tag = gtk_text_buffer_create_tag (textbuffer,
4052 "saddlebrown_foreground",
4053 "foreground",
"saddlebrown", NULL);
4060 switch (log_level & G_LOG_LEVEL_MASK) {
4061 case G_LOG_LEVEL_ERROR:
4063 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4065 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4066 gtk_widget_show(screen.win.sidepane_notebook);
4068 case G_LOG_LEVEL_CRITICAL:
4069 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4071 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4072 gtk_widget_show(screen.win.sidepane_notebook);
4074 case G_LOG_LEVEL_WARNING:
4075 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4076 "darkred_foreground");
4077 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4078 gtk_widget_show(screen.win.sidepane_notebook);
4080 case G_LOG_LEVEL_MESSAGE:
4081 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4082 "darkblue_foreground");
4083 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4084 gtk_widget_show(screen.win.sidepane_notebook);
4086 case G_LOG_LEVEL_INFO:
4087 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4088 "darkgreen_foreground");
4090 case G_LOG_LEVEL_DEBUG:
4091 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4092 "saddlebrown_foreground");
4095 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table(textbuffer),
4096 "black_foreground");
4103 if (log_level & G_LOG_FLAG_FATAL) {
4104 fprintf(stderr, _(
"Fatal error: %s\n"), message);
4107 dialog = gtk_dialog_new_with_buttons(_(
"Fatal Error"),
4108 NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
4109 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
4111 label = gtk_label_new(g_strdup_printf(_(
"Fatal error: %s"), message));
4112 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4114 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
4115 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4116 gtk_label_new(_(
"\nGerbv will be closed now!")));
4118 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
4120 gtk_widget_show_all(dialog);
4121 gtk_dialog_run(GTK_DIALOG(dialog));
4124 gtk_text_buffer_insert(textbuffer, &iter, message, -1);
4125 gtk_text_buffer_insert(textbuffer, &iter,
"\n", -1);
4128 g_signal_emit_by_name(textbuffer,
"paste-done", NULL);
4130 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4132 StopMark = gtk_text_buffer_create_mark(textbuffer,
4133 "NewTextStop", &iter, TRUE);
4135 gtk_text_buffer_get_iter_at_mark(textbuffer, &StartIter, StartMark);
4136 gtk_text_buffer_get_iter_at_mark(textbuffer, &StopIter, StopMark);
4138 gtk_text_buffer_apply_tag(textbuffer, tag, &StartIter, &StopIter);
4142 void callbacks_force_expose_event_for_screen (
void)
4144 GdkRectangle update_rect;
4152 gdk_window_invalidate_rect (screen.drawing_area->window, &update_rect, FALSE);
4155 callbacks_update_ruler_scales ();
4156 callbacks_update_scrollbar_limits ();
4157 callbacks_update_scrollbar_positions ();
4160 static double screen_units(
double d)
4162 switch (screen.unit) {
4164 return COORD2INS(d);
4167 return COORD2MILS(d);
4170 return COORD2MMS(d);
4177 static const char *screen_units_str(
void)
4180 const char *units_str[] = {N_(
"mil"), N_(
"mm"), N_(
"in")};
4182 return _(units_str[screen.unit]);
4185 static double line_length(
double x0,
double y0,
double x1,
double y1)
4187 double dx = x0 - x1;
4188 double dy = y0 - y1;
4190 return hypot(dx, dy);
4193 static double arc_length(
double dia,
double angle)
4195 return M_PI*dia*(angle/360.0);
4198 static void aperture_state_report (
gerbv_net_t *net,
4203 gboolean show_length = FALSE;
4204 gboolean aperture_is_valid = FALSE;
4205 double x, y, len = 0;
4208 aperture_is_valid = TRUE;
4223 g_message (_(
"Object type: Line"));
4225 g_message (_(
"Object type: Slot (drilled)"));
4235 g_message (_(
"Object type: Arc"));
4236 len = arc_length(net->
cirseg->width,
4237 fabs(net->
cirseg->angle1 -
4243 g_message (_(
"Object type: Unknown"));
4248 g_message (_(
" Exposure: On"));
4250 if (aperture_is_valid) {
4262 g_message (_(
" Start: (%g, %g) %s"),
4265 screen_units_str());
4270 g_message (_(
" Stop: (%g, %g) %s"),
4273 screen_units_str());
4282 g_message (_(
" Center: (%g, %g) %s"),
4285 screen_units_str());
4287 x = net->
cirseg->width/2;
4290 g_message (_(
" Radius: %g %s"),
4292 screen_units_str());
4294 g_message (_(
" Angle: %g deg"),
4295 fabs(net->
cirseg->angle1 -
4297 g_message (_(
" Angles: (%g, %g) deg"),
4300 g_message (_(
" Direction: %s"),
4314 && aperture_is_valid
4316 double dia = aper->parameter[0];
4317 g_message (_(
" Slot length: %g %s"),
4318 screen_units(len + dia),
4319 screen_units_str());
4322 screen.length_sum += len;
4323 g_message (_(
" Length: %g (sum: %g) %s"),
4325 screen_units(screen.length_sum),
4326 screen_units_str());
4329 net_layer_file_report (net, img, prj);
4335 g_message (_(
"Object type: Flashed aperture"));
4337 g_message (_(
"Object type: Drill"));
4339 if (aperture_is_valid) {
4351 g_message (_(
" Location: (%g, %g) %s"),
4354 screen_units_str());
4356 net_layer_file_report (net, img, prj);
4363 aperture_report(gerbv_aperture_t *apertures[],
int aperture_num,
4367 double *params = apertures[aperture_num]->parameter;
4368 gerbv_simplified_amacro_t *sam = apertures[aperture_num]->simplified;
4370 g_message (_(
" Aperture used: D%d"), aperture_num);
4371 g_message (_(
" Aperture type: %s"),
4378 g_message (_(
" Diameter: %g %s"),
4379 screen_units(params[0]),
4380 screen_units_str());
4384 g_message (_(
" Dimensions: %gx%g %s"),
4385 screen_units(params[0]),
4386 screen_units(params[1]),
4387 screen_units_str());
4390 switch (sam->type) {
4392 g_message (_(
" Diameter: %g %s"),
4393 screen_units(sam->parameter[CIRCLE_DIAMETER]),
4394 screen_units_str());
4395 x += sam->parameter[CIRCLE_CENTER_X];
4396 y += sam->parameter[CIRCLE_CENTER_Y];
4398 g_message (_(
" Center: (%g, %g) %s"),
4399 screen_units(x), screen_units(y),
4400 screen_units_str());
4404 g_message (_(
" Number of points: %g"),
4405 sam->parameter[OUTLINE_NUMBER_OF_POINTS]);
4406 x += sam->parameter[OUTLINE_FIRST_X];
4407 y += sam->parameter[OUTLINE_FIRST_Y];
4409 g_message (_(
" Start: (%g, %g) %s"),
4410 screen_units(x), screen_units(y),
4411 screen_units_str());
4412 g_message (_(
" Rotation: %g deg"),
4413 sam->parameter[OUTLINE_ROTATION_IDX(sam->parameter)]);
4417 g_message (_(
" Number of points: %g"),
4418 sam->parameter[POLYGON_NUMBER_OF_POINTS]);
4419 g_message (_(
" Diameter: %g %s"),
4420 screen_units(sam->parameter[POLYGON_DIAMETER]),
4421 screen_units_str());
4422 x += sam->parameter[POLYGON_CENTER_X];
4423 y += sam->parameter[POLYGON_CENTER_Y];
4425 g_message (_(
" Center: (%g, %g) %s"),
4426 screen_units(x), screen_units(y),
4427 screen_units_str());
4428 g_message (_(
" Rotation: %g deg"),
4429 sam->parameter[POLYGON_ROTATION]);
4433 g_message (_(
" Outside diameter: %g %s"),
4434 screen_units(sam->parameter[MOIRE_OUTSIDE_DIAMETER]),
4435 screen_units_str());
4436 g_message (_(
" Ring thickness: %g %s"),
4437 screen_units(sam->parameter[MOIRE_CIRCLE_THICKNESS]),
4438 screen_units_str());
4439 g_message (_(
" Gap width: %g %s"),
4440 screen_units(sam->parameter[MOIRE_GAP_WIDTH]),
4441 screen_units_str());
4442 g_message (_(
" Number of rings: %g"),
4443 sam->parameter[MOIRE_NUMBER_OF_CIRCLES]);
4444 g_message (_(
" Crosshair thickness: %g %s"),
4446 sam->parameter[MOIRE_CROSSHAIR_THICKNESS]),
4447 screen_units_str());
4448 g_message (_(
" Crosshair length: %g %s"),
4449 screen_units(sam->parameter[MOIRE_CROSSHAIR_LENGTH]),
4450 screen_units_str());
4451 x += sam->parameter[MOIRE_CENTER_X];
4452 y += sam->parameter[MOIRE_CENTER_Y];
4454 g_message (_(
" Center: (%g, %g) %s"),
4455 screen_units(x), screen_units(y),
4456 screen_units_str());
4457 g_message (_(
" Rotation: %g deg"),
4458 sam->parameter[MOIRE_ROTATION]);
4462 g_message (_(
" Outside diameter: %g %s"),
4463 screen_units(sam->parameter[THERMAL_OUTSIDE_DIAMETER]),
4464 screen_units_str());
4465 g_message (_(
" Inside diameter: %g %s"),
4466 screen_units(sam->parameter[THERMAL_INSIDE_DIAMETER]),
4467 screen_units_str());
4468 g_message (_(
" Crosshair thickness: %g %s"),
4470 sam->parameter[THERMAL_CROSSHAIR_THICKNESS]),
4471 screen_units_str());
4472 x += sam->parameter[THERMAL_CENTER_X];
4473 y += sam->parameter[THERMAL_CENTER_Y];
4475 g_message (_(
" Center: (%g, %g) %s"),
4476 screen_units(x), screen_units(y),
4477 screen_units_str());
4478 g_message (_(
" Rotation: %g deg"),
4479 sam->parameter[THERMAL_ROTATION]);
4483 g_message (_(
" Width: %g %s"),
4484 screen_units(sam->parameter[LINE20_WIDTH]),
4485 screen_units_str());
4486 x += sam->parameter[LINE20_START_X];
4487 y += sam->parameter[LINE20_START_Y];
4489 g_message (_(
" Start: (%g, %g) %s"),
4490 screen_units(x), screen_units(y),
4491 screen_units_str());
4492 x += sam->parameter[LINE20_END_X];
4493 y += sam->parameter[LINE20_END_Y];
4495 g_message (_(
" Stop: (%g, %g) %s"),
4496 screen_units(x), screen_units(y),
4497 screen_units_str());
4498 g_message (_(
" Rotation: %g deg"),
4499 sam->parameter[LINE20_ROTATION]);
4503 g_message (_(
" Width: %g %s"),
4504 screen_units(sam->parameter[LINE21_WIDTH]),
4505 screen_units_str());
4506 g_message (_(
" Height: %g %s"),
4507 screen_units(sam->parameter[LINE21_HEIGHT]),
4508 screen_units_str());
4509 x += sam->parameter[LINE21_CENTER_X];
4510 y += sam->parameter[LINE21_CENTER_Y];
4512 g_message (_(
" Center: (%g, %g) %s"),
4513 screen_units(x), screen_units(y),
4514 screen_units_str());
4515 g_message (_(
" Rotation: %g deg"),
4516 sam->parameter[LINE21_ROTATION]);
4520 g_message (_(
" Width: %g %s"),
4521 screen_units(sam->parameter[LINE22_WIDTH]),
4522 screen_units_str());
4523 g_message (_(
" Height: %g %s"),
4524 screen_units(sam->parameter[LINE22_HEIGHT]),
4525 screen_units_str());
4526 x += sam->parameter[LINE22_LOWER_LEFT_X];
4527 y += sam->parameter[LINE22_LOWER_LEFT_Y];
4529 g_message (_(
" Lower left: (%g, %g) %s"),
4530 screen_units(x), screen_units(y),
4531 screen_units_str());
4532 g_message (_(
" Rotation: %g deg"),
4533 sam->parameter[LINE22_ROTATION]);
4546 static void drill_report(gerbv_aperture_t *apertures[],
int aperture_num)
4549 double *params = apertures[aperture_num]->parameter;
4551 g_message (_(
" Tool used: T%d"), aperture_num);
4553 g_message (_(
" Diameter: %g %s"),
4554 screen_units(params[0]),
4555 screen_units_str());
4576 g_message (_(
" Number of vertices: %u"), c - 1);
4592 g_message (_(
" Line from: (%g, %g) %s"),
4595 screen_units_str());
4601 g_message (_(
" Line to: (%g, %g) %s"),
4602 screen_units(x), screen_units(y),
4603 screen_units_str());
4612 g_message (_(
" Arc from: (%g, %g) %s"),
4613 screen_units(x), screen_units(y),
4614 screen_units_str());
4619 g_message (_(
" Arc to: (%g, %g) %s"),
4620 screen_units(x), screen_units(y),
4621 screen_units_str());
4626 g_message (_(
" Center: (%g, %g) %s"),
4627 screen_units(x), screen_units(y),
4628 screen_units_str());
4633 g_message (_(
" Radius: %g %s"),
4634 screen_units(x)/2, screen_units_str());
4636 g_message (_(
" Angle: %g deg"),
4638 g_message (_(
" Angles: (%g, %g) deg"),
4640 g_message (_(
" Direction: %s"),
4647 g_message(
" Skipping interpolation: %s",
4655 static void net_layer_file_report(
gerbv_net_t *net,
4659 if (net->
label != NULL)
4660 g_message (_(
" Net label: %s"), net->
label->str);
4664 g_message (_(
" Layer name: %s"), net->
layer->
name);
4669 g_message (_(
" In file: %s"), prj->
file[i]->
name);
4675 analyze_window_size_restore(GtkWidget *win)
4681 if (!screen.settings)
4684 var = g_settings_get_value (screen.settings,
"analyze-window-size");
4685 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4687 gtk_window_set_default_size (GTK_WINDOW (win), xy[0], xy[1]);
4688 g_variant_unref (var);
4690 var = g_settings_get_value (screen.settings,
"analyze-window-position");
4691 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4693 gtk_window_move (GTK_WINDOW (win), xy[0], xy[1]);
4694 g_variant_unref (var);
4699 analyze_window_size_store(GtkWidget *win, gpointer user_data)
4705 if (!screen.settings)
4708 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED &
4709 gdk_window_get_state (gtk_widget_get_window (win)));
4713 gtk_window_get_size (GTK_WINDOW (win), (gint *)xy, (gint *)(xy+1));
4714 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4715 xy, 2,
sizeof (xy[0]));
4716 g_settings_set_value (screen.settings,
"analyze-window-size", var);
4718 gtk_window_get_position (GTK_WINDOW (win),
4719 (gint *)xy, (gint *)(xy+1));
4720 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4721 xy, 2,
sizeof (xy[0]));
4722 g_settings_set_value (screen.settings,
"analyze-window-position", var);
Dynamic GUI window creation header info.
void open_files(GSList *filenames)
File -> open action requested or file drop event happened.
void callbacks_bugs_activate(GtkMenuItem *menuitem, gpointer user_data)
The help -> bugs menu item was selected.
gboolean callbacks_quit_activate(GtkMenuItem *menuitem, gpointer user_data)
The file -> quit menu item was selected or the user requested the main window to be closed by other m...
void callbacks_update_statusbar(void)
Displays additional information in the statusbar.
void callbacks_open_activate(GtkMenuItem *menuitem, gpointer user_data)
The file -> open action was selected.
void callbacks_align_files_from_sel_clicked(GtkMenuItem *menu_item, gpointer user_data)
The edit -> align layers menu item was selected.
void callbacks_analyze_active_drill_activate(GtkMenuItem *menuitem, gpointer user_data)
The analyze -> analyze drill file menu item was selected.
static gint callbacks_get_selected_row_index(void)
This fcn returns the index of selected layer (selected in the layer window on left).
gerbv_image_t * merge_images(int type)
Go through each file and look at visibility, then type.
void open_project(char *project_filename)
The file -> open menu item was selected.
void callbacks_analyze_active_gerbers_activate(GtkMenuItem *menuitem, gpointer user_data)
The analyze -> analyze Gerbers menu item was selected.
gboolean callbacks_drawingarea_button_release_event(GtkWidget *widget, GdkEventButton *event)
void callbacks_about_activate(GtkMenuItem *menuitem, gpointer user_data)
The help -> about menu item was selected.
void callbacks_new_project_activate(GtkMenuItem *menuitem, gpointer user_data)
The file -> new menu item was selected.
void callbacks_toggle_layer_visibility_activate(GtkMenuItem *menuitem, gpointer user_data)
View/"Toggle visibility layer X" or Current layer/"Toggle visibility" menu item was activated.
Header info for the GUI callback functions.
Header info for the GDK rendering functions.
Header info for the cairo rendering functions and the related selection calculating functions.
const char * drill_g_code_name(drill_g_code_t g_code)
Return drill G-code name by code number.
const char * drill_m_code_name(drill_m_code_t m_code)
Return drill M-code name by code number.
Header info for the Excellon drill parsing functions.
void gerbv_drill_stats_destroy(gerbv_drill_stats_t *stats)
gboolean gerbv_export_drill_file_from_image(const gchar *filename, gerbv_image_t *inputImage, gerbv_user_transformation_t *transform)
Export an image to a new file in Excellon drill format.
gboolean gerbv_export_dxf_file_from_image(const gchar *file_name, gerbv_image_t *input_img, gerbv_user_transformation_t *trans)
Export an image to a new file in DXF format.
gboolean gerbv_export_geda_pcb_file_from_image(const gchar *file_name, gerbv_image_t *input_img, gerbv_user_transformation_t *trans)
Export an image to a new file in gEDA PCB format.
void gerbv_export_png_file_from_project(gerbv_project_t *gerbvProject, gerbv_render_info_t *renderInfo, gchar const *filename)
Render a project to a PNG file using user-specified render info.
void gerbv_export_postscript_file_from_project_autoscaled(gerbv_project_t *gerbvProject, gchar const *filename)
Render a project to a Postscript file, autoscaling the layers to fit inside the specified image dimen...
void gerbv_export_svg_file_from_project_autoscaled_with_options(gerbv_project_t *gerbvProject, gchar const *filename, gboolean exportLayersAsSvgLayers)
Render a project to a SVG file, optionally exporting visible layers as Inkscape layers.
void gerbv_export_png_file_from_project_autoscaled(gerbv_project_t *gerbvProject, int widthInPixels, int heightInPixels, gchar const *filename)
Render a project to a PNG file, autoscaling the layers to fit inside the specified image dimensions.
void gerbv_export_pdf_file_from_project_autoscaled(gerbv_project_t *gerbvProject, gchar const *filename)
Render a project to a PDF file, autoscaling the layers to fit inside the specified image dimensions.
gboolean gerbv_export_isel_drill_file_from_image(const gchar *filename, gerbv_image_t *inputImage, gerbv_user_transformation_t *transform)
Export an image to a new file in ISEL NCP drill format.
gboolean gerbv_export_rs274x_file_from_image(const gchar *filename, gerbv_image_t *inputImage, gerbv_user_transformation_t *transform)
Export an image to a new file in RS274X format.
void gerbv_destroy_image(gerbv_image_t *image)
Free an image structure.
void gerbv_image_copy_image(gerbv_image_t *sourceImage, gerbv_user_transformation_t *transform, gerbv_image_t *destinationImage)
Copy an image into an existing image, effectively merging the two together.
void gerbv_image_delete_net(gerbv_net_t *currentNet)
Delete a net in an existing image.
gerbv_image_t * gerbv_image_duplicate_image(gerbv_image_t *sourceImage, gerbv_user_transformation_t *transform)
Duplicate an existing image and return the new copy.
void gerbv_stats_destroy(gerbv_stats_t *stats)
const char * gerber_d_code_name(int d_code)
Return Gerber D-code name by code number.
const char * gerber_g_code_name(int g_code)
Return Gerber G-code name by code number.
const char * gerber_m_code_name(int m_code)
Return Gerber M-code name by code number.
const char * gerbv_interpolation_name(gerbv_interpolation_t interp)
Return string name of gerbv_interpolation_t interpolation.
gerbv_fileinfo_t * gerbv_get_fileinfo_for_image(const gerbv_image_t *image, const gerbv_project_t *project)
void gerbv_open_layer_from_filename(gerbv_project_t *gerbvProject, gchar const *filename)
Open a file, parse the contents, and add a new layer to an existing project.
const char * gerbv_aperture_type_name(gerbv_aperture_type_t type)
Return string name of gerbv_aperture_type_t aperture type.
void gerbv_render_zoom_to_fit_display(gerbv_project_t *gerbvProject, gerbv_render_info_t *renderInfo)
Calculate the zoom and translations to fit the rendered scene inside the given scene size.
int gerbv_transform_coord_for_image(double *x, double *y, const gerbv_image_t *image, const gerbv_project_t *project)
The main header file for the libgerbv library.
@ GERBV_APERTURE_STATE_OFF
@ GERBV_APERTURE_STATE_ON
@ GERBV_APERTURE_STATE_FLASH
@ GERBV_RENDER_TYPE_CAIRO_HIGH_QUALITY
@ GERBV_RENDER_TYPE_GDK_XOR
@ GERBV_RENDER_TYPE_CAIRO_NORMAL
@ GERBV_APTYPE_MACRO_LINE20
@ GERBV_APTYPE_MACRO_LINE21
@ GERBV_APTYPE_MACRO_OUTLINE
@ GERBV_APTYPE_MACRO_CIRCLE
@ GERBV_APTYPE_MACRO_POLYGON
@ GERBV_APTYPE_MACRO_THERMAL
@ GERBV_APTYPE_MACRO_LINE22
@ GERBV_APTYPE_MACRO_MOIRE
@ GERBV_INTERPOLATION_LINEARx01
@ GERBV_INTERPOLATION_PAREA_START
@ GERBV_INTERPOLATION_LINEARx001
@ GERBV_INTERPOLATION_CW_CIRCULAR
@ GERBV_INTERPOLATION_PAREA_END
@ GERBV_INTERPOLATION_LINEARx10
@ GERBV_INTERPOLATION_CCW_CIRCULAR
@ GERBV_INTERPOLATION_LINEARx1
int interface_reopen_question(GSList *fns, GSList *fns_is_mod, GSList *fns_cnt, GSList *fns_lay_num)
This dialog box shows a text message with three buttons in the case if the file to be open was alread...
void interface_show_alert_dialog(gchar *primaryText, gchar *secondaryText, gboolean show_checkbox, gboolean *ask_to_show_again)
This dialog box shows a textmessage and one button: "OK".
gboolean interface_get_alert_dialog_response(const gchar *primaryText, const gchar *secondaryText, gboolean show_checkbox, gboolean *ask_to_show_again, const gchar *true_button_label, const gchar *false_button_label)
This dialog box shows a message and two buttons: "True" and "False".
Header info for the GUI building functions for Gerber Viewer.
gerbv_project_t * mainProject
Global state variable to keep track of what's happening on the screen.
Header info for common structs and functions used for the GUI application.
int project_is_gerbv_project(const char *filename, gboolean *ret)
Checks whether the supplied file look like a gerbv project by reading the first line and checking if ...
Header info for loading and saving project files.
void render_calculate_zoom_from_outline(GtkWidget *widget, GdkEventButton *event)
Will determine the outline of the zoomed regions.
gerbv_stats_t * generate_gerber_analysis(void)
void render_draw_measure_distance(void)
Displays a measured distance graphically on screen and in statusbar.
void render_toggle_measure_line(void)
Draws/erases measure line.
gerbv_drill_stats_t * generate_drill_analysis(void)
Header info for the rendering support functions for gerbv.
Header info for the selection support functions for libgerbv.
gerbv_user_transformation_t transform
gerbv_layertype_t layertype
gerbv_aperture_t * aperture[APERTURE_MAX]
gerbv_image_info_t * info
gerbv_aperture_state_t aperture_state
gerbv_interpolation_t interpolation
gboolean show_invisible_selection
gboolean check_before_delete
gboolean show_cross_on_drill_holes
gerbv_render_types_t renderType
Header info for GTK widgets table functions.