GRASS GIS 8 Programmer's Manual  8.4.0dev(2024)-112dd97adf
get_window.c
Go to the documentation of this file.
1 /*!
2  \file lib/gis/get_window.c
3 
4  \brief GIS Library - Get window (i.e. GRASS region)
5 
6  (C) 2001-2009, 2011 by the GRASS Development Team
7 
8  This program is free software under the GNU General Public License
9  (>=v2). Read the file COPYING that comes with GRASS for details.
10 
11  \author Original author CERL
12  */
13 
14 #include <stdlib.h>
15 
16 #include <grass/gis.h>
17 #include <grass/glocale.h>
18 
19 #include "G.h"
20 #include "gis_local_proto.h"
21 
22 static struct state {
23  int initialized;
24  struct Cell_head dbwindow;
25 } state;
26 
27 static struct state *st = &state;
28 
29 /*!
30  \brief Get the current region
31 
32  Reads the region as stored in the WIND file in the user's current
33  mapset into region.
34 
35  3D values are set to defaults if not available in WIND file. An
36  error message is printed and exit() is called if there is a problem
37  reading the region.
38 
39  <b>Note:</b> GRASS applications that read or write raster maps
40  should not use this routine since its use implies that the active
41  module region will not be used. Programs that read or write raster
42  map data (or vector data) can query the active module region using
43  Rast_window_rows() and Rast_window_cols().
44 
45  \param[out] window pointer to Cell_head
46  */
47 void G_get_window(struct Cell_head *window)
48 {
49  const char *regvar;
50 
51  if (G_is_initialized(&st->initialized)) {
52  *window = st->dbwindow;
53  return;
54  }
55 
56  /* Optionally read the region from environment variable */
57  regvar = getenv("GRASS_REGION");
58 
59  if (regvar) {
60  char **tokens = G_tokenize(regvar, ";");
61 
62  G__read_Cell_head_array(tokens, &st->dbwindow);
63  G_free_tokens(tokens);
64  }
65  else {
66  char *wind = getenv("WIND_OVERRIDE");
67 
68  if (wind)
69  G_get_element_window(&st->dbwindow, "windows", wind, G_mapset());
70  else
71  G_get_element_window(&st->dbwindow, "", "WIND", G_mapset());
72  }
73 
74  *window = st->dbwindow;
75 
76  if (!G__.window_set) {
77  G__.window_set = 1;
78  G__.window = st->dbwindow;
79  }
80 
81  G_initialize_done(&st->initialized);
82 }
83 
84 /*!
85  \brief Get the default region
86 
87  Reads the default region for the location into <i>region.</i> 3D
88  values are set to defaults if not available in WIND file.
89 
90  An error message is printed and exit() is called if there is a
91  problem reading the default region.
92 
93  \param[out] window pointer to Cell_head
94  */
95 void G_get_default_window(struct Cell_head *window)
96 {
97  G_get_element_window(window, "", "DEFAULT_WIND", "PERMANENT");
98 }
99 
100 /*!
101  \brief Get region for selected element (raster, vector, window, etc.)
102 
103  G_fatal_error() is called on error
104 
105  \param[out] window pointer to Cell_head
106  \param element element type
107  \param name element name
108  \param mapset mapset name
109  */
110 void G_get_element_window(struct Cell_head *window, const char *element,
111  const char *name, const char *mapset)
112 {
113  FILE *fp;
114 
115  G_zero(window, sizeof(struct Cell_head));
116 
117  /* Read from file */
118  fp = G_fopen_old(element, name, mapset);
119  if (!fp)
120  G_fatal_error(_("Unable to open element file <%s> for <%s@%s>"),
121  element, name, mapset);
122 
123  G_fseek(fp, 0, SEEK_END);
124  if (!G_ftell(fp))
125  G_fatal_error(_("Region file %s/%s/%s is empty"), mapset, element,
126  name);
127  G_fseek(fp, 0, SEEK_SET);
128  G__read_Cell_head(fp, window);
129  fclose(fp);
130 }
131 
132 /*!
133  \brief Unset current region
134  */
135 void G_unset_window(void)
136 {
137  st->initialized = 0;
138  G__.window_set = 0;
139 }
void G__read_Cell_head_array(char **, struct Cell_head *)
Read window from NULL terminated array of strings (for internal use only)
Definition: rd_cellhd.c:96
FILE * G_fopen_old(const char *, const char *, const char *)
Open a database file for reading.
Definition: gis/open.c:251
void G_zero(void *, int)
Zero out a buffer, buf, of length i.
Definition: gis/zero.c:23
void G__read_Cell_head(FILE *, struct Cell_head *)
Read cell header (for internal use only)
Definition: rd_cellhd.c:56
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void G_fseek(FILE *, off_t, int)
Change the file position of the stream.
Definition: gis/seek.c:50
const char * G_mapset(void)
Get current mapset name.
Definition: gis/mapset.c:33
off_t G_ftell(FILE *)
Get the current file position of the stream.
Definition: gis/seek.c:29
void G_free_tokens(char **)
Free memory allocated to tokens.
Definition: gis/token.c:198
int G_is_initialized(int *)
Definition: counter.c:60
void G_initialize_done(int *)
Definition: counter.c:77
char ** G_tokenize(const char *, const char *)
Tokenize string.
Definition: gis/token.c:47
void G_get_window(struct Cell_head *window)
Get the current region.
Definition: get_window.c:47
void G_get_element_window(struct Cell_head *window, const char *element, const char *name, const char *mapset)
Get region for selected element (raster, vector, window, etc.)
Definition: get_window.c:110
void G_unset_window(void)
Unset current region.
Definition: get_window.c:135
void G_get_default_window(struct Cell_head *window)
Get the default region.
Definition: get_window.c:95
#define _(str)
Definition: glocale.h:10
const char * name
Definition: named_colr.c:6
struct state state
Definition: parser.c:103
struct state * st
Definition: parser.c:104
2D/3D raster map header (used also for region)
Definition: gis.h:437
Definition: G.h:5
int window_set
Definition: G.h:7
struct Cell_head window
Definition: G.h:6
Definition: lidar.h:85