volume.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /**
  2. \file volume.cpp
  3. \brief Experimental C++ wxWidgets Nviz prototype -- volume attributes
  4. Used by wxGUI Nviz extension.
  5. Copyright: (C) by the GRASS Development Team
  6. This program is free software under the GNU General Public
  7. License (>=v2). Read the file COPYING that comes with GRASS
  8. for details.
  9. \author Martin Landa <landa.martin gmail.com> (Google SoC 2008)
  10. \date 2008
  11. */
  12. #include "nviz.h"
  13. /**
  14. \brief Add new isosurface
  15. \param id volume id
  16. \param level isosurface level (topography)
  17. \return -1 on failure
  18. \return 1 on success
  19. */
  20. int Nviz::AddIsosurface(int id, int level)
  21. {
  22. int nisosurfs;
  23. if (!GVL_vol_exists(id))
  24. return -1;
  25. if (GVL_isosurf_add(id) < 0)
  26. return -1;
  27. /* set topography level */
  28. nisosurfs = GVL_isosurf_num_isosurfs(id);
  29. return GVL_isosurf_set_att_const(id, nisosurfs - 1,
  30. ATT_TOPO, level);
  31. }
  32. /**
  33. \brief Delete isosurface
  34. \param id volume id
  35. \param isosurf_id isosurface id
  36. \return 1 on success
  37. \return -1 volume not found
  38. \return -2 isosurface not found
  39. \return -3 on failure
  40. */
  41. int Nviz::DeleteIsosurface(int id, int isosurf_id)
  42. {
  43. int ret;
  44. if (!GVL_vol_exists(id))
  45. return -1;
  46. if (isosurf_id > GVL_isosurf_num_isosurfs(id))
  47. return -2;
  48. ret = GVL_isosurf_del(id, isosurf_id);
  49. return ret < 0 ? -3 : 1;
  50. }
  51. /*!
  52. \brief Move isosurface up/down in the list
  53. \param id volume id
  54. \param isosurf_id isosurface id
  55. \param up if true move up otherwise down
  56. \return 1 on success
  57. \return -1 volume not found
  58. \return -2 isosurface not found
  59. \return -3 on failure
  60. */
  61. int Nviz::MoveIsosurface(int id, int isosurf_id, bool up)
  62. {
  63. int ret;
  64. if (!GVL_vol_exists(id))
  65. return -1;
  66. if (isosurf_id > GVL_isosurf_num_isosurfs(id))
  67. return -2;
  68. if (up)
  69. ret = GVL_isosurf_move_up(id, isosurf_id);
  70. else
  71. ret = GVL_isosurf_move_down(id, isosurf_id);
  72. return ret < 0 ? -3 : 1;
  73. }
  74. /*!
  75. \brief Set isosurface color
  76. \param id volume id
  77. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  78. \param map if true use map otherwise constant
  79. \param value map name of value
  80. \return 1 on success
  81. \return -1 volume not found
  82. \return -2 isosurface not found
  83. \return -3 on failure
  84. */
  85. int Nviz::SetIsosurfaceColor(int id, int isosurf_id,
  86. bool map, const char *value)
  87. {
  88. return SetIsosurfaceAttr(id, isosurf_id, ATT_COLOR, map, value);
  89. }
  90. /*!
  91. \brief Set isosurface mask
  92. @todo invert
  93. \param id volume id
  94. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  95. \param invert true for invert mask
  96. \param value map name to be used for mask
  97. \return 1 on success
  98. \return -1 volume not found
  99. \return -2 isosurface not found
  100. \return -3 on failure
  101. */
  102. int Nviz::SetIsosurfaceMask(int id, int isosurf_id,
  103. bool invert, const char *value)
  104. {
  105. return SetIsosurfaceAttr(id, isosurf_id, ATT_MASK, true, value);
  106. }
  107. /*!
  108. \brief Set isosurface transparency
  109. \param id volume id
  110. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  111. \param map if true use map otherwise constant
  112. \param value map name of value
  113. \return 1 on success
  114. \return -1 volume not found
  115. \return -2 isosurface not found
  116. \return -3 on failure
  117. */
  118. int Nviz::SetIsosurfaceTransp(int id, int isosurf_id,
  119. bool map, const char *value)
  120. {
  121. return SetIsosurfaceAttr(id, isosurf_id, ATT_TRANSP, map, value);
  122. }
  123. /*!
  124. \brief Set isosurface shininess
  125. \param id volume id
  126. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  127. \param map if true use map otherwise constant
  128. \param value map name of value
  129. \return 1 on success
  130. \return -1 volume not found
  131. \return -2 isosurface not found
  132. \return -3 on failure
  133. */
  134. int Nviz::SetIsosurfaceShine(int id, int isosurf_id,
  135. bool map, const char *value)
  136. {
  137. return SetIsosurfaceAttr(id, isosurf_id, ATT_SHINE, map, value);
  138. }
  139. /*!
  140. \brief Set isosurface emission
  141. \param id volume id
  142. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  143. \param map if true use map otherwise constant
  144. \param value map name of value
  145. \return 1 on success
  146. \return -1 volume not found
  147. \return -2 isosurface not found
  148. \return -3 on failure
  149. */
  150. int Nviz::SetIsosurfaceEmit(int id, int isosurf_id,
  151. bool map, const char *value)
  152. {
  153. return SetIsosurfaceAttr(id, isosurf_id, ATT_EMIT, map, value);
  154. }
  155. /*!
  156. \brief Set isosurface attribute
  157. \param id volume id
  158. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  159. \param attr attribute desc
  160. \param map if true use map otherwise constant
  161. \param value map name of value
  162. \return 1 on success
  163. \return -1 volume not found
  164. \return -2 isosurface not found
  165. \return -3 setting attributes failed
  166. */
  167. int Nviz::SetIsosurfaceAttr(int id, int isosurf_id,
  168. int attr, bool map, const char *value)
  169. {
  170. int ret;
  171. if (!GVL_vol_exists(id)) {
  172. return -1;
  173. }
  174. if (isosurf_id > GVL_isosurf_num_isosurfs(id) - 1)
  175. return -2;
  176. if (map) {
  177. ret = GVL_isosurf_set_att_map(id, isosurf_id, attr,
  178. value);
  179. }
  180. else {
  181. float val;
  182. if (attr == ATT_COLOR) {
  183. val = Nviz_color_from_str(value);
  184. }
  185. else {
  186. val = atof(value);
  187. }
  188. ret = GVL_isosurf_set_att_const(id, isosurf_id, attr,
  189. val);
  190. }
  191. G_debug(1, "Nviz::SetIsosurfaceAttr(): id=%d, isosurf=%d, "
  192. "attr=%d, map=%d, value=%s",
  193. id, isosurf_id, attr, map, value);
  194. return ret > 0 ? 1 : -2;
  195. }
  196. /*!
  197. \brief Unset isosurface mask
  198. \param id volume id
  199. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  200. \return 1 on success
  201. \return -1 volume not found
  202. \return -2 isosurface not found
  203. \return -3 setting attributes failed
  204. */
  205. int Nviz::UnsetIsosurfaceMask(int id, int isosurf_id)
  206. {
  207. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_MASK);
  208. }
  209. /*!
  210. \brief Unset isosurface transparency
  211. \param id volume id
  212. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  213. \return 1 on success
  214. \return -1 volume not found
  215. \return -2 isosurface not found
  216. \return -3 setting attributes failed
  217. */
  218. int Nviz::UnsetIsosurfaceTransp(int id, int isosurf_id)
  219. {
  220. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_TRANSP);
  221. }
  222. /*!
  223. \brief Unset isosurface emission
  224. \param id volume id
  225. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  226. \return 1 on success
  227. \return -1 volume not found
  228. \return -2 isosurface not found
  229. \return -3 setting attributes failed
  230. */
  231. int Nviz::UnsetIsosurfaceEmit(int id, int isosurf_id)
  232. {
  233. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_EMIT);
  234. }
  235. /*!
  236. \brief Unset surface attribute
  237. \param id surface id
  238. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  239. \param attr attribute descriptor
  240. \return 1 on success
  241. \return -1 volume not found
  242. \return -2 isosurface not found
  243. \return -2 on failure
  244. */
  245. int Nviz::UnsetIsosurfaceAttr(int id, int isosurf_id,
  246. int attr)
  247. {
  248. int ret;
  249. if (!GVL_vol_exists(id)) {
  250. return -1;
  251. }
  252. if (isosurf_id > GVL_isosurf_num_isosurfs(id) - 1)
  253. return -2;
  254. G_debug(1, "Nviz::UnsetSurfaceAttr(): id=%d, isosurf_id=%d, attr=%d",
  255. id, isosurf_id, attr);
  256. ret = GVL_isosurf_unset_att(id, isosurf_id, attr);
  257. return ret > 0 ? 1 : -2;
  258. }
  259. /*!
  260. \brief Set draw mode for isosurfaces
  261. \param mode
  262. \return 1 on success
  263. \return -1 volume set not found
  264. \return -2 on failure
  265. */
  266. int Nviz::SetIsosurfaceMode(int id, int mode)
  267. {
  268. int ret;
  269. if (!GVL_vol_exists(id)) {
  270. return -1;
  271. }
  272. ret = GVL_isosurf_set_drawmode(id, mode);
  273. return ret < 0 ? -2 : 1;
  274. }
  275. /*!
  276. \brief Set draw resolution for isosurfaces
  277. \param res resolution value
  278. \return 1 on success
  279. \return -1 volume set not found
  280. \return -2 on failure
  281. */
  282. int Nviz::SetIsosurfaceRes(int id, int res)
  283. {
  284. int ret;
  285. if (!GVL_vol_exists(id)) {
  286. return -1;
  287. }
  288. ret = GVL_isosurf_set_drawres(id, res, res, res);
  289. return ret < 0 ? -2 : 1;
  290. }