delete.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*!
  2. \file lib/vector/vedit/delete.c
  3. \brief Vedit library - delete vector features
  4. (C) 2007-2008, 2012 by the GRASS Development Team
  5. This program is free software under the GNU General Public License
  6. (>=v2). Read the file COPYING that comes with GRASS for details.
  7. \author Martin Landa <landa.martin gmail.com>
  8. */
  9. #include <stdlib.h>
  10. #include <grass/vedit.h>
  11. #include <grass/dbmi.h>
  12. #include <grass/glocale.h>
  13. /*!
  14. \brief Delete selected features
  15. \param Map pointer to Map_info
  16. \param List list of features to be deleted
  17. \return number of deleted features
  18. \return -1 on on error
  19. */
  20. int Vedit_delete_lines(struct Map_info *Map, struct ilist *List)
  21. {
  22. int i, line;
  23. int nlines_removed;
  24. nlines_removed = 0;
  25. for (i = 0; i < List->n_values; i++) {
  26. line = List->value[i];
  27. if (!Vect_line_alive(Map, line)) {
  28. G_warning(_("Attempt to delete dead feature (%d)"), line);
  29. continue;
  30. }
  31. if (Vect_delete_line(Map, line) < 0) {
  32. return -1;
  33. }
  34. G_debug(3, "Vedit_delete_lines(): line=%d", line);
  35. nlines_removed++;
  36. }
  37. return nlines_removed;
  38. }
  39. /*!
  40. \brief Delete area (centroid and set of boundaries) by centroid
  41. \param Map pointer to Map_info struct
  42. \param centroid
  43. \return 0 no area deleted
  44. \return 1 area deleted
  45. */
  46. int Vedit_delete_area_centroid(struct Map_info *Map, int centroid)
  47. {
  48. int area;
  49. G_debug(1, "Vedit_delete_area_centroid(): centroid = %d", centroid);
  50. area = Vect_get_centroid_area(Map, centroid);
  51. if (area == 0) {
  52. G_warning(_("No area found for centroid %d"), centroid);
  53. return 0;
  54. }
  55. if (area < 0) {
  56. G_warning(_("Duplicate centroid %d, unable to delete area"), centroid);
  57. return 0;
  58. }
  59. return Vedit_delete_area(Map, area);
  60. }
  61. /*!
  62. \brief Delete area (centroid + set of boundaries) by id
  63. \param Map pointer to Map_info struct
  64. \param area id
  65. \return 0 no area deleted
  66. \return 1 area deleted
  67. */
  68. int Vedit_delete_area(struct Map_info *Map, int area)
  69. {
  70. int i, line, centroid, left, right;
  71. struct ilist *list;
  72. list = Vect_new_list();
  73. G_debug(3, "Vedit_delete_area(): area=%d", area);
  74. centroid = Vect_get_area_centroid(Map, area);
  75. if (centroid != 0) {
  76. Vect_delete_line(Map, centroid);
  77. }
  78. else {
  79. G_warning(_("Area %d without centroid"), area);
  80. return 0;
  81. }
  82. Vect_get_area_boundaries(Map, area, list);
  83. if (list->n_values > 0) {
  84. for (i = 0; i < list->n_values; i++) {
  85. line = abs(list->value[i]);
  86. Vect_get_line_areas(Map, line, &left, &right);
  87. if (left > 0 && right > 0)
  88. /* do not delete common boundaries */
  89. continue;
  90. Vect_delete_line(Map, line);
  91. }
  92. }
  93. else {
  94. G_warning(_("Area %d has no boundaries"), area);
  95. return 0;
  96. }
  97. Vect_destroy_list(list);
  98. return 1;
  99. }
  100. /*!
  101. \brief Delete vector areas of given category
  102. \param Map pointer to Map_info struct
  103. \param field layer number
  104. \param cat category number
  105. \return number of deleted areas
  106. */
  107. int Vedit_delete_areas_cat(struct Map_info *Map, int field, int cat)
  108. {
  109. int area, nareas, nremoved;
  110. G_debug(1, "Vedit_delete_areas(): field = %d cat = %d", field, cat);
  111. nareas = Vect_get_num_areas(Map);
  112. nremoved = 0;
  113. for (area = 1; area <= nareas; area++) {
  114. if (!Vect_area_alive(Map, area))
  115. continue;
  116. if (Vect_get_area_cat(Map, area, field) != cat)
  117. continue;
  118. if (Vedit_delete_area(Map, area))
  119. nremoved++;
  120. }
  121. return nremoved;
  122. }