123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #include "globals.h"
- #include "local_proto.h"
- #include <grass/display.h>
- static int get_point2(double *, double *);
- static int keyboard(void);
- static int _keyboard(void);
- static int screen(int, int, int);
- static int digitizer(void);
- static int cancel(void);
- int mark(int x, int y, int button)
- {
- if (button != 1)
- return where(x, y);
- if (VIEW_MAP1->cell.configured && In_view(VIEW_MAP1, x, y))
- mark_point(VIEW_MAP1, x, y);
- else if (VIEW_MAP1_ZOOM->cell.configured && In_view(VIEW_MAP1_ZOOM, x, y))
- mark_point(VIEW_MAP1_ZOOM, x, y);
- return 0; /* return but don't quit */
- }
- int mark_point(View * view, int x, int y)
- {
- double e1, n1;
- double e2, n2;
- int row, col;
- char buf[100];
- /* convert x,y to east,north at center of cell */
- col = view_to_col(view, x);
- e1 = col_to_easting(&view->cell.head, col, 0.5);
- row = view_to_row(view, y);
- n1 = row_to_northing(&view->cell.head, row, 0.5);
- Curses_clear_window(MENU_WINDOW);
- sprintf(buf, "Point %d marked on image at", group.points.count + 1);
- Curses_write_window(MENU_WINDOW, 1, 1, buf);
- sprintf(buf, "East: %10.2f", e1);
- Curses_write_window(MENU_WINDOW, 3, 3, buf);
- sprintf(buf, "North: %10.2f", n1);
- Curses_write_window(MENU_WINDOW, 4, 3, buf);
- Curses_clear_window(INFO_WINDOW);
- R_standard_color(ORANGE);
- save_under_dot(x, y);
- dot(x, y);
- if (!get_point2(&e2, &n2)) {
- Curses_clear_window(MENU_WINDOW);
- restore_under_dot();
- }
- else {
- Curses_write_window(MENU_WINDOW, 7, 1, "Point located at");
- sprintf(buf, "East: %10.2f", e2);
- Curses_write_window(MENU_WINDOW, 9, 3, buf);
- sprintf(buf, "North: %10.2f", n2);
- Curses_write_window(MENU_WINDOW, 10, 3, buf);
- I_new_control_point(&group.points, e1, n1, e2, n2, 1);
- I_put_control_points(group.name, &group.points);
- Compute_equation();
- display_points(1);
- }
- release_under_dot();
- return 0;
- }
- static double N, E;
- static int get_point2(double *east, double *north)
- {
- int stat;
- static int use = 1;
- static Objects objects[] = {
- MENU("CANCEL", cancel, &use),
- INFO("Mark point on target image", &use),
- OTHER(screen, &use),
- {0}
- };
- if (from_digitizer > 0) {
- stat = Input_other(digitizer, "Digitizer");
- }
- else if (from_screen > 0) {
- set_colors(&VIEW_MAP2->cell.colors);
- stat = Input_pointer(objects) > 0;
- set_colors(&VIEW_MAP1->cell.colors);
- }
- else
- stat = Input_other(keyboard, "Keyboard");
- if (stat) {
- *east = E;
- *north = N;
- }
- return stat;
- }
- static int keyboard(void)
- {
- int ok;
- Curses_clear_window(INFO_WINDOW);
- ok = _keyboard();
- Curses_clear_window(INFO_WINDOW);
- return ok;
- }
- static int _keyboard(void)
- {
- char buf[100], buf1[100], buf2[100];
- while (1) {
- Curses_prompt_gets("Enter coordinates as east north: ", buf);
- G_strip(buf);
- if (*buf == 0) {
- return 0;
- }
- if (sscanf(buf, "%s %s", buf1, buf2) != 2) {
- Beep();
- continue;
- }
- /* scan for lat/lon string first as "123E 45S" passes the %lf test but is wrong */
- if (!(G_lon_scan(buf1, &E) && G_lat_scan(buf2, &N))) {
- if (sscanf(buf, "%lf %lf", &E, &N) != 2) {
- Beep();
- continue;
- }
- }
- Curses_clear_window(INFO_WINDOW);
- sprintf(buf, "East: %f\n", E);
- Curses_write_window(INFO_WINDOW, 2, 2, buf);
- sprintf(buf, "North: %f\n", N);
- Curses_write_window(INFO_WINDOW, 3, 2, buf);
- Curses_write_window(INFO_WINDOW, 5, 1, "Look ok? (y/n) ");
- while (1) {
- int c;
- c = Curses_getch(0);
- if (c == 'y' || c == 'Y')
- return 1;
- if (c == 'n' || c == 'N')
- break;
- Beep();
- }
- }
- return 0;
- }
- static int digitizer(void)
- {
- return digitizer_point(&E, &N);
- }
- static int screen(int x, int y, int button)
- {
- int row, col;
- char buf[50];
- View *view;
- if (In_view(VIEW_MAP2, x, y) && VIEW_MAP2->cell.configured)
- view = VIEW_MAP2;
- else if (In_view(VIEW_MAP2_ZOOM, x, y) && VIEW_MAP2_ZOOM->cell.configured)
- view = VIEW_MAP2_ZOOM;
- else
- return 0; /* ignore mouse event */
- col = view_to_col(view, x);
- E = col_to_easting(&view->cell.head, col, 0.5);
- row = view_to_row(view, y);
- N = row_to_northing(&view->cell.head, row, 0.5);
- if (button == 1)
- return 1;
- sprintf(buf, "East: %10.2f\n", E);
- Curses_write_window(INFO_WINDOW, 2, 2, buf);
- sprintf(buf, "North: %10.2f\n", N);
- Curses_write_window(INFO_WINDOW, 3, 2, buf);
- return 0;
- }
- static int cancel(void)
- {
- return -1;
- }
|