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);
1622 table_add_row(G_table,
"", stat->G_machine_only, _(
"machine-only G-codes (ignored)"));
1623 table_add_row(G_table,
"", stat->G_unknown, _(
"unknown G-codes"));
1625 table_set_sortable(G_table);
1626 gtk_container_add(GTK_CONTAINER(G_report_window), G_table->widget);
1629 GtkWidget *M_report_window = gtk_scrolled_window_new(NULL, NULL);
1630 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(M_report_window),
1631 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1633 struct table *M_table =
1634 table_new_with_columns(3, _(
"Code"), G_TYPE_STRING,
1635 pgettext(
"table",
"Count"), G_TYPE_UINT,
1636 _(
"Note"), G_TYPE_STRING);
1637 table_set_column_align(M_table, 0, 1.0);
1638 table_set_column_align(M_table, 1, 1.0);
1639 gtk_tree_view_set_headers_clickable(
1640 GTK_TREE_VIEW(M_table->widget), TRUE);
1658 table_add_row(M_table,
"", stat->M_machine_only, _(
"machine-only M-codes (ignored)"));
1659 table_add_row(M_table,
"", stat->M_unknown, _(
"unknown M-codes"));
1661 table_set_sortable(M_table);
1662 gtk_container_add(GTK_CONTAINER(M_report_window), M_table->widget);
1665 GtkWidget *misc_report_window = gtk_scrolled_window_new(NULL, NULL);
1666 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(misc_report_window),
1667 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1669 struct table *misc_table =
1670 table_new_with_columns(2,
1672 pgettext(
"table",
"Count"), G_TYPE_STRING,
1673 _(
"Code"), G_TYPE_STRING);
1674 table_set_column_align(misc_table, 0, 1.0);
1675 str = g_strdup_printf(
"%d", stat->comment);
1676 table_add_row(misc_table, str,_(
"Comments"));
1678 str = g_strdup_printf(
"%d", stat->unknown);
1679 table_add_row(misc_table, str, _(
"Unknown codes"));
1681 str = g_strdup_printf(
"%d", stat->R);
1682 table_add_row(misc_table, str, _(
"Repeat hole (R)"));
1684 if (stat->detect != NULL ) {
1685 table_add_row(misc_table,
"", stat->detect);
1688 table_set_sortable(misc_table);
1689 gtk_container_add(GTK_CONTAINER(misc_report_window),
1690 misc_table->widget);
1693 GtkWidget *drill_usage_report_window =
1694 gtk_scrolled_window_new(NULL, NULL);
1695 gtk_scrolled_window_set_policy(
1696 GTK_SCROLLED_WINDOW(drill_usage_report_window),
1697 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1699 struct table *drill_usage_table = table_new_with_columns(4,
1700 _(
"Drill no."), G_TYPE_UINT,
1701 _(
"Dia."), G_TYPE_DOUBLE,
1702 _(
"Units"), G_TYPE_STRING,
1703 pgettext(
"table",
"Count"), G_TYPE_UINT);
1705 table_set_column_align(drill_usage_table, 0, 1.0);
1706 table_set_column_align(drill_usage_table, 3, 1.0);
1707 gtk_tree_view_set_headers_clickable(
1708 GTK_TREE_VIEW(drill_usage_table->widget), TRUE);
1716 table_add_row(drill_usage_table,
1723 table_set_sortable(drill_usage_table);
1724 gtk_container_add(GTK_CONTAINER(drill_usage_report_window),
1725 drill_usage_table->widget);
1728 GtkWidget *analyze_active_drill;
1729 analyze_active_drill = gtk_dialog_new_with_buttons(
1730 _(
"Drill codes report on visible layers"),
1731 NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
1732 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
1733 gtk_container_set_border_width (GTK_CONTAINER (analyze_active_drill), 5);
1735 gtk_dialog_set_default_response (GTK_DIALOG(analyze_active_drill),
1736 GTK_RESPONSE_ACCEPT);
1737 g_signal_connect_after (G_OBJECT(analyze_active_drill),
1739 G_CALLBACK (gtk_widget_destroy),
1740 GTK_WIDGET(analyze_active_drill));
1743 GtkWidget *general_report_window =
1744 gtk_scrolled_window_new(NULL, NULL);
1745 gtk_scrolled_window_set_policy(
1746 GTK_SCROLLED_WINDOW(general_report_window),
1747 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1749 GtkWidget *vbox = gtk_vbox_new(0, 0);
1750 gtk_box_pack_start(GTK_BOX(vbox), general_label, 0, 0, 0);
1751 gtk_box_pack_start(GTK_BOX(vbox), general_table->widget, 0, 0, 0);
1752 gtk_scrolled_window_add_with_viewport(
1753 GTK_SCROLLED_WINDOW(general_report_window), vbox);
1756 GtkWidget *notebook = gtk_notebook_new();
1758 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1759 GTK_WIDGET(general_report_window),
1760 gtk_label_new(_(
"General")));
1762 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1763 GTK_WIDGET(G_report_window),
1764 gtk_label_new(_(
"G codes")));
1766 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1767 GTK_WIDGET(M_report_window),
1768 gtk_label_new(_(
"M codes")));
1770 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1771 GTK_WIDGET(misc_report_window),
1772 gtk_label_new(_(
"Misc. codes")));
1774 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1775 GTK_WIDGET(drill_usage_report_window),
1776 gtk_label_new(_(
"Drill usage")));
1779 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(analyze_active_drill)->vbox),
1780 GTK_WIDGET(notebook));
1782 if (screen.settings) {
1783 analyze_window_size_restore(analyze_active_drill);
1784 g_signal_connect (G_OBJECT(analyze_active_drill),
"response",
1785 G_CALLBACK (analyze_window_size_store),
1786 GTK_WIDGET(analyze_active_drill));
1788 gtk_window_set_default_size(GTK_WINDOW(analyze_active_drill),
1792 gtk_widget_show_all(analyze_active_drill);
1799 callbacks_control_gerber_options_activate (GtkMenuItem *menuitem,
1807 callbacks_online_manual_activate (GtkMenuItem *menuitem,
1824 gboolean layers_dirty = FALSE;
1834 _(
"Do you want to close all open layers and quit the program?"),
1835 _(
"Quitting the program will cause any unsaved changes "
1837 FALSE, NULL, GTK_STOCK_QUIT, GTK_STOCK_CANCEL)) {
1843 if (screen.settings && !screen.background_is_from_project) {
1847 clr = bg->red/257<<16 | bg->green/257<<8 | bg->blue/257;
1848 g_settings_set_uint (screen.settings,
"background-color", clr);
1852 if (screen.settings) {
1853 GtkWindow *win = GTK_WINDOW(screen.win.topLevelWindow);
1858 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED & gdk_window_get_state (
1859 gtk_widget_get_window (GTK_WIDGET(win))));
1860 g_settings_set_boolean (screen.settings,
"window-maximized", is_max);
1863 gtk_window_get_size (win, (gint *)xy, (gint *)(xy+1));
1864 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1866 g_settings_set_value (screen.settings,
"window-size", var);
1868 gtk_window_get_position (win, (gint *)xy, (gint *)(xy+1));
1869 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, xy, 2,
1871 g_settings_set_value (screen.settings,
"window-position", var);
1891 GtkWidget *aboutdialog1;
1893 gchar *translators = _(
"translator-credits");
1895 gchar *
string = g_strdup_printf(_(
1896 "Gerbv — a Gerber (RS-274/X) viewer\n"
1899 "Compiled on %s at %s\n"
1901 "Gerbv was originally developed as part of the gEDA Project "
1902 "but is now separately maintained.\n"
1904 "For more information see:\n"
1905 " gerbv homepage: https://gerbv.github.io/\n"
1906 " gerbv repository: https://github.com/gerbv/gerbv"),
1907 VERSION, __DATE__, __TIME__);
1909 #if GTK_CHECK_VERSION(2,6,0)
1910 gchar *license = g_strdup_printf(_(
1911 "Gerbv — a Gerber (RS-274/X) viewer\n"
1913 "Copyright (C) 2000—2007 Stefan Petersen\n"
1915 "This program is free software: you can redistribute it and/or modify\n"
1916 "it under the terms of the GNU General Public License as published by\n"
1917 "the Free Software Foundation, either version 2 of the License, or\n"
1918 "(at your option) any later version.\n"
1920 "This program is distributed in the hope that it will be useful,\n"
1921 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
1922 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
1923 "GNU General Public License for more details.\n\n"
1924 "You should have received a copy of the GNU General Public License\n"
1925 "along with this program. If not, see <http://www.gnu.org/licenses/>."));
1927 #include "authors.c"
1932 aboutdialog1 = gtk_about_dialog_new ();
1933 gtk_container_set_border_width (GTK_CONTAINER (aboutdialog1), 5);
1934 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (aboutdialog1), VERSION);
1935 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (aboutdialog1), _(
"Gerbv"));
1937 gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (aboutdialog1), translators);
1938 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (aboutdialog1),
string);
1939 gtk_about_dialog_set_license(GTK_ABOUT_DIALOG (aboutdialog1), license);
1942 a_size =
sizeof(authors_string_array)/
sizeof(authors_string_array[0]);
1943 a = g_new(gchar *, a_size);
1944 for (i = 0; i < a_size; i++)
1945 a[i] = _(authors_string_array[i]);
1947 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG (aboutdialog1), (
const gchar **)a);
1948 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG (aboutdialog1),
"https://gerbv.github.io/");
1951 g_signal_connect (G_OBJECT(aboutdialog1),
"response",
1952 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(aboutdialog1));
1957 aboutdialog1 = gtk_message_dialog_new ( GTK_WINDOW (screen.win.topLevelWindow),
1958 GTK_DIALOG_DESTROY_WITH_PARENT,
1964 gtk_window_set_title ( GTK_WINDOW (aboutdialog1), _(
"About Gerbv"));
1967 g_signal_connect_swapped (aboutdialog1,
"response",
1968 G_CALLBACK (gtk_widget_destroy),
1973 gtk_widget_show_all(GTK_WIDGET(aboutdialog1));
1991 GtkWidget *bugs_dialog = gtk_dialog_new_with_buttons(_(
"Known bugs in Gerbv"),
1993 GTK_DIALOG_DESTROY_WITH_PARENT,
1994 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1996 gtk_container_set_border_width (GTK_CONTAINER (bugs_dialog), 5);
1997 gtk_dialog_set_default_response (GTK_DIALOG(bugs_dialog),
1998 GTK_RESPONSE_ACCEPT);
1999 g_signal_connect (G_OBJECT(bugs_dialog),
"response",
2000 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET(bugs_dialog));
2003 GString *bugs_string = g_string_new(NULL);
2004 for (i=0; bugs_string_array[i] != NULL; i++) {
2006 g_string_append_printf(bugs_string,
"%s\n",
2007 (bugs_string_array[i][0] ==
'\0') ?
"" : _(bugs_string_array[i]));
2011 GtkWidget *bugs_label = gtk_label_new (bugs_string->str);
2012 g_string_free(bugs_string, TRUE);
2013 gtk_misc_set_alignment(GTK_MISC(bugs_label), 0, 0);
2014 gtk_misc_set_padding(GTK_MISC(bugs_label), 7, 7);
2017 GtkWidget *bugs_window = gtk_scrolled_window_new (NULL, NULL);
2018 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(bugs_window),
2019 GTK_WIDGET(bugs_label));
2020 gtk_widget_set_size_request(bugs_window, 600, 300);
2021 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(bugs_dialog)->vbox),
2022 GTK_WIDGET(bugs_window));
2024 gtk_widget_show_all(GTK_WIDGET(bugs_dialog));
2025 gtk_dialog_run(GTK_DIALOG(bugs_dialog));
2030 gdouble callbacks_calculate_actual_distance (gdouble inputDimension) {
2031 return screen_units(inputDimension);
2035 void callbacks_update_ruler_pointers (
void) {
2036 double xPosition, yPosition;
2040 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2041 xPosition = callbacks_calculate_actual_distance (xPosition);
2042 yPosition = callbacks_calculate_actual_distance (yPosition);
2044 g_object_set (G_OBJECT (screen.win.hRuler),
"position", xPosition, NULL);
2045 g_object_set (G_OBJECT (screen.win.vRuler),
"position", yPosition, NULL);
2050 callbacks_render_type_changed () {
2051 static gboolean isChanging = FALSE;
2057 GtkCheckMenuItem *check_item = screen.win.menu_view_render_group[type];
2058 DPRINTF(
"%s(): type = %d, check_item = %p\n", __FUNCTION__, type, check_item);
2059 gtk_check_menu_item_set_active (check_item, TRUE);
2060 gtk_combo_box_set_active (screen.win.sidepaneRenderComboBox, type);
2062 render_refresh_rendered_image_on_screen();
2068 callbacks_units_changed (gerbv_gui_unit_t unit)
2070 static gboolean isChanging = FALSE;
2078 if (unit == GERBV_MILS || unit == GERBV_MMS || unit == GERBV_INS) {
2079 gtk_combo_box_set_active (
2080 GTK_COMBO_BOX (screen.win.statusUnitComboBox),
2082 gtk_check_menu_item_set_active (
2083 screen.win.menu_view_unit_group[unit], TRUE);
2086 callbacks_update_ruler_scales ();
2087 callbacks_update_statusbar_coordinates (screen.last_x, screen.last_y);
2089 if (screen.tool == MEASURE)
2090 callbacks_update_statusbar_measured_distance (
2091 screen.measure_last_x,
2092 screen.measure_last_y);
2099 callbacks_update_ruler_scales (
void) {
2100 double xStart, xEnd, yStart, yEnd;
2109 if (!((screen.unit == GERBV_MILS) && ((screenRenderInfo.
scaleFactorX < 80)||(screenRenderInfo.
scaleFactorY < 80)))) {
2110 xStart = callbacks_calculate_actual_distance (xStart);
2111 xEnd = callbacks_calculate_actual_distance (xEnd);
2112 yStart = callbacks_calculate_actual_distance (yStart);
2113 yEnd = callbacks_calculate_actual_distance (yEnd);
2117 if (screen.win.hRuler)
2118 gtk_ruler_set_range (GTK_RULER (screen.win.hRuler), xStart, xEnd, 0, xEnd - xStart);
2120 if (screen.win.vRuler)
2121 gtk_ruler_set_range (GTK_RULER (screen.win.vRuler), yEnd, yStart, 0, yEnd - yStart);
2125 void callbacks_update_scrollbar_limits (
void){
2131 GtkAdjustment *hAdjust = (GtkAdjustment *)screen.win.hAdjustment;
2132 GtkAdjustment *vAdjust = (GtkAdjustment *)screen.win.vAdjustment;
2135 hAdjust->page_increment = hAdjust->page_size;
2136 hAdjust->step_increment = hAdjust->page_size / 10.0;
2138 vAdjust->page_increment = vAdjust->page_size;
2139 vAdjust->step_increment = vAdjust->page_size / 10.0;
2144 callbacks_update_scrollbar_positions ();
2148 void callbacks_update_scrollbar_positions (
void){
2149 gdouble positionX,positionY;
2152 if (positionX < ((GtkAdjustment *)screen.win.hAdjustment)->lower)
2153 positionX = ((GtkAdjustment *)screen.win.hAdjustment)->lower;
2154 if (positionX > (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size))
2155 positionX = (((GtkAdjustment *)screen.win.hAdjustment)->upper - ((GtkAdjustment *)screen.win.hAdjustment)->page_size);
2156 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.hAdjustment, positionX);
2158 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->upper - screenRenderInfo.
lowerLeftY -
2159 ((GtkAdjustment *)screen.win.vAdjustment)->page_size +
2160 ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2161 if (positionY < ((GtkAdjustment *)screen.win.vAdjustment)->lower)
2162 positionY = ((GtkAdjustment *)screen.win.vAdjustment)->lower;
2163 if (positionY > (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size))
2164 positionY = (((GtkAdjustment *)screen.win.vAdjustment)->upper - ((GtkAdjustment *)screen.win.vAdjustment)->page_size);
2165 gtk_adjustment_set_value ((GtkAdjustment *)screen.win.vAdjustment, positionY);
2170 callbacks_scrollbar_button_released (GtkWidget *widget, GdkEventButton *event){
2173 screen.state = NORMAL;
2174 render_refresh_rendered_image_on_screen();
2180 callbacks_scrollbar_button_pressed (GtkWidget *widget, GdkEventButton *event){
2182 screen.state = SCROLLBAR;
2187 void callbacks_hadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2190 if (screen.state == SCROLLBAR) {
2191 screenRenderInfo.
lowerLeftX = gtk_adjustment_get_value (adjustment);
2196 void callbacks_vadjustment_value_changed (GtkAdjustment *adjustment, gpointer user_data){
2199 if (screen.state == SCROLLBAR) {
2200 screenRenderInfo.
lowerLeftY = adjustment->upper -
2201 (gtk_adjustment_get_value (adjustment) + adjustment->page_size) + adjustment->lower;
2207 callbacks_layer_tree_visibility_toggled (gint index)
2212 callbacks_update_layer_tree ();
2214 render_refresh_rendered_image_on_screen ();
2216 render_recreate_composite_surface ();
2217 callbacks_force_expose_event_for_screen ();
2223 callbacks_get_col_num_from_tree_view_col (GtkTreeViewColumn *col)
2228 g_return_val_if_fail ( col != NULL, -1 );
2229 g_return_val_if_fail ( col->tree_view != NULL, -1 );
2230 cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view));
2231 num = g_list_index(cols, (gpointer) col);
2238 callbacks_add_layer_button_clicked (GtkButton *button, gpointer user_data)
2245 callbacks_unselect_all_tool_buttons (
void) {
2250 callbacks_switch_to_normal_tool_cursor (gint toolNumber)
2252 GdkWindow *drawing_area_window = screen.drawing_area->window;
2255 switch (toolNumber) {
2257 gdk_window_set_cursor(drawing_area_window, GERBV_DEF_CURSOR);
2260 cursor = gdk_cursor_new(GDK_FLEUR);
2261 gdk_window_set_cursor(drawing_area_window, cursor);
2262 gdk_cursor_destroy(cursor);
2265 cursor = gdk_cursor_new(GDK_SIZING);
2266 gdk_window_set_cursor(drawing_area_window, cursor);
2267 gdk_cursor_destroy(cursor);
2270 cursor = gdk_cursor_new(GDK_CROSSHAIR);
2271 gdk_window_set_cursor(drawing_area_window, cursor);
2272 gdk_cursor_destroy(cursor);
2281 callbacks_switch_to_correct_cursor (
void)
2283 GdkWindow *drawing_area_window = screen.drawing_area->window;
2286 if (screen.state == IN_MOVE) {
2287 cursor = gdk_cursor_new(GDK_FLEUR);
2288 gdk_window_set_cursor(drawing_area_window, cursor);
2289 gdk_cursor_destroy(cursor);
2292 else if (screen.state == IN_ZOOM_OUTLINE) {
2293 cursor = gdk_cursor_new(GDK_SIZING);
2294 gdk_window_set_cursor(drawing_area_window, cursor);
2295 gdk_cursor_destroy(cursor);
2298 callbacks_switch_to_normal_tool_cursor (screen.tool);
2303 callbacks_change_tool (GtkButton *button, gpointer user_data) {
2304 gint toolNumber = GPOINTER_TO_INT (user_data);
2307 if (screen.win.updatingTools)
2309 screen.win.updatingTools = TRUE;
2310 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), FALSE);
2311 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), FALSE);
2312 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), FALSE);
2313 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), FALSE);
2314 switch (toolNumber) {
2316 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPointer), TRUE);
2317 screen.tool = POINTER;
2318 screen.state = NORMAL;
2319 utf8_strncpy(screen.statusbar.diststr,
2320 _(
"Click to select objects in the active layer. "
2321 "Middle click and drag to pan."),
2325 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonPan), TRUE);
2327 screen.state = NORMAL;
2328 utf8_strncpy(screen.statusbar.diststr,
2329 _(
"Click and drag to pan. Right click and drag to zoom."),
2333 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonZoom), TRUE);
2335 screen.state = NORMAL;
2336 utf8_strncpy(screen.statusbar.diststr,
2337 _(
"Click and drag to zoom in. Shift+click to zoom out."),
2342 gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (screen.win.toolButtonMeasure), TRUE);
2343 screen.tool = MEASURE;
2344 screen.state = NORMAL;
2345 utf8_strncpy(screen.statusbar.diststr,
2346 _(
"Click and drag to measure a distance or select two apertures."),
2350 screen.measure_start_x = 0;
2351 screen.measure_start_y = 0;
2352 screen.measure_stop_x = 0;
2353 screen.measure_stop_y = 0;
2356 if (selection_length (&screen.selectionInfo) == 2) {
2357 gerbv_selection_item_t item[2];
2360 item[0] = selection_get_item_by_index(
2361 &screen.selectionInfo, 0);
2362 item[1] = selection_get_item_by_index(
2363 &screen.selectionInfo, 1);
2364 net[0] = item[0].net;
2365 net[1] = item[1].net;
2367 if ((net[0]->aperture_state ==
2368 net[1]->aperture_state)
2369 && (net[0]->aperture_state ==
2371 screen.measure_start_x = net[0]->
stop_x;
2372 screen.measure_start_y = net[0]->
stop_y;
2374 &screen.measure_start_x,
2375 &screen.measure_start_y,
2379 screen.measure_stop_x = net[1]->
stop_x;
2380 screen.measure_stop_y = net[1]->
stop_y;
2382 &screen.measure_stop_x,
2383 &screen.measure_stop_y,
2395 callbacks_switch_to_normal_tool_cursor (toolNumber);
2397 screen.win.updatingTools = FALSE;
2398 callbacks_force_expose_event_for_screen();
2403 callbacks_select_layer_row (gint rowIndex)
2405 GtkTreeSelection *selection;
2407 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2408 ((GtkTreeView *) screen.win.layerTree);
2410 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2412 if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list_store),
2413 &iter, NULL, rowIndex)) {
2414 gtk_tree_selection_select_iter (selection, &iter);
2427 GtkTreeSelection *selection;
2429 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2430 ((GtkTreeView *) screen.win.layerTree);
2434 selection = gtk_tree_view_get_selection((GtkTreeView *) screen.win.layerTree);
2435 if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
2436 while (gtk_tree_model_iter_nth_child ((GtkTreeModel *)list_store,
2438 if (gtk_tree_selection_iter_is_selected (selection, &iter)) {
2449 callbacks_remove_layer_button_clicked (GtkButton *button, gpointer user_data)
2453 if ((index >= 0) && (index <= mainProject->last_loaded)) {
2454 render_remove_selected_objects_belonging_to_layer (
2455 &screen.selectionInfo,
2457 update_selected_object_message (FALSE);
2460 callbacks_update_layer_tree ();
2462 index = MAX(0, index - 1);
2463 callbacks_select_layer_row (index);
2466 render_refresh_rendered_image_on_screen ();
2468 render_recreate_composite_surface ();
2469 callbacks_force_expose_event_for_screen ();
2476 callbacks_move_layer_down_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2477 callbacks_move_layer_down_button_clicked(NULL, NULL);
2478 gtk_widget_grab_focus (screen.win.layerTree);
2483 callbacks_move_layer_down_button_clicked (GtkButton *button, gpointer user_data) {
2486 show_no_layers_warning ();
2490 if (index < mainProject->last_loaded) {
2491 gerbv_change_layer_order (
mainProject, index, index + 1);
2492 callbacks_update_layer_tree ();
2493 callbacks_select_layer_row (index + 1);
2496 render_refresh_rendered_image_on_screen ();
2499 render_recreate_composite_surface ();
2500 callbacks_force_expose_event_for_screen ();
2507 callbacks_move_layer_up_menu_activate (GtkMenuItem *menuitem, gpointer user_data) {
2508 callbacks_move_layer_up_button_clicked (NULL, NULL);
2509 gtk_widget_grab_focus (screen.win.layerTree);
2514 callbacks_move_layer_up_button_clicked (GtkButton *button, gpointer user_data) {
2517 show_no_layers_warning ();
2521 gerbv_change_layer_order (
mainProject, index, index - 1);
2522 callbacks_update_layer_tree ();
2523 callbacks_select_layer_row (index - 1);
2525 render_refresh_rendered_image_on_screen();
2528 render_recreate_composite_surface ();
2529 callbacks_force_expose_event_for_screen ();
2535 void callbacks_layer_tree_row_inserted (GtkTreeModel *tree_model, GtkTreePath *path,
2536 GtkTreeIter *oIter, gpointer user_data) {
2537 gint *indices=NULL,oldPosition,newPosition;
2539 if ((!screen.win.treeIsUpdating)&&(path != NULL)) {
2540 indices = gtk_tree_path_get_indices (path);
2542 newPosition = indices[0];
2546 if (oldPosition < newPosition)
2550 gerbv_change_layer_order (
mainProject, oldPosition, newPosition);
2553 render_refresh_rendered_image_on_screen();
2556 render_recreate_composite_surface ();
2557 callbacks_force_expose_event_for_screen ();
2560 GtkTreeSelection *selection;
2562 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2563 ((GtkTreeView *) screen.win.layerTree);
2565 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
2566 if (gtk_tree_model_get_iter ((GtkTreeModel *)list_store, &iter, path))
2567 gtk_tree_selection_select_iter (selection, &iter);
2574 callbacks_show_color_picker_dialog (gint index){
2575 screen.win.colorSelectionDialog = NULL;
2576 GtkColorSelectionDialog *cs= (GtkColorSelectionDialog *) gtk_color_selection_dialog_new (_(
"Select a color"));
2577 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2579 screen.win.colorSelectionDialog = (GtkWidget *) cs;
2580 screen.win.colorSelectionIndex = index;
2586 gtk_color_selection_set_has_opacity_control (colorsel, TRUE);
2589 gtk_widget_show_all((GtkWidget *)cs);
2590 if (gtk_dialog_run ((GtkDialog*)cs) == GTK_RESPONSE_OK) {
2591 GtkColorSelection *colorsel = (GtkColorSelection *) cs->colorsel;
2592 gint rowIndex = screen.win.colorSelectionIndex;
2596 gdk_colormap_alloc_color(gdk_colormap_get_system(), &
mainProject->
file[rowIndex]->
color, FALSE, TRUE);
2606 callbacks_update_layer_tree ();
2607 render_refresh_rendered_image_on_screen();
2609 gtk_widget_destroy ((GtkWidget *)cs);
2610 screen.win.colorSelectionDialog = NULL;
2615 callbacks_invert_layer_clicked (GtkButton *button, gpointer user_data) {
2618 show_no_layers_warning ();
2622 render_refresh_rendered_image_on_screen ();
2623 callbacks_update_layer_tree ();
2628 callbacks_change_layer_color_clicked (GtkButton *button, gpointer user_data) {
2631 show_no_layers_warning ();
2634 callbacks_show_color_picker_dialog (index);
2638 callbacks_change_background_color_clicked (GtkButton *button, gpointer user_data) {
2639 callbacks_show_color_picker_dialog (-1);
2644 callbacks_reload_layer_clicked (GtkButton *button, gpointer user_data)
2649 show_no_layers_warning ();
2653 render_remove_selected_objects_belonging_to_layer (
2655 update_selected_object_message (FALSE);
2658 render_refresh_rendered_image_on_screen ();
2659 callbacks_update_layer_tree();
2663 callbacks_change_layer_edit_clicked (GtkButton *button, gpointer userData)
2671 show_no_layers_warning ();
2687 if (files[i] && files[i]->isVisible)
2692 transforms[j] = NULL;
2694 interface_show_layer_edit_dialog(transforms, screen.unit);
2695 g_free (transforms);
2696 render_refresh_rendered_image_on_screen ();
2697 callbacks_update_layer_tree ();
2702 callbacks_change_layer_format_clicked (GtkButton *button, gpointer user_data)
2704 gerbv_HID_Attribute *attr = NULL;
2707 gerbv_HID_Attr_Val * results = NULL;
2712 show_no_layers_warning ();
2715 DPRINTF(
"%s(): index = %d\n", __FUNCTION__, index);
2720 type = N_(
"Unknown type");
2722 if (attr == NULL || n == 0)
2725 _(
"Format editing is currently only supported for Excellon drill file formats."),
2731 DPRINTF(
"%s(): n = %d, attr = %p\n", __FUNCTION__, n, attr);
2736 _(
"This layer has changed!"),
2737 _(
"Editing the file type will reload the layer, "
2738 "destroying your changes. Click OK to edit "
2739 "the file type and destroy your changes, "
2740 "or Cancel to leave."),
2741 TRUE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL);
2742 if (rc == 0)
return;
2745 results = (gerbv_HID_Attr_Val *) malloc (n *
sizeof (gerbv_HID_Attr_Val));
2746 if (results == NULL)
2747 GERB_FATAL_ERROR(
"%s(): malloc failed", __FUNCTION__);
2750 if (attribute_interface_dialog (attr, n, results,
2751 _(
"Edit file format"),
2759 DPRINTF(
"%s(): reloading layer\n", __func__);
2762 for (i = 0; i < n; i++)
2764 if (results[i].str_value)
2765 free (results[i].str_value);
2770 render_refresh_rendered_image_on_screen();
2771 callbacks_update_layer_tree();
2776 callbacks_file_drop_event(GtkWidget *widget, GdkDragContext *dc,
2777 gint x, gint y, GtkSelectionData *data,
2778 guint info, guint time, gpointer p)
2780 gchar **uris, **uri;
2783 uris = gtk_selection_data_get_uris(data);
2787 for (uri = uris; *uri; uri++) {
2788 const char *prefix_str =
2794 if (g_strrstr(*uri, prefix_str) == *uri)
2795 fns = g_slist_append(fns, g_uri_unescape_string(
2796 *uri + strlen(prefix_str), NULL));
2800 g_slist_free_full(fns, g_free);
2808 callbacks_layer_tree_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
2812 if(event->keyval == GDK_space){
2815 GtkTreeViewColumn *col;
2819 tree = (GtkTreeView *) screen.win.layerTree;
2820 gtk_tree_view_get_cursor (tree, &path, &col);
2822 indices = gtk_tree_path_get_indices (path);
2824 idx = callbacks_get_col_num_from_tree_view_col (col);
2826 callbacks_show_color_picker_dialog (indices[0]);
2829 gtk_tree_path_free (path);
2838 callbacks_layer_tree_button_press (GtkWidget *widget, GdkEventButton *event,
2843 GtkTreeViewColumn *col;
2847 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model (
2848 (GtkTreeView *) screen.win.layerTree);
2850 if (event->button == 1) {
2851 if (gtk_tree_view_get_path_at_pos ((GtkTreeView *) widget,
2852 event->x, event->y, &path, &col, &x, &y)
2853 && gtk_tree_model_get_iter ((GtkTreeModel *)list_store,
2855 indices = gtk_tree_path_get_indices (path);
2857 switch (callbacks_get_col_num_from_tree_view_col (col)) {
2859 callbacks_select_layer_row (indices[0]);
2860 callbacks_layer_tree_visibility_toggled (indices[0]);
2863 callbacks_show_color_picker_dialog (indices[0]);
2873 gtk_menu_popup (GTK_MENU (screen.win.layerTreePopupMenu),
2874 NULL, NULL, NULL, NULL,
2875 event->button, event->time);
2884 callbacks_update_layer_tree (
void)
2886 GtkListStore *list_store = (GtkListStore *) gtk_tree_view_get_model
2887 ((GtkTreeView *) screen.win.layerTree);
2890 GtkTreeSelection *selection;
2891 gint oldSelectedRow;
2893 if (screen.win.treeIsUpdating)
2896 screen.win.treeIsUpdating = TRUE;
2899 if (oldSelectedRow < 0)
2902 gtk_list_store_clear (list_store);
2905 GdkPixbuf *pixbuf, *blackPixbuf;
2906 unsigned char red, green, blue, alpha;
2915 red = (
unsigned char) (file->
color.red * 255 / G_MAXUINT16);
2916 green = (
unsigned char) (file->
color.green * 255 / G_MAXUINT16);
2917 blue = (
unsigned char) (file->
color.blue *255 / G_MAXUINT16);
2918 alpha = (
unsigned char) (file->
alpha * 255 / G_MAXUINT16);
2920 color = red*(256*256*256) + green*(256*256) + blue*256 + alpha;
2921 pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2922 gdk_pixbuf_fill (pixbuf, color);
2924 blackPixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 20, 15);
2925 color = 100*(256*256*256) + 100*(256*256) + 100*256 + 150;
2926 gdk_pixbuf_fill (blackPixbuf, color);
2929 gdk_pixbuf_copy_area (pixbuf, 1, 1, 18, 13, blackPixbuf, 1, 1);
2930 g_object_unref(pixbuf);
2932 gtk_list_store_append (list_store, &iter);
2934 gchar startChar[2],*modifiedCode;
2938 gint numberOfModifications = 0;
2941 numberOfModifications++;
2946 numberOfModifications++;
2949 > GERBV_PRECISION_LINEAR_INCH
2951 > GERBV_PRECISION_LINEAR_INCH) {
2953 numberOfModifications++;
2956 > GERBV_PRECISION_LINEAR_INCH
2958 > GERBV_PRECISION_LINEAR_INCH) {
2960 numberOfModifications++;
2963 > GERBV_PRECISION_ANGLE_RAD) {
2965 numberOfModifications++;
2967 if (numberOfModifications > 1)
2969 if (numberOfModifications == 0)
2970 modifiedCode = g_strdup (
"");
2972 modifiedCode = g_strdup (startChar);
2979 layerName = g_strconcat (
"*",
"<i>", file->
name,
2983 layerName = g_strdup (file->
name);
2986 gtk_list_store_set (list_store, &iter,
2993 g_free (modifiedCode);
2995 g_object_unref(blackPixbuf);
2998 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(screen.win.layerTree));
3003 if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
3004 if (gtk_tree_model_iter_nth_child ((GtkTreeModel *) list_store,
3005 &iter, NULL, oldSelectedRow)) {
3006 gtk_tree_selection_select_iter (selection, &iter);
3010 gtk_widget_set_sensitive (screen.win.curLayerMenuItem, showItems);
3011 gtk_widget_set_sensitive (screen.win.curAnalyzeMenuItem, showItems);
3012 gtk_widget_set_sensitive (screen.win.curEditMenuItem, showItems);
3013 for (
unsigned int i = 0;
3014 i < G_N_ELEMENTS(screen.win.curFileMenuItem); i++) {
3015 gtk_widget_set_sensitive (screen.win.curFileMenuItem[i], showItems);
3017 screen.win.treeIsUpdating = FALSE;
3022 callbacks_display_object_properties_clicked (GtkButton *button, gpointer user_data)
3027 if (index < 0 || selection_length (&screen.selectionInfo) == 0) {
3029 _(
"Objects must be selected using the pointer tool "
3030 "before you can view the object properties."),
3035 for (i = 0; i < selection_length (&screen.selectionInfo); i++){
3036 gerbv_selection_item_t sItem =
3037 selection_get_item_by_index (&screen.selectionInfo, i);
3047 g_message (_(
"Object type: Polygon"));
3068 g_message (
"---------------------------------------");
3075 GdkPixmap *renderedPixmap = gdk_pixmap_new (NULL, renderInfo->
displayWidth,
3082 while( now - 30 < start) {
3084 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3085 gerbv_render_to_pixmap_using_gdk (
mainProject, renderedPixmap, renderInfo, NULL, NULL);
3087 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3089 g_message(_(
"FAST (=GDK) mode benchmark: %d redraws "
3090 "in %ld seconds (%g redraws/second)"),
3091 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3092 gdk_pixmap_unref(renderedPixmap);
3099 while( now - 30 < start) {
3101 DPRINTF(
"Benchmark(): Starting redraw #%d\n", i);
3102 cairo_surface_t *cSurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
3104 cairo_t *cairoTarget = cairo_create (cSurface);
3105 gerbv_render_all_layers_to_cairo_target (
mainProject, cairoTarget, renderInfo);
3106 cairo_destroy (cairoTarget);
3107 cairo_surface_destroy (cSurface);
3109 DPRINTF(
"Elapsed time = %ld seconds\n", (
long int) (now - start));
3111 g_message(_(
"NORMAL (=Cairo) mode benchmark: %d redraws "
3112 "in %ld seconds (%g redraws/second)"),
3113 i, (
long int) (now - start), (
double) i / (
double)(now - start));
3118 callbacks_benchmark_clicked (GtkButton *button, gpointer user_data)
3125 _(
"Application will be unresponsive for 1 minute! "
3126 "Run performance benchmark?"),
3127 FALSE, NULL, GTK_STOCK_OK, GTK_STOCK_CANCEL))
3130 GERB_COMPILE_WARNING(_(
"Running full zoom benchmark..."));
3131 while (g_main_context_iteration(NULL, FALSE)) {}
3136 callbacks_support_benchmark (&renderInfo);
3138 GERB_COMPILE_WARNING(_(
"Running x5 zoom benchmark..."));
3139 while (g_main_context_iteration(NULL, FALSE)) {}
3147 callbacks_support_benchmark (&renderInfo);
3152 callbacks_edit_object_properties_clicked (GtkButton *button, gpointer user_data){
3156 callbacks_live_edit (GtkWidget *button, gpointer user_data){
3157 GtkDialog *toplevel = GTK_DIALOG(gtk_widget_get_toplevel (button));
3158 gtk_dialog_response(toplevel, GTK_RESPONSE_APPLY);
3162 callbacks_move_objects_clicked (GtkButton *button, gpointer user_data){
3164 gerbv_image_move_selected_objects (screen.selectionInfo.selectedNodeArray, -0.050, 0.050);
3165 callbacks_update_layer_tree();
3166 selection_clear (&screen.selectionInfo);
3167 update_selected_object_message (FALSE);
3168 render_refresh_rendered_image_on_screen ();
3173 callbacks_reduce_object_area_clicked (GtkButton *button, gpointer user_data){
3175 gerbv_image_reduce_area_of_selected_objects (screen.selectionInfo.selectedNodeArray, 0.20, 3, 3, 0.01);
3176 selection_clear (&screen.selectionInfo);
3177 update_selected_object_message (FALSE);
3178 render_refresh_rendered_image_on_screen ();
3183 callbacks_delete_objects_clicked (GtkButton *button, gpointer user_data)
3185 if (selection_length (&screen.selectionInfo) == 0) {
3187 _(
"No object is currently selected"),
3188 _(
"Objects must be selected using the pointer tool "
3189 "before they can be deleted."),
3201 _(
"Do you want to permanently delete "
3202 "the selected objects from <i>visible</i> layers?"),
3203 _(
"Gerbv currently has no undo function, so "
3204 "this action cannot be undone. This action "
3205 "will not change the saved file unless you "
3206 "save the file afterwards."),
3208 GTK_STOCK_DELETE, GTK_STOCK_CANCEL)) {
3214 for (i = 0; i < selection_length (&screen.selectionInfo);) {
3215 gerbv_selection_item_t sel_item =
3216 selection_get_item_by_index (&screen.selectionInfo, i);
3227 selection_clear_item_by_index (&screen.selectionInfo, i);
3230 update_selected_object_message (FALSE);
3232 render_refresh_rendered_image_on_screen ();
3233 callbacks_update_layer_tree();
3238 callbacks_drawingarea_configure_event (GtkWidget *widget, GdkEventConfigure *event)
3240 GdkDrawable *drawable = widget->window;
3246 int x_off=0, y_off=0;
3248 if (GDK_IS_WINDOW(widget->window)) {
3250 GdkWindow *window = GDK_WINDOW(widget->window);
3251 gdk_window_get_internal_paint_info (window, &drawable, &x_off, &y_off);
3253 if (screen.windowSurface)
3254 cairo_surface_destroy ((cairo_surface_t *)
3255 screen.windowSurface);
3257 #if defined(WIN32) || defined(QUARTZ)
3258 cairo_t *cairoTarget = gdk_cairo_create (GDK_WINDOW(widget->window));
3260 screen.windowSurface = cairo_get_target (cairoTarget);
3263 screen.windowSurface = cairo_surface_reference (screen.windowSurface);
3264 cairo_destroy (cairoTarget);
3266 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3267 screen.windowSurface = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3268 GDK_DRAWABLE_XID (drawable),
3269 GDK_VISUAL_XVISUAL (visual),
3278 render_refresh_rendered_image_on_screen();
3284 callbacks_drawingarea_expose_event (GtkWidget *widget, GdkEventExpose *event)
3287 GdkPixmap *new_pixmap;
3288 GdkGC *gc = gdk_gc_new(widget->window);
3293 new_pixmap = gdk_pixmap_new(widget->window,
3294 widget->allocation.width,
3295 widget->allocation.height,
3300 gdk_draw_rectangle(new_pixmap, gc, TRUE,
3301 event->area.x, event->area.y,
3302 event->area.width, event->area.height);
3308 if (screen.pixmap != NULL) {
3309 gdk_draw_pixmap(new_pixmap,
3310 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3312 event->area.x - screen.off_x,
3313 event->area.y - screen.off_y,
3314 event->area.x, event->area.y,
3315 event->area.width, event->area.height);
3321 gdk_draw_pixmap(widget->window,
3322 widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
3324 event->area.x, event->area.y,
3325 event->area.x, event->area.y,
3326 event->area.width, event->area.height);
3328 gdk_pixmap_unref(new_pixmap);
3334 if (screen.state == IN_ZOOM_OUTLINE) {
3335 render_draw_zoom_outline(screen.centered_outline_zoom);
3337 else if (screen.state == IN_MEASURE) {
3340 if (screen.tool == MEASURE && screen.state != IN_MEASURE) {
3349 int x_off=0, y_off=0;
3350 GdkDrawable *drawable = widget->window;
3352 if (GDK_IS_WINDOW(widget->window)) {
3354 GdkWindow *window = GDK_WINDOW(widget->window);
3355 gdk_window_get_internal_paint_info (window,
3356 &drawable, &x_off, &y_off);
3358 gdk_drawable_get_size (drawable, &width, &height);
3360 #if defined(WIN32) || defined(QUARTZ)
3362 cr = gdk_cairo_create (GDK_WINDOW(widget->window));
3364 cairo_surface_t *buffert;
3366 GdkVisual *visual = gdk_drawable_get_visual (drawable);
3367 buffert = (gpointer) cairo_xlib_surface_create (GDK_DRAWABLE_XDISPLAY (drawable),
3368 GDK_DRAWABLE_XID (drawable),
3369 GDK_VISUAL_XVISUAL (visual),
3370 event->area.width,
event->area.height);
3371 cr = cairo_create (buffert);
3373 cairo_translate (cr, -event->area.x + screen.off_x, -event->area.y + screen.off_y);
3374 render_project_to_cairo_target (cr);
3376 #if !defined(WIN32) && !defined(QUARTZ)
3377 cairo_surface_destroy (buffert);
3380 if (screen.tool == MEASURE)
3387 callbacks_screen2board(gdouble *X, gdouble *Y, gint x, gint y) {
3401 const char *gerbv_coords_pattern_mils_str = N_(
"%8.2f %8.2f");
3405 callbacks_update_statusbar_coordinates (gint x, gint y)
3409 callbacks_screen2board (&X, &Y, x, y);
3411 switch (screen.unit) {
3413 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3414 _(gerbv_coords_pattern_mils_str),
3415 COORD2MILS (X), COORD2MILS (Y));
3418 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3420 COORD2MMS (X), COORD2MMS (Y));
3423 utf8_snprintf (screen.statusbar.coordstr, MAX_COORDLEN,
3425 COORD2INS (X), COORD2INS (Y));
3432 update_selected_object_message (gboolean userTriedToSelect)
3434 if (screen.tool != POINTER)
3437 gint selectionLength = selection_length (&screen.selectionInfo);
3439 if (selectionLength == 0) {
3440 if (userTriedToSelect) {
3443 gchar *str = g_new(gchar, MAX_DISTLEN);
3445 _(
"No object selected. Objects can "
3446 "only be selected in the active "
3449 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3453 utf8_strncpy(screen.statusbar.diststr,
3454 _(
"Click to select objects in the "
3455 "active layer. Middle click and drag "
3460 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3461 ngettext(
"%d object are currently selected",
3462 "%d objects are currently selected",
3463 selectionLength), selectionLength);
3471 callbacks_drawingarea_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
3474 GdkModifierType state;
3477 gdk_window_get_pointer (event->window, &x, &y, &state);
3481 state =
event->state;
3484 switch (screen.state) {
3486 if (screen.last_x != 0 || screen.last_y != 0) {
3488 screen.off_x += x - screen.last_x;
3489 screen.off_y += y - screen.last_y;
3493 callbacks_force_expose_event_for_screen ();
3494 callbacks_update_scrollbar_positions ();
3499 case IN_ZOOM_OUTLINE: {
3500 if (screen.last_x || screen.last_y)
3501 render_draw_zoom_outline(screen.centered_outline_zoom);
3504 render_draw_zoom_outline(screen.centered_outline_zoom);
3510 callbacks_screen2board(&(screen.measure_stop_x),
3511 &(screen.measure_stop_y), x, y);
3519 case IN_SELECTION_DRAG: {
3520 if (screen.last_x || screen.last_y)
3521 render_draw_selection_box_outline();
3524 render_draw_selection_box_outline();
3532 callbacks_update_statusbar_coordinates (x, y);
3533 callbacks_update_ruler_pointers ();
3539 callbacks_drawingarea_button_press_event (GtkWidget *widget, GdkEventButton *event)
3541 GdkWindow *drawing_area_window = screen.drawing_area->window;
3544 switch (event->button) {
3546 if (screen.tool == POINTER) {
3550 screen.state = IN_SELECTION_DRAG;
3551 screen.start_x =
event->x;
3552 screen.start_y =
event->y;
3554 else if (screen.tool == PAN) {
3556 screen.state = IN_MOVE;
3557 screen.last_x =
event->x;
3558 screen.last_y =
event->y;
3560 else if (screen.tool == ZOOM) {
3561 screen.state = IN_ZOOM_OUTLINE;
3563 screen.start_x =
event->x;
3564 screen.start_y =
event->y;
3565 screen.centered_outline_zoom =
event->state;
3567 else if (screen.tool == MEASURE) {
3568 screen.state = IN_MEASURE;
3569 callbacks_screen2board(&(screen.measure_start_x), &(screen.measure_start_y),
3570 event->x, event->y);
3571 screen.measure_stop_x = screen.measure_start_x;
3572 screen.measure_stop_y = screen.measure_start_y;
3574 callbacks_force_expose_event_for_screen ();
3578 screen.state = IN_MOVE;
3579 screen.last_x =
event->x;
3580 screen.last_y =
event->y;
3581 cursor = gdk_cursor_new(GDK_FLEUR);
3582 gdk_window_set_cursor(drawing_area_window, cursor);
3583 gdk_cursor_destroy(cursor);
3586 if (screen.tool == POINTER) {
3589 if (selection_length (&screen.selectionInfo) == 0) {
3592 (index <= mainProject->last_loaded) &&
3594 render_fill_selection_buffer_from_mouse_click(
3596 index, SELECTION_REPLACE);
3598 selection_clear (&screen.selectionInfo);
3599 update_selected_object_message (FALSE);
3600 render_refresh_rendered_image_on_screen ();
3605 if (selection_length (&screen.selectionInfo) != 0) {
3606 update_selected_object_message (TRUE);
3607 gtk_menu_popup(GTK_MENU(screen.win.drawWindowPopupMenu), NULL, NULL, NULL, NULL,
3608 event->button, event->time);
3613 screen.state = IN_ZOOM_OUTLINE;
3614 screen.start_x =
event->x;
3615 screen.start_y =
event->y;
3616 screen.centered_outline_zoom =
event->state & GDK_SHIFT_MASK;
3617 cursor = gdk_cursor_new(GDK_SIZING);
3618 gdk_window_set_cursor(drawing_area_window, cursor);
3619 gdk_cursor_destroy(cursor);
3623 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3626 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3631 callbacks_switch_to_correct_cursor ();
3639 GtkMenuItem **menu_items = (GtkMenuItem **) screen.win.curEditAlingItem;
3640 gerbv_selection_item_t si[2];
3641 int id[2] = {-1, -1};
3645 if (selection_length (sel_info) == 2) {
3646 si[0] = selection_get_item_by_index(sel_info, 0);
3647 si[1] = selection_get_item_by_index(sel_info, 1);
3650 if (f[i]->image == si[0].image)
3653 if (f[i]->image == si[1].image)
3658 if (
id[0]*
id[1] >= 0 &&
id[0] !=
id[1]) {
3664 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3665 id[0]+1, f[
id[0]]->name,
3666 id[1]+1, f[
id[1]]->name);
3667 gtk_menu_item_set_label (menu_items[0], str);
3670 str = g_strdup_printf (_(
"#_%i %s > #%i %s"),
3671 id[1]+1, f[
id[1]]->name,
3672 id[0]+1, f[
id[0]]->name);
3673 gtk_menu_item_set_label (menu_items[1], str);
3676 gtk_widget_set_sensitive (
3677 screen.win.curEditAlingMenuItem, TRUE);
3684 gtk_widget_set_sensitive (screen.win.curEditAlingMenuItem, FALSE);
3685 gtk_menu_item_set_label (menu_items[0],
"");
3686 gtk_menu_item_set_label (menu_items[1],
"");
3695 GtkMenuItem *menu_item, gpointer user_data)
3698 gerbv_selection_item_t item[2];
3701 int align_second_to_first = GPOINTER_TO_INT(user_data);
3705 if (selection_length (sel_info) != 2)
3708 item[0] = selection_get_item_by_index(sel_info, 0);
3709 item[1] = selection_get_item_by_index(sel_info, 1);
3714 if (fi[0] == NULL || fi[1] == NULL || fi[0] == fi[1])
3718 for (i = 0; i < 2; i++) {
3737 x[i] = net->
cirseg->cp_x;
3738 y[i] = net->
cirseg->cp_y;
3741 GERB_COMPILE_ERROR (_(
"Can't align by this "
3747 GERB_COMPILE_ERROR (_(
"Can't align by this "
3756 if (align_second_to_first) {
3764 render_refresh_rendered_image_on_screen ();
3765 callbacks_update_layer_tree ();
3774 if (event->type != GDK_BUTTON_RELEASE)
3777 switch (screen.state) {
3781 render_refresh_rendered_image_on_screen ();
3782 callbacks_switch_to_normal_tool_cursor (screen.tool);
3785 case IN_ZOOM_OUTLINE:
3786 if ((event->state & GDK_SHIFT_MASK) != 0) {
3787 render_zoom_display (ZOOM_OUT_CMOUSE, 0,
3788 event->x, event->y);
3793 else if ((fabs(screen.start_x - event->x) < 4.0) &&
3794 (fabs(screen.start_y - event->y) < 4.0)) {
3795 render_zoom_display (ZOOM_IN_CMOUSE, 0,
3796 event->x, event->y);
3800 callbacks_switch_to_normal_tool_cursor (screen.tool);
3803 case IN_SELECTION_DRAG:
3809 enum selection_action sel_action = SELECTION_REPLACE;
3811 if (event->state & GDK_SHIFT_MASK)
3812 sel_action = SELECTION_ADD;
3813 else if (event->state & GDK_CONTROL_MASK)
3814 sel_action = SELECTION_TOGGLE;
3817 if ((fabs((
double)(screen.last_x - screen.start_x)) < 5)
3818 && (fabs((
double)(screen.last_y - screen.start_y)) < 5)) {
3819 render_fill_selection_buffer_from_mouse_click (
3820 event->x, event->y, index,
3823 render_fill_selection_buffer_from_mouse_drag (
3825 screen.start_x, screen.start_y,
3830 update_selected_object_message (TRUE);
3832 check_align_files_possibility (&screen.selectionInfo);
3834 render_refresh_rendered_image_on_screen ();
3841 screen.state = NORMAL;
3848 callbacks_window_key_press_event (GtkWidget *widget, GdkEventKey *event)
3850 switch (event->keyval) {
3852 if (screen.tool == POINTER) {
3853 selection_clear (&screen.selectionInfo);
3854 update_selected_object_message (FALSE);
3859 screen.state = NORMAL;
3860 render_refresh_rendered_image_on_screen();
3872 callbacks_window_key_release_event (GtkWidget *widget, GdkEventKey *event)
3880 callbacks_window_scroll_event(GtkWidget *widget, GdkEventScroll *event)
3882 switch (event->direction) {
3884 render_zoom_display (ZOOM_IN_CMOUSE, 0, event->x, event->y);
3886 case GDK_SCROLL_DOWN:
3887 render_zoom_display (ZOOM_OUT_CMOUSE, 0, event->x, event->y);
3889 case GDK_SCROLL_LEFT:
3891 case GDK_SCROLL_RIGHT:
3910 if (GTK_IS_LABEL(screen.win.statusMessageLeft)) {
3911 gtk_label_set_text(GTK_LABEL(screen.win.statusMessageLeft), screen.statusbar.coordstr);
3913 if (GTK_IS_LABEL(screen.win.statusMessageRight)) {
3914 gtk_label_set_markup(GTK_LABEL(screen.win.statusMessageRight), screen.statusbar.diststr);
3920 callbacks_update_statusbar_measured_distance (gdouble dx, gdouble dy){
3921 gdouble delta = hypot(dx, dy);
3923 if (screen.unit == GERBV_MILS) {
3924 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3925 _(
"Measured distance: %8.2f mils (%8.2f x, %8.2f y)"),
3926 COORD2MILS(delta), COORD2MILS(dx), COORD2MILS(dy));
3928 else if (screen.unit == GERBV_MMS) {
3929 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3930 _(
"Measured distance: %8.3f mm (%8.3f x, %8.3f y)"),
3931 COORD2MMS(delta), COORD2MMS(dx), COORD2MMS(dy));
3934 utf8_snprintf(screen.statusbar.diststr, MAX_DISTLEN,
3935 _(
"Measured distance: %4.5f inches (%4.5f x, %4.5f y)"),
3936 COORD2INS(delta), COORD2INS(dx), COORD2INS(dy));
3943 callbacks_sidepane_render_type_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3946 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3948 if (type < 0 || type == screenRenderInfo.
renderType)
3952 callbacks_render_type_changed ();
3957 callbacks_viewmenu_rendertype_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3963 DPRINTF(
"%s(): type = %d\n", __FUNCTION__, type);
3966 callbacks_render_type_changed ();
3971 callbacks_viewmenu_units_changed (GtkCheckMenuItem *widget, gpointer user_data) {
3972 gerbv_gui_unit_t unit = GPOINTER_TO_INT(user_data);
3974 if (unit < 0 || unit == screen.unit)
3977 DPRINTF(
"%s(): unit = %d, screen.unit = %d\n", __FUNCTION__, unit, screen.unit);
3979 callbacks_units_changed (unit);
3984 callbacks_statusbar_unit_combo_box_changed (GtkComboBox *widget, gpointer user_data) {
3985 gerbv_gui_unit_t unit = gtk_combo_box_get_active (widget);
3986 int force_change = GPOINTER_TO_INT (user_data);
3988 if (!force_change && (unit < 0 || unit == screen.unit))
3991 callbacks_units_changed (unit);
3996 callbacks_clear_messages_button_clicked (GtkButton *button, gpointer user_data) {
3997 GtkTextBuffer *textbuffer;
3998 GtkTextIter start, end;
4000 screen.length_sum = 0;
4002 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
4003 gtk_text_buffer_get_start_iter(textbuffer, &start);
4004 gtk_text_buffer_get_end_iter(textbuffer, &end);
4005 gtk_text_buffer_delete (textbuffer, &start, &end);
4010 callbacks_handle_log_messages(
const gchar *log_domain, GLogLevelFlags log_level,
4011 const gchar *message, gpointer user_data)
4013 GtkTextBuffer *textbuffer = NULL;
4016 GtkTextMark *StartMark = NULL, *StopMark = NULL;
4017 GtkTextIter StartIter, StopIter;
4018 GtkWidget *dialog, *label;
4020 if (!screen.win.messageTextView)
4023 textbuffer = gtk_text_view_get_buffer((GtkTextView*)screen.win.messageTextView);
4026 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4030 StartMark = gtk_text_buffer_create_mark(textbuffer,
4031 "NewTextStart", &iter, TRUE);
4033 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4037 tag = gtk_text_buffer_create_tag(textbuffer,
"black_foreground",
4038 "foreground",
"black", NULL);
4039 tag = gtk_text_buffer_create_tag(textbuffer,
"blue_foreground",
4040 "foreground",
"blue", NULL);
4041 tag = gtk_text_buffer_create_tag(textbuffer,
"red_foreground",
4042 "foreground",
"red", NULL);
4043 tag = gtk_text_buffer_create_tag(textbuffer,
"darkred_foreground",
4044 "foreground",
"darkred", NULL);
4045 tag = gtk_text_buffer_create_tag(textbuffer,
"darkblue_foreground",
4046 "foreground",
"darkblue", NULL);
4047 tag = gtk_text_buffer_create_tag (textbuffer,
"darkgreen_foreground",
4048 "foreground",
"darkgreen", NULL);
4049 tag = gtk_text_buffer_create_tag (textbuffer,
4050 "saddlebrown_foreground",
4051 "foreground",
"saddlebrown", NULL);
4058 switch (log_level & G_LOG_LEVEL_MASK) {
4059 case G_LOG_LEVEL_ERROR:
4061 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4063 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4064 gtk_widget_show(screen.win.sidepane_notebook);
4066 case G_LOG_LEVEL_CRITICAL:
4067 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4069 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4070 gtk_widget_show(screen.win.sidepane_notebook);
4072 case G_LOG_LEVEL_WARNING:
4073 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4074 "darkred_foreground");
4075 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4076 gtk_widget_show(screen.win.sidepane_notebook);
4078 case G_LOG_LEVEL_MESSAGE:
4079 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4080 "darkblue_foreground");
4081 gtk_notebook_set_current_page(GTK_NOTEBOOK(screen.win.sidepane_notebook), 1);
4082 gtk_widget_show(screen.win.sidepane_notebook);
4084 case G_LOG_LEVEL_INFO:
4085 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4086 "darkgreen_foreground");
4088 case G_LOG_LEVEL_DEBUG:
4089 tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(textbuffer),
4090 "saddlebrown_foreground");
4093 tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table(textbuffer),
4094 "black_foreground");
4101 if (log_level & G_LOG_FLAG_FATAL) {
4102 fprintf(stderr, _(
"Fatal error: %s\n"), message);
4105 dialog = gtk_dialog_new_with_buttons(_(
"Fatal Error"),
4106 NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
4107 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
4109 label = gtk_label_new(g_strdup_printf(_(
"Fatal error: %s"), message));
4110 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4112 gtk_label_set_selectable(GTK_LABEL(label), TRUE);
4113 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
4114 gtk_label_new(_(
"\nGerbv will be closed now!")));
4116 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
4118 gtk_widget_show_all(dialog);
4119 gtk_dialog_run(GTK_DIALOG(dialog));
4122 gtk_text_buffer_insert(textbuffer, &iter, message, -1);
4123 gtk_text_buffer_insert(textbuffer, &iter,
"\n", -1);
4126 g_signal_emit_by_name(textbuffer,
"paste-done", NULL);
4128 gtk_text_buffer_get_end_iter(textbuffer, &iter);
4130 StopMark = gtk_text_buffer_create_mark(textbuffer,
4131 "NewTextStop", &iter, TRUE);
4133 gtk_text_buffer_get_iter_at_mark(textbuffer, &StartIter, StartMark);
4134 gtk_text_buffer_get_iter_at_mark(textbuffer, &StopIter, StopMark);
4136 gtk_text_buffer_apply_tag(textbuffer, tag, &StartIter, &StopIter);
4140 void callbacks_force_expose_event_for_screen (
void)
4142 GdkRectangle update_rect;
4150 gdk_window_invalidate_rect (screen.drawing_area->window, &update_rect, FALSE);
4153 callbacks_update_ruler_scales ();
4154 callbacks_update_scrollbar_limits ();
4155 callbacks_update_scrollbar_positions ();
4158 static double screen_units(
double d)
4160 switch (screen.unit) {
4162 return COORD2INS(d);
4165 return COORD2MILS(d);
4168 return COORD2MMS(d);
4175 static const char *screen_units_str(
void)
4178 const char *units_str[] = {N_(
"mil"), N_(
"mm"), N_(
"in")};
4180 return _(units_str[screen.unit]);
4183 static double line_length(
double x0,
double y0,
double x1,
double y1)
4185 double dx = x0 - x1;
4186 double dy = y0 - y1;
4188 return hypot(dx, dy);
4191 static double arc_length(
double dia,
double angle)
4193 return M_PI*dia*(angle/360.0);
4196 static void aperture_state_report (
gerbv_net_t *net,
4201 gboolean show_length = FALSE;
4202 gboolean aperture_is_valid = FALSE;
4203 double x, y, len = 0;
4206 aperture_is_valid = TRUE;
4221 g_message (_(
"Object type: Line"));
4223 g_message (_(
"Object type: Slot (drilled)"));
4233 g_message (_(
"Object type: Arc"));
4234 len = arc_length(net->
cirseg->width,
4235 fabs(net->
cirseg->angle1 -
4241 g_message (_(
"Object type: Unknown"));
4246 g_message (_(
" Exposure: On"));
4248 if (aperture_is_valid) {
4260 g_message (_(
" Start: (%g, %g) %s"),
4263 screen_units_str());
4268 g_message (_(
" Stop: (%g, %g) %s"),
4271 screen_units_str());
4280 g_message (_(
" Center: (%g, %g) %s"),
4283 screen_units_str());
4285 x = net->
cirseg->width/2;
4288 g_message (_(
" Radius: %g %s"),
4290 screen_units_str());
4292 g_message (_(
" Angle: %g deg"),
4293 fabs(net->
cirseg->angle1 -
4295 g_message (_(
" Angles: (%g, %g) deg"),
4298 g_message (_(
" Direction: %s"),
4312 && aperture_is_valid
4314 double dia = aper->parameter[0];
4315 g_message (_(
" Slot length: %g %s"),
4316 screen_units(len + dia),
4317 screen_units_str());
4320 screen.length_sum += len;
4321 g_message (_(
" Length: %g (sum: %g) %s"),
4323 screen_units(screen.length_sum),
4324 screen_units_str());
4327 net_layer_file_report (net, img, prj);
4333 g_message (_(
"Object type: Flashed aperture"));
4335 g_message (_(
"Object type: Drill"));
4337 if (aperture_is_valid) {
4349 g_message (_(
" Location: (%g, %g) %s"),
4352 screen_units_str());
4354 net_layer_file_report (net, img, prj);
4361 aperture_report(gerbv_aperture_t *apertures[],
int aperture_num,
4365 double *params = apertures[aperture_num]->parameter;
4366 gerbv_simplified_amacro_t *sam = apertures[aperture_num]->simplified;
4368 g_message (_(
" Aperture used: D%d"), aperture_num);
4369 g_message (_(
" Aperture type: %s"),
4376 g_message (_(
" Diameter: %g %s"),
4377 screen_units(params[0]),
4378 screen_units_str());
4382 g_message (_(
" Dimensions: %gx%g %s"),
4383 screen_units(params[0]),
4384 screen_units(params[1]),
4385 screen_units_str());
4388 switch (sam->type) {
4390 g_message (_(
" Diameter: %g %s"),
4391 screen_units(sam->parameter[CIRCLE_DIAMETER]),
4392 screen_units_str());
4393 x += sam->parameter[CIRCLE_CENTER_X];
4394 y += sam->parameter[CIRCLE_CENTER_Y];
4396 g_message (_(
" Center: (%g, %g) %s"),
4397 screen_units(x), screen_units(y),
4398 screen_units_str());
4402 g_message (_(
" Number of points: %g"),
4403 sam->parameter[OUTLINE_NUMBER_OF_POINTS]);
4404 x += sam->parameter[OUTLINE_FIRST_X];
4405 y += sam->parameter[OUTLINE_FIRST_Y];
4407 g_message (_(
" Start: (%g, %g) %s"),
4408 screen_units(x), screen_units(y),
4409 screen_units_str());
4410 g_message (_(
" Rotation: %g deg"),
4411 sam->parameter[OUTLINE_ROTATION_IDX(sam->parameter)]);
4415 g_message (_(
" Number of points: %g"),
4416 sam->parameter[POLYGON_NUMBER_OF_POINTS]);
4417 g_message (_(
" Diameter: %g %s"),
4418 screen_units(sam->parameter[POLYGON_DIAMETER]),
4419 screen_units_str());
4420 x += sam->parameter[POLYGON_CENTER_X];
4421 y += sam->parameter[POLYGON_CENTER_Y];
4423 g_message (_(
" Center: (%g, %g) %s"),
4424 screen_units(x), screen_units(y),
4425 screen_units_str());
4426 g_message (_(
" Rotation: %g deg"),
4427 sam->parameter[POLYGON_ROTATION]);
4431 g_message (_(
" Outside diameter: %g %s"),
4432 screen_units(sam->parameter[MOIRE_OUTSIDE_DIAMETER]),
4433 screen_units_str());
4434 g_message (_(
" Ring thickness: %g %s"),
4435 screen_units(sam->parameter[MOIRE_CIRCLE_THICKNESS]),
4436 screen_units_str());
4437 g_message (_(
" Gap width: %g %s"),
4438 screen_units(sam->parameter[MOIRE_GAP_WIDTH]),
4439 screen_units_str());
4440 g_message (_(
" Number of rings: %g"),
4441 sam->parameter[MOIRE_NUMBER_OF_CIRCLES]);
4442 g_message (_(
" Crosshair thickness: %g %s"),
4444 sam->parameter[MOIRE_CROSSHAIR_THICKNESS]),
4445 screen_units_str());
4446 g_message (_(
" Crosshair length: %g %s"),
4447 screen_units(sam->parameter[MOIRE_CROSSHAIR_LENGTH]),
4448 screen_units_str());
4449 x += sam->parameter[MOIRE_CENTER_X];
4450 y += sam->parameter[MOIRE_CENTER_Y];
4452 g_message (_(
" Center: (%g, %g) %s"),
4453 screen_units(x), screen_units(y),
4454 screen_units_str());
4455 g_message (_(
" Rotation: %g deg"),
4456 sam->parameter[MOIRE_ROTATION]);
4460 g_message (_(
" Outside diameter: %g %s"),
4461 screen_units(sam->parameter[THERMAL_OUTSIDE_DIAMETER]),
4462 screen_units_str());
4463 g_message (_(
" Inside diameter: %g %s"),
4464 screen_units(sam->parameter[THERMAL_INSIDE_DIAMETER]),
4465 screen_units_str());
4466 g_message (_(
" Crosshair thickness: %g %s"),
4468 sam->parameter[THERMAL_CROSSHAIR_THICKNESS]),
4469 screen_units_str());
4470 x += sam->parameter[THERMAL_CENTER_X];
4471 y += sam->parameter[THERMAL_CENTER_Y];
4473 g_message (_(
" Center: (%g, %g) %s"),
4474 screen_units(x), screen_units(y),
4475 screen_units_str());
4476 g_message (_(
" Rotation: %g deg"),
4477 sam->parameter[THERMAL_ROTATION]);
4481 g_message (_(
" Width: %g %s"),
4482 screen_units(sam->parameter[LINE20_WIDTH]),
4483 screen_units_str());
4484 x += sam->parameter[LINE20_START_X];
4485 y += sam->parameter[LINE20_START_Y];
4487 g_message (_(
" Start: (%g, %g) %s"),
4488 screen_units(x), screen_units(y),
4489 screen_units_str());
4490 x += sam->parameter[LINE20_END_X];
4491 y += sam->parameter[LINE20_END_Y];
4493 g_message (_(
" Stop: (%g, %g) %s"),
4494 screen_units(x), screen_units(y),
4495 screen_units_str());
4496 g_message (_(
" Rotation: %g deg"),
4497 sam->parameter[LINE20_ROTATION]);
4501 g_message (_(
" Width: %g %s"),
4502 screen_units(sam->parameter[LINE21_WIDTH]),
4503 screen_units_str());
4504 g_message (_(
" Height: %g %s"),
4505 screen_units(sam->parameter[LINE21_HEIGHT]),
4506 screen_units_str());
4507 x += sam->parameter[LINE21_CENTER_X];
4508 y += sam->parameter[LINE21_CENTER_Y];
4510 g_message (_(
" Center: (%g, %g) %s"),
4511 screen_units(x), screen_units(y),
4512 screen_units_str());
4513 g_message (_(
" Rotation: %g deg"),
4514 sam->parameter[LINE21_ROTATION]);
4518 g_message (_(
" Width: %g %s"),
4519 screen_units(sam->parameter[LINE22_WIDTH]),
4520 screen_units_str());
4521 g_message (_(
" Height: %g %s"),
4522 screen_units(sam->parameter[LINE22_HEIGHT]),
4523 screen_units_str());
4524 x += sam->parameter[LINE22_LOWER_LEFT_X];
4525 y += sam->parameter[LINE22_LOWER_LEFT_Y];
4527 g_message (_(
" Lower left: (%g, %g) %s"),
4528 screen_units(x), screen_units(y),
4529 screen_units_str());
4530 g_message (_(
" Rotation: %g deg"),
4531 sam->parameter[LINE22_ROTATION]);
4544 static void drill_report(gerbv_aperture_t *apertures[],
int aperture_num)
4547 double *params = apertures[aperture_num]->parameter;
4549 g_message (_(
" Tool used: T%d"), aperture_num);
4551 g_message (_(
" Diameter: %g %s"),
4552 screen_units(params[0]),
4553 screen_units_str());
4574 g_message (_(
" Number of vertices: %u"), c - 1);
4590 g_message (_(
" Line from: (%g, %g) %s"),
4593 screen_units_str());
4599 g_message (_(
" Line to: (%g, %g) %s"),
4600 screen_units(x), screen_units(y),
4601 screen_units_str());
4610 g_message (_(
" Arc from: (%g, %g) %s"),
4611 screen_units(x), screen_units(y),
4612 screen_units_str());
4617 g_message (_(
" Arc to: (%g, %g) %s"),
4618 screen_units(x), screen_units(y),
4619 screen_units_str());
4624 g_message (_(
" Center: (%g, %g) %s"),
4625 screen_units(x), screen_units(y),
4626 screen_units_str());
4631 g_message (_(
" Radius: %g %s"),
4632 screen_units(x)/2, screen_units_str());
4634 g_message (_(
" Angle: %g deg"),
4636 g_message (_(
" Angles: (%g, %g) deg"),
4638 g_message (_(
" Direction: %s"),
4645 g_message(
" Skipping interpolation: %s",
4653 static void net_layer_file_report(
gerbv_net_t *net,
4657 if (net->
label != NULL)
4658 g_message (_(
" Net label: %s"), net->
label->str);
4662 g_message (_(
" Layer name: %s"), net->
layer->
name);
4667 g_message (_(
" In file: %s"), prj->
file[i]->
name);
4673 analyze_window_size_restore(GtkWidget *win)
4679 if (!screen.settings)
4682 var = g_settings_get_value (screen.settings,
"analyze-window-size");
4683 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4685 gtk_window_set_default_size (GTK_WINDOW (win), xy[0], xy[1]);
4686 g_variant_unref (var);
4688 var = g_settings_get_value (screen.settings,
"analyze-window-position");
4689 xy = g_variant_get_fixed_array (var, &num,
sizeof (*xy));
4691 gtk_window_move (GTK_WINDOW (win), xy[0], xy[1]);
4692 g_variant_unref (var);
4697 analyze_window_size_store(GtkWidget *win, gpointer user_data)
4703 if (!screen.settings)
4706 is_max = FALSE != (GDK_WINDOW_STATE_MAXIMIZED &
4707 gdk_window_get_state (gtk_widget_get_window (win)));
4711 gtk_window_get_size (GTK_WINDOW (win), (gint *)xy, (gint *)(xy+1));
4712 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4713 xy, 2,
sizeof (xy[0]));
4714 g_settings_set_value (screen.settings,
"analyze-window-size", var);
4716 gtk_window_get_position (GTK_WINDOW (win),
4717 (gint *)xy, (gint *)(xy+1));
4718 var = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32,
4719 xy, 2,
sizeof (xy[0]));
4720 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.