23 : mbImpl( impl ), mbMergeTag( 0 ), mergeTol( 0.001 ), mergeTolSq( 0.000001 ), printError( printErrorIn )
35 const double merge_tol,
37 const int update_sets,
44 tmp_elems.
insert( elems, elems + elems_size );
61 const double merge_tol,
65 bool merge_higher_dim )
68 if( merge_higher_dim && !do_merge )
95 result = kd.
build_tree( skin_range, &tree_root );
109 if( merge_higher_dim &&
deadEnts.size() != 0 )
137 entities =
subtract( entities, sets );
164 if(
printError ) std::cout <<
"\nWarning: Geometries don't have a common face; Nothing to merge" << std::endl;
168 std::vector< EntityHandle > merge_tag_val(
deadEnts.size() );
174 std::set< EntityHandle >::iterator rit;
178 assert( merge_tag_val[i] );
206 return ( ia->
eh < ib->
eh ) ? -1 : 1;
210 return ( ia->
val - ib->
val );
221 std::vector< int > vals( verts.
size() );
235 std::vector< handle_id > handles( verts.
size() );
239 handles[i].eh = *vit;
240 handles[i].val = vals[i];
246 while( i < (
int)verts.
size() - 1 )
250 while( j < (
int)verts.
size() && handles[j].val ==
first.val )
269 Range leaf_range, leaf_range2;
270 std::vector< EntityHandle > sorted_leaves;
271 std::vector< double > coords;
272 std::vector< EntityHandle > merge_tag_val, leaves_out;
278 sorted_leaves.push_back( iter.
handle() );
279 result = iter.
step();
282 std::sort( sorted_leaves.begin(), sorted_leaves.end() );
284 std::vector< EntityHandle >::iterator it;
285 for( it = sorted_leaves.begin(); it != sorted_leaves.end(); ++it )
291 coords.resize( 3 * leaf_range.
size() );
292 merge_tag_val.resize( leaf_range.
size() );
299 bool inleaf_merged, outleaf_merged =
false;
300 unsigned int lr_size = leaf_range.
size();
302 for( i = 0, rit = leaf_range.
begin(); i != lr_size; ++rit, i++ )
304 if( 0 != merge_tag_val[i] )
continue;
306 inleaf_merged =
false;
313 for( std::vector< EntityHandle >::iterator vit = leaves_out.begin(); vit != leaves_out.end(); ++vit )
321 if( !leaf_range2.
empty() )
323 coords.resize( 3 * ( lr_size + leaf_range2.
size() ) );
324 merge_tag_val.resize( lr_size + leaf_range2.
size() );
329 outleaf_merged =
false;
333 for(
unsigned int j = i + 1; j < merge_tag_val.size(); j++ )
335 EntityHandle to_ent = j >= lr_size ? leaf_range2[j - lr_size] : leaf_range[j];
337 if( *rit == to_ent )
continue;
341 merge_tag_val[j] = *rit;
344 inleaf_merged =
true;
348 outleaf_merged =
true;
357 outleaf_merged =
false;
382 Range mergedToVertsRange;
386 Range possibleEntsToMerge, conn, matches, moreDeadEnts;
388 for(
int dim = 1; dim < 3; dim++ )
390 moreDeadEnts.
clear();
391 possibleEntsToMerge.
clear();
408 if( matches.
size() > 1 )
413 if( to_remove != eh )
415 moreDeadEnts.
insert( to_remove );
418 possibleEntsToMerge.
erase( to_remove );
429 Range skinEnts, adj, matches, moreDeadEnts;
433 for (
int dim = 1; dim < 3; dim++)
436 moreDeadEnts.
clear();
437 result = skinner.
find_skin(0, elems, dim, skinEnts,
false,
false);
440 skinIt != skinEnts.
end(); ++skinIt)
454 if (matches.
size() > 1)
457 matchIt != matches.
end(); ++matchIt)
459 if (*matchIt != *skinIt)
461 moreDeadEnts.
insert(*matchIt);
465 skinEnts.
erase(*matchIt);