43 static bool debug =
false;
107 if( MB_SUCCESS != result ) return result
112 #define IO_ASSERT( C ) INT_IO_ERROR( C, __LINE__ )
118 char buffer[] = __FILE__
" ";
119 snprintf(
buffer, strlen(
buffer ),
"%s:%u", __FILE__, line );
128 int rval = fseek(
cubFile, offset, SEEK_SET );
157 unsigned char tmp, *cdat = (
unsigned char*)data;
159 cdat[0] = cdat[7], cdat[7] = tmp;
161 cdat[1] = cdat[6], cdat[6] = tmp;
163 cdat[2] = cdat[5], cdat[5] = tmp;
165 cdat[3] = cdat[4], cdat[4] = tmp;
170 unsigned char tmp, *cdat = (
unsigned char*)data;
172 cdat[0] = cdat[3], cdat[3] = tmp;
174 cdat[1] = cdat[2], cdat[2] = tmp;
187 unsigned rval = fread( array,
sizeof(
unsigned int ), num_ents,
cubFile );
191 unsigned int* pt = array;
192 for(
unsigned int i = 0; i < num_ents; i++ )
202 unsigned rval = fread( array,
sizeof(
double ), num_ents,
cubFile );
207 for(
unsigned int i = 0; i < num_ents; i++ )
217 unsigned rval = fread( array,
sizeof(
char ), num_ents,
cubFile );
223 for(
unsigned int i = 0; i < num_ents; i++ )
233 : cubFile( NULL ), globalIdTag( 0 ), cubIdTag( 0 ),
geomTag( 0 ), uniqueIdTag( 0 ),
blockTag( 0 ), nsTag( 0 ),
234 ssTag( 0 ), attribVectorTag( 0 ), entityNameTag( 0 ), categoryTag( 0 ), hasMidNodesTag( 0 ),
235 swapForEndianness( false ), int_buf( NULL ), mFileSet( 0 ), printedSeqWarning( false ),
236 printedElemWarning( false ), acisDumpFile( NULL )
238 assert( NULL != impl );
276 if( rval !=
MB_SUCCESS ) std::cerr <<
"WARNING: Could not get_entities_by_type" << std::endl;
280 std::vector< std::string >* dum_vec;
283 if( rval !=
MB_SUCCESS ) std::cerr <<
"WARNING: Could not tag_get_data" << std::endl;
284 if( NULL != dum_vec )
delete dum_vec;
294 std::vector< int >& ,
304 const Tag* file_id_tag )
311 if( 0 < tmpval )
debug =
true;
320 cubFile = fopen( file_name,
"rb" );
331 MB_SET_ERR( MB_FAILURE,
"This doesn't appear to be a .cub file" );
341 if(
debug ) std::cout <<
"Reading file header." << std::endl;
344 if(
debug ) std::cout <<
"Reading model entries." << std::endl;
348 if(
debug ) std::cout <<
"Reading model metadata." << std::endl;
368 if( -1 ==
index )
return MB_FAILURE;
372 if(
debug ) std::cout <<
"Reading mesh model header and metadata." << std::endl;
380 for(
int dim = 0; dim < 4; dim++ )
386 if( geom_header->
maxDim != dim )
continue;
389 if(
debug ) std::cout <<
"Reading geom index " << gindex <<
" mesh: nodes... ";
390 result =
read_nodes( gindex, mesh_model, geom_header );
394 if(
debug ) std::cout <<
"elements... ";
397 if(
debug ) std::cout << std::endl;
404 std::string sat_file_name;
411 if(
debug ) std::cout <<
"Reading groups... ";
415 result =
read_group( grindex, mesh_model, group_header );
423 if(
debug ) std::cout <<
"Reading blocks... ";
428 result =
read_block( blindex, data_version, mesh_model, block_header );
437 if(
debug ) std::cout <<
"Reading nodesets... ";
441 result =
read_nodeset( nsindex, mesh_model, nodeset_header );
449 if(
debug ) std::cout <<
"Reading sidesets...";
453 result =
read_sideset( ssindex, data_version, mesh_model, sideset_header );
460 std::cout <<
"Read the following mesh:" << std::endl;
485 std::cout <<
"Failed to restore topology " << std::endl;
499 unsigned int nodeset_offset, sideset_offset;
519 if( 0 == nodeset_offset && 0 == sideset_offset )
return MB_SUCCESS;
527 std::vector< int > block_ids( blocks.
size() );
533 Range new_nodesets, new_sidesets;
534 std::vector< int > new_nodeset_ids, new_sideset_ids;
535 for( ; rit != blocks.
end(); i++, ++rit )
537 if( 0 != nodeset_offset && block_ids[i] >= (
int)nodeset_offset &&
538 ( nodeset_offset > sideset_offset || block_ids[i] < (
int)sideset_offset ) )
541 new_nodesets.
insert( *rit );
542 new_nodeset_ids.push_back( block_ids[i] );
544 else if( 0 != sideset_offset && block_ids[i] >= (
int)sideset_offset &&
545 ( sideset_offset > nodeset_offset || block_ids[i] < (
int)nodeset_offset ) )
548 new_sidesets.
insert( *rit );
549 new_sideset_ids.push_back( block_ids[i] );
556 if( 0 != nodeset_offset )
563 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
566 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
568 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
570 if( 0 != sideset_offset )
577 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
580 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
582 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
596 unsigned int this_type, num_ents;
597 std::vector< char > bc_data;
598 unsigned int num_read = 0;
599 std::vector< EntityHandle > ns_entities, excl_entities;
600 for(
unsigned int i = 0; i < nodeseth->
memTypeCt; i++ )
604 num_read += 2 *
sizeof( int );
610 num_read +=
sizeof( int );
617 if( num_read < nodeseth->nsLength )
631 bc_data.resize( num_bcs );
632 FREADCA( num_bcs, &bc_data[0] );
640 if( !bc_data.empty() )
642 std::cout <<
"bc_data = ";
643 std::vector< char >::iterator vit = bc_data.begin();
644 for( ; vit != bc_data.end(); ++vit )
646 std::cout << std::hex << (int)( (
unsigned char)*vit ) <<
" ";
649 vit = bc_data.begin();
650 for( ; vit != bc_data.end(); ++vit )
654 std::cout << std::endl;
665 const int def_bc_data_len = 0;
671 void const* tag_data[] = { ( bc_data.empty() ) ? NULL : &( bc_data[0] ) };
672 int tag_size = bc_data.size();
680 const double data_version,
692 unsigned int this_type, num_ents, sense_size;
694 std::vector< char > bc_data;
695 unsigned int num_read = 0;
696 std::vector< EntityHandle > ss_entities, excl_entities;
697 if( data_version <= 1.0 )
699 for(
unsigned int i = 0; i < sideseth->
memTypeCt; i++ )
703 num_read += 3 *
sizeof( int );
710 num_read +=
sizeof( int );
716 if( sense_size == 1 )
719 unsigned int read_length = ( num_ents / 8 ) * 8;
720 if( read_length < num_ents ) read_length += 8;
722 num_read += read_length;
724 else if( sense_size == 2 )
728 num_read +=
sizeof( int );
737 for(
unsigned int i = 0; i < sideseth->
memTypeCt; i++ )
741 num_read +=
sizeof( int );
745 std::vector< unsigned int > mem_types( num_ents ), mem_ids( num_ents );
746 FREADIA( num_ents, &mem_types[0] );
747 num_read += num_ents *
sizeof( int );
749 num_read +=
sizeof( int );
755 unsigned int read_length = ( num_ents / 8 ) * 8;
756 if( read_length < num_ents ) read_length += 8;
758 num_read += read_length;
762 num_read +=
sizeof( int );
765 num_read += num_wrts *
sizeof( int );
773 if( sideseth->
numDF > 0 )
777 num_read += sideseth->
numDF *
sizeof( double );
782 const void* dist_data = &
dbl_buf[0];
783 const int dist_size = sideseth->
numDF;
789 if( data_version > 1.0 && num_read < sideseth->ssLength )
804 bc_data.resize( num_bcs );
805 FREADCA( num_bcs, &bc_data[0] );
813 if( !bc_data.empty() )
815 std::cout <<
"bc_data = ";
816 std::vector< char >::iterator vit = bc_data.begin();
817 for( ; vit != bc_data.end(); ++vit )
819 std::cout << std::hex << (int)( (
unsigned char)*vit ) <<
" ";
822 vit = bc_data.begin();
823 for( ; vit != bc_data.end(); ++vit )
827 std::cout << std::endl;
834 const int def_bc_data_len = 0;
840 void const* tag_data[] = { ( bc_data.empty() ) ? NULL : &( bc_data[0] ) };
841 int tag_size = bc_data.size();
850 const int sense_size,
851 std::vector< EntityHandle >& ss_entities,
854 std::vector< EntityHandle > forward, reverse;
860 for(
int i = 0; i < num_ents; i++ )
863 forward.push_back( ss_entities[i] );
865 reverse.push_back( ss_entities[i] );
868 forward.push_back( ss_entities[i] );
869 reverse.push_back( ss_entities[i] );
873 else if( this_type == 4
877 for(
int i = 0; i < num_ents; i++ )
880 forward.push_back( ss_entities[i] );
882 reverse.push_back( ss_entities[i] );
883 else if( *( (
int*)&
uint_buf[i] ) == -1 )
885 forward.push_back( ss_entities[i] );
886 reverse.push_back( ss_entities[i] );
893 if( !forward.empty() )
896 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
898 if( !reverse.empty() )
903 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
905 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
910 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
913 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
915 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
925 std::vector< EntityHandle > forward, reverse;
927 unsigned int num_ents = ss_entities.size();
928 unsigned int* wrt_it = &
uint_buf[0];
930 for(
unsigned int i = 0; i < num_ents; i++ )
932 unsigned int num_wrt = 0;
933 if( 0 != num_wrts ) num_wrt = *wrt_it++;
934 for(
unsigned int j = 0; j < num_wrt; j++ )
939 forward.push_back( ss_entities[i] );
940 reverse.push_back( ss_entities[i] );
946 forward.push_back( ss_entities[i] );
948 reverse.push_back( ss_entities[i] );
951 forward.push_back( ss_entities[i] );
952 reverse.push_back( ss_entities[i] );
959 if( !forward.empty() )
962 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
964 if( !reverse.empty() )
969 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
971 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
979 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
981 if( tmp_result !=
MB_SUCCESS ) result = tmp_result;
998 unsigned int num_read = 0;
999 int this_type, num_ents;
1000 std::vector< EntityHandle > block_entities, excl_entities;
1001 for(
unsigned int i = 0; i < blockh->
memTypeCt; i++ )
1005 num_read += 2 *
sizeof( int );
1011 num_read += num_ents *
sizeof( int );
1025 int def_block_attributes_length = 0;
1034 num_read +=
sizeof( double );
1035 void const* tag_data[] = { &
dbl_buf[0] };
1036 int tag_sizes[] = {
static_cast< int >( blockh->
attribOrder ) };
1042 if( num_read < blockh->blockLength )
1078 Range ho_entities, entities;
1090 entities.
merge( ho_entities );
1093 assert( mbcore != NULL );
1104 if( -1 == md_index )
return result;
1114 md_index = md.
get_md_entry( set_index,
"NumExtraNames" );
1115 if( -1 == md_index )
return result;
1117 for(
int i = 0; i < num_names; i++ )
1119 std::ostringstream extra_name_label(
"ExtraName" );
1120 extra_name_label << i;
1121 std::ostringstream moab_extra_name(
"EXTRA_" );
1123 md_index = md.
get_md_entry( set_index, extra_name_label.str().c_str() );
1124 if( -1 != md_index )
1148 int this_type, num_ents;
1149 std::vector< EntityHandle > grp_entities, excl_entities;
1150 for(
unsigned int i = 0; i < grouph->
memTypeCt; i++ )
1172 if( -1 != md_index )
1190 if( -1 != md_index )
1193 for(
int i = 0; i < num_names; i++ )
1195 std::ostringstream extra_name_label(
"ExtraName" );
1196 extra_name_label << i;
1197 std::ostringstream moab_extra_name(
"EXTRA_" );
1200 if( -1 != md_index )
1221 std::vector< EntityHandle >& entities,
1222 std::vector< EntityHandle >& excl_entities )
1230 if( !excl_entities.empty() )
1235 std::vector< EntityHandle >* new_vector =
new std::vector< EntityHandle >;
1236 new_vector->swap( excl_entities );
1250 const unsigned int id_buf_size,
1251 const bool is_group,
1252 std::vector< EntityHandle >& entities )
1256 for(
unsigned int i = 0; i < id_buf_size; i++ )
1259 tmp_result =
get_entities( mem_types[i], id_buf + i, 1, entities, entities );
1263 tmp_result =
get_entities( mem_types[i] + 2, id_buf + i, 1, entities, entities );
1264 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
1272 const unsigned int id_buf_size,
1273 std::vector< EntityHandle >& entities,
1274 std::vector< EntityHandle >& excl_entities )
1278 if( this_type <=
VERTEX )
1280 else if( this_type >=
HEX && this_type <=
NODE )
1281 result =
get_mesh_entities( this_type, id_buf, id_buf_size, entities, excl_entities );
1288 const unsigned int id_buf_size,
1289 std::vector< EntityHandle >& entities )
1291 for(
unsigned int i = 0; i < id_buf_size; i++ )
1292 entities.push_back( (
gidSetMap[5 - this_type] )[id_buf[i]] );
1299 const unsigned int id_buf_size,
1300 std::vector< EntityHandle >& entities,
1301 std::vector< EntityHandle >& excl_entities )
1304 std::vector< EntityHandle >* ent_list = NULL;
1305 EntityType this_ent_type =
MBVERTEX;
1307 if( this_type > 1000 )
1309 if( this_type - 1000 < arr_len )
1312 ent_list = &excl_entities;
1317 if( this_type < arr_len )
1320 ent_list = &entities;
1323 if( NULL == ent_list )
1325 MB_SET_ERR( MB_FAILURE,
"Entities list is NULL" );
1334 for(
unsigned int i = 0; i < id_buf_size; i++ )
1339 for(
unsigned int i = 0; i < id_buf_size; i++ )
1351 if( tmp_ents.
empty() && 0 != id_buf_size )
return MB_FAILURE;
1353 std::vector< int > cub_ids( tmp_ents.
size() );
1358 for(
unsigned int i = 0; i < id_buf_size; i++ )
1360 std::vector< int >::iterator vit = std::find( cub_ids.begin(), cub_ids.end(), id_buf[i] );
1361 if( vit != cub_ids.end() )
1363 EntityHandle this_ent = tmp_ents[vit - cub_ids.begin()];
1368 std::cout <<
"Warning: didn't find " <<
CN::EntityTypeName( this_ent_type ) <<
" " << id_buf[i]
1379 if( entity->
nodeCt == 0 )
1381 if(
debug ) std::cout <<
"(no nodes) ";
1394 for(
unsigned int i = 0; i < entity->
nodeCt; i++ )
1397 if( i != entity->
nodeCt - 1 ) std::cout <<
", ";
1399 std::cout <<
")...";
1404 std::vector< double* > arrays;
1416 Range dum_range( vhandle, vhandle + entity->
nodeCt - 1 );
1422 unsigned int max_cid, min_cid;
1427 long vhandle_offset = vhandle - min_cid;
1436 Range vrange, tmp_range( dum_range );
1439 vrange =
subtract( vrange, tmp_range );
1441 #define MAX( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )
1442 #define MIN( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
1446 max_cid =
MAX( max_cid, ( (
unsigned int)new_max ) );
1451 for( rit = vrange.
begin(); rit != vrange.
end(); ++rit )
1471 if( -1 == contig || -2 == contig )
1474 std::vector< double > tmp_coords( entity->
nodeCt );
1475 for(
unsigned int j = 0; j < 3; j++ )
1478 for(
unsigned int i = 0; i < entity->
nodeCt; i++ )
1481 tmp_coords[
uint_buf[i] - min_cid] = arrays[j][i];
1484 std::copy( &tmp_coords[0], &tmp_coords[0] + entity->
nodeCt, arrays[j] );
1487 for(
unsigned int i = 0; i < entity->
nodeCt; i++ )
1500 for( ; rit != dum_range.
end(); vit++, ++rit )
1502 assert( *vit < cubMOABVertexMap->size() );
1503 ( *cubMOABVertexMap )[*vit] = *rit;
1526 std::vector< int > fixed_flags( entity->
nodeCt );
1527 std::fill( fixed_flags.begin(), fixed_flags.end(), 0 );
1528 if( md_entry->
mdDataType != 3 )
return MB_FAILURE;
1530 for( std::vector< unsigned int >::iterator vit = md_entry->
mdIntArrayValue.begin();
1536 assert( fixed_v >= *dum_range.
begin() && fixed_v <= *dum_range.
rbegin() );
1538 fixed_flags[*vit - *dum_range.
begin()] = 1;
1554 const int in_order_map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
1555 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 };
1561 int int_type, nodes_per_elem, num_elem;
1564 for(
unsigned int i = 0; i < entity->
elemTypeCt; i++ )
1579 if( !node_order ) node_order = in_order_map;
1586 unsigned int max_id, min_id;
1590 std::cout <<
"Element ids are not contiguous!" << std::endl;
1601 Range dum_range( start_handle, start_handle + num_elem - 1 );
1604 elem_offset = ( 1 == contig ? start_handle -
int_buf[0] :
int_buf[num_elem - 1] );
1613 unsigned int total_conn = num_elem * nodes_per_elem;
1620 for(
int e = 0; e < num_elem; ++e )
1622 for(
int k = 0; k < nodes_per_elem; ++k, ++j )
1626 if( 0 == j ) std::cout <<
"Conn=";
1634 new_handle = ( *cubMOABVertexMap )[
uint_buf[j]];
1641 conn[e * nodes_per_elem + node_order[k]] = new_handle;
1668 unsigned int *id_it, curr_id, i;
1672 curr_id = *id_it++ + 1;
1676 for( i = 1; i < num_ents; id_it++, i++, curr_id++ )
1678 if( *id_it != curr_id )
1687 if( 1 == contig )
return;
1692 curr_id = *id_it++ - 1;
1693 for( i = 1; i < num_ents; id_it++, i++, curr_id-- )
1695 if( *id_it != curr_id )
1703 if( -1 == contig )
return;
1706 if( max_id - min_id + 1 == num_ents ) contig = -2;
1714 instance->
FSEEK( offset );
1744 #ifdef WORDS_BIGENDIAN
1769 std::vector< unsigned int >::iterator int_it =
uint_buf.begin();
1789 if(
modelEntries[i].modelType == model_type )
return i;
1798 FSEEK( metadata_offset );
1866 if(
char_buf.size() <= (
unsigned int)str_size )
char_buf.resize( str_size + 1 );
1870 int extra = str_size %
sizeof( int );
1874 str_size =
sizeof( int ) - extra;
1900 for(
unsigned int i = 0; i < info.
numEntities; i++ )
1912 if( geom_headers[i].nodeCt == 0 && geom_headers[i].elemCt == 0 )
continue;
1915 result = instance->
create_set( geom_headers[i].setHandle );
1925 &( geom_headers[i].
geomID ) );
1933 for(
unsigned int i = 0; i < info.
numEntities; i++ )
1935 if( geom_headers[i].elemTypeCt == 0 )
continue;
1936 instance->
FSEEK( model_offset + geom_headers[i].elemOffset );
1937 for(
unsigned int j = 0; j < geom_headers[i].
elemTypeCt; j++ )
1941 int int_type = instance->
uint_buf[0];
1942 int nodes_per_elem = instance->
uint_buf[1];
1943 int num_elem = instance->
uint_buf[2];
1945 geom_headers[i].
maxDim = std::max( geom_headers[i].maxDim, (
int)
CN::Dimension( elem_type ) );
1946 if( j < geom_headers[i].elemTypeCt - 1 )
1948 int num_skipped_ints = num_elem + num_elem * nodes_per_elem;
1949 if(
major >= 14 ) num_skipped_ints += num_elem;
1950 instance->
FREADI( num_skipped_ints );
1975 for(
unsigned int i = 0; i < info.
numEntities; i++ )
1978 result = instance->
create_set( group_headers[i].setHandle );
1997 &( group_headers[i].
grpID ) );
2007 const unsigned int model_offset,
2024 for(
unsigned int i = 0; i < info.
numEntities; i++ )
2027 result = instance->
create_set( block_headers[i].setHandle );
2047 std::vector< int > def_uint_zero( 3, 0 );
2050 &def_uint_zero[0] );
2052 int block_header_data[] = {
static_cast< int >( block_headers[i].
blockCol ),
2053 static_cast< int >( block_headers[i].blockMat ),
2054 static_cast< int >( block_headers[i].
blockDim ) };
2056 instance->
mdbImpl->
tag_set_data( bhTag_header, &( block_headers[i].setHandle ), 1, block_header_data );
2063 if( data_version <= 1.0 && block_headers[i].blockElemType >= 15 ) block_headers[i].
blockElemType += 4;
2071 if( 55 != block_headers[i].blockElemType )
2072 MB_SET_ERR( MB_FAILURE,
"Invalid block element type: " << block_headers[i].blockElemType );
2076 if( 52 != block_headers[i].blockElemType )
2077 MB_SET_ERR( MB_FAILURE,
"Invalid block element type: " << block_headers[i].blockElemType );
2083 &( block_headers[i].
blockID ) );
2086 &( block_headers[i].
blockID ) );
2089 material_category );
2093 if( !block_headers[i].memCt )
continue;
2098 if( 52 != block_headers[i].blockElemType && 55 != block_headers[i].blockElemType )
2102 if( ( block_headers[i].blockEntityType <
MBMAXTYPE ) &&
2106 for(
int j = 0; j < 4; j++ )
2107 block_headers[i].hasMidNodes[j] = 0;
2112 block_headers[i].hasMidNodes );
2116 CN::HasMidNodes( block_headers[i].blockEntityType, num_verts, block_headers[i].hasMidNodes );
2120 block_headers[i].hasMidNodes );
2146 for(
unsigned int i = 0; i < info.
numEntities; i++ )
2149 result = instance->
create_set( nodeset_headers[i].setHandle );
2165 &( nodeset_headers[i].
nsID ) );
2168 &( nodeset_headers[i].
nsID ) );
2171 dirichlet_category );
2195 for(
unsigned int i = 0; i < info.
numEntities; i++ )
2198 result = instance->
create_set( sideset_headers[i].setHandle );
2214 &( sideset_headers[i].
ssID ) );
2217 &( sideset_headers[i].
ssID ) );
2229 if( !
debug )
return;
2230 std::cout << prefix << std::endl;
2231 if( NULL != header )
2233 for(
unsigned int i = 0; i < num_headers; i++ )
2235 std::cout <<
"Index " << i << std::endl;
2243 if( !
debug )
return;
2244 std::cout << prefix << std::endl;
2245 if( NULL != header )
2247 for(
unsigned int i = 0; i < num_headers; i++ )
2254 if( !
debug )
return;
2255 std::cout << prefix << std::endl;
2256 if( NULL != header )
2258 for(
unsigned int i = 0; i < num_headers; i++ )
2265 const unsigned int num_headers )
2267 if( !
debug )
return;
2268 std::cout << prefix << std::endl;
2269 if( NULL != header )
2271 for(
unsigned int i = 0; i < num_headers; i++ )
2278 const unsigned int num_headers )
2280 if( !
debug )
return;
2281 std::cout << prefix << std::endl;
2282 if( NULL != header )
2284 for(
unsigned int i = 0; i < num_headers; i++ )
2291 feModelHeader.init( modelOffset, instance );
2296 if( feModelHeader.geomArray.numEntities > 0 )
2307 print_geom_headers(
"Geom headers:", feGeomH, feModelHeader.geomArray.numEntities );
2311 if( feModelHeader.groupArray.numEntities > 0 )
2314 print_group_headers(
"Group headers:", feGroupH, feModelHeader.groupArray.numEntities );
2318 if( feModelHeader.blockArray.numEntities > 0 )
2326 print_block_headers(
"Block headers:", feBlockH, feModelHeader.blockArray.numEntities );
2329 if( feModelHeader.nodesetArray.numEntities > 0 )
2338 print_nodeset_headers(
"Nodeset headers:", feNodeSetH, feModelHeader.nodesetArray.numEntities );
2340 if( feModelHeader.sidesetArray.numEntities > 0 )
2348 print_sideset_headers(
"SideSet headers:", feSideSetH, feModelHeader.sidesetArray.numEntities );
2356 if(
debug ) std::cout <<
"Geom metadata:" << std::endl;
2357 tqd->
read_meta_data( modelOffset + feModelHeader.geomArray.metaDataOffset, geomMD );
2358 if(
debug ) std::cout <<
"Node metadata:" << std::endl;
2359 tqd->
read_meta_data( modelOffset + feModelHeader.nodeArray.metaDataOffset, nodeMD );
2360 if(
debug ) std::cout <<
"Elem metadata:" << std::endl;
2361 tqd->
read_meta_data( modelOffset + feModelHeader.elementArray.metaDataOffset, elementMD );
2362 if(
debug ) std::cout <<
"Group metadata:" << std::endl;
2363 tqd->
read_meta_data( modelOffset + feModelHeader.groupArray.metaDataOffset, groupMD );
2364 if(
debug ) std::cout <<
"Block metadata:" << std::endl;
2365 tqd->
read_meta_data( modelOffset + feModelHeader.blockArray.metaDataOffset, blockMD );
2366 if(
debug ) std::cout <<
"Nodeset metadata:" << std::endl;
2367 tqd->
read_meta_data( modelOffset + feModelHeader.nodesetArray.metaDataOffset, nodesetMD );
2368 if(
debug ) std::cout <<
"Sideset metadata:" << std::endl;
2369 tqd->
read_meta_data( modelOffset + feModelHeader.sidesetArray.metaDataOffset, sidesetMD );
2377 unsigned int acis_model_offset = 0, acis_model_length = 0, acis_model_handle = 1, acis_sat_type = 1;
2388 if( acis_model_length == 0 )
return MB_SUCCESS;
2390 std::vector< AcisRecord > records;
2400 FSEEK( acis_model_offset );
2402 unsigned int bytes_left = acis_model_length;
2409 const unsigned int buf_size = 1023;
2414 while( 0 != bytes_left )
2417 unsigned int next_buf = ( bytes_left > buf_size ? buf_size : bytes_left );
2425 unsigned int buf_pos = 0;
2428 if( bytes_left == acis_model_length )
2431 ret = strchr( &(
char_buf[0] ),
'\n' );
2432 ret = strchr( ret + 1,
'\n' );
2433 ret = strchr( ret + 1,
'\n' );
2434 if( NULL == ret )
return MB_FAILURE;
2435 buf_pos += ret - &(
char_buf[0] ) + 1;
2438 bytes_left -= next_buf;
2444 ret = strchr( &(
char_buf[buf_pos] ),
'#' );
2445 while( ret && (
unsigned int)( ret + 1 - &
char_buf[0] ) < bytes_left && *( ret + 1 ) !=
'\n' &&
2446 *( ret + 1 ) !=
'\r' && *( ret + 1 ) != 0 )
2447 ret = strchr( ret + 1,
'#' );
2452 int num_chars = ret - &(
char_buf[buf_pos] ) + 2;
2453 if( *( ret + 1 ) ==
'\r' ) num_chars++;
2455 buf_pos += num_chars;
2459 records.push_back( this_record );
2471 }
while( buf_pos < next_buf );
2475 fwrite(
"\n======================\nSorted acis records:\n======================\n", 1, 68,
acisDumpFile );
2488 void* default_val = NULL;
2493 unsigned int current_record = 0;
2495 #define REC records[current_record]
2497 while( current_record != records.size() )
2508 REC.processed =
true;
2516 REC.processed =
true;
2526 unsigned int num_read;
2527 std::vector< std::string > attrib_vec;
2528 char temp_name[1024];
2530 std::string name_tag;
2533 int next_attrib = -1;
2536 int current_attrib = records[entity_rec_num].first_attrib;
2537 if( -1 == current_attrib )
return MB_SUCCESS;
2541 fwrite(
"-----------------------------------------------------------------------\n", 1, 72,
acisDumpFile );
2542 fwrite( records[entity_rec_num].att_string.c_str(),
sizeof(
char ), records[entity_rec_num].att_string.length(),
2546 while( -1 != current_attrib )
2549 ( records[current_attrib].att_next != next_attrib ||
2550 records[current_attrib].att_ent_num != (
int)entity_rec_num ) )
2554 fwrite( records[current_attrib].att_string.c_str(),
sizeof(
char ),
2555 records[current_attrib].att_string.length(),
acisDumpFile );
2558 if( strncmp( records[current_attrib].att_string.c_str(),
"ENTITY_NAME", 11 ) == 0 )
2563 sscanf( records[current_attrib].att_string.c_str(),
"ENTITY_NAME @%d %s", &num_chars, temp_name );
2566 sscanf( records[current_attrib].att_string.c_str(),
"ENTITY_NAME %d %s", &num_chars, temp_name );
2567 if( num_read != 2 )
return MB_FAILURE;
2570 name_tag = std::string( temp_name, num_chars );
2572 else if( strncmp( records[current_attrib].att_string.c_str(),
"ENTITY_ID", 9 ) == 0 )
2575 int bounding_uid, bounding_sense;
2576 num_read = sscanf( records[current_attrib].att_string.c_str(),
"ENTITY_ID 0 3 %d %d %d", &
id, &bounding_uid,
2582 float dumx, dumy, dumz;
2583 num_read = sscanf( records[current_attrib].att_string.c_str(),
"ENTITY_ID 3 %f %f %f 3 %d %d %d", &dumx,
2584 &dumy, &dumz, &
id, &bounding_uid, &bounding_sense );
2589 std::cout <<
"Warning: bad ENTITY_ID attribute in .sat file, record number " << entity_rec_num
2590 <<
", record follows:" << std::endl
2591 << records[current_attrib].att_string.c_str() << std::endl;
2593 else if( strncmp( records[current_attrib].att_string.c_str(),
"UNIQUE_ID", 9 ) == 0 )
2597 num_read = sscanf( records[current_attrib].att_string.c_str(),
"UNIQUE_ID 0 1 %d", &uid );
2599 num_read = sscanf( records[current_attrib].att_string.c_str(),
"UNIQUE_ID 1 0 1 %d", &uid );
2600 if( 1 != num_read )
return MB_FAILURE;
2602 else if( strncmp( records[current_attrib].att_string.c_str(),
"COMPOSITE_ATTRIB @9 UNIQUE_ID", 29 ) == 0 )
2605 int dum1, dum2, dum3, dum4;
2606 num_read = sscanf( records[current_attrib].att_string.c_str(),
2607 "COMPOSITE_ATTRIB @9 UNIQUE_ID %d %d %d %d %d", &dum1, &dum2, &dum3, &dum4, &uid );
2608 if( 5 != num_read )
return MB_FAILURE;
2610 else if( strncmp( records[current_attrib].att_string.c_str(),
"COMPOSITE_ATTRIB @9 ENTITY_ID", 29 ) == 0 )
2613 int dum1, dum2, dum3;
2614 num_read = sscanf( records[current_attrib].att_string.c_str(),
"COMPOSITE_ATTRIB @9 ENTITY_ID %d %d %d %d",
2615 &dum1, &dum2, &dum3, &
id );
2616 if( 4 != num_read )
return MB_FAILURE;
2620 attrib_vec.push_back( records[current_attrib].att_string );
2623 records[current_attrib].processed =
true;
2624 next_attrib = current_attrib;
2625 current_attrib = records[current_attrib].att_prev;
2630 if( records[entity_rec_num].rec_type ==
aBODY || ( records[entity_rec_num].entity == 0 && uid == -1 ) )
2639 if( records[entity_rec_num].entity == 0 )
2641 records[entity_rec_num].entity =
uidSetMap[uid];
2644 if( 0 == records[entity_rec_num].entity )
return MB_SUCCESS;
2655 if( records[entity_rec_num].rec_type ==
aBODY )
2657 else if( records[entity_rec_num].rec_type ==
LUMP )
2659 else if( records[entity_rec_num].rec_type ==
FACE )
2661 else if( records[entity_rec_num].rec_type ==
aEDGE )
2663 else if( records[entity_rec_num].rec_type ==
aVERTEX )
2665 if( -1 != ent_dim )
gidSetMap[ent_dim][id] = records[entity_rec_num].entity;
2669 if( !name_tag.empty() )
2679 size_t len = name_tag.size();
2681 memcpy( name_tag_val, name_tag.c_str(), len );
2687 if( !attrib_vec.empty() )
2690 std::vector< std::string >* dum_vec;
2696 dum_vec =
new std::vector< std::string >;
2697 dum_vec->swap( attrib_vec );
2708 std::copy( attrib_vec.begin(), attrib_vec.end(), std::back_inserter( *dum_vec ) );
2729 const char* type_substr;
2732 if( ( type_substr = strstr( this_record.
att_string.c_str(),
"attrib" ) ) != NULL &&
2733 type_substr - this_record.
att_string.c_str() < 20 )
2736 bool simple_attrib =
false;
2737 bool generic_attrib =
false;
2738 if( ( type_substr = strstr( this_record.
att_string.c_str(),
"simple-snl-attrib" ) ) != NULL )
2739 simple_attrib =
true;
2740 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"integer_attrib-name_attrib-gen-attrib" ) ) !=
2742 generic_attrib =
true;
2750 type_substr = strchr( type_substr,
' ' );
2751 if( NULL == type_substr )
return MB_FAILURE;
2754 int num_converted = sscanf( type_substr,
" $-1 -1 $%d $%d $%d -1", &( this_record.
att_prev ),
2756 if( num_converted != 3 )
return MB_FAILURE;
2761 type_substr = strstr( this_record.
att_string.c_str(),
"NEW_SIMPLE_ATTRIB" );
2762 if( NULL == type_substr )
return MB_FAILURE;
2763 type_substr = strstr( type_substr,
"@" );
2764 if( NULL == type_substr )
return MB_FAILURE;
2765 type_substr = strstr( type_substr,
" " ) + 1;
2767 std::string dum_str( type_substr );
2770 else if( generic_attrib )
2772 type_substr = strstr( this_record.
att_string.c_str(),
"CUBIT_ID" );
2773 if( NULL == type_substr )
return MB_FAILURE;
2775 std::string dum_str( type_substr );
2782 if( ( type_substr = strstr( this_record.
att_string.c_str(),
"body" ) ) != NULL &&
2783 type_substr - this_record.
att_string.c_str() < 20 )
2787 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"lump" ) ) != NULL &&
2788 type_substr - this_record.
att_string.c_str() < 20 )
2792 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"shell" ) ) != NULL &&
2793 type_substr - this_record.
att_string.c_str() < 20 )
2798 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"surface" ) ) != NULL &&
2799 type_substr - this_record.
att_string.c_str() < 20 )
2804 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"face" ) ) != NULL &&
2805 type_substr - this_record.
att_string.c_str() < 20 )
2809 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"loop" ) ) != NULL &&
2810 type_substr - this_record.
att_string.c_str() < 20 )
2815 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"coedge" ) ) != NULL &&
2816 type_substr - this_record.
att_string.c_str() < 20 )
2821 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"edge" ) ) != NULL &&
2822 type_substr - this_record.
att_string.c_str() < 20 )
2826 else if( ( type_substr = strstr( this_record.
att_string.c_str(),
"vertex" ) ) != NULL &&
2827 type_substr - this_record.
att_string.c_str() < 20 )
2839 std::cout <<
"Warning: acis file has sequence numbers!" << std::endl;
2844 type_substr = strchr( type_substr,
' ' );
2845 if( NULL == type_substr )
return MB_FAILURE;
2848 int num_converted = sscanf( type_substr,
" $%d", &( this_record.
first_attrib ) );
2849 if( num_converted != 1 )
return MB_FAILURE;
2857 : fileEndian( 0 ), fileSchema( 0 ), numModels( 0 ), modelTableOffset( 0 ), modelMetaDataOffset( 0 ),
2864 std::cout <<
"FileTOC:End, Sch, #Mdl, TabOff, "
2865 <<
"MdlMDOff, actFEMdl = ";
2866 std::cout << fileEndian <<
", " << fileSchema <<
", " << numModels <<
", " << modelTableOffset <<
", "
2867 << modelMetaDataOffset <<
", " << activeFEModel << std::endl;
2874 std::cout <<
"ArrayInfo:numEntities, tableOffset, metaDataOffset = " << numEntities <<
", " << tableOffset <<
", "
2875 << metaDataOffset << std::endl;
2880 numEntities = uint_buf_in[0];
2881 tableOffset = uint_buf_in[1];
2882 metaDataOffset = uint_buf_in[2];
2887 std::cout <<
"FEModelHeader:feEndian, feSchema, feCompressFlag, feLength = " <<
feEndian <<
", " <<
feSchema <<
", "
2889 std::cout <<
"geomArray: ";
2891 std::cout <<
"nodeArray: ";
2893 std::cout <<
"elementArray: ";
2895 std::cout <<
"groupArray: ";
2897 std::cout <<
"blockArray: ";
2899 std::cout <<
"nodesetArray: ";
2901 std::cout <<
"sidesetArray: ";
2906 : geomID( 0 ), nodeCt( 0 ), nodeOffset( 0 ), elemCt( 0 ), elemOffset( 0 ), elemTypeCt( 0 ), elemLength( 0 ),
2907 maxDim( 0 ), setHandle( 0 )
2913 std::cout <<
"geomID = " << geomID << std::endl;
2914 std::cout <<
"nodeCt = " << nodeCt << std::endl;
2915 std::cout <<
"nodeOffset = " << nodeOffset << std::endl;
2916 std::cout <<
"elemCt = " << elemCt << std::endl;
2917 std::cout <<
"elemOffset = " << elemOffset << std::endl;
2918 std::cout <<
"elemTypeCt = " << elemTypeCt << std::endl;
2919 std::cout <<
"elemLength = " << elemLength << std::endl;
2920 std::cout <<
"setHandle = " << setHandle << std::endl;
2924 : grpID( 0 ), grpType( 0 ), memCt( 0 ), memOffset( 0 ), memTypeCt( 0 ), grpLength( 0 ), setHandle( 0 )
2930 std::cout <<
"grpID = " << grpID << std::endl;
2931 std::cout <<
"grpType = " << grpType << std::endl;
2932 std::cout <<
"memCt = " << memCt << std::endl;
2933 std::cout <<
"memOffset = " << memOffset << std::endl;
2934 std::cout <<
"memTypeCt = " << memTypeCt << std::endl;
2935 std::cout <<
"grpLength = " << grpLength << std::endl;
2936 std::cout <<
"setHandle = " << setHandle << std::endl;
2940 : blockID( 0 ), blockElemType( 0 ), memCt( 0 ), memOffset( 0 ), memTypeCt( 0 ), attribOrder( 0 ), blockCol( 0 ),
2941 blockMixElemType( 0 ), blockPyrType( 0 ), blockMat( 0 ), blockLength( 0 ), blockDim( 0 ), setHandle( 0 ),
2948 std::cout <<
"blockID = " << blockID << std::endl;
2949 std::cout <<
"blockElemType = " << blockElemType << std::endl;
2950 std::cout <<
"memCt = " << memCt << std::endl;
2951 std::cout <<
"memOffset = " << memOffset << std::endl;
2952 std::cout <<
"memTypeCt = " << memTypeCt << std::endl;
2953 std::cout <<
"attribOrder = " << attribOrder << std::endl;
2954 std::cout <<
"blockCol = " << blockCol << std::endl;
2955 std::cout <<
"blockMixElemType = " << blockMixElemType << std::endl;
2956 std::cout <<
"blockPyrType = " << blockPyrType << std::endl;
2957 std::cout <<
"blockMat = " << blockMat << std::endl;
2958 std::cout <<
"blockLength = " << blockLength << std::endl;
2959 std::cout <<
"blockDim = " << blockDim << std::endl;
2960 std::cout <<
"setHandle = " << setHandle << std::endl;
2961 std::cout <<
"blockEntityType = " << blockEntityType << std::endl;
2965 : nsID( 0 ), memCt( 0 ), memOffset( 0 ), memTypeCt( 0 ), pointSym( 0 ), nsCol( 0 ), nsLength( 0 ), setHandle( 0 )
2971 std::cout <<
"nsID = " << nsID << std::endl;
2972 std::cout <<
"memCt = " << memCt << std::endl;
2973 std::cout <<
"memOffset = " << memOffset << std::endl;
2974 std::cout <<
"memTypeCt = " << memTypeCt << std::endl;
2975 std::cout <<
"pointSym = " << pointSym << std::endl;
2976 std::cout <<
"nsCol = " << nsCol << std::endl;
2977 std::cout <<
"nsLength = " << nsLength << std::endl;
2978 std::cout <<
"setHandle = " << setHandle << std::endl;
2982 : ssID( 0 ), memCt( 0 ), memOffset( 0 ), memTypeCt( 0 ), numDF( 0 ), ssCol( 0 ), useShell( 0 ), ssLength( 0 ),
2989 std::cout <<
"ssID = " << ssID << std::endl;
2990 std::cout <<
"memCt = " << memCt << std::endl;
2991 std::cout <<
"memOffset = " << memOffset << std::endl;
2992 std::cout <<
"memTypeCt = " << memTypeCt << std::endl;
2993 std::cout <<
"numDF = " << numDF << std::endl;
2994 std::cout <<
"ssCol = " << ssCol << std::endl;
2995 std::cout <<
"useShell = " << useShell << std::endl;
2996 std::cout <<
"ssLength = " << ssLength << std::endl;
2997 std::cout <<
"setHandle = " << setHandle << std::endl;
3001 : mdOwner( 0 ), mdDataType( 0 ), mdIntValue( 0 ), mdName(
"(uninit)" ), mdStringValue(
"(uninit)" ), mdDblValue( 0 )
3007 std::cout <<
"MetaDataEntry:own, typ, name, I, D, S = " << mdOwner <<
", " << mdDataType <<
", " << mdName <<
", "
3008 << mdIntValue <<
", " << mdDblValue <<
", " << mdStringValue;
3010 if( mdIntArrayValue.size() )
3012 std::cout << std::endl <<
"IArray = " << mdIntArrayValue[0];
3013 for( i = 1; i < mdIntArrayValue.size(); i++ )
3014 std::cout <<
", " << mdIntArrayValue[i];
3016 if( mdDblArrayValue.size() )
3018 std::cout << std::endl <<
"DArray = " << mdDblArrayValue[0];
3019 for( i = 1; i < mdDblArrayValue.size(); i++ )
3020 std::cout <<
", " << mdDblArrayValue[i];
3022 std::cout << std::endl;
3027 std::cout <<
"MetaDataContainer:mdSchema, compressFlag, numDatums = " <<
mdSchema <<
", " <<
compressFlag <<
", "
3038 for(
unsigned int i = 0; i < metadataEntries.size(); i++ )
3040 if( owner == metadataEntries[i].mdOwner && name == metadataEntries[i].mdName )
return i;
3047 : modelHandle( 0 ), modelOffset( 0 ), modelLength( 0 ), modelType( 0 ), modelOwner( 0 ), modelPad( 0 ),
3048 feGeomH( NULL ), feGroupH( NULL ), feBlockH( NULL ), feNodeSetH( NULL ), feSideSetH( NULL )
3057 delete[] feNodeSetH;
3058 delete[] feSideSetH;
3063 std::cout <<
"ModelEntry: Han, Of, Len, Tp, Own, Pd = " << modelHandle <<
", " << modelOffset <<
", " << modelLength
3064 <<
", " << modelType <<
", " << modelOwner <<
", " << modelPad << std::endl;