GRASS Programmer's Manual
6.4.2(2012)
|
00001 00002 #include <stdio.h> 00003 #include <stdlib.h> 00004 #include <sys/types.h> 00005 #include <unistd.h> 00006 #include <grass/G3d.h> 00007 00008 /*---------------------------------------------------------------------------*/ 00009 00010 00024 void G3d_changeType(void *map, const char *nameOut) 00025 { 00026 void *map2; 00027 int x, y, z, saveType; 00028 void *data, *data2; 00029 G3D_Region region; 00030 int tileSize; 00031 int tileX, tileY, tileZ, typeIntern, typeIntern2; 00032 int tileXsave, tileYsave, tileZsave, nx, ny, nz; 00033 00034 saveType = G3d_getFileType(); 00035 G3d_setFileType(G3d_fileTypeMap(map) == FCELL_TYPE ? 00036 DCELL_TYPE : FCELL_TYPE); 00037 G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave); 00038 G3d_getTileDimensionsMap(map, &tileX, &tileY, &tileZ); 00039 G3d_setTileDimension(tileX, tileY, tileZ); 00040 00041 G3d_getRegionStructMap(map, ®ion); 00042 map2 = 00043 G3d_openCellNew(nameOut, FCELL_TYPE, G3D_USE_CACHE_DEFAULT, ®ion); 00044 00045 if (map2 == NULL) 00046 G3d_fatalError("G3d_changeType: error in G3d_openCellNew"); 00047 00048 G3d_setFileType(saveType); 00049 G3d_setTileDimension(tileXsave, tileYsave, tileZsave); 00050 00051 data = G3d_allocTiles(map, 1); 00052 if (data == NULL) 00053 G3d_fatalError("G3d_changeType: error in G3d_allocTiles"); 00054 data2 = G3d_allocTiles(map2, 1); 00055 if (data2 == NULL) 00056 G3d_fatalError("G3d_changeType: error in G3d_allocTiles"); 00057 00058 G3d_getNofTilesMap(map2, &nx, &ny, &nz); 00059 typeIntern = G3d_tileTypeMap(map); 00060 typeIntern2 = G3d_tileTypeMap(map2); 00061 tileSize = tileX * tileY * tileZ; 00062 00063 for (z = 0; z < nz; z++) 00064 for (y = 0; y < ny; y++) 00065 for (x = 0; x < nx; x++) { 00066 if (!G3d_readTile(map, G3d_tile2tileIndex(map, x, y, z), data, 00067 typeIntern)) 00068 G3d_fatalError("G3d_changeType: error in G3d_readTile"); 00069 G3d_copyValues(data, 0, typeIntern, data2, 0, typeIntern2, 00070 tileSize); 00071 if (!G3d_writeTile 00072 (map2, G3d_tile2tileIndex(map2, x, y, z), data2, 00073 typeIntern2)) 00074 G3d_fatalError("G3d_changeType: error in G3d_writeTile"); 00075 } 00076 00077 G3d_freeTiles(data); 00078 G3d_freeTiles(data2); 00079 if (!G3d_closeCell(map2)) 00080 G3d_fatalError("G3d_changeType: error in G3d_closeCell"); 00081 }