39 if( MB_SUCCESS != result ) \
41 std::cerr << ( a ) << std::endl; \
46 if( n != ( a ) ) return MB_FILE_WRITE_ERROR
83 const Tag* file_id_tag )
93 FILE* file_ptr = fopen( filename,
"r" );
108 double dum_params[] = { 0.0, 0.0, 0.0 };
114 CHECK(
"Failed to create param coords tag." );
119 CHECK(
"Failed to create geom dim tag." );
122 char line[256], all_line[1024];
125 if( fgets( all_line,
sizeof( all_line ), file_ptr ) == NULL )
129 if( sscanf( all_line,
"%s %d", line, &file_type ) != 2 )
137 CHECK(
"Failed to read parallel info." );
140 int nregions, nfaces, nedges, nvertices, npoints;
141 n = fscanf( file_ptr,
"%d %d %d %d %d", &nregions, &nfaces, &nedges, &nvertices, &npoints );
143 if( nregions < 0 || nfaces < 0 || nedges < 0 || nvertices < 0 || npoints < 0 )
return MB_FILE_WRITE_ERROR;
146 std::vector< double* > coord_arrays;
149 CHECK(
"Failed to get node arrays." );
153 result =
add_entities( vstart, nvertices, file_id_tag );
158 std::vector< EntityHandle > gentities[4];
159 int gent_id, dum_int;
160 int gent_type, num_connections;
162 for(
int i = 0; i < nvertices; i++ )
164 n = fscanf( file_ptr,
"%d", &gent_id );
166 if( !gent_id )
continue;
168 n = fscanf( file_ptr,
"%d %d %lf %lf %lf", &gent_type, &num_connections, coord_arrays[0] + i,
169 coord_arrays[1] + i, coord_arrays[2] + i );
175 new_handle = vstart + i;
177 CHECK(
"Adding vertex to geom set failed." );
182 n = fscanf( file_ptr,
"%le", dum_params );
185 CHECK(
"Failed to set param coords tag for vertex." );
188 n = fscanf( file_ptr,
"%le %le %d", dum_params, dum_params + 1, &dum_int );
190 dum_params[2] = dum_int;
192 CHECK(
"Failed to set param coords tag for vertex." );
203 int vert1, vert2, num_pts;
204 std::vector< EntityHandle > everts( 2 );
207 CHECK(
"Failed to create array of edges." );
215 for(
int i = 0; i < nedges; i++ )
217 n = fscanf( file_ptr,
"%d", &gent_id );
219 if( !gent_id )
continue;
221 n = fscanf( file_ptr,
"%d %d %d %d %d", &gent_type, &vert1, &vert2, &num_connections, &num_pts );
226 connect[0] = vstart + vert1 - 1;
227 connect[1] = vstart + vert2 - 1;
228 if( num_pts > 1 && !warned )
230 std::cout <<
"Warning: num_points > 1 not supported; choosing last one." << std::endl;
235 CHECK(
"Problem getting geom set for edge." );
237 new_handle = estart + i;
239 CHECK(
"Failed to add edge to geom set." );
243 for(
int j = 0; j < num_pts; j++ )
248 n = fscanf( file_ptr,
"%le", dum_params );
251 CHECK(
"Failed to set param coords tag for edge." );
254 n = fscanf( file_ptr,
"%le %le %d", dum_params, dum_params + 1, &dum_int );
256 dum_params[2] = dum_int;
258 CHECK(
"Failed to set param coords tag for edge." );
269 std::vector< EntityHandle > bound_ents, bound_verts, new_faces;
272 new_faces.resize( nfaces );
275 for(
int i = 0; i < nfaces; i++ )
277 n = fscanf( file_ptr,
"%d", &gent_id );
279 if( !gent_id )
continue;
281 n = fscanf( file_ptr,
"%d %d", &gent_type, &num_bounding );
285 CHECK(
"Problem getting geom set for face." );
287 bound_ents.resize( num_bounding + 1 );
288 bound_verts.resize( num_bounding );
289 for(
int j = 0; j < num_bounding; j++ )
291 n = fscanf( file_ptr,
"%d ", &bound_id );
293 if( 0 > bound_id ) bound_id = abs( bound_id );
294 assert( 0 < bound_id && bound_id <= nedges );
296 bound_ents[j] = estart + abs( bound_id ) - 1;
300 for(
int j = 0; j < num_bounding; j++ )
302 if( j == num_bounding - 1 ) bound_ents[j + 1] = bound_ents[0];
304 CHECK(
"Failed to get vertices bounding edge." );
305 assert( shverts.
size() == 1 );
306 bound_verts[j] = *shverts.
begin();
312 CHECK(
"Failed to create edge." );
315 CHECK(
"Failed to add edge to geom set." );
317 int num_read = fscanf( file_ptr,
"%d", &num_pts );
318 if( !num_pts || !num_read )
continue;
320 for(
int j = 0; j < num_pts; j++ )
325 n = fscanf( file_ptr,
"%le", dum_params );
328 CHECK(
"Failed to set param coords tag for face." );
331 n = fscanf( file_ptr,
"%le %le %d", dum_params, dum_params + 1, &dum_int );
333 dum_params[2] = dum_int;
335 CHECK(
"Failed to set param coords tag for face." );
355 std::vector< EntityHandle > regions;
356 if( file_id_tag ) regions.resize( nregions );
357 for(
int i = 0; i < nregions; i++ )
359 n = fscanf( file_ptr,
"%d", &gent_id );
361 if( !gent_id )
continue;
363 CHECK(
"Couldn't get geom set for region." );
364 n = fscanf( file_ptr,
"%d", &num_bounding );
366 bound_ents.resize( num_bounding );
367 for(
int j = 0; j < num_bounding; j++ )
369 n = fscanf( file_ptr,
"%d ", &bound_id );
371 assert( abs( bound_id ) < (
int)new_faces.size() + 1 && bound_id );
373 sense[j] = ( bound_id < 0 ) ? -1 : 1;
374 bound_ents[j] = new_faces[abs( bound_id ) - 1];
379 CHECK(
"Failed in get_ordered_vertices." );
383 CHECK(
"Failed to create region." );
386 CHECK(
"Failed to add region to geom set." );
388 if( file_id_tag ) regions[i] = new_handle;
390 n = fscanf( file_ptr,
"%d ", &dum_int );
408 const Tag* file_id_tag )
414 if( (
int)sets[set_dim].size() <= set_id || !sets[set_dim][set_id] )
416 if( (
int)sets[set_dim].size() <= set_id ) sets[set_dim].resize( set_id + 1, 0 );
418 if( !sets[set_dim][set_id] )
435 this_set = sets[set_dim][set_id];
445 int nparts, part_id, num_ifaces, num_corner_ents;
446 int num_read = fscanf( file_ptr,
"%d %d %d %d", &
nparts, &part_id, &num_ifaces, &num_corner_ents );
447 if( !num_read )
return MB_FAILURE;
450 int iface_id, iface_dim, iface_own, num_iface_corners;
452 std::vector< int >* iface_corners = NULL;
453 for(
int i = 0; i < num_ifaces; i++ )
455 num_read = fscanf( file_ptr,
"%d %d %d %d", &iface_id, &iface_dim, &iface_own, &num_iface_corners );
456 if( !num_read )
return MB_FAILURE;
462 iface_corners =
new std::vector< int >( num_iface_corners );
463 for(
int j = 0; j < num_iface_corners; j++ )
465 num_read = fscanf( file_ptr,
"%d", &( *iface_corners )[j] );
468 delete iface_corners;
477 delete iface_corners;
478 iface_corners = NULL;
487 if( !count || !file_id_tag )
return MB_FAILURE;
490 range.
insert( start, start + count - 1 );