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);
1621 table_add_row(G_table,
"", stat->G_unknown, _(
"unknown G-codes"));
1623 table_set_sortable(G_table);
1624 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
1627 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
1628 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
1629 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1631 struct table *M_table =
1632 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1633 pgettext(
"table",
"Count"), G_TYPE_UINT,
1634 _(
"Note"), G_TYPE_STRING);
1635 table_set_column_align(M_table, 0, 1.0);
1636 table_set_column_align(M_table, 1, 1.0);
1637 gtk_tree_view_set_headers_clickable(
1638 GTK_TREE_VIEW(M_table->widget), TRUE);
1652 table_add_row(M_table,
"", stat->M_unknown, _(
"unknown M-codes"));
1654 table_set_sortable(M_table);
1655 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
1658 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
1659 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
1660 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1662 struct table *misc_table =
1663 table_new_with_columns(2,
1665 pgettext(
"table",
"Count"), G_TYPE_STRING,
1666 _(
"Code"), G_TYPE_STRING);
1667 table_set_column_align(misc_table, 0, 1.0);
1668 str = g_strdup_printf(
"%d", stat->comment);
1669 table_add_row(misc_table, str,_(
"Comments"));
1671 str = g_strdup_printf(
"%d", stat->unknown);
1672 table_add_row(misc_table, str, _(
"Unknown codes"));
1674 str = g_strdup_printf(
"%d", stat->R);
1675 table_add_row(misc_table, str, _(
"Repeat hole (R)"));
1677 if (stat->detect != NULL ) {
1678 table_add_row(misc_table,
"", stat->detect);
1681 table_set_sortable(misc_table);
1682 gtk_container_add(GTK_CONTAINER(misc_report_window),
1683 misc_table->widget);
1686 GtkWidget *drill_usage_report_window =
1687 gtk_scrolled_window_new(NULL, NULL);
1688 gtk_scrolled_window_set_policy(
1689 GTK_SCROLLED_WINDOW(drill_usage_report_window),
1690 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1692 struct table *drill_usage_table = table_new_with_columns(4,
1693 _(
"Drill no."), G_TYPE_UINT,
1694 _(
"Dia."), G_TYPE_DOUBLE,
1695 _(
"Units"), G_TYPE_STRING,
1696 pgettext(
"table",
"Count"), G_TYPE_UINT);
1698 table_set_column_align(drill_usage_table, 0, 1.0);
1699 table_set_column_align(drill_usage_table, 3, 1.0);
1700 gtk_tree_view_set_headers_clickable(
1701 GTK_TREE_VIEW(drill_usage_table->widget), TRUE);
1709 table_add_row(drill_usage_table,
1716 table_set_sortable(drill_usage_table);
1717 gtk_container_add(GTK_CONTAINER(drill_usage_report_window),
1718 drill_usage_table->widget);
1721 GtkWidget *analyze_active_drill;
1722 analyze_active_drill = gtk_dialog_new_with_buttons(
1723 _(
"Drill codes report on visible layers"),
1724 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1725 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1726 gtk_container_set_border_width (GTK_CONTAINER (analyze_active_drill), 5);
1728 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_drill),
1729 GTK_RESPONSE_ACCEPT);
1730 g_signal_connect_after (G_OBJECT(analyze_active_drill),
1732 G_CALLBACK (gtk_widget_destroy),
1733 GTK_WIDGET(analyze_active_drill));
1736 GtkWidget *general_report_window =
1737 gtk_scrolled_window_new(NULL, NULL);
1738 gtk_scrolled_window_set_policy(
1739 GTK_SCROLLED_WINDOW(general_report_window),
1740 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1742 GtkWidget *vbox = gtk_vbox_new(0, 0);
1743 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1744 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1745 gtk_scrolled_window_add_with_viewport(
1746 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1749 GtkWidget *notebook = gtk_notebook_new();
1751 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1752 GTK_WIDGET(general_report_window),
1753 gtk_label_new(_(
"General")));
1755 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1756 GTK_WIDGET(G_report_window),
1757 gtk_label_new(_(
"G codes")));
1759 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1760 GTK_WIDGET(M_report_window),
1761 gtk_label_new(_(
"M codes")));
1763 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1764 GTK_WIDGET(misc_report_window),
1765 gtk_label_new(_(
"Misc. codes")));
1767 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1768 GTK_WIDGET(drill_usage_report_window),
1769 gtk_label_new(_(
"Drill usage")));
1772 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(analyze_active_drill)->vbox),
1773 GTK_WIDGET(notebook));
1775 if (screen.settings) {
1776 analyze_window_size_restore(analyze_active_drill);
1777 g_signal_connect (G_OBJECT(analyze_active_drill),
"response",
1778 G_CALLBACK (analyze_window_size_store),
1779 GTK_WIDGET(analyze_active_drill));
1781 gtk_window_set_default_size(GTK_WINDOW(analyze_active_drill),
1785 gtk_widget_show_all(analyze_active_drill);
1792 callbacks_control_gerber_options_activate (GtkMenuItem *menuitem,
1800 callbacks_online_manual_activate (GtkMenuItem *menuitem,
1817 gboolean layers_dirty = FALSE;
1827 _(
"Do you want to close all open layers and quit the program?"),
1828 _(
"Quitting the program will cause any unsaved changes "
1830 FALSE, NULL, GTK_STOCK_QUIT, GTK_STOCK_CANCEL)) {
1836 if (screen.settings && !screen.background_is_from_project) {
1840 clr = bg->red/257<<16 | bg->green/257<<8 | bg->blue/257;
1841 g_settings_set_uint (screen.settings,
"background-color", clr);
1845 if (screen.settings) {
1846 GtkWindow *win = GTK_WINDOW(screen.win.topLevelWindow);
1851 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED & gdk_window_get_state (
1852 gtk_widget_get_window (GTK_WIDGET(win))));
1853 g_settings_set_boolean (screen.settings,
"window-maximized", is_max);
1856 gtk_window_get_size (win, (gint *)xy, (gint *)(xy+1));
1857 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1859 g_settings_set_value (screen.settings,
"window-size", var);
1861 gtk_window_get_position (win, (gint *)xy, (gint *)(xy+1));
1862 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1864 g_settings_set_value (screen.settings,
"window-position", var);
1884 GtkWidget *aboutdialog1;
1886 gchar *translators = _(
"translator-credits");
1888 gchar *
string = g_strdup_printf(_(
1889 "Gerbv — a Gerber (RS-274/X) viewer\n"
1892 "Compiled on %s at %s\n"
1894 "Gerbv was originally developed as part of the gEDA Project "
1895 "but is now separately maintained.\n"
1897 "For more information see:\n"
1898 " gerbv homepage: https://gerbv.github.io/\n"
1899 " gerbv repository: https://github.com/gerbv/gerbv"),
1900 VERSION, __DATE__, __TIME__);
1902 #if GTK_CHECK_VERSION(2,6,0)
1903 gchar *license = g_strdup_printf(_(
1904 "Gerbv — a Gerber (RS-274/X) viewer\n"
1906 "Copyright (C) 2000—2007 Stefan Petersen\n"
1908 "This program is free software: you can redistribute it and/or modify\n"
1909 "it under the terms of the GNU General Public License as published by\n"
1910 "the Free Software Foundation, either version 2 of the License, or\n"
1911 "(at your option) any later version.\n"
1913 "This program is distributed in the hope that it will be useful,\n"
1914 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1915 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1916 "GNU General Public License for more details.\n\n"
1917 "You should have received a copy of the GNU General Public License\n"
1918 "along with this program. If not, see <http://www.gnu.org/licenses/>."));
1920 #include "authors.c"
1925 aboutdialog1 = gtk_about_dialog_new ();
1926 gtk_container_set_border_width (GTK_CONTAINER (aboutdialog1), 5);
1927 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (aboutdialog1), VERSION);
1928 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (aboutdialog1), _(
"Gerbv"));
1930 gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (aboutdialog1), translators);
1931 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (aboutdialog1),
string);
1932 gtk_about_dialog_set_license(GTK_ABOUT_DIALOG (aboutdialog1), license);
1935 a_size =
sizeof(authors_string_array)/
sizeof(authors_string_array[0]);
1936 a = g_new(gchar *, a_size);
1937 for (i = 0; i < a_size; i++)
1938 a[i] = _(authors_string_array[i]);
1940 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG (aboutdialog1), (
const gchar **)a);
1941 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG (aboutdialog1),
"https://gerbv.github.io/");
1944 g_signal_connect (G_OBJECT(aboutdialog1),
"response",
1945 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(aboutdialog1));
1950 aboutdialog1 = gtk_message_dialog_new ( GTK_WINDOW (screen.win.topLevelWindow),
1951 GTK_DIALOG_DESTROY_WITH_PARENT,
1957 gtk_window_set_title ( GTK_WINDOW (aboutdialog1), _(
"About Gerbv"));
1960 g_signal_connect_swapped (aboutdialog1,
"response",
1961 G_CALLBACK (gtk_widget_destroy),
1966 gtk_widget_show_all(GTK_WIDGET(aboutdialog1));
1984 GtkWidget *bugs_dialog = gtk_dialog_new_with_buttons(_(
"Known bugs in Gerbv"),
1986 GTK_DIALOG_DESTROY_WITH_PARENT,
1987 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1989 gtk_container_set_border_width (GTK_CONTAINER (bugs_dialog), 5);
1990 gtk_dialog_set_default_response (GTK_DIALOG(bugs_dialog),
1991 GTK_RESPONSE_ACCEPT);
1992 g_signal_connect (G_OBJECT(bugs_dialog),
"response",
1993 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(bugs_dialog));
1996 GString *bugs_string = g_string_new(NULL);
1997 for (i=0; bugs_string_array[i] != NULL; i++) {
1999 g_string_append_printf(bugs_string,
"%s\n",
2000 (bugs_string_array[i][0] ==
'\0') ?
"" : _(bugs_string_array[i]));
2004 GtkWidget *bugs_label = gtk_label_new (bugs_string->str);
2005 g_string_free(bugs_string, TRUE);
2006 gtk_misc_set_alignment(GTK_MISC(bugs_label), 0, 0);
2007 gtk_misc_set_padding(GTK_MISC(bugs_label), 7, 7);
2010 GtkWidget *bugs_window = gtk_scrolled_window_new (NULL, NULL);
2011 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bugs_window),
2012 GTK_WIDGET(bugs_label));
2013 gtk_widget_set_size_request(bugs_window, 600, 300);
2014 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(bugs_dialog)->vbox),
2015 GTK_WIDGET(bugs_window));
2017 gtk_widget_show_all(GTK_WIDGET(bugs_dialog));
2018 gtk_dialog_run(GTK_DIALOG(bugs_dialog));
2023 gdouble callbacks_calculate_actual_distance (gdouble inputDimension) {
2024 return screen_units(inputDimension);
2028 void callbacks_update_ruler_pointers (
void) {
2029 double xPosition, yPosition;
2033 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2034 xPosition = callbacks_calculate_actual_distance (xPosition);
2035 yPosition = callbacks_calculate_actual_distance (yPosition);
2037 g_object_set (G_OBJECT (screen.win.hRuler),
"position", xPosition, NULL);
2038 g_object_set (G_OBJECT (screen.win.vRuler),
"position", yPosition, NULL);
2043 callbacks_render_type_changed () {
2044 static gboolean isChanging = FALSE;
2050 GtkCheckMenuItem *check_item = screen.win.menu_view_render_group[type];
2051 DPRINTF(
"%s(): type = %d, check_item = %p\n", __FUNCTION__, type, check_item);
2052 gtk_check_menu_item_set_active (check_item, TRUE);
2053 gtk_combo_box_set_active (screen.win.sidepaneRenderComboBox, type);
2055 render_refresh_rendered_image_on_screen();
2061 callbacks_units_changed (gerbv_gui_unit_t unit)
2063 static gboolean isChanging = FALSE;
2071 if (unit == GERBV_MILS || unit == GERBV_MMS || unit == GERBV_INS) {
2072 gtk_combo_box_set_active (
2073 GTK_COMBO_BOX (screen.win.statusUnitComboBox),
2075 gtk_check_menu_item_set_active (
2076 screen.win.menu_view_unit_group[unit], TRUE);
2079 callbacks_update_ruler_scales ();
2080 callbacks_update_statusbar_coordinates (screen.last_x, screen.last_y);
2082 if (screen.tool == MEASURE)
2083 callbacks_update_statusbar_measured_distance (
2084 screen.measure_last_x,
2085 screen.measure_last_y);
2092 callbacks_update_ruler_scales (
void) {
2093 double xStart, xEnd, yStart, yEnd;
2102 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2103 xStart = callbacks_calculate_actual_distance (xStart);
2104 xEnd = callbacks_calculate_actual_distance (xEnd);
2105 yStart = callbacks_calculate_actual_distance (yStart);
2106 yEnd = callbacks_calculate_actual_distance (yEnd);
2110 if (screen.win.hRuler)
2111 gtk_ruler_set_range (GTK_RULER (screen.win.hRuler), xStart, xEnd, 0, xEnd - xStart);
2113 if (screen.win.vRuler)
2114 gtk_ruler_set_range (GTK_RULER (screen.win.vRuler), yEnd, yStart, 0, yEnd - yStart);
2118 void callbacks_update_scrollbar_limits (
void){
2124 GtkAdjustment *hAdjust = (GtkAdjustment *)screen.win.hAdjustment;
2125 GtkAdjustment *vAdjust = (GtkAdjustment *)screen.win.vAdjustment;
2128 hAdjust->page_increment = hAdjust->page_size;
2129 hAdjust->step_increment = hAdjust->page_size / 10.0;
2131 vAdjust->page_increment = vAdjust->page_size;
2132 vAdjust->step_increment = vAdjust->page_size / 10.0;
2137 callbacks_update_scrollbar_positions ();
2141 void callbacks_update_scrollbar_positions (
void){
2142 gdouble positionX,positionY;
2145 if (positionX < ((GtkAdjustment *)screen.win.hAdjustment)->lower)
2146 positionX = ((GtkAdjustment *)screen.win.hAdjustment)->lower;
2147 if (positionX > (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size))
2148 positionX = (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size);
2149 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.hAdjustment, positionX);
2151 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->upper - screenRenderInfo.
lowerLeftY -
2152 ((GtkAdjustment *)screen.win.vAdjustment)->page_size +
2153 ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2154 if (positionY < ((GtkAdjustment *)screen.win.vAdjustment)->lower)
2155 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2156 if (positionY > (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size))
2157 positionY = (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size);
2158 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.vAdjustment, positionY);
2163 callbacks_scrollbar_button_released (GtkWidget *widget, GdkEventButton *event){
2166 screen.state = NORMAL;
2167 render_refresh_rendered_image_on_screen();
2173 callbacks_scrollbar_button_pressed (GtkWidget *widget, GdkEventButton *event){
2175 screen.state = SCROLLBAR;
2180 void callbacks_hadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2183 if (screen.state == SCROLLBAR) {
2184 screenRenderInfo.
lowerLeftX = gtk_adjustment_get_value (adjustment);
2189 void callbacks_vadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2192 if (screen.state == SCROLLBAR) {
2193 screenRenderInfo.
lowerLeftY = adjustment->upper -
2194 (gtk_adjustment_get_value (adjustment) + adjustment->page_size) + adjustment->lower;
2200 callbacks_layer_tree_visibility_toggled (gint index)
2205 callbacks_update_layer_tree ();
2207 render_refresh_rendered_image_on_screen ();
2209 render_recreate_composite_surface ();
2210 callbacks_force_expose_event_for_screen ();
2216 callbacks_get_col_num_from_tree_view_col (GtkTreeViewColumn *col)
2221 g_return_val_if_fail ( col != NULL, -1 );
2222 g_return_val_if_fail ( col->tree_view != NULL, -1 );
2223 cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view));
2224 num = g_list_index(cols, (gpointer) col);
2231 callbacks_add_layer_button_clicked (GtkButton *button, gpointer user_data)
2238 callbacks_unselect_all_tool_buttons (
void) {
2243 callbacks_switch_to_normal_tool_cursor (gint toolNumber)
2245 GdkWindow *drawing_area_window = screen.drawing_area->window;
2248 switch (toolNumber) {
2250 gdk_window_set_cursor(drawing_area_window, GERBV_DEF_CURSOR);
2253 cursor = gdk_cursor_new(GDK_FLEUR);
2254 gdk_window_set_cursor(drawing_area_window, cursor);
2255 gdk_cursor_destroy(cursor);
2258 cursor = gdk_cursor_new(GDK_SIZING);
2259 gdk_window_set_cursor(drawing_area_window, cursor);
2260 gdk_cursor_destroy(cursor);
2263 cursor = gdk_cursor_new(GDK_CROSSHAIR);
2264 gdk_window_set_cursor(drawing_area_window, cursor);
2265 gdk_cursor_destroy(cursor);
2274 callbacks_switch_to_correct_cursor (
void)
2276 GdkWindow *drawing_area_window = screen.drawing_area->window;
2279 if (screen.state == IN_MOVE) {
2280 cursor = gdk_cursor_new(GDK_FLEUR);
2281 gdk_window_set_cursor(drawing_area_window, cursor);
2282 gdk_cursor_destroy(cursor);
2285 else if (screen.state == IN_ZOOM_OUTLINE) {
2286 cursor = gdk_cursor_new(GDK_SIZING);
2287 gdk_window_set_cursor(drawing_area_window, cursor);
2288 gdk_cursor_destroy(cursor);
2291 callbacks_switch_to_normal_tool_cursor (screen.tool);
2296 callbacks_change_tool (GtkButton *button, gpointer user_data) {
2297 gint toolNumber = GPOINTER_TO_INT (user_data);
2300 if (screen.win.updatingTools)
2302 screen.win.updatingTools = TRUE;
2303 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), FALSE);
2304 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), FALSE);
2305 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), FALSE);
2306 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), FALSE);
2307 switch (toolNumber) {
2309 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), TRUE);
2310 screen.tool = POINTER;
2311 screen.state = NORMAL;
2312 utf8_strncpy(screen.statusbar.diststr,
2313 _(
"Click to select objects in the active layer. "
2314 "Middle click and drag to pan."),
2318 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), TRUE);
2320 screen.state = NORMAL;
2321 utf8_strncpy(screen.statusbar.diststr,
2322 _(
"Click and drag to pan. Right click and drag to zoom."),
2326 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), TRUE);
2328 screen.state = NORMAL;
2329 utf8_strncpy(screen.statusbar.diststr,
2330 _(
"Click and drag to zoom in. Shift+click to zoom out."),
2335 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), TRUE);
2336 screen.tool = MEASURE;
2337 screen.state = NORMAL;
2338 utf8_strncpy(screen.statusbar.diststr,
2339 _(
"Click and drag to measure a distance or select two apertures."),
2343 screen.measure_start_x = 0;
2344 screen.measure_start_y = 0;
2345 screen.measure_stop_x = 0;
2346 screen.measure_stop_y = 0;
2349 if (selection_length (&screen.selectionInfo) == 2) {
2350 gerbv_selection_item_t item[2];
2353 item[0] = selection_get_item_by_index(
2354 &screen.selectionInfo, 0);
2355 item[1] = selection_get_item_by_index(
2356 &screen.selectionInfo, 1);
2357 net[0] = item[0].net;
2358 net[1] = item[1].net;
2360 if ((net[0]->aperture_state ==
2361 net[1]->aperture_state)
2362 && (net[0]->aperture_state ==
2364 screen.measure_start_x = net[0]->
stop_x;
2365 screen.measure_start_y = net[0]->
stop_y;
2367 &screen.measure_start_x,
2368 &screen.measure_start_y,
2372 screen.measure_stop_x = net[1]->
stop_x;
2373 screen.measure_stop_y = net[1]->
stop_y;
2375 &screen.measure_stop_x,
2376 &screen.measure_stop_y,
2388 callbacks_switch_to_normal_tool_cursor (toolNumber);
2390 screen.win.updatingTools = FALSE;
2391 callbacks_force_expose_event_for_screen();
2396 callbacks_select_layer_row (gint rowIndex)
2398 GtkTreeSelection *selection;
2400 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2401 ((GtkTreeView *) screen.win.layerTree);
2403 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2405 if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store),
2406 &iter, NULL, rowIndex)) {
2407 gtk_tree_selection_select_iter (selection, &iter);
2420 GtkTreeSelection *selection;
2422 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2423 ((GtkTreeView *) screen.win.layerTree);
2427 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2428 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
2429 while (gtk_tree_model_iter_nth_child ((GtkTreeModel *)list_store,
2431 if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
2442 callbacks_remove_layer_button_clicked (GtkButton *button, gpointer user_data)
2446 if ((index >= 0) && (index <= mainProject->last_loaded)) {
2447 render_remove_selected_objects_belonging_to_layer (
2448 &screen.selectionInfo,
2450 update_selected_object_message (FALSE);
2453 callbacks_update_layer_tree ();
2455 index = MAX(0, index - 1);
2456 callbacks_select_layer_row (index);
2459 render_refresh_rendered_image_on_screen ();
2461 render_recreate_composite_surface ();
2462 callbacks_force_expose_event_for_screen ();
2469 callbacks_move_layer_down_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2470 callbacks_move_layer_down_button_clicked(NULL, NULL);
2471 gtk_widget_grab_focus (screen.win.layerTree);
2476 callbacks_move_layer_down_button_clicked (GtkButton *button, gpointer user_data) {
2479 show_no_layers_warning ();
2483 if (index < mainProject->last_loaded) {
2484 gerbv_change_layer_order (
mainProject, index, index + 1);
2485 callbacks_update_layer_tree ();
2486 callbacks_select_layer_row (index + 1);
2489 render_refresh_rendered_image_on_screen ();
2492 render_recreate_composite_surface ();
2493 callbacks_force_expose_event_for_screen ();
2500 callbacks_move_layer_up_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2501 callbacks_move_layer_up_button_clicked (NULL, NULL);
2502 gtk_widget_grab_focus (screen.win.layerTree);
2507 callbacks_move_layer_up_button_clicked (GtkButton *button, gpointer user_data) {
2510 show_no_layers_warning ();
2514 gerbv_change_layer_order (
mainProject, index, index - 1);
2515 callbacks_update_layer_tree ();
2516 callbacks_select_layer_row (index - 1);
2518 render_refresh_rendered_image_on_screen();
2521 render_recreate_composite_surface ();
2522 callbacks_force_expose_event_for_screen ();
2528 void callbacks_layer_tree_row_inserted (GtkTreeModel *tree_model, GtkTreePath *path,
2529 GtkTreeIter *oIter, gpointer user_data) {
2530 gint *indices=NULL,oldPosition,newPosition;
2532 if ((!screen.win.treeIsUpdating)&&(path != NULL)) {
2533 indices = gtk_tree_path_get_indices (path);
2535 newPosition = indices[0];
2539 if (oldPosition < newPosition)
2543 gerbv_change_layer_order (
mainProject, oldPosition, newPosition);
2546 render_refresh_rendered_image_on_screen();
2549 render_recreate_composite_surface ();
2550 callbacks_force_expose_event_for_screen ();
2553 GtkTreeSelection *selection;
2555 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2556 ((GtkTreeView *) screen.win.layerTree);
2558 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
2559 if (gtk_tree_model_get_iter ((GtkTreeModel *)list_store, &iter, path))
2560 gtk_tree_selection_select_iter (selection, &iter);
2567 callbacks_show_color_picker_dialog (gint index){
2568 screen.win.colorSelectionDialog = NULL;
2569 GtkColorSelectionDialog *cs= (GtkColorSelectionDialog *) gtk_color_selection_dialog_new (_(
"Select a color"));
2570 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2572 screen.win.colorSelectionDialog = (GtkWidget *) cs;
2573 screen.win.colorSelectionIndex = index;
2579 gtk_color_selection_set_has_opacity_control (colorsel, TRUE);
2582 gtk_widget_show_all((GtkWidget *)cs);
2583 if (gtk_dialog_run ((GtkDialog*)cs) == GTK_RESPONSE_OK) {
2584 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2585 gint rowIndex = screen.win.colorSelectionIndex;
2589 gdk_colormap_alloc_color(gdk_colormap_get_system(), &
mainProject->
file[rowIndex]->
color, FALSE, TRUE);
2599 callbacks_update_layer_tree ();
2600 render_refresh_rendered_image_on_screen();
2602 gtk_widget_destroy ((GtkWidget *)cs);
2603 screen.win.colorSelectionDialog = NULL;
2608 callbacks_invert_layer_clicked (GtkButton *button, gpointer user_data) {
2611 show_no_layers_warning ();
2615 render_refresh_rendered_image_on_screen ();
2616 callbacks_update_layer_tree ();
2621 callbacks_change_layer_color_clicked (GtkButton *button, gpointer user_data) {
2624 show_no_layers_warning ();
2627 callbacks_show_color_picker_dialog (index);
2631 callbacks_change_background_color_clicked (GtkButton *button, gpointer user_data) {
2632 callbacks_show_color_picker_dialog (-1);
2637 callbacks_reload_layer_clicked (GtkButton *button, gpointer user_data)
2642 show_no_layers_warning ();
2646 render_remove_selected_objects_belonging_to_layer (
2648 update_selected_object_message (FALSE);
2651 render_refresh_rendered_image_on_screen ();
2652 callbacks_update_layer_tree();
2656 callbacks_change_layer_edit_clicked (GtkButton *button, gpointer userData)
2664 show_no_layers_warning ();
2680 if (files[i] && files[i]->isVisible)
2685 transforms[j] = NULL;
2687 interface_show_layer_edit_dialog(transforms, screen.unit);
2688 g_free (transforms);
2689 render_refresh_rendered_image_on_screen ();
2690 callbacks_update_layer_tree ();
2695 callbacks_change_layer_format_clicked (GtkButton *button, gpointer user_data)
2697 gerbv_HID_Attribute *attr = NULL;
2700 gerbv_HID_Attr_Val * results = NULL;
2705 show_no_layers_warning ();
2708 DPRINTF(
"%s(): index = %d\n", __FUNCTION__, index);
2713 type = N_(
"Unknown type");
2715 if (attr == NULL || n == 0)
2718 _(
"Format editing is currently only supported for Excellon drill file formats."),
2724 DPRINTF(
"%s(): n = %d, attr = %p\n", __FUNCTION__, n, attr);
2729 _(
"This layer has changed!"),
2730 _(
"Editing the file type will reload the layer, "
2731 "destroying your changes. Click OK to edit "
2732 "the file type and destroy your changes, "
2733 "or Cancel to leave."),
2734 TRUE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL);
2735 if (rc == 0)
return;
2738 results = (gerbv_HID_Attr_Val *) malloc (n *
sizeof (gerbv_HID_Attr_Val));
2739 if (results == NULL)
2740 GERB_FATAL_ERROR(
"%s(): malloc failed", __FUNCTION__);
2743 if (attribute_interface_dialog (attr, n, results,
2744 _(
"Edit file format"),
2752 DPRINTF(
"%s(): reloading layer\n", __func__);
2755 for (i = 0; i < n; i++)
2757 if (results[i].str_value)
2758 free (results[i].str_value);
2763 render_refresh_rendered_image_on_screen();
2764 callbacks_update_layer_tree();
2769 callbacks_file_drop_event(GtkWidget *widget, GdkDragContext *dc,
2770 gint x, gint y, GtkSelectionData *data,
2771 guint info, guint time, gpointer p)
2773 gchar **uris, **uri;
2776 uris = gtk_selection_data_get_uris(data);
2780 for (uri = uris; *uri; uri++) {
2781 const char *prefix_str =
2787 if (g_strrstr(*uri, prefix_str) == *uri)
2788 fns = g_slist_append(fns, g_uri_unescape_string(
2789 *uri + strlen(prefix_str), NULL));
2793 g_slist_free_full(fns, g_free);
2801 callbacks_layer_tree_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
2805 if(event->keyval == GDK_space){
2808 GtkTreeViewColumn *col;
2812 tree = (GtkTreeView *) screen.win.layerTree;
2813 gtk_tree_view_get_cursor (tree, &path, &col);
2815 indices = gtk_tree_path_get_indices (path);
2817 idx = callbacks_get_col_num_from_tree_view_col (col);
2819 callbacks_show_color_picker_dialog (indices[0]);
2822 gtk_tree_path_free (path);
2831 callbacks_layer_tree_button_press (GtkWidget *widget, GdkEventButton *event,
2836 GtkTreeViewColumn *col;
2840 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model (
2841 (GtkTreeView *) screen.win.layerTree);
2843 if (event->button == 1) {
2844 if (gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget,
2845 event->x, event->y, &path, &col, &x, &y)
2846 && gtk_tree_model_get_iter ((GtkTreeModel *)list_store,
2848 indices = gtk_tree_path_get_indices (path);
2850 switch (callbacks_get_col_num_from_tree_view_col (col)) {
2852 callbacks_select_layer_row (indices[0]);
2853 callbacks_layer_tree_visibility_toggled (indices[0]);
2856 callbacks_show_color_picker_dialog (indices[0]);
2866 gtk_menu_popup (GTK_MENU (screen.win.layerTreePopupMenu),
2867 NULL, NULL, NULL, NULL,
2868 event->button, event->time);
2877 callbacks_update_layer_tree (
void)
2879 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2880 ((GtkTreeView *) screen.win.layerTree);
2883 GtkTreeSelection *selection;
2884 gint oldSelectedRow;
2886 if (screen.win.treeIsUpdating)
2889 screen.win.treeIsUpdating = TRUE;
2892 if (oldSelectedRow < 0)
2895 gtk_list_store_clear (list_store);
2898 GdkPixbuf *pixbuf, *blackPixbuf;
2899 unsigned char red, green, blue, alpha;
2908 red = (
unsigned char) (file->
color.red * 255 / G_MAXUINT16);
2909 green = (
unsigned char) (file->
color.green * 255 / G_MAXUINT16);
2910 blue = (
unsigned char) (file->
color.blue *255 / G_MAXUINT16);
2911 alpha = (
unsigned char) (file->
alpha * 255 / G_MAXUINT16);
2913 color = red*(256*256*256) + green*(256*256) + blue*256 + alpha;
2914 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2915 gdk_pixbuf_fill (pixbuf, color);
2917 blackPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2918 color = 100*(256*256*256) + 100*(256*256) + 100*256 + 150;
2919 gdk_pixbuf_fill (blackPixbuf, color);
2922 gdk_pixbuf_copy_area (pixbuf, 1, 1, 18, 13, blackPixbuf, 1, 1);
2923 g_object_unref(pixbuf);
2925 gtk_list_store_append (list_store, &iter);
2927 gchar startChar[2],*modifiedCode;
2931 gint numberOfModifications = 0;
2934 numberOfModifications++;
2939 numberOfModifications++;
2942 > GERBV_PRECISION_LINEAR_INCH
2944 > GERBV_PRECISION_LINEAR_INCH) {
2946 numberOfModifications++;
2949 > GERBV_PRECISION_LINEAR_INCH
2951 > GERBV_PRECISION_LINEAR_INCH) {
2953 numberOfModifications++;
2956 > GERBV_PRECISION_ANGLE_RAD) {
2958 numberOfModifications++;
2960 if (numberOfModifications > 1)
2962 if (numberOfModifications == 0)
2963 modifiedCode = g_strdup (
"");
2965 modifiedCode = g_strdup (startChar);
2972 layerName = g_strconcat (
"*",
"<i>", file->
name,
2976 layerName = g_strdup (file->
name);
2979 gtk_list_store_set (list_store, &iter,
2986 g_free (modifiedCode);
2988 g_object_unref(blackPixbuf);
2991 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
2996 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
2997 if (gtk_tree_model_iter_nth_child ((GtkTreeModel *) list_store,
2998 &iter, NULL, oldSelectedRow)) {
2999 gtk_tree_selection_select_iter (selection, &iter);
3003 gtk_widget_set_sensitive (screen.win.curLayerMenuItem, showItems);
3004 gtk_widget_set_sensitive (screen.win.curAnalyzeMenuItem, showItems);
3005 gtk_widget_set_sensitive (screen.win.curEditMenuItem, showItems);
3006 for (
unsigned int i = 0;
3007 i < G_N_ELEMENTS(screen.win.curFileMenuItem); i++) {
3008 gtk_widget_set_sensitive (screen.win.curFileMenuItem[i], showItems);
3010 screen.win.treeIsUpdating = FALSE;
3015 callbacks_display_object_properties_clicked (GtkButton *button, gpointer user_data)
3020 if (index < 0 || selection_length (&screen.selectionInfo) == 0) {
3022 _(
"Objects must be selected using the pointer tool "
3023 "before you can view the object properties."),
3028 for (i = 0; i < selection_length (&screen.selectionInfo); i++){
3029 gerbv_selection_item_t sItem =
3030 selection_get_item_by_index (&screen.selectionInfo, i);
3040 g_message (_(
"Object type: Polygon"));
3061 g_message (
"---------------------------------------");
3068 GdkPixmap *renderedPixmap = gdk_pixmap_new (NULL, renderInfo->
displayWidth,
3075 while( now - 30 < start) {
3077 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3078 gerbv_render_to_pixmap_using_gdk (
mainProject, renderedPixmap, renderInfo, NULL, NULL);
3080 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3082 g_message(_(
"FAST (=GDK) mode benchmark: %d redraws "
3083 "in %ld seconds (%g redraws/second)"),
3084 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3085 gdk_pixmap_unref(renderedPixmap);
3092 while( now - 30 < start) {
3094 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3095 cairo_surface_t *cSurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
3097 cairo_t *cairoTarget = cairo_create (cSurface);
3098 gerbv_render_all_layers_to_cairo_target (
mainProject, cairoTarget, renderInfo);
3099 cairo_destroy (cairoTarget);
3100 cairo_surface_destroy (cSurface);
3102 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3104 g_message(_(
"NORMAL (=Cairo) mode benchmark: %d redraws "
3105 "in %ld seconds (%g redraws/second)"),
3106 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3111 callbacks_benchmark_clicked (GtkButton *button, gpointer user_data)
3118 _(
"Application will be unresponsive for 1 minute! "
3119 "Run performance benchmark?"),
3120 FALSE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL))
3123 GERB_COMPILE_WARNING(_(
"Running full zoom benchmark..."));
3124 while (g_main_context_iteration(NULL, FALSE)) {}
3129 callbacks_support_benchmark (&renderInfo);
3131 GERB_COMPILE_WARNING(_(
"Running x5 zoom benchmark..."));
3132 while (g_main_context_iteration(NULL, FALSE)) {}
3140 callbacks_support_benchmark (&renderInfo);
3145 callbacks_edit_object_properties_clicked (GtkButton *button, gpointer user_data){
3149 callbacks_live_edit (GtkWidget *button, gpointer user_data){
3150 GtkDialog *toplevel = GTK_DIALOG(gtk_widget_get_toplevel (button));
3151 gtk_dialog_response(toplevel, GTK_RESPONSE_APPLY);
3155 callbacks_move_objects_clicked (GtkButton *button, gpointer user_data){
3157 gerbv_image_move_selected_objects (screen.selectionInfo.selectedNodeArray, -0.050, 0.050);
3158 callbacks_update_layer_tree();
3159 selection_clear (&screen.selectionInfo);
3160 update_selected_object_message (FALSE);
3161 render_refresh_rendered_image_on_screen ();
3166 callbacks_reduce_object_area_clicked (GtkButton *button, gpointer user_data){
3168 gerbv_image_reduce_area_of_selected_objects (screen.selectionInfo.selectedNodeArray, 0.20, 3, 3, 0.01);
3169 selection_clear (&screen.selectionInfo);
3170 update_selected_object_message (FALSE);
3171 render_refresh_rendered_image_on_screen ();
3176 callbacks_delete_objects_clicked (GtkButton *button, gpointer user_data)
3178 if (selection_length (&screen.selectionInfo) == 0) {
3180 _(
"No object is currently selected"),
3181 _(
"Objects must be selected using the pointer tool "
3182 "before they can be deleted."),
3194 _(
"Do you want to permanently delete "
3195 "the selected objects from <i>visible</i> layers?"),
3196 _(
"Gerbv currently has no undo function, so "
3197 "this action cannot be undone. This action "
3198 "will not change the saved file unless you "
3199 "save the file afterwards."),
3201 GTK_STOCK_DELETE, GTK_STOCK_CANCEL)) {
3207 for (i = 0; i < selection_length (&screen.selectionInfo);) {
3208 gerbv_selection_item_t sel_item =
3209 selection_get_item_by_index (&screen.selectionInfo, i);
3220 selection_clear_item_by_index (&screen.selectionInfo, i);
3223 update_selected_object_message (FALSE);
3225 render_refresh_rendered_image_on_screen ();
3226 callbacks_update_layer_tree();
3231 callbacks_drawingarea_configure_event (GtkWidget *widget, GdkEventConfigure *event)
3233 GdkDrawable *drawable = widget->window;
3239 int x_off=0, y_off=0;
3241 if (GDK_IS_WINDOW(widget->window)) {
3243 GdkWindow *window = GDK_WINDOW(widget->window);
3244 gdk_window_get_internal_paint_info (window, &drawable, &x_off, &y_off);
3246 if (screen.windowSurface)
3247 cairo_surface_destroy ((cairo_surface_t *)
3248 screen.windowSurface);
3250 #if defined(WIN32) || defined(QUARTZ)
3251 cairo_t *cairoTarget = gdk_cairo_create (GDK_WINDOW(widget->window));
3253 screen.windowSurface = cairo_get_target (cairoTarget);
3256 screen.windowSurface = cairo_surface_reference (screen.windowSurface);
3257 cairo_destroy (cairoTarget);
3259 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3260 screen.windowSurface = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3261 GDK_DRAWABLE_XID (drawable),
3262 GDK_VISUAL_XVISUAL (visual),
3271 render_refresh_rendered_image_on_screen();
3277 callbacks_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *event)
3280 GdkPixmap *new_pixmap;
3281 GdkGC *gc = gdk_gc_new(widget->window);
3286 new_pixmap = gdk_pixmap_new(widget->window,
3287 widget->allocation.width,
3288 widget->allocation.height,
3293 gdk_draw_rectangle(new_pixmap, gc, TRUE,
3294 event->area.x, event->area.y,
3295 event->area.width, event->area.height);
3301 if (screen.pixmap != NULL) {
3302 gdk_draw_pixmap(new_pixmap,
3303 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3305 event->area.x - screen.off_x,
3306 event->area.y - screen.off_y,
3307 event->area.x, event->area.y,
3308 event->area.width, event->area.height);
3314 gdk_draw_pixmap(widget->window,
3315 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3317 event->area.x, event->area.y,
3318 event->area.x, event->area.y,
3319 event->area.width, event->area.height);
3321 gdk_pixmap_unref(new_pixmap);
3327 if (screen.state == IN_ZOOM_OUTLINE) {
3328 render_draw_zoom_outline(screen.centered_outline_zoom);
3330 else if (screen.state == IN_MEASURE) {
3333 if (screen.tool == MEASURE && screen.state != IN_MEASURE) {
3342 int x_off=0, y_off=0;
3343 GdkDrawable *drawable = widget->window;
3345 if (GDK_IS_WINDOW(widget->window)) {
3347 GdkWindow *window = GDK_WINDOW(widget->window);
3348 gdk_window_get_internal_paint_info (window,
3349 &drawable, &x_off, &y_off);
3351 gdk_drawable_get_size (drawable, &width, &height);
3353 #if defined(WIN32) || defined(QUARTZ)
3355 cr = gdk_cairo_create (GDK_WINDOW(widget->window));
3357 cairo_surface_t *buffert;
3359 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3360 buffert = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3361 GDK_DRAWABLE_XID (drawable),
3362 GDK_VISUAL_XVISUAL (visual),
3363 event->area.width,
event->area.height);
3364 cr = cairo_create (buffert);
3366 cairo_translate (cr, -event->area.x + screen.off_x, -event->area.y + screen.off_y);
3367 render_project_to_cairo_target (cr);
3369 #if !defined(WIN32) && !defined(QUARTZ)
3370 cairo_surface_destroy (buffert);
3373 if (screen.tool == MEASURE)
3380 callbacks_screen2board(gdouble *X, gdouble *Y, gint x, gint y) {
3394 const char *gerbv_coords_pattern_mils_str = N_(
"%8.2f %8.2f");
3398 callbacks_update_statusbar_coordinates (gint x, gint y)
3402 callbacks_screen2board (&X, &Y, x, y);
3404 switch (screen.unit) {
3406 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3407 _(gerbv_coords_pattern_mils_str),
3408 COORD2MILS (X), COORD2MILS (Y));
3411 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3413 COORD2MMS (X), COORD2MMS (Y));
3416 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3418 COORD2INS (X), COORD2INS (Y));
3425 update_selected_object_message (gboolean userTriedToSelect)
3427 if (screen.tool != POINTER)
3430 gint selectionLength = selection_length (&screen.selectionInfo);
3432 if (selectionLength == 0) {
3433 if (userTriedToSelect) {
3436 gchar *str = g_new(gchar, MAX_DISTLEN);
3438 _(
"No object selected. Objects can "
3439 "only be selected in the active "
3442 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3446 utf8_strncpy(screen.statusbar.diststr,
3447 _(
"Click to select objects in the "
3448 "active layer. Middle click and drag "
3453 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3454 ngettext(
"%d object are currently selected",
3455 "%d objects are currently selected",
3456 selectionLength), selectionLength);
3464 callbacks_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
3467 GdkModifierType state;
3470 gdk_window_get_pointer (event->window, &x, &y, &state);
3474 state =
event->state;
3477 switch (screen.state) {
3479 if (screen.last_x != 0 || screen.last_y != 0) {
3481 screen.off_x += x - screen.last_x;
3482 screen.off_y += y - screen.last_y;
3486 callbacks_force_expose_event_for_screen ();
3487 callbacks_update_scrollbar_positions ();
3492 case IN_ZOOM_OUTLINE: {
3493 if (screen.last_x || screen.last_y)
3494 render_draw_zoom_outline(screen.centered_outline_zoom);
3497 render_draw_zoom_outline(screen.centered_outline_zoom);
3503 callbacks_screen2board(&(screen.measure_stop_x),
3504 &(screen.measure_stop_y), x, y);
3512 case IN_SELECTION_DRAG: {
3513 if (screen.last_x || screen.last_y)
3514 render_draw_selection_box_outline();
3517 render_draw_selection_box_outline();
3525 callbacks_update_statusbar_coordinates (x, y);
3526 callbacks_update_ruler_pointers ();
3532 callbacks_drawingarea_button_press_event (GtkWidget *widget, GdkEventButton *event)
3534 GdkWindow *drawing_area_window = screen.drawing_area->window;
3537 switch (event->button) {
3539 if (screen.tool == POINTER) {
3543 screen.state = IN_SELECTION_DRAG;
3544 screen.start_x =
event->x;
3545 screen.start_y =
event->y;
3547 else if (screen.tool == PAN) {
3549 screen.state = IN_MOVE;
3550 screen.last_x =
event->x;
3551 screen.last_y =
event->y;
3553 else if (screen.tool == ZOOM) {
3554 screen.state = IN_ZOOM_OUTLINE;
3556 screen.start_x =
event->x;
3557 screen.start_y =
event->y;
3558 screen.centered_outline_zoom =
event->state;
3560 else if (screen.tool == MEASURE) {
3561 screen.state = IN_MEASURE;
3562 callbacks_screen2board(&(screen.measure_start_x), &(screen.measure_start_y),
3563 event->x, event->y);
3564 screen.measure_stop_x = screen.measure_start_x;
3565 screen.measure_stop_y = screen.measure_start_y;
3567 callbacks_force_expose_event_for_screen ();
3571 screen.state = IN_MOVE;
3572 screen.last_x =
event->x;
3573 screen.last_y =
event->y;
3574 cursor = gdk_cursor_new(GDK_FLEUR);
3575 gdk_window_set_cursor(drawing_area_window, cursor);
3576 gdk_cursor_destroy(cursor);
3579 if (screen.tool == POINTER) {
3582 if (selection_length (&screen.selectionInfo) == 0) {
3585 (index <= mainProject->last_loaded) &&
3587 render_fill_selection_buffer_from_mouse_click(
3589 index, SELECTION_REPLACE);
3591 selection_clear (&screen.selectionInfo);
3592 update_selected_object_message (FALSE);
3593 render_refresh_rendered_image_on_screen ();
3598 if (selection_length (&screen.selectionInfo) != 0) {
3599 update_selected_object_message (TRUE);
3600 gtk_menu_popup(GTK_MENU(screen.win.drawWindowPopupMenu), NULL, NULL, NULL, NULL,
3601 event->button, event->time);
3606 screen.state = IN_ZOOM_OUTLINE;
3607 screen.start_x =
event->x;
3608 screen.start_y =
event->y;
3609 screen.centered_outline_zoom =
event->state & GDK_SHIFT_MASK;
3610 cursor = gdk_cursor_new(GDK_SIZING);
3611 gdk_window_set_cursor(drawing_area_window, cursor);
3612 gdk_cursor_destroy(cursor);
3616 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3619 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3624 callbacks_switch_to_correct_cursor ();
3632 GtkMenuItem **menu_items = (GtkMenuItem **) screen.win.curEditAlingItem;
3633 gerbv_selection_item_t si[2];
3634 int id[2] = {-1, -1};
3638 if (selection_length (sel_info) == 2) {
3639 si[0] = selection_get_item_by_index(sel_info, 0);
3640 si[1] = selection_get_item_by_index(sel_info, 1);
3643 if (f[i]->image == si[0].image)
3646 if (f[i]->image == si[1].image)
3651 if (
id[0]*
id[1] >= 0 &&
id[0] !=
id[1]) {
3657 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3658 id[0]+1, f[
id[0]]->name,
3659 id[1]+1, f[
id[1]]->name);
3660 gtk_menu_item_set_label (menu_items[0], str);
3663 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3664 id[1]+1, f[
id[1]]->name,
3665 id[0]+1, f[
id[0]]->name);
3666 gtk_menu_item_set_label (menu_items[1], str);
3669 gtk_widget_set_sensitive (
3670 screen.win.curEditAlingMenuItem, TRUE);
3677 gtk_widget_set_sensitive (screen.win.curEditAlingMenuItem, FALSE);
3678 gtk_menu_item_set_label (menu_items[0],
"");
3679 gtk_menu_item_set_label (menu_items[1],
"");
3688 GtkMenuItem *menu_item, gpointer user_data)
3691 gerbv_selection_item_t item[2];
3694 int align_second_to_first = GPOINTER_TO_INT(user_data);
3698 if (selection_length (sel_info) != 2)
3701 item[0] = selection_get_item_by_index(sel_info, 0);
3702 item[1] = selection_get_item_by_index(sel_info, 1);
3707 if (fi[0] == NULL || fi[1] == NULL || fi[0] == fi[1])
3711 for (i = 0; i < 2; i++) {
3730 x[i] = net->
cirseg->cp_x;
3731 y[i] = net->
cirseg->cp_y;
3734 GERB_COMPILE_ERROR (_(
"Can't align by this "
3740 GERB_COMPILE_ERROR (_(
"Can't align by this "
3749 if (align_second_to_first) {
3757 render_refresh_rendered_image_on_screen ();
3758 callbacks_update_layer_tree ();
3767 if (event->type != GDK_BUTTON_RELEASE)
3770 switch (screen.state) {
3774 render_refresh_rendered_image_on_screen ();
3775 callbacks_switch_to_normal_tool_cursor (screen.tool);
3778 case IN_ZOOM_OUTLINE:
3779 if ((event->state & GDK_SHIFT_MASK) != 0) {
3780 render_zoom_display (ZOOM_OUT_CMOUSE, 0,
3781 event->x, event->y);
3786 else if ((fabs(screen.start_x - event->x) < 4.0) &&
3787 (fabs(screen.start_y - event->y) < 4.0)) {
3788 render_zoom_display (ZOOM_IN_CMOUSE, 0,
3789 event->x, event->y);
3793 callbacks_switch_to_normal_tool_cursor (screen.tool);
3796 case IN_SELECTION_DRAG:
3802 enum selection_action sel_action = SELECTION_REPLACE;
3804 if (event->state & GDK_SHIFT_MASK)
3805 sel_action = SELECTION_ADD;
3806 else if (event->state & GDK_CONTROL_MASK)
3807 sel_action = SELECTION_TOGGLE;
3810 if ((fabs((
double)(screen.last_x - screen.start_x)) < 5)
3811 && (fabs((
double)(screen.last_y - screen.start_y)) < 5)) {
3812 render_fill_selection_buffer_from_mouse_click (
3813 event->x, event->y, index,
3816 render_fill_selection_buffer_from_mouse_drag (
3818 screen.start_x, screen.start_y,
3823 update_selected_object_message (TRUE);
3825 check_align_files_possibility (&screen.selectionInfo);
3827 render_refresh_rendered_image_on_screen ();
3834 screen.state = NORMAL;
3841 callbacks_window_key_press_event (GtkWidget *widget, GdkEventKey *event)
3843 switch (event->keyval) {
3845 if (screen.tool == POINTER) {
3846 selection_clear (&screen.selectionInfo);
3847 update_selected_object_message (FALSE);
3852 screen.state = NORMAL;
3853 render_refresh_rendered_image_on_screen();
3865 callbacks_window_key_release_event (GtkWidget *widget, GdkEventKey *event)
3873 callbacks_window_scroll_event(GtkWidget *widget, GdkEventScroll *event)
3875 switch (event->direction) {
3877 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3879 case GDK_SCROLL_DOWN:
3880 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3882 case GDK_SCROLL_LEFT:
3884 case GDK_SCROLL_RIGHT:
3903 if (GTK_IS_LABEL(screen.win.statusMessageLeft)) {
3904 gtk_label_set_text(GTK_LABEL(screen.win.statusMessageLeft), screen.statusbar.coordstr);
3906 if (GTK_IS_LABEL(screen.win.statusMessageRight)) {
3907 gtk_label_set_markup(GTK_LABEL(screen.win.statusMessageRight), screen.statusbar.diststr);
3913 callbacks_update_statusbar_measured_distance (gdouble dx, gdouble dy){
3914 gdouble delta = hypot(dx, dy);
3916 if (screen.unit == GERBV_MILS) {
3917 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3918 _(
"Measured distance: %8.2f mils (%8.2f x, %8.2f y)"),
3919 COORD2MILS(delta), COORD2MILS(dx), COORD2MILS(dy));
3921 else if (screen.unit == GERBV_MMS) {
3922 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3923 _(
"Measured distance: %8.3f mm (%8.3f x, %8.3f y)"),
3924 COORD2MMS(delta), COORD2MMS(dx), COORD2MMS(dy));
3927 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3928 _(
"Measured distance: %4.5f inches (%4.5f x, %4.5f y)"),
3929 COORD2INS(delta), COORD2INS(dx), COORD2INS(dy));
3936 callbacks_sidepane_render_type_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3939 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3941 if (type < 0 || type == screenRenderInfo.
renderType)
3945 callbacks_render_type_changed ();
3950 callbacks_viewmenu_rendertype_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3956 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3959 callbacks_render_type_changed ();
3964 callbacks_viewmenu_units_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3965 gerbv_gui_unit_t unit = GPOINTER_TO_INT(user_data);
3967 if (unit < 0 || unit == screen.unit)
3970 DPRINTF(
"%s(): unit = %d, screen.unit = %d\n", __FUNCTION__, unit, screen.unit);
3972 callbacks_units_changed (unit);
3977 callbacks_statusbar_unit_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3978 gerbv_gui_unit_t unit = gtk_combo_box_get_active (widget);
3979 int force_change = GPOINTER_TO_INT (user_data);
3981 if (!force_change && (unit < 0 || unit == screen.unit))
3984 callbacks_units_changed (unit);
3989 callbacks_clear_messages_button_clicked (GtkButton *button, gpointer user_data) {
3990 GtkTextBuffer *textbuffer;
3991 GtkTextIter start, end;
3993 screen.length_sum = 0;
3995 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
3996 gtk_text_buffer_get_start_iter(textbuffer, &start);
3997 gtk_text_buffer_get_end_iter(textbuffer, &end);
3998 gtk_text_buffer_delete (textbuffer, &start, &end);
4003 callbacks_handle_log_messages(
const gchar *log_domain, GLogLevelFlags log_level,
4004 const gchar *message, gpointer user_data)
4006 GtkTextBuffer *textbuffer = NULL;
4009 GtkTextMark *StartMark = NULL, *StopMark = NULL;
4010 GtkTextIter StartIter, StopIter;
4011 GtkWidget *dialog, *label;
4013 if (!screen.win.messageTextView)
4016 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
4019 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4023 StartMark = gtk_text_buffer_create_mark(textbuffer,
4024 "NewTextStart", &iter, TRUE);
4026 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4030 tag = gtk_text_buffer_create_tag(textbuffer,
"black_foreground",
4031 "foreground",
"black", NULL);
4032 tag = gtk_text_buffer_create_tag(textbuffer,
"blue_foreground",
4033 "foreground",
"blue", NULL);
4034 tag = gtk_text_buffer_create_tag(textbuffer,
"red_foreground",
4035 "foreground",
"red", NULL);
4036 tag = gtk_text_buffer_create_tag(textbuffer,
"darkred_foreground",
4037 "foreground",
"darkred", NULL);
4038 tag = gtk_text_buffer_create_tag(textbuffer,
"darkblue_foreground",
4039 "foreground",
"darkblue", NULL);
4040 tag = gtk_text_buffer_create_tag (textbuffer,
"darkgreen_foreground",
4041 "foreground",
"darkgreen", NULL);
4042 tag = gtk_text_buffer_create_tag (textbuffer,
4043 "saddlebrown_foreground",
4044 "foreground",
"saddlebrown", NULL);
4051 switch (log_level & G_LOG_LEVEL_MASK) {
4052 case G_LOG_LEVEL_ERROR:
4054 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4056 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4057 gtk_widget_show(screen.win.sidepane_notebook);
4059 case G_LOG_LEVEL_CRITICAL:
4060 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4062 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4063 gtk_widget_show(screen.win.sidepane_notebook);
4065 case G_LOG_LEVEL_WARNING:
4066 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4067 "darkred_foreground");
4068 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4069 gtk_widget_show(screen.win.sidepane_notebook);
4071 case G_LOG_LEVEL_MESSAGE:
4072 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4073 "darkblue_foreground");
4074 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4075 gtk_widget_show(screen.win.sidepane_notebook);
4077 case G_LOG_LEVEL_INFO:
4078 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4079 "darkgreen_foreground");
4081 case G_LOG_LEVEL_DEBUG:
4082 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4083 "saddlebrown_foreground");
4086 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table(textbuffer),
4087 "black_foreground");
4094 if (log_level & G_LOG_FLAG_FATAL) {
4095 fprintf(stderr, _(
"Fatal error: %s\n"), message);
4098 dialog = gtk_dialog_new_with_buttons(_(
"Fatal Error"),
4099 NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
4100 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
4102 label = gtk_label_new(g_strdup_printf(_(
"Fatal error: %s"), message));
4103 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4105 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
4106 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4107 gtk_label_new(_(
"\nGerbv will be closed now!")));
4109 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
4111 gtk_widget_show_all(dialog);
4112 gtk_dialog_run(GTK_DIALOG(dialog));
4115 gtk_text_buffer_insert(textbuffer, &iter, message, -1);
4116 gtk_text_buffer_insert(textbuffer, &iter,
"\n", -1);
4119 g_signal_emit_by_name(textbuffer,
"paste-done", NULL);
4121 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4123 StopMark = gtk_text_buffer_create_mark(textbuffer,
4124 "NewTextStop", &iter, TRUE);
4126 gtk_text_buffer_get_iter_at_mark(textbuffer, &StartIter, StartMark);
4127 gtk_text_buffer_get_iter_at_mark(textbuffer, &StopIter, StopMark);
4129 gtk_text_buffer_apply_tag(textbuffer, tag, &StartIter, &StopIter);
4133 void callbacks_force_expose_event_for_screen (
void)
4135 GdkRectangle update_rect;
4143 gdk_window_invalidate_rect (screen.drawing_area->window, &update_rect, FALSE);
4146 callbacks_update_ruler_scales ();
4147 callbacks_update_scrollbar_limits ();
4148 callbacks_update_scrollbar_positions ();
4151 static double screen_units(
double d)
4153 switch (screen.unit) {
4155 return COORD2INS(d);
4158 return COORD2MILS(d);
4161 return COORD2MMS(d);
4168 static const char *screen_units_str(
void)
4171 const char *units_str[] = {N_(
"mil"), N_(
"mm"), N_(
"in")};
4173 return _(units_str[screen.unit]);
4176 static double line_length(
double x0,
double y0,
double x1,
double y1)
4178 double dx = x0 - x1;
4179 double dy = y0 - y1;
4181 return hypot(dx, dy);
4184 static double arc_length(
double dia,
double angle)
4186 return M_PI*dia*(angle/360.0);
4189 static void aperture_state_report (
gerbv_net_t *net,
4194 gboolean show_length = FALSE;
4195 gboolean aperture_is_valid = FALSE;
4196 double x, y, len = 0;
4199 aperture_is_valid = TRUE;
4214 g_message (_(
"Object type: Line"));
4216 g_message (_(
"Object type: Slot (drilled)"));
4226 g_message (_(
"Object type: Arc"));
4227 len = arc_length(net->
cirseg->width,
4228 fabs(net->
cirseg->angle1 -
4234 g_message (_(
"Object type: Unknown"));
4239 g_message (_(
" Exposure: On"));
4241 if (aperture_is_valid) {
4253 g_message (_(
" Start: (%g, %g) %s"),
4256 screen_units_str());
4261 g_message (_(
" Stop: (%g, %g) %s"),
4264 screen_units_str());
4273 g_message (_(
" Center: (%g, %g) %s"),
4276 screen_units_str());
4278 x = net->
cirseg->width/2;
4281 g_message (_(
" Radius: %g %s"),
4283 screen_units_str());
4285 g_message (_(
" Angle: %g deg"),
4286 fabs(net->
cirseg->angle1 -
4288 g_message (_(
" Angles: (%g, %g) deg"),
4291 g_message (_(
" Direction: %s"),
4305 && aperture_is_valid
4307 double dia = aper->parameter[0];
4308 g_message (_(
" Slot length: %g %s"),
4309 screen_units(len + dia),
4310 screen_units_str());
4313 screen.length_sum += len;
4314 g_message (_(
" Length: %g (sum: %g) %s"),
4316 screen_units(screen.length_sum),
4317 screen_units_str());
4320 net_layer_file_report (net, img, prj);
4326 g_message (_(
"Object type: Flashed aperture"));
4328 g_message (_(
"Object type: Drill"));
4330 if (aperture_is_valid) {
4342 g_message (_(
" Location: (%g, %g) %s"),
4345 screen_units_str());
4347 net_layer_file_report (net, img, prj);
4354 aperture_report(gerbv_aperture_t *apertures[],
int aperture_num,
4358 double *params = apertures[aperture_num]->parameter;
4359 gerbv_simplified_amacro_t *sam = apertures[aperture_num]->simplified;
4361 g_message (_(
" Aperture used: D%d"), aperture_num);
4362 g_message (_(
" Aperture type: %s"),
4369 g_message (_(
" Diameter: %g %s"),
4370 screen_units(params[0]),
4371 screen_units_str());
4375 g_message (_(
" Dimensions: %gx%g %s"),
4376 screen_units(params[0]),
4377 screen_units(params[1]),
4378 screen_units_str());
4381 switch (sam->type) {
4383 g_message (_(
" Diameter: %g %s"),
4384 screen_units(sam->parameter[CIRCLE_DIAMETER]),
4385 screen_units_str());
4386 x += sam->parameter[CIRCLE_CENTER_X];
4387 y += sam->parameter[CIRCLE_CENTER_Y];
4389 g_message (_(
" Center: (%g, %g) %s"),
4390 screen_units(x), screen_units(y),
4391 screen_units_str());
4395 g_message (_(
" Number of points: %g"),
4396 sam->parameter[OUTLINE_NUMBER_OF_POINTS]);
4397 x += sam->parameter[OUTLINE_FIRST_X];
4398 y += sam->parameter[OUTLINE_FIRST_Y];
4400 g_message (_(
" Start: (%g, %g) %s"),
4401 screen_units(x), screen_units(y),
4402 screen_units_str());
4403 g_message (_(
" Rotation: %g deg"),
4404 sam->parameter[OUTLINE_ROTATION_IDX(sam->parameter)]);
4408 g_message (_(
" Number of points: %g"),
4409 sam->parameter[POLYGON_NUMBER_OF_POINTS]);
4410 g_message (_(
" Diameter: %g %s"),
4411 screen_units(sam->parameter[POLYGON_DIAMETER]),
4412 screen_units_str());
4413 x += sam->parameter[POLYGON_CENTER_X];
4414 y += sam->parameter[POLYGON_CENTER_Y];
4416 g_message (_(
" Center: (%g, %g) %s"),
4417 screen_units(x), screen_units(y),
4418 screen_units_str());
4419 g_message (_(
" Rotation: %g deg"),
4420 sam->parameter[POLYGON_ROTATION]);
4424 g_message (_(
" Outside diameter: %g %s"),
4425 screen_units(sam->parameter[MOIRE_OUTSIDE_DIAMETER]),
4426 screen_units_str());
4427 g_message (_(
" Ring thickness: %g %s"),
4428 screen_units(sam->parameter[MOIRE_CIRCLE_THICKNESS]),
4429 screen_units_str());
4430 g_message (_(
" Gap width: %g %s"),
4431 screen_units(sam->parameter[MOIRE_GAP_WIDTH]),
4432 screen_units_str());
4433 g_message (_(
" Number of rings: %g"),
4434 sam->parameter[MOIRE_NUMBER_OF_CIRCLES]);
4435 g_message (_(
" Crosshair thickness: %g %s"),
4437 sam->parameter[MOIRE_CROSSHAIR_THICKNESS]),
4438 screen_units_str());
4439 g_message (_(
" Crosshair length: %g %s"),
4440 screen_units(sam->parameter[MOIRE_CROSSHAIR_LENGTH]),
4441 screen_units_str());
4442 x += sam->parameter[MOIRE_CENTER_X];
4443 y += sam->parameter[MOIRE_CENTER_Y];
4445 g_message (_(
" Center: (%g, %g) %s"),
4446 screen_units(x), screen_units(y),
4447 screen_units_str());
4448 g_message (_(
" Rotation: %g deg"),
4449 sam->parameter[MOIRE_ROTATION]);
4453 g_message (_(
" Outside diameter: %g %s"),
4454 screen_units(sam->parameter[THERMAL_OUTSIDE_DIAMETER]),
4455 screen_units_str());
4456 g_message (_(
" Inside diameter: %g %s"),
4457 screen_units(sam->parameter[THERMAL_INSIDE_DIAMETER]),
4458 screen_units_str());
4459 g_message (_(
" Crosshair thickness: %g %s"),
4461 sam->parameter[THERMAL_CROSSHAIR_THICKNESS]),
4462 screen_units_str());
4463 x += sam->parameter[THERMAL_CENTER_X];
4464 y += sam->parameter[THERMAL_CENTER_Y];
4466 g_message (_(
" Center: (%g, %g) %s"),
4467 screen_units(x), screen_units(y),
4468 screen_units_str());
4469 g_message (_(
" Rotation: %g deg"),
4470 sam->parameter[THERMAL_ROTATION]);
4474 g_message (_(
" Width: %g %s"),
4475 screen_units(sam->parameter[LINE20_WIDTH]),
4476 screen_units_str());
4477 x += sam->parameter[LINE20_START_X];
4478 y += sam->parameter[LINE20_START_Y];
4480 g_message (_(
" Start: (%g, %g) %s"),
4481 screen_units(x), screen_units(y),
4482 screen_units_str());
4483 x += sam->parameter[LINE20_END_X];
4484 y += sam->parameter[LINE20_END_Y];
4486 g_message (_(
" Stop: (%g, %g) %s"),
4487 screen_units(x), screen_units(y),
4488 screen_units_str());
4489 g_message (_(
" Rotation: %g deg"),
4490 sam->parameter[LINE20_ROTATION]);
4494 g_message (_(
" Width: %g %s"),
4495 screen_units(sam->parameter[LINE21_WIDTH]),
4496 screen_units_str());
4497 g_message (_(
" Height: %g %s"),
4498 screen_units(sam->parameter[LINE21_HEIGHT]),
4499 screen_units_str());
4500 x += sam->parameter[LINE21_CENTER_X];
4501 y += sam->parameter[LINE21_CENTER_Y];
4503 g_message (_(
" Center: (%g, %g) %s"),
4504 screen_units(x), screen_units(y),
4505 screen_units_str());
4506 g_message (_(
" Rotation: %g deg"),
4507 sam->parameter[LINE21_ROTATION]);
4511 g_message (_(
" Width: %g %s"),
4512 screen_units(sam->parameter[LINE22_WIDTH]),
4513 screen_units_str());
4514 g_message (_(
" Height: %g %s"),
4515 screen_units(sam->parameter[LINE22_HEIGHT]),
4516 screen_units_str());
4517 x += sam->parameter[LINE22_LOWER_LEFT_X];
4518 y += sam->parameter[LINE22_LOWER_LEFT_Y];
4520 g_message (_(
" Lower left: (%g, %g) %s"),
4521 screen_units(x), screen_units(y),
4522 screen_units_str());
4523 g_message (_(
" Rotation: %g deg"),
4524 sam->parameter[LINE22_ROTATION]);
4537 static void drill_report(gerbv_aperture_t *apertures[],
int aperture_num)
4540 double *params = apertures[aperture_num]->parameter;
4542 g_message (_(
" Tool used: T%d"), aperture_num);
4544 g_message (_(
" Diameter: %g %s"),
4545 screen_units(params[0]),
4546 screen_units_str());
4567 g_message (_(
" Number of vertices: %u"), c - 1);
4583 g_message (_(
" Line from: (%g, %g) %s"),
4586 screen_units_str());
4592 g_message (_(
" Line to: (%g, %g) %s"),
4593 screen_units(x), screen_units(y),
4594 screen_units_str());
4603 g_message (_(
" Arc from: (%g, %g) %s"),
4604 screen_units(x), screen_units(y),
4605 screen_units_str());
4610 g_message (_(
" Arc to: (%g, %g) %s"),
4611 screen_units(x), screen_units(y),
4612 screen_units_str());
4617 g_message (_(
" Center: (%g, %g) %s"),
4618 screen_units(x), screen_units(y),
4619 screen_units_str());
4624 g_message (_(
" Radius: %g %s"),
4625 screen_units(x)/2, screen_units_str());
4627 g_message (_(
" Angle: %g deg"),
4629 g_message (_(
" Angles: (%g, %g) deg"),
4631 g_message (_(
" Direction: %s"),
4638 g_message(
" Skipping interpolation: %s",
4646 static void net_layer_file_report(
gerbv_net_t *net,
4650 if (net->
label != NULL)
4651 g_message (_(
" Net label: %s"), net->
label->str);
4655 g_message (_(
" Layer name: %s"), net->
layer->
name);
4660 g_message (_(
" In file: %s"), prj->
file[i]->
name);
4666 analyze_window_size_restore(GtkWidget *win)
4672 if (!screen.settings)
4675 var = g_settings_get_value (screen.settings,
"analyze-window-size");
4676 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4678 gtk_window_set_default_size (GTK_WINDOW (win), xy[0], xy[1]);
4679 g_variant_unref (var);
4681 var = g_settings_get_value (screen.settings,
"analyze-window-position");
4682 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4684 gtk_window_move (GTK_WINDOW (win), xy[0], xy[1]);
4685 g_variant_unref (var);
4690 analyze_window_size_store(GtkWidget *win, gpointer user_data)
4696 if (!screen.settings)
4699 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED &
4700 gdk_window_get_state (gtk_widget_get_window (win)));
4704 gtk_window_get_size (GTK_WINDOW (win), (gint *)xy, (gint *)(xy+1));
4705 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4706 xy, 2,
sizeof (xy[0]));
4707 g_settings_set_value (screen.settings,
"analyze-window-size", var);
4709 gtk_window_get_position (GTK_WINDOW (win),
4710 (gint *)xy, (gint *)(xy+1));
4711 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4712 xy, 2,
sizeof (xy[0]));
4713 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.