GRASS GIS 7 Programmer's Manual  7.0.3(2016)-r00000
cplanes_obj.c
Go to the documentation of this file.
1 
15 #include <grass/nviz.h>
16 
17 static void cp_draw(nv_data *, int, int, int);
18 static geoview Gv;
19 
30 int Nviz_new_cplane(nv_data * data, int id)
31 {
32  data->num_cplanes++;
33  /* Initialize internal attributes for this cutplane */
34  data->cp_rot[id][X] = data->cp_rot[id][Y] = data->cp_rot[id][Z] = 0.0;
35  data->cp_trans[id][X] = data->cp_trans[id][Y] = data->cp_trans[id][Z] =
36  0.0;
37  data->cp_on[id] = 0;
38 
39  return 1;
40 }
41 
48 int Nviz_on_cplane(nv_data * data, int id)
49 {
50  data->cur_cplane = id;
51  data->cp_on[id] = 1;
52  GS_set_cplane(id);
53 
54  return 1;
55 }
56 
63 int Nviz_off_cplane(nv_data * data, int id)
64 {
65  data->cp_on[id] = 0;
66  GS_unset_cplane(id);
67 
68  return 1;
69 }
70 
78 int Nviz_draw_cplane(nv_data * data, int bound1, int bound2)
79 {
80  cp_draw(data, data->cur_cplane, bound1, bound2);
81 
82  return 1;
83 }
84 
93 void cp_draw(nv_data * data, int current, int surf1, int surf2)
94 {
95  int i, nsurfs;
96  int surf_min = 0, surf_max = 0, temp;
97  int *surf_list;
98 
99  GS_set_draw(GSD_BACK);
100  GS_clear(data->bgcolor);
101  GS_ready_draw();
102 
103  /* If surf boundaries present then find them */
104  surf_list = GS_get_surf_list(&nsurfs);
105  if ((surf1 != -1) && (surf2 != -1)) {
106  for (i = 0; i < nsurfs; i++) {
107  if (surf_list[i] == surf1)
108  surf_min = i;
109  if (surf_list[i] == surf2)
110  surf_max = i;
111  }
112 
113  if (surf_max < surf_min) {
114  temp = surf_min;
115  surf_min = surf_max;
116  surf_max = temp;
117  }
118 
119  surf_max++;
120  }
121  else {
122  surf_min = 0;
123  surf_max = nsurfs;
124  }
125 
126  if (nsurfs > 1) {
127  for (i = 0; i < MAX_CPLANES; i++) {
128  if (data->cp_on[i])
129  GS_draw_cplane_fence(surf_list[0], surf_list[1], i);
130  }
131  }
132 
133  for (i = surf_min; i < surf_max; i++) {
134  GS_draw_wire(surf_list[i]);
135  }
136 
137  GS_done_draw();
138 
139  return;
140 }
146 int Nviz_num_cplanes(nv_data * data)
147 {
148  return data->num_cplanes;
149 }
150 
156 int Nviz_get_current_cplane(nv_data * data)
157 {
158  return data->cur_cplane;
159 }
160 
171 int Nviz_set_cplane_rotation(nv_data * data, int id, float dx, float dy, float dz)
172 {
173  data->cp_rot[id][X] = dx;
174  data->cp_rot[id][Y] = dy;
175  data->cp_rot[id][Z] = dz;
176  GS_set_cplane_rot(id, data->cp_rot[id][X], data->cp_rot[id][Y],
177  data->cp_rot[id][Z]);
178 
179  cp_draw(data, data->cur_cplane, -1, -1);
180 
181  return 1;
182 }
193 int Nviz_get_cplane_rotation(nv_data * data, int id, float *dx, float *dy, float *dz)
194 {
195  *dx = data->cp_rot[id][X];
196  *dy = data->cp_rot[id][Y];
197  *dz = data->cp_rot[id][Z];
198 
199  return 1;
200 }
201 
211 int Nviz_set_cplane_translation(nv_data * data, int id, float dx, float dy, float dz)
212 {
213  data->cp_trans[id][X] = dx;
214  data->cp_trans[id][Y] = dy;
215  data->cp_trans[id][Z] = dz;
216  GS_set_cplane_trans(id, data->cp_trans[id][X], data->cp_trans[id][Y],
217  data->cp_trans[id][Z]);
218 
219  cp_draw(data, data->cur_cplane, -1, -1);
220 
221  return 1;
222 }
230 int Nviz_get_cplane_translation(nv_data * data, int id, float *dx, float *dy, float *dz)
231 {
232  *dx = data->cp_trans[id][X];
233  *dy = data->cp_trans[id][Y];
234  *dz = data->cp_trans[id][Z];
235 
236  return 1;
237 }
243 int Nviz_set_fence_color(nv_data * data, int type)
244 {
245  GS_set_fencecolor(type);
246 
247  return 1;
248 
249 }
250 int Nviz_set_cplane_here(nv_data *data, int cplane, float sx, float sy)
251 {
252  float x, y, z, len, los[2][3];
253  float dx, dy, dz;
254  float n, s, w, e;
255  Point3 realto, dir;
256  int id;
257  geosurf *gs;
258 
259  if (GS_get_selected_point_on_surface(sx, sy, &id, &x, &y, &z)) {
260  gs = gs_get_surf(id);
261  if (gs) {
262  realto[X] = x - gs->ox + gs->x_trans;
263  realto[Y] = y - gs->oy + gs->y_trans;
264  realto[Z] = z + gs->z_trans;
265  }
266  else
267  return 0;
268  }
269  else {
270  if (gsd_get_los(los, (short)sx, (short)sy)) {
271  len = GS_distance(Gv.from_to[FROM], Gv.real_to);
272  GS_v3dir(los[FROM], los[TO], dir);
273  GS_v3mult(dir, len);
274  realto[X] = Gv.from_to[FROM][X] + dir[X];
275  realto[Y] = Gv.from_to[FROM][Y] + dir[Y];
276  realto[Z] = Gv.from_to[FROM][Z] + dir[Z];
277  }
278  else
279  return 0;
280  }
281  Nviz_get_cplane_translation(data, cplane, &dx, &dy, &dz);
282 
283  GS_get_region(&n, &s, &w, &e);
284  dx = realto[X] - (e - w) / 2.;
285  dy = realto[Y] - (n - s) / 2.;
286 
287  Nviz_set_cplane_translation(data, cplane, dx, dy, dz);
288 
289  return 1;
290 }
void GS_ready_draw(void)
Definition: gs2.c:2489
void GS_draw_wire(int id)
Draw surface wire.
Definition: gs2.c:1900
int GS_draw_cplane_fence(int hs1, int hs2, int num)
Draw cplace fence ?
Definition: gs2.c:3176
int Nviz_draw_cplane(nv_data *data, int bound1, int bound2)
Draw the clip plane.
Definition: cplanes_obj.c:78
void GS_set_fencecolor(int mode)
Set fence color.
Definition: gs2.c:3257
int GS_v3dir(float *v1, float *v2, float *v3)
Get a normalized direction from v1 to v2, store in v3.
Definition: gs_util.c:353
int Nviz_set_fence_color(nv_data *data, int type)
Set appropriate fence color.
Definition: cplanes_obj.c:243
int GS_get_selected_point_on_surface(int sx, int sy, int *id, float *x, float *y, float *z)
Get selected point of surface.
Definition: gs2.c:3055
int Nviz_set_cplane_rotation(nv_data *data, int id, float dx, float dy, float dz)
Set the rotation for the current clip plane.
Definition: cplanes_obj.c:171
int Nviz_get_cplane_rotation(nv_data *data, int id, float *dx, float *dy, float *dz)
Get the rotation values for the current clip plane.
Definition: cplanes_obj.c:193
#define Y(n)
Definition: plot.c:141
int Nviz_off_cplane(nv_data *data, int id)
Turn off (make inactive) the given clip plane.
Definition: cplanes_obj.c:63
void GS_v3mult(float *v1, float k)
Multiple vectors.
Definition: gs_util.c:229
void GS_set_cplane_trans(int num, float dx, float dy, float dz)
Set cplace trans.
Definition: gs2.c:3136
int Nviz_set_cplane_translation(nv_data *data, int id, float dx, float dy, float dz)
Set the translation for the current clip plane.
Definition: cplanes_obj.c:211
int Nviz_get_current_cplane(nv_data *data)
Get the current active cutplane.
Definition: cplanes_obj.c:156
int GS_get_region(float *n, float *s, float *w, float *e)
Get 2D region extent.
Definition: gs2.c:157
void GS_clear(int col)
Clear view.
Definition: gs2.c:3419
void GS_set_cplane_rot(int num, float dx, float dy, float dz)
Set cplace rotation.
Definition: gs2.c:3123
int Nviz_on_cplane(nv_data *data, int id)
Turn on (make current) the given clip plane.
Definition: cplanes_obj.c:48
int Nviz_num_cplanes(nv_data *data)
Return the number of clip planes objects currently allocated.
Definition: cplanes_obj.c:146
geosurf * gs_get_surf(int id)
Get geosurf struct.
Definition: gs.c:62
void GS_unset_cplane(int num)
Unset clip place (turn off)
Definition: gs2.c:3228
void GS_set_draw(int where)
Sets which buffer to draw to.
Definition: gs2.c:2463
int Nviz_set_cplane_here(nv_data *data, int cplane, float sx, float sy)
Definition: cplanes_obj.c:250
int Nviz_new_cplane(nv_data *data, int id)
Creates a clip plane object.
Definition: cplanes_obj.c:30
void GS_set_cplane(int num)
Set cplace.
Definition: gs2.c:3216
#define X(e)
Definition: plot.c:140
float GS_distance(float *from, float *to)
Calculate distance.
Definition: gs_util.c:141
int Nviz_get_cplane_translation(nv_data *data, int id, float *dx, float *dy, float *dz)
Get the translation values for the current clip plane.
Definition: cplanes_obj.c:230
int gsd_get_los(float(*vect)[3], short sx, short sy)
ADD.
Definition: gsd_views.c:40
int * GS_get_surf_list(int *numsurfs)
Get surface list.
Definition: gs2.c:1540
void GS_done_draw(void)
Draw done, swap buffers.
Definition: gs2.c:2502