GRASS 8 Programmer's Manual 8.6.0dev(2026)-4bb960b182
Loading...
Searching...
No Matches
gv.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gv.c
3
4 \brief OGSF library - loading and manipulating vector sets (lower level
5 functions)
6
7 SPDX-FileCopyrightText: 1999-2008, 2011 GRASS Development Team
8 SPDX-License-Identifier: GPL-2.0-or-later
9
10 \author Bill Brown USACERL (November 1993)
11 \author Doxygenized by Martin Landa (June 2008)
12 */
13
14#include <stdio.h>
15#include <stdlib.h>
16
17#include <grass/ogsf.h>
18#include "gsget.h"
19
20#define FIRST_VECT_ID 20656
21
22static geovect *Vect_top = NULL;
23
24/*!
25 \brief Get vector set
26
27 \param id vector set id
28
29 \return pointer to geovect struct
30 \return NULL on failure
31 */
33{
34 geovect *gv;
35
36 G_debug(5, "gv_get_vect() id=%d", id);
37
38 for (gv = Vect_top; gv; gv = gv->next) {
39 if (gv->gvect_id == id) {
40 return gv;
41 }
42 }
43
44 return NULL;
45}
46
47/*!
48 \brief Get previous vector set
49
50 \param id vector set id
51
52 \return pointer to geovect struct
53 \return NULL on failure
54 */
56{
57 geovect *pv;
58
59 G_debug(5, "gv_get_prev_vect(): id=%d", id);
60
61 for (pv = Vect_top; pv; pv = pv->next) {
62 if (pv->gvect_id == id - 1) {
63 return pv;
64 }
65 }
66
67 return NULL;
68}
69
70/*!
71 \brief Get number of loaded vector sets
72
73 \return number of vector sets
74 */
75int gv_num_vects(void)
76{
77 geovect *gv;
78 int i;
79
80 for (i = 0, gv = Vect_top; gv; gv = gv->next, i++)
81 ;
82
83 G_debug(5, "gv_num_vects(): num=%d", i);
84
85 return i;
86}
87
88/*!
89 \brief Get last loaded vector set
90
91 \return pointer to geovect struct
92 \return NULL on failure (no vector set available)
93 */
95{
96 geovect *lv;
97
98 if (!Vect_top) {
99 return NULL;
100 }
101
102 for (lv = Vect_top; lv->next; lv = lv->next)
103 ;
104
105 G_debug(5, "gv_get_last_vect(): id=%d", lv->gvect_id);
106
107 return lv;
108}
109
110/*!
111 \brief Allocate memory for new vector set
112
113 \return pointer to geovect struct
114 \return NULL on failure
115 */
117{
118 geovect *nv, *lv;
119
120 nv = (geovect *)G_malloc(sizeof(geovect));
121 if (!nv) {
122 /* G_fatal_error */
123 return NULL;
124 }
125 G_zero(nv, sizeof(geovect));
126
127 if ((lv = gv_get_last_vect())) {
128 lv->next = nv;
129 nv->gvect_id = lv->gvect_id + 1;
130 }
131 else {
132 Vect_top = nv;
133 nv->gvect_id = FIRST_VECT_ID;
134 }
135
136 nv->style = (gvstyle *)G_malloc(sizeof(gvstyle));
137 if (NULL == nv->style)
138 return NULL;
139 G_zero(nv->style, sizeof(gvstyle));
140 nv->hstyle = (gvstyle *)G_malloc(sizeof(gvstyle));
141 if (NULL == nv->hstyle)
142 return NULL;
143 G_zero(nv->hstyle, sizeof(gvstyle));
144
145 G_debug(5, "gv_get_new_vect() id=%d", nv->gvect_id);
146
147 return nv;
148}
149
150/*!
151 \brief Update drape surfaces
152
153 Call after surface is deleted
154 */
156{
157 geovect *gv;
158 int i, j;
159
160 for (gv = Vect_top; gv; gv = gv->next) {
161 if (gv->n_surfs) {
162 for (i = 0; i < gv->n_surfs; i++) {
163 if (gv->drape_surf_id[i]) {
164 if (NULL == gs_get_surf(gv->drape_surf_id[i])) {
165 for (j = i; j < gv->n_surfs - 1; j++) {
166 gv->drape_surf_id[j] = gv->drape_surf_id[j + 1];
167 }
168
169 gv->n_surfs = gv->n_surfs - 1;
170 }
171 }
172 }
173 }
174 }
175}
176
177/*!
178 \brief Set attributes of vector set to default values
179
180 \param gv pointer to geovect struct
181
182 \return -1 on error
183 \return 0 on success
184 */
186{
187 int i;
188
189 if (!gv) {
190 return (-1);
191 }
192 G_debug(5, "gv_set_defaults() id=%d", gv->gvect_id);
193
194 gv->filename = NULL;
195 gv->n_lines = gv->n_surfs = gv->use_mem = 0;
196 gv->x_trans = gv->y_trans = gv->z_trans = 0.0;
197 gv->lines = NULL;
198 gv->fastlines = NULL;
199 gv->use_z = 0;
200 gv->style->color = 0xF0F0F0;
201 gv->style->width = 1;
202 gv->style->next = NULL;
203 gv->hstyle->color = 0xFF0000;
204 gv->hstyle->width = 2;
205 gv->hstyle->next = NULL;
206 gv->tstyle = NULL;
207 gv->next = NULL;
208
209 for (i = 0; i < MAX_SURFS; i++) {
210 gv->drape_surf_id[i] = 0;
211 }
212
213 return 0;
214}
215
216/*!
217 \brief Initialize geovect struct
218
219 \param gv pointer to geovect struct
220
221 \return -1 on failure
222 \return 0 on success
223 */
225{
226 if (!gv) {
227 return -1;
228 }
229
230 G_debug(5, "gv_init_vect() id=%d", gv->gvect_id);
231
232 return 0;
233}
234
235/*!
236 \brief Delete vector set (unload)
237
238 \param id vector set id
239 */
240void gv_delete_vect(int id)
241{
242 geovect *fv;
243
244 G_debug(5, "gv_delete_vect(): id=%d", id);
245
246 fv = gv_get_vect(id);
247
248 if (fv) {
250 }
251
252 return;
253}
254
255/*!
256 \brief Free allocated memory for geovect struct
257
258 \param fv pointer to geovect struct
259
260 \return -1 on failure
261 \return 1 on success
262 */
264{
265 geovect *gv;
266 int found = 0;
267
268 if (Vect_top) {
269 if (fv == Vect_top) {
270 if (Vect_top->next) {
271 /* can't free top if last */
272 found = 1;
273 Vect_top = fv->next;
274 }
275 else {
277 G_free(fv);
278 Vect_top = NULL;
279 }
280 }
281 else {
282 for (gv = Vect_top; gv && !found; gv = gv->next) {
283 /* can't free top */
284 if (gv->next) {
285 if (gv->next == fv) {
286 found = 1;
287 gv->next = fv->next;
288 }
289 }
290 }
291 }
292
293 if (found) {
294 G_debug(5, "gv_free_vect(): id=%d", fv->gvect_id);
296 G_free(fv);
297 fv = NULL;
298 }
299
300 return 1;
301 }
302
303 return -1;
304}
305
306/*!
307 \brief Free allocated memory
308
309 \param fv pointer to geovect struct
310 */
312{
313 geoline *gln, *tmpln;
314
315 G_free((void *)fv->filename);
316 fv->filename = NULL;
317 if (fv->style)
318 G_free(fv->style);
319 if (fv->hstyle)
320 G_free(fv->hstyle);
321
322 if (fv->lines) {
323 for (gln = fv->lines; gln;) {
324 if (gln->dims == 2) {
325 sub_Vectmem(gln->npts * sizeof(Point2));
326 G_free(gln->p2);
327 }
328
329 if (gln->dims == 3) {
330 G_free(gln->p3);
331 }
332
333 G_free(gln->cats);
334
335 tmpln = gln;
336 gln = gln->next;
337 sub_Vectmem(sizeof(geoline));
338 G_free(tmpln);
339 }
340
341 fv->n_lines = 0;
342 fv->lines = NULL;
343 }
344
345 if (fv->tstyle) {
346 G_free(fv->tstyle->color_column);
347 G_free(fv->tstyle->symbol_column);
348 G_free(fv->tstyle->size_column);
349 G_free(fv->tstyle->width_column);
350 }
351
352 return;
353}
354
355/*!
356 \brief Set drape surfaces for vector set
357
358 \param gv pointer to geovect struct
359 \param hsurfs array of surfaces (id)
360 \param nsurfs number of surfaces
361 */
363{
364 int i;
365
366 for (i = 0; i < nsurfs && i < MAX_SURFS; i++) {
367 gv->drape_surf_id[i] = hsurfs[i];
368 }
369
370 return;
371}
#define NULL
Definition ccmath.h:32
void G_zero(void *, int)
Zero out a buffer, buf, of length i.
Definition gis/zero.c:21
void G_free(void *)
Free allocated memory.
Definition gis/alloc.c:145
#define G_malloc(n)
Definition defs/gis.h:136
int G_debug(int, const char *,...) __attribute__((format(printf
geosurf * gs_get_surf(int)
Get geosurf struct.
Definition gs.c:59
void sub_Vectmem(int)
Tracking memory.
Definition gv3.c:296
int gv_free_vect(geovect *fv)
Free allocated memory for geovect struct.
Definition gv.c:263
void gv_update_drapesurfs(void)
Update drape surfaces.
Definition gv.c:155
int gv_init_vect(geovect *gv)
Initialize geovect struct.
Definition gv.c:224
geovect * gv_get_prev_vect(int id)
Get previous vector set.
Definition gv.c:55
geovect * gv_get_last_vect(void)
Get last loaded vector set.
Definition gv.c:94
void gv_delete_vect(int id)
Delete vector set (unload)
Definition gv.c:240
int gv_num_vects(void)
Get number of loaded vector sets.
Definition gv.c:75
geovect * gv_get_new_vect(void)
Allocate memory for new vector set.
Definition gv.c:116
geovect * gv_get_vect(int id)
Get vector set.
Definition gv.c:32
void gv_free_vectmem(geovect *fv)
Free allocated memory.
Definition gv.c:311
void gv_set_drapesurfs(geovect *gv, int *hsurfs, int nsurfs)
Set drape surfaces for vector set.
Definition gv.c:362
#define FIRST_VECT_ID
Definition gv.c:20
int gv_set_defaults(geovect *gv)
Set attributes of vector set to default values.
Definition gv.c:185
OGSF header file (structures)
float Point2[2]
Definition ogsf.h:207
#define MAX_SURFS
Definition ogsf.h:41
Line instance.
Definition ogsf.h:353
Struct for vector feature displaying attributes.
Definition ogsf.h:308
Vector map (lines)
Definition ogsf.h:373
struct g_vect * next
Definition ogsf.h:389
int gvect_id
Definition ogsf.h:374