/* ************************************************************************* */ int main(int argc, char *argv[]) { char *output = NULL; RASTER3D_Region region; struct Cell_head window2d; struct Cell_head default_region; FILE *fp = NULL; struct GModule *module; int dp, i, changemask = 0; int rows, cols; const char *mapset, *name; double scale = 1.0, llscale = 1.0; input_maps *in; /* Initialize GRASS */ G_gisinit(argv[0]); module = G_define_module(); G_add_keyword(_("raster3d")); G_add_keyword(_("export")); G_add_keyword(_("voxel")); G_add_keyword("VTK"); module->description = _("Converts 3D raster maps into the VTK-ASCII format."); /* Get parameters from user */ set_params(); /* Have GRASS get inputs */ if (G_parser(argc, argv)) exit(EXIT_FAILURE); /*The precision of the output */ if (param.decimals->answer) { if (sscanf(param.decimals->answer, "%d", &dp) != 1) G_fatal_error(_("failed to interpret dp as an integer")); if (dp > 20 || dp < 0) G_fatal_error(_("dp has to be from 0 to 20")); } else { dp = 8; /*This value is taken from the lib settings in G_format_easting */ } /*Check the input */ check_input_maps(); /*Correct the coordinates, so the precision of VTK is not hurt :( */ if (param.coorcorr->answer) { /*Get the default region for coordiante correction */ G_get_default_window(&default_region); /*Use the center of the current region as extent */ y_extent = (default_region.north + default_region.south) / 2; x_extent = (default_region.west + default_region.east) / 2; } else { x_extent = 0; y_extent = 0; } /*open the output */ if (param.output->answer) { fp = fopen(param.output->answer, "w"); if (fp == NULL) { perror(param.output->answer); G_usage(); exit(EXIT_FAILURE); } } else fp = stdout; /* Figure out the region from the map */ Rast3d_init_defaults(); Rast3d_get_window(®ion); /*initiate the input mpas structure */ in = create_input_maps_struct(); /* read and compute the scale factor */ sscanf(param.elevscale->answer, "%lf", &scale); /*if LL projection, convert the elevation values to degrees */ if (param.scalell->answer && region.proj == PROJECTION_LL) { llscale = M_PI / (180) * 6378137; scale /= llscale; } /*Open the top and bottom file */ if (param.structgrid->answer) { /*Check if the g3d-region is equal to the 2d rows and cols */ rows = Rast_window_rows(); cols = Rast_window_cols(); /*If not equal, set the 2D windows correct */ if (rows != region.rows || cols != region.cols) { G_message(_("The 2D and 3D region settings are different. " "Using the 2D window settings to adjust the 2D part of the 3D region.")); G_get_set_window(&window2d); window2d.ns_res = region.ns_res; window2d.ew_res = region.ew_res; window2d.rows = region.rows; window2d.cols = region.cols; Rast_set_window(&window2d); } /*open top */ mapset = NULL; name = NULL; name = param.top->answer; mapset = G_find_raster2(name, ""); in->top = open_input_map(name, mapset); in->topMapType = Rast_get_map_type(in->top); /*open bottom */ mapset = NULL; name = NULL; name = param.bottom->answer; mapset = G_find_raster2(name, ""); in->bottom = open_input_map(name, mapset); in->bottomMapType = Rast_get_map_type(in->bottom); /* Write the vtk-header and the points */ if (param.point->answer) { write_vtk_structured_grid_header(fp, output, region); write_vtk_points(in, fp, region, dp, 1, scale); } else { write_vtk_unstructured_grid_header(fp, output, region); write_vtk_points(in, fp, region, dp, 0, scale); write_vtk_unstructured_grid_cells(fp, region); } Rast_close(in->top); in->top = -1; Rast_close(in->bottom); in->bottom = -1; } else { /* Write the structured point vtk-header */ write_vtk_structured_point_header(fp, output, region, dp, scale); } /*Write the normal VTK data (cell or point data) */ /*Loop over all 3d input maps! */ if (param.input->answers != NULL) { for (i = 0; param.input->answers[i] != NULL; i++) { G_debug(3, "Open 3D raster map <%s>", param.input->answers[i]); /*Open the map */ in->map = Rast3d_open_cell_old(param.input->answers[i], G_find_raster3d(param.input->answers[i], ""), ®ion, RASTER3D_TILE_SAME_AS_FILE, RASTER3D_USE_CACHE_DEFAULT); if (in->map == NULL) { G_warning(_("Unable to open 3D raster map <%s>"), param.input->answers[i]); fatal_error(" ", in); } /*if requested set the Mask on */ if (param.mask->answer) { if (Rast3d_mask_file_exists()) { changemask = 0; if (Rast3d_mask_is_off(in->map)) { Rast3d_mask_on(in->map); changemask = 1; } } } /* Write the point or cell data */ write_vtk_data(fp, in->map, region, param.input->answers[i], dp); /*We set the Mask off, if it was off before */ if (param.mask->answer) { if (Rast3d_mask_file_exists()) if (Rast3d_mask_is_on(in->map) && changemask) Rast3d_mask_off(in->map); } /* Close the 3d raster map */ if (!Rast3d_close(in->map)) { in->map = NULL; fatal_error(_("Unable to close 3D raster map, the VTK file may be incomplete"), in); } in->map = NULL; } } /*Write the RGB voxel data */ open_write_rgb_maps(in, region, fp, dp); open_write_vector_maps(in, region, fp, dp); /*Close the output file */ if (param.output->answer && fp != NULL) if (fclose(fp)) fatal_error(_("Unable to close VTK-ASCII file"), in); /*close all open maps and free memory */ release_input_maps_struct(in); return 0; }
/* ************************************************************************* */ int main(int argc, char *argv[]) { struct Cell_head region; struct Cell_head default_region; FILE *fp = NULL; struct GModule *module; int i = 0, polytype = 0; char *null_value; int out_type; int fd; /*Normale maps ;) */ int rgbfd[3]; int vectfd[3]; int celltype[3] = { 0, 0, 0 }; int headertype; double scale = 1.0, llscale = 1.0, eleval = 0.0; int digits = 12; /* Initialize GRASS */ G_gisinit(argv[0]); module = G_define_module(); G_add_keyword(_("raster")); G_add_keyword(_("export")); module->description = _("Converts raster maps into the VTK-ASCII format."); /* Get parameters from user */ set_params(); /* Have GRASS get inputs */ if (G_parser(argc, argv)) exit(EXIT_FAILURE); if (param.input->answers == NULL && param.rgbmaps->answers == NULL && param.vectmaps->answers == NULL) { G_fatal_error(_("No input maps specified. You need to specify at least one input map or three vector maps or three rgb maps.")); } /*open the output */ if (param.output->answer) { fp = fopen(param.output->answer, "w"); if (fp == NULL) { perror(param.output->answer); G_usage(); exit(EXIT_FAILURE); } } else fp = stdout; /*Correct the coordinates, so the precision of VTK is not hurt :( */ if (param.coorcorr->answer) { /*Get the default region for coordiante correction */ G_get_default_window(&default_region); /*Use the center of the current region as extent */ y_extent = (default_region.north + default_region.south) / 2; x_extent = (default_region.west + default_region.east) / 2; } else { x_extent = 0; y_extent = 0; } /* Figure out the region from the map */ G_get_window(®ion); /*Set the null Value, maybe i have to check this? */ null_value = param.null_val->answer; /*number of significant digits */ sscanf(param.decimals->answer, "%i", &digits); /* read and compute the scale factor */ sscanf(param.elevscale->answer, "%lf", &scale); sscanf(param.elev->answer, "%lf", &eleval); /*if LL projection, convert the elevation values to degrees */ if (region.proj == PROJECTION_LL) { llscale = M_PI / (180) * 6378137; scale /= llscale; } /********************* WRITE ELEVATION *************************************/ if (param.elevationmap->answer) { /*If the elevation is set, write the correct Header */ if (param.usestruct->answer) { write_vtk_structured_elevation_header(fp, region); } else { write_vtk_polygonal_elevation_header(fp, region); } G_debug(3, _("Open Raster file %s"), param.elevationmap->answer); /* open raster map */ fd = Rast_open_old(param.elevationmap->answer, ""); out_type = Rast_get_map_type(fd); /*The write the Coordinates */ if (param.usestruct->answer) { write_vtk_structured_coordinates(fd, fp, param.elevationmap->answer, region, out_type, null_value, scale, digits); } else { polytype = QUADS; /*The default */ if (param.usetriangle->answer) polytype = TRIANGLE_STRIPS; if (param.usevertices->answer) polytype = VERTICES; write_vtk_polygonal_coordinates(fd, fp, param.elevationmap->answer, region, out_type, null_value, scale, polytype, digits); } Rast_close(fd); } else { /*Should pointdata or celldata be written */ if (param.point->answer) headertype = 1; else headertype = 0; /*If no elevation is given, write the normal Header */ if (param.origin->answer) write_vtk_normal_header(fp, region, scale * eleval, headertype); else write_vtk_normal_header(fp, region, eleval / llscale, headertype); } /******************** WRITE THE POINT OR CELL DATA HEADER ******************/ if (param.input->answers != NULL || param.rgbmaps->answers != NULL) { if (param.point->answer || param.elevationmap->answer) write_vtk_pointdata_header(fp, region); else write_vtk_celldata_header(fp, region); } /********************** WRITE NORMAL DATA; CELL OR POINT *******************/ /*Loop over all input maps! */ if (param.input->answers != NULL) { for (i = 0; param.input->answers[i] != NULL; i++) { G_debug(3, _("Open Raster file %s"), param.input->answers[i]); /* open raster map */ fd = Rast_open_old(param.input->answers[i], ""); out_type = Rast_get_map_type(fd); /*Now write the data */ write_vtk_data(fd, fp, param.input->answers[i], region, out_type, null_value, digits); Rast_close(fd); } } /********************** WRITE RGB IMAGE DATA; CELL OR POINT ****************/ if (param.rgbmaps->answers != NULL) { if (param.rgbmaps->answers[0] != NULL && param.rgbmaps->answers[1] != NULL && param.rgbmaps->answers[2] != NULL) { /*Loop over all three rgb input maps! */ for (i = 0; i < 3; i++) { G_debug(3, _("Open Raster file %s"), param.rgbmaps->answers[i]); /* open raster map */ rgbfd[i] = Rast_open_old(param.rgbmaps->answers[i], ""); celltype[i] = Rast_get_map_type(rgbfd[i]); } /*Maps have to be from the same type */ if (celltype[0] == celltype[1] && celltype[0] == celltype[2]) { G_debug(3, _("Writing VTK ImageData\n")); out_type = celltype[0]; /*Now write the data */ write_vtk_rgb_image_data(rgbfd[0], rgbfd[1], rgbfd[2], fp, "RGB_Image", region, out_type, digits); } else { G_warning(_("Wrong RGB maps. Maps should have the same type! RGB output not added!")); /*do nothing */ } /*Close the maps */ for (i = 0; i < 3; i++) Rast_close(rgbfd[i]); } } /********************** WRITE VECTOR DATA; CELL OR POINT ****************/ if (param.vectmaps->answers != NULL) { if (param.vectmaps->answers[0] != NULL && param.vectmaps->answers[1] != NULL && param.vectmaps->answers[2] != NULL) { /*Loop over all three vect input maps! */ for (i = 0; i < 3; i++) { G_debug(3, _("Open Raster file %s"), param.vectmaps->answers[i]); /* open raster map */ vectfd[i] = Rast_open_old(param.vectmaps->answers[i], ""); celltype[i] = Rast_get_map_type(vectfd[i]); } /*Maps have to be from the same type */ if (celltype[0] == celltype[1] && celltype[0] == celltype[2]) { G_debug(3, _("Writing VTK Vector Data\n")); out_type = celltype[0]; /*Now write the data */ write_vtk_vector_data(vectfd[0], vectfd[1], vectfd[2], fp, "Vector_Data", region, out_type, digits); } else { G_warning(_("Wrong vector maps. Maps should have the same type! Vector output not added!")); /*do nothing */ } /*Close the maps */ for (i = 0; i < 3; i++) Rast_close(vectfd[i]); } } if (param.output->answer && fp != NULL) if (fclose(fp)) { G_fatal_error(_("Error closing VTK-ASCII file")); } return 0; }