25 static int get_bool(
const char *);
26 static void pr_winerr(
int,
const char *);
27 static void edge_sort(
float sides[4]);
28 static int read_old_format(
struct G_3dview *, FILE *);
30 static const int vers_major = 4;
31 static const int vers_minor = 1;
33 static int Suppress_warn = 0;
46 Suppress_warn =
b ? 0 : 1;
166 G_warning(
_(
"Unable to open %s for writing"), fname);
170 fprintf(fp,
"# %01d.%02d\n", vers_major, vers_minor);
171 fprintf(fp,
"PGM_ID: %s\n", View->
pgm_id);
174 fprintf(fp,
"north: %f\n", Win->
north);
175 fprintf(fp,
"south: %f\n", Win->
south);
176 fprintf(fp,
"east: %f\n", Win->
east);
177 fprintf(fp,
"west: %f\n", Win->
west);
178 fprintf(fp,
"rows: %d\n", Win->
rows);
179 fprintf(fp,
"cols: %d\n", Win->
cols);
182 fprintf(fp,
"north: %f\n", View->
vwin.
north);
183 fprintf(fp,
"south: %f\n", View->
vwin.
south);
184 fprintf(fp,
"east: %f\n", View->
vwin.
east);
185 fprintf(fp,
"west: %f\n", View->
vwin.
west);
186 fprintf(fp,
"rows: %d\n", View->
vwin.
rows);
187 fprintf(fp,
"cols: %d\n", View->
vwin.
cols);
190 fprintf(fp,
"TO_EASTING: %f\n", View->
from_to[1][0]);
191 fprintf(fp,
"TO_NORTHING: %f\n", View->
from_to[1][1]);
192 fprintf(fp,
"TO_HEIGHT: %f\n", View->
from_to[1][2]);
193 fprintf(fp,
"FROM_EASTING: %f\n", View->
from_to[0][0]);
194 fprintf(fp,
"FROM_NORTHING: %f\n", View->
from_to[0][1]);
195 fprintf(fp,
"FROM_HEIGHT: %f\n", View->
from_to[0][2]);
196 fprintf(fp,
"Z_EXAG: %f\n", View->
exag);
197 fprintf(fp,
"TWIST: %f\n", View->
twist);
198 fprintf(fp,
"FIELD_VIEW: %f\n", View->
fov);
199 fprintf(fp,
"MESH_FREQ: %d\n", View->
mesh_freq);
200 fprintf(fp,
"POLY_RES: %d\n", View->
poly_freq);
201 fprintf(fp,
"DOAVG: %d\n", View->
doavg);
203 fprintf(fp,
"DOZERO: %d\n", View->
dozero);
205 fprintf(fp,
"COLORGRID: %d\n", View->
colorgrid);
206 fprintf(fp,
"SHADING: %d\n", View->
shading);
207 fprintf(fp,
"FRINGE: %d\n", View->
fringe);
208 fprintf(fp,
"BG_COL: %s\n", View->
bg_col);
209 fprintf(fp,
"GRID_COL: %s\n", View->
grid_col);
210 fprintf(fp,
"OTHER_COL: %s\n", View->
other_col);
211 fprintf(fp,
"SURFACEONLY: %d\n", View->
surfonly);
212 fprintf(fp,
"LIGHTS_ON: %d\n", View->
lightson);
213 fprintf(fp,
"LIGHTPOS: %f %f %f %f\n", View->
lightpos[0], View->
lightpos[1],
217 fprintf(fp,
"LIGHTAMBIENT: %f\n", View->
ambient);
218 fprintf(fp,
"SHINE: %f\n", View->
shine);
243 char buffer[80], keystring[24], boo[8], nbuf[128], ebuf[128];
244 int lap, v_maj, v_min, wind_keys = 0, reqkeys = 0;
248 if (mapset !=
NULL) {
250 G_warning(
_(
"Unable to open %s for reading"), fname);
257 if (
NULL != fgets(buffer, 80, fp)) {
258 if (buffer[0] !=
'#') {
260 if (0 <= read_old_format(View, fp))
266 sscanf(buffer,
"#%d.%d\n", &v_maj, &v_min);
267 if (v_maj == vers_major && v_min == vers_minor)
272 while (
NULL != fgets(buffer, 75, fp)) {
273 if (buffer[0] !=
'#') {
275 sscanf(buffer,
"%[^:]:", keystring);
277 if (!strcmp(keystring,
"PGM_ID")) {
278 sscanf(buffer,
"%*s%s", (View->
pgm_id));
281 if (!strcmp(keystring,
"north")) {
282 sscanf(buffer,
"%*s%lf", &(View->
vwin.
north));
286 if (!strcmp(keystring,
"south")) {
287 sscanf(buffer,
"%*s%lf", &(View->
vwin.
south));
291 if (!strcmp(keystring,
"east")) {
292 sscanf(buffer,
"%*s%lf", &(View->
vwin.
east));
296 if (!strcmp(keystring,
"west")) {
297 sscanf(buffer,
"%*s%lf", &(View->
vwin.
west));
301 if (!strcmp(keystring,
"rows")) {
302 sscanf(buffer,
"%*s%d", &(View->
vwin.
rows));
306 if (!strcmp(keystring,
"cols")) {
307 sscanf(buffer,
"%*s%d", &(View->
vwin.
cols));
311 if (!strcmp(keystring,
"TO_EASTING")) {
312 sscanf(buffer,
"%*s%f", &(View->
from_to[1][0]));
316 if (!strcmp(keystring,
"TO_NORTHING")) {
317 sscanf(buffer,
"%*s%f", &(View->
from_to[1][1]));
321 if (!strcmp(keystring,
"TO_HEIGHT")) {
322 sscanf(buffer,
"%*s%f", &(View->
from_to[1][2]));
326 if (!strcmp(keystring,
"FROM_EASTING")) {
327 sscanf(buffer,
"%*s%f", &(View->
from_to[0][0]));
331 if (!strcmp(keystring,
"FROM_NORTHING")) {
332 sscanf(buffer,
"%*s%f", &(View->
from_to[0][1]));
336 if (!strcmp(keystring,
"FROM_HEIGHT")) {
337 sscanf(buffer,
"%*s%f", &(View->
from_to[0][2]));
341 if (!strcmp(keystring,
"Z_EXAG")) {
342 sscanf(buffer,
"%*s%f", &(View->
exag));
346 if (!strcmp(keystring,
"MESH_FREQ")) {
347 sscanf(buffer,
"%*s%d", &(View->
mesh_freq));
350 if (!strcmp(keystring,
"POLY_RES")) {
351 sscanf(buffer,
"%*s%d", &(View->
poly_freq));
354 if (!strcmp(keystring,
"DOAVG")) {
355 sscanf(buffer,
"%*s%d", &(View->
doavg));
358 if (!strcmp(keystring,
"FIELD_VIEW")) {
359 sscanf(buffer,
"%*s%f", &(View->
fov));
363 if (!strcmp(keystring,
"TWIST")) {
364 sscanf(buffer,
"%*s%f", &(View->
twist));
367 if (!strcmp(keystring,
"DISPLAY_TYPE")) {
371 if (!strcmp(keystring,
"DOZERO")) {
372 sscanf(buffer,
"%*s%s", boo);
373 View->
dozero = get_bool(boo);
376 if (!strcmp(keystring,
"COLORGRID")) {
377 sscanf(buffer,
"%*s%s", boo);
381 if (!strcmp(keystring,
"FRINGE")) {
382 sscanf(buffer,
"%*s%s", boo);
383 View->
fringe = get_bool(boo);
386 if (!strcmp(keystring,
"SHADING")) {
387 sscanf(buffer,
"%*s%s", boo);
391 if (!strcmp(keystring,
"BG_COL")) {
392 sscanf(buffer,
"%*s%s", View->
bg_col);
395 if (!strcmp(keystring,
"GRID_COL")) {
396 sscanf(buffer,
"%*s%s", View->
grid_col);
399 if (!strcmp(keystring,
"OTHER_COL")) {
400 sscanf(buffer,
"%*s%s", View->
other_col);
403 if (!strcmp(keystring,
"SURFACEONLY")) {
404 sscanf(buffer,
"%*s%s", boo);
408 if (!strcmp(keystring,
"LIGHTS_ON")) {
409 sscanf(buffer,
"%*s%s", boo);
413 if (!strcmp(keystring,
"LIGHTPOS")) {
414 sscanf(buffer,
"%*s%f%f%f%f", &(View->
lightpos[0]),
419 if (!strcmp(keystring,
"LIGHTCOL")) {
420 sscanf(buffer,
"%*s%f%f%f", &(View->
lightcol[0]),
424 if (!strcmp(keystring,
"LIGHTAMBIENT")) {
425 sscanf(buffer,
"%*s%f", &(View->
ambient));
428 if (!strcmp(keystring,
"SHINE")) {
429 sscanf(buffer,
"%*s%f", &(View->
shine));
441 if (wind_keys == 6) {
450 if (!Suppress_warn) {
451 if (95 > (lap = compare_wind(&(View->
vwin), &curwin))) {
453 fprintf(stderr,
_(
"GRASS window when view was saved:\n"));
455 fprintf(stderr,
"north: %s\n", nbuf);
457 fprintf(stderr,
"south: %s\n", nbuf);
459 fprintf(stderr,
"east: %s\n", ebuf);
461 fprintf(stderr,
"west: %s\n", ebuf);
462 pr_winerr(lap, fname);
467 G_warning(
_(
"Unable to open %s for reading"), fname);
479 static int compare_wind(
const struct Cell_head *savedwin,
482 float e_ings[4], n_ings[4], area_lap, area_saved;
496 e_ings[0] = savedwin->
west;
497 e_ings[1] = savedwin->
east;
498 e_ings[2] = curwin->
west;
499 e_ings[3] = curwin->
east;
502 n_ings[0] = savedwin->
south;
503 n_ings[1] = savedwin->
north;
504 n_ings[2] = curwin->
south;
505 n_ings[3] = curwin->
north;
508 area_lap = (e_ings[2] - e_ings[1]) * (n_ings[2] - n_ings[1]);
512 return ((
int)(area_lap * 100.0 / area_saved));
515 static int get_bool(
const char *str)
517 if (str[0] ==
'y' || str[0] ==
'Y')
519 if (str[0] ==
'n' || str[0] ==
'N')
522 return (atoi(str) ? 1 : 0);
527 const char *viewname)
531 G_warning(
_(
" Window saved in \"%s\" is completely outside of current "
536 G_warning(
_(
" Only %d%% of window saved in \"%s\" overlaps with "
537 "current GRASS window."),
546 static void edge_sort(
float sides[4])
551 for (i = 0; i < 4; ++i) {
552 for (j = i + 1; j < 4; ++j) {
553 if (sides[j] < sides[i]) {
562 static int read_old_format(
struct G_3dview *v, FILE *fp)
570 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[1][0])))
572 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[1][1])))
574 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[1][2])))
576 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[0][0])))
578 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[0][1])))
580 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
from_to[0][2])))
582 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
exag)))
584 sscanf(fgets(buffer, 80, fp),
"%d", &(v->
mesh_freq));
585 if (1 == sscanf(fgets(buffer, 80, fp),
"%f", &(v->
fov)))
587 if (1 == sscanf(fgets(buffer, 80, fp),
"%lf", &td)) {
593 sscanf(fgets(buffer, 80, fp),
"%s", boo);
595 sscanf(fgets(buffer, 80, fp),
"%s", boo);
596 v->
dozero = get_bool(boo);
597 sscanf(fgets(buffer, 80, fp),
"%s", v->
grid_col);
601 sscanf(fgets(buffer, 80, fp),
"%s", v->
other_col);
602 sscanf(fgets(buffer, 80, fp),
"%s", v->
bg_col);
603 sscanf(fgets(buffer, 80, fp),
"%s", boo);
604 v->
doavg = get_bool(boo);
FILE * G_fopen_old(const char *, const char *, const char *)
Open a database file for reading.
const char * G_find_file2(const char *, const char *, const char *)
Searches for a file from the mapset search list or in a specified mapset. (look but don't touch)
void G_warning(const char *,...) __attribute__((format(printf
void G_get_set_window(struct Cell_head *)
Get the current working window (region)
void G_format_easting(double, char *, int)
Easting to ASCII.
FILE * G_fopen_new(const char *, const char *)
Open a new database file.
int G_projection(void)
Query cartographic projection.
void G_format_northing(double, char *, int)
Northing to ASCII.
2D/3D raster map header (used also for region)
double ew_res
Resolution - east to west cell size for 2D data.
double north
Extent coordinates (north)
int compressed
Compression mode (raster header only)
int format
Max number of bytes per raster data value minus 1 (raster header only)
int zone
Projection zone (UTM)
double east
Extent coordinates (east)
double ns_res
Resolution - north to south cell size for 2D data.
int rows
Number of rows for 2D data.
int cols
Number of columns for 2D data.
double south
Extent coordinates (south)
double west
Extent coordinates (west)
int G_get_3dview(const char *fname, const char *mapset, struct G_3dview *View)
Gets a 3D View.
void G_3dview_warning(int b)
Turns 3D View warnings on and off.
int G_get_3dview_defaults(struct G_3dview *v, struct Cell_head *w)
Sets default for v based on w.
int G_put_3dview(const char *fname, const struct G_3dview *View, const struct Cell_head *Win)
Saves info to a 3d.view file in the current mapset.