args.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. /*!
  2. \file args.c
  3. \brief Parse command
  4. COPYRIGHT: (C) 2008 by the GRASS Development Team
  5. This program is free software under the GNU General Public
  6. License (>=v2). Read the file COPYING that comes with GRASS
  7. for details.
  8. \author Martin Landa <landa.martin gmail.com> (Google SoC 2008)
  9. \date 2008
  10. */
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <grass/gis.h>
  14. #include <grass/glocale.h>
  15. #include "local_proto.h"
  16. static void print_error(int, int, int,
  17. const char *, const char *,
  18. const char *, const char *);
  19. static void args_surface(struct GParams *);
  20. static void args_vline(struct GParams *);
  21. static void args_vpoint(struct GParams *);
  22. static void args_viewpoint(struct GParams *);
  23. /*!
  24. \brief Parse command
  25. \param argc number of arguments
  26. \param argv arguments array
  27. \param params GRASS parameters
  28. \return 1
  29. */
  30. void parse_command(int argc, char* argv[], struct GParams *params)
  31. {
  32. params->mode_all = G_define_flag();
  33. params->mode_all->key = 'a';
  34. params->mode_all->description = _("Use draw mode for all loaded surfaces");
  35. /*
  36. surface attributes
  37. */
  38. args_surface(params);
  39. /*
  40. vector lines
  41. */
  42. args_vline(params);
  43. /*
  44. vector points
  45. */
  46. args_vpoint(params);
  47. /*
  48. misc
  49. */
  50. /* background color */
  51. params->bgcolor = G_define_standard_option(G_OPT_C_BG);
  52. /*
  53. viewpoint
  54. */
  55. args_viewpoint(params);
  56. /*
  57. image
  58. */
  59. /* output */
  60. params->output = G_define_standard_option(G_OPT_F_OUTPUT);
  61. params->output->description = _("Name for output file (do not add extension)");
  62. params->output->guisection = _("Image");
  63. /* format */
  64. params->format = G_define_option();
  65. params->format->key = "format";
  66. params->format->type = TYPE_STRING;
  67. params->format->options = "ppm,tif"; /* TODO: png */
  68. params->format->answer = "ppm";
  69. params->format->description = _("Graphics file format");
  70. params->format->required = YES;
  71. params->format->guisection = _("Image");
  72. /* size */
  73. params->size = G_define_option();
  74. params->size->key = "size";
  75. params->size->type = TYPE_INTEGER;
  76. params->size->key_desc = "width,height";
  77. params->size->answer = "640,480";
  78. params->size->description = _("Width and height of output image");
  79. params->size->required = YES;
  80. params->size->guisection = _("Image");
  81. if (G_parser(argc, argv))
  82. exit(EXIT_FAILURE);
  83. return;
  84. }
  85. void args_surface(struct GParams *params)
  86. {
  87. /* topography */
  88. params->elev_map = G_define_standard_option(G_OPT_R_ELEV);
  89. params->elev_map->key = "elevation_map";
  90. params->elev_map->required = NO;
  91. params->elev_map->multiple = YES;
  92. params->elev_map->description = _("Name of raster map(s) for elevation");
  93. params->elev_map->guisection = _("Surface");
  94. params->elev_const = G_define_option();
  95. params->elev_const->key = "elevation_value";
  96. params->elev_const->key_desc = "value";
  97. params->elev_const->type = TYPE_INTEGER;
  98. params->elev_const->required = NO;
  99. params->elev_const->multiple = YES;
  100. params->elev_const->description = _("Elevation value(s)");
  101. params->elev_const->guisection = _("Surface");
  102. /* color */
  103. params->color_map = G_define_standard_option(G_OPT_R_MAP);
  104. params->color_map->multiple = YES;
  105. params->color_map->required = NO;
  106. params->color_map->description = _("Name of raster map(s) for color");
  107. params->color_map->guisection = _("Surface");
  108. params->color_map->key = "color_map";
  109. params->color_const = G_define_standard_option(G_OPT_C_FG);
  110. params->color_const->multiple = YES;
  111. params->color_const->label = _("Color value(s)");
  112. params->color_const->guisection = _("Surface");
  113. params->color_const->key = "color_value";
  114. params->color_const->answer = NULL;
  115. /* mask */
  116. params->mask_map = G_define_standard_option(G_OPT_R_MAP);
  117. params->mask_map->multiple = YES;
  118. params->mask_map->required = NO;
  119. params->mask_map->description = _("Name of raster map(s) for mask");
  120. params->mask_map->guisection = _("Surface");
  121. params->mask_map->key = "mask_map";
  122. /* transparency */
  123. params->transp_map = G_define_standard_option(G_OPT_R_MAP);
  124. params->transp_map->multiple = YES;
  125. params->transp_map->required = NO;
  126. params->transp_map->description = _("Name of raster map(s) for transparency");
  127. params->transp_map->guisection = _("Surface");
  128. params->transp_map->key = "transparency_map";
  129. params->transp_const = G_define_option();
  130. params->transp_const->key = "transparency_value";
  131. params->transp_const->key_desc = "value";
  132. params->transp_const->type = TYPE_INTEGER;
  133. params->transp_const->required = NO;
  134. params->transp_const->multiple = YES;
  135. params->transp_const->description = _("Transparency value(s)");
  136. params->transp_const->guisection = _("Surface");
  137. params->transp_const->options = "0-255";
  138. /* shininess */
  139. params->shine_map = G_define_standard_option(G_OPT_R_MAP);
  140. params->shine_map->multiple = YES;
  141. params->shine_map->required = NO;
  142. params->shine_map->description = _("Name of raster map(s) for shininess");
  143. params->shine_map->guisection = _("Surface");
  144. params->shine_map->key = "shininess_map";
  145. params->shine_const = G_define_option();
  146. params->shine_const->key = "shininess_value";
  147. params->shine_const->key_desc = "value";
  148. params->shine_const->type = TYPE_INTEGER;
  149. params->shine_const->required = NO;
  150. params->shine_const->multiple = YES;
  151. params->shine_const->description = _("Shininess value(s)");
  152. params->shine_const->guisection = _("Surface");
  153. params->shine_const->options = "0-255";
  154. /* emission */
  155. params->emit_map = G_define_standard_option(G_OPT_R_MAP);
  156. params->emit_map->multiple = YES;
  157. params->emit_map->required = NO;
  158. params->emit_map->description = _("Name of raster map(s) for emission");
  159. params->emit_map->guisection = _("Surface");
  160. params->emit_map->key = "emission_map";
  161. params->emit_const = G_define_option();
  162. params->emit_const->key = "emission_value";
  163. params->emit_const->key_desc = "value";
  164. params->emit_const->type = TYPE_INTEGER;
  165. params->emit_const->required = NO;
  166. params->emit_const->multiple = YES;
  167. params->emit_const->description = _("Emission value(s)");
  168. params->emit_const->guisection = _("Surface");
  169. params->emit_const->options = "0-255";
  170. /*
  171. draw
  172. */
  173. /* mode */
  174. params->mode = G_define_option();
  175. params->mode->key = "mode";
  176. params->mode->key_desc = "string";
  177. params->mode->type = TYPE_STRING;
  178. params->mode->required = YES;
  179. params->mode->multiple = YES;
  180. params->mode->description = _("Draw mode");
  181. params->mode->options = "coarse,fine,both";
  182. params->mode->answer = "fine";
  183. params->mode->guisection = _("Draw");
  184. /* resolution fine */
  185. params->res_fine = G_define_option();
  186. params->res_fine->key = "resolution_fine";
  187. params->res_fine->key_desc = "value";
  188. params->res_fine->type = TYPE_INTEGER;
  189. params->res_fine->required = YES;
  190. params->res_fine->multiple = YES;
  191. params->res_fine->description = _("Fine resolution");
  192. params->res_fine->answer = "6";
  193. params->res_fine->guisection = _("Draw");
  194. /* resolution coarse */
  195. params->res_coarse = G_define_option();
  196. params->res_coarse->key = "resolution_coarse";
  197. params->res_coarse->key_desc = "value";
  198. params->res_coarse->type = TYPE_INTEGER;
  199. params->res_coarse->required = YES;
  200. params->res_coarse->multiple = YES;
  201. params->res_coarse->description = _("Coarse resolution");
  202. params->res_coarse->answer = "9";
  203. params->res_coarse->guisection = _("Draw");
  204. /* style */
  205. params->style = G_define_option();
  206. params->style->key = "style";
  207. params->style->key_desc = "string";
  208. params->style->type = TYPE_STRING;
  209. params->style->required = YES;
  210. params->style->multiple = YES;
  211. params->style->description = _("Draw style");
  212. params->style->options = "wire,surface";
  213. params->style->answer = "surface";
  214. params->style->guisection = _("Draw");
  215. /* shading */
  216. params->shade = G_define_option();
  217. params->shade->key = "shading";
  218. params->shade->key_desc = "string";
  219. params->shade->type = TYPE_STRING;
  220. params->shade->required = YES;
  221. params->shade->multiple = YES;
  222. params->shade->description = _("Shading");
  223. params->shade->options = "flat,gouraud";
  224. params->shade->answer = "gouraud";
  225. params->shade->guisection = _("Draw");
  226. /* wire color */
  227. params->wire_color = G_define_standard_option(G_OPT_C_FG);
  228. params->wire_color->multiple = YES;
  229. params->wire_color->required = YES;
  230. params->wire_color->label = _("Wire color");
  231. params->wire_color->key = "wire_color";
  232. params->wire_color->answer = "136:136:136";
  233. params->wire_color->guisection = _("Draw");
  234. /* shading */
  235. params->shade = G_define_option();
  236. params->shade->key = "shading";
  237. params->shade->key_desc = "string";
  238. params->shade->type = TYPE_STRING;
  239. params->shade->required = YES;
  240. params->shade->multiple = YES;
  241. params->shade->description = _("Shading");
  242. params->shade->options = "flat,gouraud";
  243. params->shade->answer = "gouraud";
  244. params->shade->guisection = _("Draw");
  245. return;
  246. }
  247. void args_vline(struct GParams *params)
  248. {
  249. params->vlines = G_define_standard_option(G_OPT_V_MAP);
  250. params->vlines->multiple = YES;
  251. params->vlines->required = NO;
  252. params->vlines->description = _("Name of line vector overlay map(s)");
  253. params->vlines->guisection = _("Vector lines");
  254. params->vlines->key = "vlines";
  255. /* line width */
  256. params->vline_width = G_define_option();
  257. params->vline_width->key = "vline_width";
  258. params->vline_width->key_desc = "value";
  259. params->vline_width->type = TYPE_INTEGER;
  260. params->vline_width->required = NO;
  261. params->vline_width->multiple = YES;
  262. params->vline_width->description = _("Vector line width");
  263. params->vline_width->guisection = _("Vector lines");
  264. params->vline_width->options = "1-100";
  265. params->vline_width->answer = "2";
  266. /* line color */
  267. params->vline_color = G_define_standard_option(G_OPT_C_FG);
  268. params->vline_color->multiple = YES;
  269. params->vline_color->required = NO;
  270. params->vline_color->label = _("Vector line color");
  271. params->vline_color->key = "vline_color";
  272. params->vline_color->answer = "blue";
  273. params->vline_color->guisection = _("Vector lines");
  274. /* line mode */
  275. params->vline_mode = G_define_option();
  276. params->vline_mode->key = "vline_mode";
  277. params->vline_mode->key_desc = "string";
  278. params->vline_mode->type = TYPE_STRING;
  279. params->vline_mode->required = YES;
  280. params->vline_mode->multiple = YES;
  281. params->vline_mode->description = _("Vector line display mode");
  282. params->vline_mode->options = "surface,flat";
  283. params->vline_mode->answer = "surface";
  284. params->vline_mode->guisection = _("Vector lines");
  285. /* line height */
  286. params->vline_height = G_define_option();
  287. params->vline_height->key = "vline_height";
  288. params->vline_height->key_desc = "value";
  289. params->vline_height->type = TYPE_INTEGER;
  290. params->vline_height->required = NO;
  291. params->vline_height->multiple = YES;
  292. params->vline_height->description = _("Vector line height");
  293. params->vline_height->guisection = _("Vector lines");
  294. params->vline_height->options = "0-1000";
  295. params->vline_height->answer = "0";
  296. return;
  297. }
  298. void args_vpoint(struct GParams *params)
  299. {
  300. params->vpoints = G_define_standard_option(G_OPT_V_MAP);
  301. params->vpoints->multiple = YES;
  302. params->vpoints->required = NO;
  303. params->vpoints->description = _("Name of point vector overlay map(s)");
  304. params->vpoints->guisection = _("Vector points");
  305. params->vpoints->key = "vpoints";
  306. /* point width */
  307. params->vpoint_size = G_define_option();
  308. params->vpoint_size->key = "vpoint_size";
  309. params->vpoint_size->key_desc = "value";
  310. params->vpoint_size->type = TYPE_INTEGER;
  311. params->vpoint_size->required = NO;
  312. params->vpoint_size->multiple = YES;
  313. params->vpoint_size->description = _("Icon size");
  314. params->vpoint_size->guisection = _("Vector points");
  315. params->vpoint_size->options = "1-1000";
  316. params->vpoint_size->answer = "100";
  317. /* point color */
  318. params->vpoint_color = G_define_standard_option(G_OPT_C_FG);
  319. params->vpoint_color->multiple = YES;
  320. params->vpoint_color->required = NO;
  321. params->vpoint_color->label = _("Icon color");
  322. params->vpoint_color->key = "vpoint_color";
  323. params->vpoint_color->answer = "blue";
  324. params->vpoint_color->guisection = _("Vector points");
  325. /* point mode */
  326. params->vpoint_symbol = G_define_option();
  327. params->vpoint_symbol->key = "vpoint_symbol";
  328. params->vpoint_symbol->key_desc = "string";
  329. params->vpoint_symbol->type = TYPE_STRING;
  330. params->vpoint_symbol->required = YES;
  331. params->vpoint_symbol->multiple = YES;
  332. params->vpoint_symbol->description = _("Icon symbol");
  333. params->vpoint_symbol->options = "x,sphere,diamond,cube,box,gyro,aster,histogram";
  334. params->vpoint_symbol->answer = "sphere";
  335. params->vpoint_symbol->guisection = _("Vector points");
  336. return;
  337. }
  338. void args_viewpoint(struct GParams *params)
  339. {
  340. /* position */
  341. params->pos = G_define_option();
  342. params->pos->key = "position";
  343. params->pos->key_desc = "x,y";
  344. params->pos->type = TYPE_DOUBLE;
  345. params->pos->required = NO;
  346. params->pos->multiple = NO;
  347. params->pos->description = _("Viewpoint position (x,y model coordinates)");
  348. params->pos->guisection = _("Viewpoint");
  349. params->pos->answer = "0.85,0.85";
  350. /* height */
  351. params->height = G_define_option();
  352. params->height->key = "height";
  353. params->height->key_desc = "value";
  354. params->height->type = TYPE_INTEGER;
  355. params->height->required = NO;
  356. params->height->multiple = NO;
  357. params->height->description = _("Viewpoint height (in map units)");
  358. params->height->guisection = _("Viewpoint");
  359. /* perspective */
  360. params->persp = G_define_option();
  361. params->persp->key = "perspective";
  362. params->persp->key_desc = "value";
  363. params->persp->type = TYPE_INTEGER;
  364. params->persp->required = NO;
  365. params->persp->multiple = NO;
  366. params->persp->description = _("Viewpoint field of view (in degrees)");
  367. params->persp->guisection = _("Viewpoint");
  368. params->persp->answer = "40";
  369. params->persp->options = "1-100";
  370. /* twist */
  371. params->twist = G_define_option();
  372. params->twist->key = "twist";
  373. params->twist->key_desc = "value";
  374. params->twist->type = TYPE_INTEGER;
  375. params->twist->required = NO;
  376. params->twist->multiple = NO;
  377. params->twist->description = _("Viewpoint twist angle (in degrees)");
  378. params->twist->guisection = _("Viewpoint");
  379. params->twist->answer = "0";
  380. params->twist->options = "-180-180";
  381. /* z-exag */
  382. params->exag = G_define_option();
  383. params->exag->key = "zexag";
  384. params->exag->key_desc = "value";
  385. params->exag->type = TYPE_DOUBLE;
  386. params->exag->required = NO;
  387. params->exag->multiple = NO;
  388. params->exag->description = _("Vertical exaggeration");
  389. return;
  390. }
  391. /*!
  392. \brief Get number of answers of given option
  393. \param pointer to option
  394. \return number of arguments
  395. */
  396. int opt_get_num_answers(const struct Option *opt)
  397. {
  398. int i;
  399. i = 0;
  400. if (opt->answer) {
  401. while (opt->answers[i]) {
  402. i++;
  403. }
  404. }
  405. return i;
  406. }
  407. /*!
  408. \brief Check parameters consistency
  409. \param params module parameters
  410. */
  411. void check_parameters(const struct GParams * params)
  412. {
  413. int nelev_map, nelev_const, nelevs;
  414. int nmaps, nconsts;
  415. int nvects;
  416. /* topography */
  417. nelev_map = opt_get_num_answers(params->elev_map);
  418. nelev_const = opt_get_num_answers(params->elev_const);
  419. nelevs = nelev_map + nelev_const;
  420. if (nelevs < 1)
  421. G_fatal_error(_("At least one <%s> or <%s> required"),
  422. params->elev_map->key, params->elev_const->key);
  423. /* color */
  424. nmaps = opt_get_num_answers(params->color_map);
  425. nconsts = opt_get_num_answers(params->color_const);
  426. print_error(nmaps, nconsts, nelevs,
  427. params->elev_map->key, params->elev_const->key,
  428. params->color_map->key, params->color_const->key);
  429. /* mask */
  430. nmaps = opt_get_num_answers(params->mask_map);
  431. if (nmaps > 0 && nelevs != nmaps)
  432. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  433. params->elev_map->key, params->elev_const->key, nelevs,
  434. params->mask_map->key, nmaps);
  435. /* transparency */
  436. nmaps = opt_get_num_answers(params->transp_map);
  437. nconsts = opt_get_num_answers(params->transp_const);
  438. print_error(nmaps, nconsts, nelevs,
  439. params->elev_map->key, params->elev_const->key,
  440. params->transp_map->key, params->transp_const->key);
  441. /* shininess */
  442. nmaps = opt_get_num_answers(params->shine_map);
  443. nconsts = opt_get_num_answers(params->shine_const);
  444. print_error(nmaps, nconsts, nelevs,
  445. params->elev_map->key, params->elev_const->key,
  446. params->shine_map->key, params->shine_const->key);
  447. /* emit */
  448. nmaps = opt_get_num_answers(params->emit_map);
  449. nconsts = opt_get_num_answers(params->emit_const);
  450. print_error(nmaps, nconsts, nelevs,
  451. params->elev_map->key, params->elev_const->key,
  452. params->emit_map->key, params->emit_const->key);
  453. /* draw mode */
  454. if (!params->mode_all->answer) { /* use one mode for all surfaces */
  455. nconsts = opt_get_num_answers(params->mode);
  456. if (nconsts > 0 && nconsts != nelevs)
  457. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  458. params->elev_map->key, params->elev_const->key, nelevs,
  459. params->mode->key, nconsts);
  460. nconsts = opt_get_num_answers(params->res_fine);
  461. if (nconsts > 0 && nconsts != nelevs)
  462. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d"),
  463. params->elev_map->key, params->elev_const->key, nelevs,
  464. params->res_fine->key, nconsts);
  465. nconsts = opt_get_num_answers(params->res_coarse);
  466. if (nconsts > 0 && nconsts != nelevs)
  467. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  468. params->elev_map->key, params->elev_const->key, nelevs,
  469. params->res_coarse->key, nconsts);
  470. nconsts = opt_get_num_answers(params->style);
  471. if (nconsts > 0 && nconsts != nelevs)
  472. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  473. params->elev_map->key, params->elev_const->key, nelevs,
  474. params->style->key, nconsts);
  475. nconsts = opt_get_num_answers(params->shade);
  476. if (nconsts > 0 && nconsts != nelevs)
  477. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  478. params->elev_map->key, params->elev_const->key, nelevs,
  479. params->shade->key, nconsts);
  480. nconsts = opt_get_num_answers(params->wire_color);
  481. if (nconsts > 0 && nconsts != nelevs)
  482. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"),
  483. params->elev_map->key, params->elev_const->key, nelevs,
  484. params->wire_color->key, nconsts);
  485. }
  486. /*
  487. * vector
  488. */
  489. nvects = opt_get_num_answers(params->vlines);
  490. /* width */
  491. nconsts = opt_get_num_answers(params->vline_width);
  492. if (nvects > 0 && nconsts != nvects)
  493. G_fatal_error(_("Inconsistent number of attributes (<%s> %d: <%s> %d)"),
  494. params->vlines->key, nvects,
  495. params->vline_width->key, nconsts);
  496. /* color */
  497. nconsts = opt_get_num_answers(params->vline_color);
  498. if (nvects > 0 && nconsts != nvects)
  499. G_fatal_error(_("Inconsistent number of attributes (<%s> %d: <%s> %d"),
  500. params->vlines->key, nvects,
  501. params->vline_color->key, nconsts);
  502. /* mode */
  503. nconsts = opt_get_num_answers(params->vline_mode);
  504. if (nvects > 0 && nconsts != nvects)
  505. G_fatal_error(_("Inconsistent number of attributes (<%s> %d: <%s> %d)"),
  506. params->vlines->key, nvects,
  507. params->vline_mode->key, nconsts);
  508. /* height */
  509. nconsts = opt_get_num_answers(params->vline_height);
  510. if (nvects > 0 && nconsts != nvects)
  511. G_fatal_error(_("Inconsistent number of attributes (<%s> %d: <%s> %d)"),
  512. params->vlines->key, nvects,
  513. params->vline_height->key, nconsts);
  514. return;
  515. }
  516. void print_error(int nmaps, int nconsts, int nelevs,
  517. const char *elev_map, const char *elev_const,
  518. const char *map_name, const char *const_name)
  519. {
  520. if ((nmaps > 0 && nelevs != nmaps) ||
  521. (nconsts > 0 && nelevs != nconsts))
  522. G_fatal_error(_("Inconsistent number of attributes (<%s/%s> %d: <%s> %d, <%s> %d"),
  523. elev_map, elev_const, nelevs,
  524. map_name, nmaps,
  525. const_name, nconsts);
  526. return;
  527. }