76 const Tag* file_id_tag )
78 int num_material_sets = 0;
79 const int* material_set_list = 0;
95 std::set< int > blocks;
96 for(
const int* mat_set_end = material_set_list + num_material_sets; material_set_list != mat_set_end;
98 blocks.insert( *material_set_list );
101 std::map< long, EntityHandle > node_id_map;
105 FILE* file_ptr = fopen( filename,
"r" );
113 const char*
const start_tokens[] = {
"$NOD",
"$MeshFormat", 0 };
114 int format_version = tokens.
match_token( start_tokens );
118 if( 2 == format_version )
123 if( version != 2.0 && version != 2.1 && version != 2.2 )
133 const char*
const phys_tokens[] = {
"$Nodes",
"$PhysicalNames", 0 };
140 for(
long loop_phys = 0; loop_phys < num_phys; loop_phys++ )
164 std::vector< double* > coord_arrays;
170 double *x = coord_arrays[0], *y = coord_arrays[1], *z = coord_arrays[2];
171 for(
long i = 0; i < num_nodes; ++i, ++handle )
178 if( !node_id_map.insert( std::pair< long, EntityHandle >(
id, handle ) ).second )
185 std::vector< int > ids( num_nodes );
186 std::vector< int >::iterator id_iter = ids.begin();
187 std::vector< EntityHandle > handles( num_nodes );
188 std::vector< EntityHandle >::iterator h_iter = handles.begin();
189 for( std::map< long, EntityHandle >::iterator i = node_id_map.begin(); i != node_id_map.end();
190 ++i, ++id_iter, ++h_iter )
207 if( !tokens.
match_token( format_version == 1 ?
"$ENDNOD" :
"$EndNodes" ) ||
208 !tokens.
match_token( format_version == 1 ?
"$ELM" :
"$Elements" ) )
216 std::vector< EntityHandle > connectivity;
217 std::vector< int > mat_set_list, geom_set_list, part_set_list, id_list;
219 std::vector< int > int_data( 5 ), tag_data( 2 );
220 std::vector< long > tmp_conn;
221 int curr_elem_type = -1;
222 for(
long i = 0; i < num_elem; ++i )
226 if( 1 == format_version )
229 tag_data[0] = int_data[2];
230 tag_data[1] = int_data[3];
235 "Invalid node count for element type at line " << tokens.
line_number() );
242 tag_data.resize( int_data[2] );
250 if( !blocks.empty() && ( tag_data.empty() || blocks.find( tag_data[0] ) != blocks.end() ) )
continue;
256 if( int_data[1] != curr_elem_type )
258 if( !id_list.empty() )
261 part_set_list, connectivity, file_id_tag );
266 mat_set_list.clear();
267 geom_set_list.clear();
268 part_set_list.clear();
269 connectivity.clear();
270 curr_elem_type = int_data[1];
275 "Unsupported element type " << curr_elem_type <<
" at line " << tokens.
line_number() );
281 id_list.push_back( int_data[0] );
282 if( tag_data.size() > 3 ) part_set_list.push_back( tag_data[3] );
284 else if( tag_data.size() > 2 )
285 part_set_list.push_back( tag_data[2] );
287 part_set_list.push_back( 0 );
288 geom_set_list.push_back( tag_data.size() > 1 ? tag_data[1] : 0 );
289 mat_set_list.push_back( tag_data.size() > 0 ? tag_data[0] : 0 );
295 for(
unsigned j = 0; j < tmp_conn.size(); ++j )
297 std::map< long, EntityHandle >::iterator k = node_id_map.find( tmp_conn[j] );
298 if( k == node_id_map.end() )
302 connectivity.push_back( k->second );
307 if( !id_list.empty() )
310 part_set_list, connectivity, file_id_tag );
324 const std::vector< int >& elem_ids,
325 const std::vector< int >& matl_ids,
326 const std::vector< int >& geom_ids,
327 const std::vector< int >& prtn_ids,
328 const std::vector< EntityHandle >& connectivity,
329 const Tag* file_id_tag )
334 const unsigned long num_elem = elem_ids.size();
335 const int node_per_elem = type.
num_nodes;
336 if( matl_ids.size() != num_elem || geom_ids.size() != num_elem || prtn_ids.size() != num_elem ||
337 connectivity.size() != num_elem * node_per_elem )
345 elements.
insert< std::vector< EntityHandle > >( connectivity.begin(), connectivity.end() );
360 for(
unsigned long i = 0; i < num_elem; ++i )
361 for(
int j = 0; j < node_per_elem; ++j )
362 conn_array[i * node_per_elem + type.
node_order[j]] = connectivity[i * node_per_elem + j];
366 memcpy( conn_array, &connectivity[0], connectivity.size() *
sizeof(
EntityHandle ) );
374 Range elements( handle, handle + num_elem - 1 );
398 const Range& elements,
399 const std::vector< int >& set_ids,
406 for( std::vector< int >::const_iterator i = set_ids.begin(); i != set_ids.end(); ++i )
410 if( ids.empty() || ( ids.size() == 1 && *ids.begin() == 0 ) )
return MB_SUCCESS;
416 const void* tag_values[2] = { &tag_val, NULL };
434 tag_values[1] = NULL;
442 for( std::set< int >::iterator i = ids.begin(); i != ids.end(); ++i )
445 if( *i == 0 )
continue;
448 Range entities, sets;
449 std::vector< int >::const_iterator j = set_ids.
begin();
451 if( *i == *j ) entities.
insert( *k );