GRASS Programmer's Manual  6.4.3(2013)-r
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Pages
changetype.c
Go to the documentation of this file.
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <unistd.h>
6 #include <grass/G3d.h>
7 
8 /*---------------------------------------------------------------------------*/
9 
10 
24 void G3d_changeType(void *map, const char *nameOut)
25 {
26  void *map2;
27  int x, y, z, saveType;
28  void *data, *data2;
29  G3D_Region region;
30  int tileSize;
31  int tileX, tileY, tileZ, typeIntern, typeIntern2;
32  int tileXsave, tileYsave, tileZsave, nx, ny, nz;
33 
34  saveType = G3d_getFileType();
35  G3d_setFileType(G3d_fileTypeMap(map) == FCELL_TYPE ?
36  DCELL_TYPE : FCELL_TYPE);
37  G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
38  G3d_getTileDimensionsMap(map, &tileX, &tileY, &tileZ);
39  G3d_setTileDimension(tileX, tileY, tileZ);
40 
41  G3d_getRegionStructMap(map, &region);
42  map2 =
43  G3d_openCellNew(nameOut, FCELL_TYPE, G3D_USE_CACHE_DEFAULT, &region);
44 
45  if (map2 == NULL)
46  G3d_fatalError("G3d_changeType: error in G3d_openCellNew");
47 
48  G3d_setFileType(saveType);
49  G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
50 
51  data = G3d_allocTiles(map, 1);
52  if (data == NULL)
53  G3d_fatalError("G3d_changeType: error in G3d_allocTiles");
54  data2 = G3d_allocTiles(map2, 1);
55  if (data2 == NULL)
56  G3d_fatalError("G3d_changeType: error in G3d_allocTiles");
57 
58  G3d_getNofTilesMap(map2, &nx, &ny, &nz);
59  typeIntern = G3d_tileTypeMap(map);
60  typeIntern2 = G3d_tileTypeMap(map2);
61  tileSize = tileX * tileY * tileZ;
62 
63  for (z = 0; z < nz; z++)
64  for (y = 0; y < ny; y++)
65  for (x = 0; x < nx; x++) {
66  if (!G3d_readTile(map, G3d_tile2tileIndex(map, x, y, z), data,
67  typeIntern))
68  G3d_fatalError("G3d_changeType: error in G3d_readTile");
69  G3d_copyValues(data, 0, typeIntern, data2, 0, typeIntern2,
70  tileSize);
71  if (!G3d_writeTile
72  (map2, G3d_tile2tileIndex(map2, x, y, z), data2,
73  typeIntern2))
74  G3d_fatalError("G3d_changeType: error in G3d_writeTile");
75  }
76 
77  G3d_freeTiles(data);
78  G3d_freeTiles(data2);
79  if (!G3d_closeCell(map2))
80  G3d_fatalError("G3d_changeType: error in G3d_closeCell");
81 }