@@ -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
5354FSMesh* 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)
0 commit comments