Skip to content

Commit 4fc414d

Browse files
committed
Added option to MMG remesher to preserve selected surface.
1 parent 22f954b commit 4fc414d

2 files changed

Lines changed: 52 additions & 31 deletions

File tree

MeshTools/FEMMGRemesh.cpp

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ MMGRemesh::MMGRemesh() : FEModifier("MMG Remesh")
4747
AddDoubleParam(0.05, "hv", "Global Hausdorff value");
4848
AddDoubleParam(1.3, "grad", "Gradation");
4949
AddDoubleParam(45, "angle", "Angle (degrees)");
50-
AddBoolParam(true, "Only remesh selection");
50+
AddBoolParam(false, "Only remesh selection");
51+
AddBoolParam(false, "Preserve selected surface");
5152
}
5253

5354
FSMesh* MMGRemesh::Apply(FSMesh* pm)
@@ -69,42 +70,48 @@ FSMesh* MMGRemesh::Apply(FSGroup* pg)
6970
if (pm == nullptr) return nullptr;
7071
if (pm->IsType(FE_TET4) == false) return Apply(pm);
7172

72-
if (dynamic_cast<FSElemSet*>(pg))
73+
bool remeshSelectionOnly = GetBoolValue(SELECTED_ONLY);
74+
pm->TagAllElements(0);
75+
76+
if (remeshSelectionOnly)
7377
{
74-
pm->TagAllElements(0);
75-
for (int i = 0; i < pm->Elements(); ++i)
78+
if (dynamic_cast<FSElemSet*>(pg))
7679
{
77-
if (pm->Element(i).IsSelected()) pm->Element(i).m_ntag = 1;
78-
}
79-
return RemeshTET4(pm);
80-
}
81-
else if (dynamic_cast<FSSurface*>(pg))
82-
{
83-
pm->TagAllNodes(0);
84-
pm->TagAllElements(0);
85-
for (int i = 0; i < pm->Faces(); ++i)
86-
{
87-
if (pm->Face(i).IsSelected())
80+
for (int i = 0; i < pm->Elements(); ++i)
8881
{
89-
FSFace& face = pm->Face(i);
90-
int nn = face.Nodes();
91-
for (int j = 0; j < nn; ++j) pm->Node(face.n[j]).m_ntag = 1;
82+
if (pm->Element(i).IsSelected()) pm->Element(i).m_ntag = 1;
9283
}
84+
return RemeshTET4(pm);
9385
}
94-
for (int i = 0; i < pm->Elements(); ++i)
86+
else if (dynamic_cast<FSSurface*>(pg))
9587
{
96-
FSElement& el = pm->Element(i);
97-
int ne = el.Nodes();
98-
for (int j = 0; j < ne; ++j)
88+
pm->TagAllNodes(0);
89+
pm->TagAllElements(0);
90+
for (int i = 0; i < pm->Faces(); ++i)
91+
{
92+
if (pm->Face(i).IsSelected())
93+
{
94+
FSFace& face = pm->Face(i);
95+
int nn = face.Nodes();
96+
for (int j = 0; j < nn; ++j) pm->Node(face.n[j]).m_ntag = 1;
97+
}
98+
}
99+
for (int i = 0; i < pm->Elements(); ++i)
99100
{
100-
if (pm->Node(el.m_node[j]).m_ntag == 1)
101+
FSElement& el = pm->Element(i);
102+
int ne = el.Nodes();
103+
for (int j = 0; j < ne; ++j)
101104
{
102-
el.m_ntag = 1;
103-
break;
105+
if (pm->Node(el.m_node[j]).m_ntag == 1)
106+
{
107+
el.m_ntag = 1;
108+
break;
109+
}
104110
}
105111
}
112+
return RemeshTET4(pm);
106113
}
107-
return RemeshTET4(pm);
114+
else return Apply(pg->GetMesh());
108115
}
109116
else return Apply(pg->GetMesh());
110117
}
@@ -183,6 +190,16 @@ FSMesh* MMGRemesh::RemeshTET4(FSMesh* pm)
183190

184191
double h = GetFloatValue(ELEM_SIZE);
185192

193+
bool preserveSurface = GetBoolValue(PRESERVE_SURFACE);
194+
if (preserveSurface)
195+
{
196+
for (int i = 0; i < NF; ++i)
197+
{
198+
FSFace& f = pm->Face(i);
199+
if (f.IsSelected()) MMG3D_Set_requiredTriangle(mmgMesh, i + 1);
200+
}
201+
}
202+
186203
vector<pair<double, int> > edgeLength(NN, pair<double, int>(0.0, 0));
187204
int nsel = 0;
188205
for (int i = 0; i < NE; ++i)
@@ -654,13 +671,17 @@ FSSurfaceMesh* MMGSurfaceRemesh::Apply(FSSurfaceMesh* pm)
654671
}
655672

656673
double h = GetFloatValue(ELEM_SIZE);
674+
bool remeshSelectionOnly = GetBoolValue(SELECTED_ONLY);
657675

658676
vector<pair<double, int> > edgeLength(NN, pair<double, int>(0.0, 0));
659677
int nsel = 0;
660-
for (int i = 0; i < NF; ++i)
678+
if (remeshSelectionOnly)
661679
{
662-
FSFace& face = pm->Face(i);
663-
if (face.IsSelected()) nsel++;
680+
for (int i = 0; i < NF; ++i)
681+
{
682+
FSFace& face = pm->Face(i);
683+
if (face.IsSelected()) nsel++;
684+
}
664685
}
665686

666687
if (nsel == 0)
@@ -671,7 +692,6 @@ FSSurfaceMesh* MMGSurfaceRemesh::Apply(FSSurfaceMesh* pm)
671692
}
672693
else
673694
{
674-
bool remeshSelectionOnly = GetBoolValue(SELECTED_ONLY);
675695
if (remeshSelectionOnly)
676696
{
677697
for (int i = 0; i < NF; ++i)

MeshTools/FEMMGRemesh.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ class MMGRemesh : public FEModifier
3838
HAUSDORFF,
3939
HGRAD,
4040
ANGLE,
41-
SELECTED_ONLY
41+
SELECTED_ONLY,
42+
PRESERVE_SURFACE
4243
};
4344

4445
public:

0 commit comments

Comments
 (0)