diff --git a/Common/ListUtils.cpp b/Common/ListUtils.cpp index 6a4ac5c9b0e5a1a216834ad31058253fbe21ba06..922e13aebd5a2f0b73d089af8a1f8106a8eb6355 100644 --- a/Common/ListUtils.cpp +++ b/Common/ListUtils.cpp @@ -154,6 +154,23 @@ void List_Sort(List_T * liste, int (*fcmp) (const void *a, const void *b)) qsort(liste->array, liste->n, liste->size, fcmp); } +void List_Unique(List_T * liste, int (*fcmp) (const void *a, const void *b)) +{ + if(liste->isorder != 1) { + List_Sort(liste, fcmp); + liste->isorder = 1; + } + if(!List_Nbr(liste)) + return; + int write_index=0; + for( int i=1; i < List_Nbr(liste); i++){ + void *data=List_Pointer(liste,i); + if((fcmp(data,(void*)List_Pointer(liste,write_index)))) + List_Write(liste,++write_index,data); + } + liste->n=write_index+1; +} + int List_Search(List_T * liste, void *data, int (*fcmp) (const void *a, const void *b)) { diff --git a/Common/ListUtils.h b/Common/ListUtils.h index e08b0a2908287b3cbc0a302b853db1f10008f9db..ebf2d4220b313e4a5c3550c68e55738785e74ac2 100644 --- a/Common/ListUtils.h +++ b/Common/ListUtils.h @@ -35,6 +35,7 @@ void *List_Pointer_NoChange(List_T *liste, int index); void *List_Pointer_Fast(List_T *liste, int index); void *List_Pointer_Test(List_T *liste, int index); void List_Sort(List_T *liste, int (*fcmp)(const void *a, const void *b)); +void List_Unique(List_T *liste, int (*fcmp)(const void *a, const void *b)); int List_Search(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); int List_ISearch(List_T *liste, void *data, int (*fcmp)(const void *a, const void *b)); int List_ISearchSeq(List_T *liste, void * data, int (*fcmp)(const void *a, const void *b)); diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp index 1afbfd1dc6d939b7e98b04d8bf4b37d5a0eda5f5..4945a130a7586142358e174e760967f7c94c4498 100644 --- a/Fltk/menuWindow.cpp +++ b/Fltk/menuWindow.cpp @@ -940,16 +940,21 @@ static void add_new_surface_volume(int mode) } } if(ib == 'l') { - int num = (type == ENT_LINE) ? - GUI::instance()->selectedEdges[0]->tag() : - GUI::instance()->selectedFaces[0]->tag(); - if(select_contour(type, num, List1)) { - if(type == ENT_LINE) - add_lineloop(List1, GModel::current()->getFileName(), &num); - else - add_surfloop(List1, GModel::current()->getFileName(), &num); - List_Reset(List1); - List_Add(List2, &num); + int size = (type == ENT_LINE) ? + GUI::instance()->selectedEdges.size() : + GUI::instance()->selectedFaces.size(); + for(int i=0;i<size;i++){ + int num = (type == ENT_LINE) ? + GUI::instance()->selectedEdges[i]->tag() : + GUI::instance()->selectedFaces[i]->tag(); + if(select_contour(type, num, List1)) { + if(type == ENT_LINE) + add_lineloop(List1, GModel::current()->getFileName(), &num); + else + add_surfloop(List1, GModel::current()->getFileName(), &num); + List_Reset(List1); + List_Add(List2, &num); + } } } if(ib == 'r') { @@ -957,6 +962,7 @@ static void add_new_surface_volume(int mode) "surface/volume creation"); } } + List_Unique(List2,fcmp_absint); if(List_Nbr(List2)) { switch (mode) { case 0: add_surf("Plane Surface", List2, diff --git a/Geo/SOrientedBoundingBox.cpp b/Geo/SOrientedBoundingBox.cpp index e140152361a03a1a5d490a7f3ddd322bee3ffc47..494566f8af2bbbc105d68d056e0d2d5931ff9a6d 100644 --- a/Geo/SOrientedBoundingBox.cpp +++ b/Geo/SOrientedBoundingBox.cpp @@ -6,6 +6,7 @@ // Contributed by Bastien Gorissen #include <math.h> +#include <stdlib.h> #include "SOrientedBoundingBox.h" #include "GmshMatrix.h"