Skip to content

Commit

Permalink
fix bug in unicode decoding. fix bug in SimpleViewerExample
Browse files Browse the repository at this point in the history
  • Loading branch information
ifcapps committed Mar 7, 2023
1 parent 4e8f2fd commit 036786f
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 147 deletions.
166 changes: 81 additions & 85 deletions IfcPlusPlus/src/ifcpp/geometry/GeometryConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class GeometryConverter : public StatusCallback

std::map<std::string, shared_ptr<ProductShapeData> > m_product_shape_data;
std::map<std::string, shared_ptr<BuildingObject> > m_map_outside_spatial_structure;
std::set<std::string> m_setResolvedProjectStructure;
std::set<int> m_setResolvedProjectStructure;
vec3 m_siteOffset;
double m_recent_progress = 0;
std::map<int, std::vector<shared_ptr<StatusCallback::Message> > > m_messages;
Expand Down Expand Up @@ -225,7 +225,7 @@ class GeometryConverter : public StatusCallback
}

#ifdef _DEBUG
std::string className = IFC4X3::EntityFactory::getStringForClassID(ifc_object_def->classID());
std::string className = IFC4X3::EntityFactory::getStringForClassID(ifc_object_def->classID());
#endif

for( const weak_ptr<IfcRelAggregates>& relAggregates_weak_ptr : ifc_object_def->m_IsDecomposedBy_inverse )
Expand All @@ -243,33 +243,31 @@ class GeometryConverter : public StatusCallback
const shared_ptr<IfcObjectDefinition>& related_obj_def = vec_related_objects[jj];
if( related_obj_def )
{
std::string related_guid;
if( related_obj_def->m_GlobalId )
int tag = related_obj_def->m_tag;
if( tag < 0 )
{
related_guid = related_obj_def->m_GlobalId->m_value;
}

if( related_guid.size() < 20 )
{
std::cout << "guid invalid: " << related_guid << std::endl;
std::cout << "invalid tag: " << tag << std::endl;
continue;
}

if( m_setResolvedProjectStructure.find(related_guid) != m_setResolvedProjectStructure.end() )
if( m_setResolvedProjectStructure.find(tag) != m_setResolvedProjectStructure.end() )
{
continue;
}
m_setResolvedProjectStructure.insert(related_guid);

m_setResolvedProjectStructure.insert(tag);

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
if( related_obj_def->m_GlobalId )
{
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
std::string guid = related_obj_def->m_GlobalId->m_value;
auto it_product_map = m_product_shape_data.find(guid);
if( it_product_map != m_product_shape_data.end() )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
}
}
}
}
Expand Down Expand Up @@ -298,41 +296,40 @@ class GeometryConverter : public StatusCallback
const shared_ptr<IfcProduct>& related_product = vec_related_elements[jj];
if( related_product )
{
std::string related_guid;
if( related_product->m_GlobalId )
int tag = related_product->m_tag;
if( tag < 0 )
{
related_guid = related_product->m_GlobalId->m_value;
}

if( related_guid.size() < 20 )
{
std::cout << "guid invalid: " << related_guid << std::endl;
std::cout << "tag invalid: " << tag << std::endl;
continue;
}

if( m_setResolvedProjectStructure.find(related_guid) != m_setResolvedProjectStructure.end() )
if( m_setResolvedProjectStructure.find(tag) != m_setResolvedProjectStructure.end() )
{
//std::cout << "duplicate guid in model tree: " << related_guid << std::endl;
continue;
}
m_setResolvedProjectStructure.insert(related_guid);
m_setResolvedProjectStructure.insert(tag);

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
if( related_product->m_GlobalId )
{
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
std::string related_guid = related_product->m_GlobalId->m_value;

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
}
}
}
}
}
}
}
}

if( resolveSecondaryStructure )
{
// handle IfcRelAssigns
Expand Down Expand Up @@ -373,33 +370,33 @@ class GeometryConverter : public StatusCallback

for( auto related_object : groupedBy->m_RelatedObjects )
{
std::string related_guid;
if( related_object->m_GlobalId )
int tag = related_object->m_tag;
if( tag < 0 )
{
related_guid = related_object->m_GlobalId->m_value;
}

if( related_guid.size() < 20 )
{
std::cout << "guid invalid: " << related_guid << std::endl;
std::cout << "tag invalid: " << tag << std::endl;
continue;
}

if( m_setResolvedProjectStructure.find(related_guid) != m_setResolvedProjectStructure.end() )
if( m_setResolvedProjectStructure.find(tag) != m_setResolvedProjectStructure.end() )
{
// std::cout << "duplicate guid in model tree: " << related_guid << std::endl;
continue;
}
m_setResolvedProjectStructure.insert(related_guid);
m_setResolvedProjectStructure.insert(tag);

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
if( related_object->m_GlobalId )
{
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
std::string related_guid = related_object->m_GlobalId->m_value;

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
}
}
}
}
Expand Down Expand Up @@ -434,33 +431,33 @@ class GeometryConverter : public StatusCallback
//shared_ptr<IfcPort> m_RelatingPort;
//shared_ptr<IfcDistributionElement> m_RelatedElement;

std::string related_guid;
if( related_object->m_GlobalId )
{
related_guid = related_object->m_GlobalId->m_value;
}
int tag = related_object->m_tag;

if( related_guid.size() < 20 )
if( tag < 0 )
{
std::cout << "guid invalid: " << related_guid << std::endl;
std::cout << "tag invalid: " << tag << std::endl;
continue;
}

if( m_setResolvedProjectStructure.find(related_guid) != m_setResolvedProjectStructure.end() )
if( m_setResolvedProjectStructure.find(tag) != m_setResolvedProjectStructure.end() )
{
// std::cout << "duplicate guid in model tree: " << related_guid << std::endl;
continue;
}
m_setResolvedProjectStructure.insert(related_guid);
m_setResolvedProjectStructure.insert(tag);

auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
if( related_object->m_GlobalId )
{
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
std::string related_guid = related_object->m_GlobalId->m_value;
auto it_product_map = m_product_shape_data.find(related_guid);
if( it_product_map != m_product_shape_data.end() )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
shared_ptr<ProductShapeData>& related_product_shape = it_product_map->second;
if( related_product_shape )
{
product_data->addChildProduct(related_product_shape, product_data);
resolveProjectStructure(related_product_shape, resolveSecondaryStructure);
}
}
}
}
Expand All @@ -476,10 +473,9 @@ class GeometryConverter : public StatusCallback
std::map<std::string, shared_ptr<ProductShapeData> >& map_shapeInputData = getShapeInputData();
shared_ptr<BuildingModel> ifc_model = getBuildingModel();
shared_ptr<IfcProject> ifc_project = ifc_model->getIfcProject();
shared_ptr<IfcSite> ifc_site;

std::vector<shared_ptr<IfcSite> > vec_ifc_sites;
std::vector<shared_ptr<ProductShapeData> > vec_ifc_buildings;

for( auto it : map_shapeInputData )
{
std::string guid = it.first;
Expand Down Expand Up @@ -511,7 +507,7 @@ class GeometryConverter : public StatusCallback
shared_ptr<IfcSite> site = dynamic_pointer_cast<IfcSite>(ifc_object_definition);
if( site )
{
ifc_site = site;
vec_ifc_sites.push_back( site );
continue;
}
}
Expand All @@ -528,7 +524,7 @@ class GeometryConverter : public StatusCallback
}

// if IfcBuilding is not connected to IfcSite and IfcProject, find IfcSite, and connect it
if( ifc_site )
for( auto ifc_site : vec_ifc_sites )
{
for( auto product_shape_building : vec_ifc_buildings )
{
Expand Down Expand Up @@ -830,7 +826,7 @@ class GeometryConverter : public StatusCallback
} // implicit barrier
#endif

// subtract openings in related objects, such as IFCBUILDINGELEMENTPART connected to a window through IFCRELAGGREGATES
// subtract openings in related objects, such as IFCBUILDINGELEMENTPART connected to a window through IFCRELAGGREGATES
for( auto it = map_products_ptr->begin(); it != map_products_ptr->end(); ++it )
{
shared_ptr<ProductShapeData> product_geom_input_data = it->second;
Expand Down Expand Up @@ -883,13 +879,13 @@ class GeometryConverter : public StatusCallback
if( !product_shape->m_ifc_object_definition.expired() )
{
shared_ptr<IfcObjectDefinition> ifc_object_def( product_shape->m_ifc_object_definition );
if( !m_geom_settings->skipRenderObject(ifc_object_def->classID()) )

if( m_geom_settings->skipRenderObject(ifc_object_def->classID()) )
{
continue;
}
std::string guid;

if (ifc_object_def->m_GlobalId)
{
guid = ifc_object_def->m_GlobalId->m_value;
Expand Down Expand Up @@ -1068,7 +1064,7 @@ class GeometryConverter : public StatusCallback
if( enableCaching )
{
bool equalItemFound = false;

for( auto it : m_product_shape_data )
{
const shared_ptr<ProductShapeData>& existingProductShape = it.second;
Expand All @@ -1091,14 +1087,14 @@ class GeometryConverter : public StatusCallback
}
if( !equalItemFound )
{
// representation_data->m_vec_item_data.push_back(geom_item_data);
//#ifdef _OPENMP
// ScopedLock lock( m_writelock_item_cache );
//#endif
// m_map_item_data_cache.push_back(geom_item_data);
// representation_data->m_vec_item_data.push_back(geom_item_data);
//#ifdef _OPENMP
// ScopedLock lock( m_writelock_item_cache );
//#endif
// m_map_item_data_cache.push_back(geom_item_data);
}
}

if( m_clear_memory_immedeately )
{
ifc_product->m_Representation.reset();
Expand Down Expand Up @@ -1186,7 +1182,7 @@ class GeometryConverter : public StatusCallback
if (related_object->m_GlobalId)
{
guid = related_object->m_GlobalId->m_value;

auto it_find_related_shape = m_product_shape_data.find(guid);
if( it_find_related_shape != m_product_shape_data.end() )
{
Expand Down
Loading

0 comments on commit 036786f

Please sign in to comment.