main.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /****************************************************************************
  2. *
  3. * MODULE: m.nviz.image
  4. *
  5. * AUTHOR(S): Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  6. * Anna Kratochvilova (Google SoC 2011)
  7. *
  8. * PURPOSE: Renders GIS data in 3D space from the command line.
  9. *
  10. * COPYRIGHT: (C) 2008-2014 by the GRASS Development Team
  11. *
  12. * This program is free software under the GNU General
  13. * Public License (>=v2). Read the file COPYING that
  14. * comes with GRASS for details.
  15. *
  16. *****************************************************************************/
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <unistd.h>
  20. #include <grass/gis.h>
  21. #include <grass/colors.h>
  22. #include <grass/glocale.h>
  23. #include <grass/nviz.h>
  24. #include "local_proto.h"
  25. int main(int argc, char *argv[])
  26. {
  27. struct GModule *module;
  28. struct GParams *params;
  29. int i, ret;
  30. int red, grn, blu;
  31. float size;
  32. double vp_height, z_exag; /* calculated viewpoint height, z-exag */
  33. int width, height; /* output image size */
  34. char *output_name;
  35. nv_data data;
  36. struct render_window *offscreen;
  37. /* initialize GRASS */
  38. G_gisinit(argv[0]);
  39. module = G_define_module();
  40. G_add_keyword(_("miscellaneous"));
  41. G_add_keyword(_("visualization"));
  42. G_add_keyword(_("graphics"));
  43. G_add_keyword(_("raster"));
  44. G_add_keyword(_("vector"));
  45. G_add_keyword(_("raster3d"));
  46. module->label = _("Creates a 3D rendering of GIS data.");
  47. module->description = _("Renders surfaces (raster data), "
  48. "2D/3D vector data, and "
  49. "volumes (3D raster data) in 3D.");
  50. params = (struct GParams *)G_malloc(sizeof(struct GParams));
  51. /* define options, call G_parser() */
  52. parse_command(argc, argv, params);
  53. /* check parameters consistency */
  54. check_parameters(params);
  55. width = atoi(params->size->answers[0]);
  56. height = atoi(params->size->answers[1]);
  57. G_asprintf(&output_name, "%s.%s", params->output->answer,
  58. params->format->answer);
  59. if (access(output_name, F_OK) == 0) {
  60. if (G_check_overwrite(argc, argv))
  61. G_warning(_("File <%s> already exists and will be overwritten"), output_name);
  62. else
  63. G_fatal_error(_("option <%s>: <%s> exists. To overwrite, use the --overwrite flag"), params->output->key, output_name);
  64. }
  65. GS_libinit();
  66. GVL_libinit();
  67. /* define render window */
  68. offscreen = Nviz_new_render_window();
  69. Nviz_init_render_window(offscreen);
  70. if (Nviz_create_render_window(offscreen, NULL, width, height) == -1)
  71. G_fatal_error(_("Unable to render data"));
  72. Nviz_make_current_render_window(offscreen);
  73. /* initialize nviz data */
  74. Nviz_init_data(&data);
  75. /* define default attributes for map objects */
  76. Nviz_set_surface_attr_default();
  77. /* set background color */
  78. Nviz_set_bgcolor(&data, Nviz_color_from_str(params->bgcolor->answer));
  79. /* init view, lights */
  80. Nviz_init_view(&data);
  81. /* load raster maps (surface topography) & set attributes (map/constant) */
  82. load_rasters(params, &data);
  83. /* set draw mode of loaded surfaces */
  84. surface_set_draw_mode(params);
  85. /* load line vector maps */
  86. if (params->vlines->answer) {
  87. load_vlines(params, &data);
  88. /* set attributes of 2d lines */
  89. vlines_set_attrb(params);
  90. }
  91. /* load point vector maps */
  92. if (params->vpoints->answer) {
  93. load_vpoints(params, &data);
  94. /* set attributes for points */
  95. vpoints_set_attrb(params);
  96. }
  97. /* load volumes */
  98. if (params->volume->answer) {
  99. load_rasters3d(params, &data);
  100. }
  101. /* define isosurfaces for displaying volumes */
  102. if (params->isosurf_level->answer) {
  103. add_isosurfs(params, &data);
  104. }
  105. /* define slices for displaying volumes */
  106. if (params->slice->answer) {
  107. add_slices(params, &data);
  108. }
  109. /* focus on loaded data */
  110. Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1);
  111. /* define view point */
  112. if (params->exag->answer) {
  113. z_exag = atof(params->exag->answer);
  114. }
  115. else {
  116. z_exag = Nviz_get_exag();
  117. G_verbose_message(_("Vertical exaggeration not given, using calculated "
  118. "value %.0f"), z_exag);
  119. }
  120. Nviz_change_exag(&data, z_exag);
  121. if (params->height->answer) {
  122. vp_height = atof(params->height->answer);
  123. }
  124. else {
  125. double min, max;
  126. Nviz_get_exag_height(&vp_height, &min, &max);
  127. G_verbose_message(_("Viewpoint height not given, using calculated "
  128. "value %.0f"), vp_height);
  129. }
  130. Nviz_set_viewpoint_height(vp_height);
  131. Nviz_set_viewpoint_position(atof(params->pos->answers[0]),
  132. atof(params->pos->answers[1]));
  133. Nviz_set_viewpoint_twist(atoi(params->twist->answer));
  134. Nviz_set_viewpoint_persp(atoi(params->persp->answer));
  135. if (params->focus->answer) {
  136. Nviz_set_focus(&data, atof(params->focus->answers[0]),
  137. atof(params->focus->answers[1]),
  138. atof(params->focus->answers[2]));
  139. }
  140. /* set lights */
  141. Nviz_set_light_position(&data, 1,
  142. atof(params->light_pos->answers[0]),
  143. atof(params->light_pos->answers[1]),
  144. atof(params->light_pos->answers[2]), 0.0);
  145. Nviz_set_light_bright(&data, 1,
  146. atoi(params->light_bright->answer) / 100.0);
  147. if (G_str_to_color(params->light_color->answer, &red, &grn, &blu) != 1) {
  148. red = grn = blu = 255;
  149. }
  150. Nviz_set_light_color(&data, 1, red, grn, blu);
  151. Nviz_set_light_ambient(&data, 1,
  152. atof(params->light_ambient->answer) / 100.0);
  153. /* define fringes */
  154. if (params->fringe->answer) {
  155. int nw, ne, sw, se;
  156. i = 0;
  157. nw = ne = sw = se = 0;
  158. while (params->fringe->answers[i]) {
  159. const char *edge = params->fringe->answers[i++];
  160. if (strcmp(edge, "nw") == 0)
  161. nw = 1;
  162. else if (strcmp(edge, "ne") == 0)
  163. ne = 1;
  164. else if (strcmp(edge, "sw") == 0)
  165. sw = 1;
  166. else if (strcmp(edge, "se") == 0)
  167. se = 1;
  168. }
  169. Nviz_new_fringe(&data, -1,
  170. Nviz_color_from_str(params->fringe_color->answer),
  171. atof(params->fringe_elev->answer), nw, ne, sw, se);
  172. }
  173. /* draw north arrow */
  174. if (params->north_arrow->answer) {
  175. if (!params->north_arrow_size->answer)
  176. size = Nviz_get_longdim(&data) / 8.;
  177. else
  178. size = atof(params->north_arrow_size->answer);
  179. Nviz_set_arrow(&data, atoi(params->north_arrow->answers[0]),
  180. atoi(params->north_arrow->answers[1]),
  181. size,
  182. Nviz_color_from_str(params->north_arrow_color->
  183. answer));
  184. Nviz_draw_arrow(&data);
  185. }
  186. GS_clear(data.bgcolor);
  187. /* cutting planes */
  188. if (params->cplane->answer)
  189. draw_cplane(params, &data);
  190. /* draw */
  191. Nviz_draw_all(&data);
  192. /* write to image */
  193. ret = 0;
  194. if (strcmp(params->format->answer, "ppm") == 0)
  195. ret = write_img(output_name, FORMAT_PPM);
  196. if (strcmp(params->format->answer, "tif") == 0)
  197. ret = write_img(output_name, FORMAT_TIF);
  198. if (ret == 1)
  199. G_fatal_error(_("Failed to write image"));
  200. else if (ret == 2)
  201. G_fatal_error(_("Unsupported output format"));
  202. G_done_msg(_("File <%s> created."), output_name);
  203. Nviz_destroy_data(&data);
  204. Nviz_destroy_render_window(offscreen);
  205. G_free((void *)output_name);
  206. G_free((void *)params);
  207. exit(EXIT_SUCCESS);
  208. }