GRASS Programmer's Manual
6.4.2(2012)
|
00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <sys/types.h> 00004 #include <unistd.h> 00005 #include <grass/G3d.h> 00006 00007 /*---------------------------------------------------------------------------*/ 00008 00009 static void 00010 retileNocache(void *map, const char *nameOut, int tileX, int tileY, int tileZ) 00011 { 00012 void *map2; 00013 int x, y, z, saveType, nx, ny, nz; 00014 int typeIntern; 00015 void *data; 00016 int tileXsave, tileYsave, tileZsave; 00017 G3D_Region region; 00018 00019 saveType = G3d_getFileType(); 00020 G3d_setFileType(G3d_fileTypeMap(map)); 00021 G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave); 00022 G3d_setTileDimension(tileX, tileY, tileZ); 00023 typeIntern = G3d_tileTypeMap(map); 00024 G3d_getRegionStructMap(map, ®ion); 00025 00026 map2 = G3d_openCellNew(nameOut, typeIntern, G3D_NO_CACHE, ®ion); 00027 00028 if (map2 == NULL) 00029 G3d_fatalError("G3d_retile: error in G3d_openCellNew"); 00030 00031 G3d_setFileType(saveType); 00032 G3d_setTileDimension(tileXsave, tileYsave, tileZsave); 00033 00034 data = G3d_allocTiles(map2, 1); 00035 if (data == NULL) 00036 G3d_fatalError("G3d_retile: error in G3d_allocTiles"); 00037 00038 G3d_getNofTilesMap(map2, &nx, &ny, &nz); 00039 00040 for (z = 0; z < nz; z++) 00041 for (y = 0; y < ny; y++) 00042 for (x = 0; x < nx; x++) { 00043 00044 G3d_getBlock(map, x * tileX, y * tileY, z * tileZ, 00045 tileX, tileY, tileZ, data, typeIntern); 00046 if (!G3d_writeTile 00047 (map2, G3d_tile2tileIndex(map2, x, y, z), data, 00048 typeIntern)) 00049 G3d_fatalError 00050 ("G3d_retileNocache: error in G3d_writeTile"); 00051 } 00052 00053 G3d_freeTiles(data); 00054 G3d_closeCell(map2); 00055 } 00056 00057 /*---------------------------------------------------------------------------*/ 00058 00059 00075 void 00076 G3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ) 00077 { 00078 void *map2; 00079 double value; 00080 int x, y, z, saveType; 00081 int rows, cols, depths, typeIntern; 00082 int xTile, yTile, zTile; 00083 int xOffs, yOffs, zOffs, prev; 00084 int tileXsave, tileYsave, tileZsave; 00085 G3D_Region region; 00086 00087 if (!G3d_tileUseCacheMap(map)) { 00088 retileNocache(map, nameOut, tileX, tileY, tileZ); 00089 return; 00090 } 00091 00092 saveType = G3d_getFileType(); 00093 G3d_setFileType(G3d_fileTypeMap(map)); 00094 G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave); 00095 G3d_setTileDimension(tileX, tileY, tileZ); 00096 00097 typeIntern = G3d_tileTypeMap(map); 00098 G3d_getRegionStructMap(map, ®ion); 00099 00100 map2 = 00101 G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, ®ion); 00102 if (map2 == NULL) 00103 G3d_fatalError("G3d_retile: error in G3d_openCellNew"); 00104 00105 G3d_setFileType(saveType); 00106 G3d_setTileDimension(tileXsave, tileYsave, tileZsave); 00107 00108 G3d_coord2tileCoord(map2, 0, 0, 0, 00109 &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs); 00110 00111 prev = zTile; 00112 00113 x = 0; 00114 y = 0; 00115 00116 G3d_getCoordsMap(map, &rows, &cols, &depths); 00117 00118 for (z = 0; z < depths; z++) { 00119 G3d_coord2tileCoord(map2, x, y, z, &xTile, &yTile, &zTile, 00120 &xOffs, &yOffs, &zOffs); 00121 if (zTile > prev) { 00122 if (!G3d_flushAllTiles(map2)) 00123 G3d_fatalError("G3d_retile: error in G3d_flushAllTiles"); 00124 prev++; 00125 } 00126 00127 for (y = 0; y < rows; y++) 00128 for (x = 0; x < cols; x++) { 00129 00130 G3d_getValueRegion(map, x, y, z, &value, typeIntern); 00131 if (!G3d_putValue(map2, x, y, z, &value, typeIntern)) 00132 G3d_fatalError("G3d_retile: error in G3d_putValue"); 00133 } 00134 } 00135 00136 if (!G3d_flushAllTiles(map2)) 00137 G3d_fatalError("G3d_retile: error in G3d_flushAllTiles"); 00138 if (!G3d_closeCell(map2)) 00139 G3d_fatalError("G3d_retile: error in G3d_closeCell"); 00140 }