Skip to content

Commit 8802177

Browse files
ModelLoader and progress changed callback (#11)
1 parent 4457b91 commit 8802177

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

include/ifcpp/Geometry/GeometryGenerator.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <map>
44
#include <memory>
55
#include <vector>
6+
#include <functional>
7+
#include <atomic>
68

79
#include "ifcpp/Geometry/CAdapter.h"
810
#include "ifcpp/Geometry/CurveConverter.h"
@@ -109,7 +111,7 @@ class GeometryGenerator {
109111
this->m_parameters->m_angleFactor = ifcModel->getUnitConverter()->getAngleInRadiantFactor();
110112
}
111113

112-
std::vector<TEntity> GenerateGeometry() {
114+
std::vector<TEntity> GenerateGeometry( const std::function<void(double)>& onProgressChanged ) {
113115
this->ResetCaches();
114116
std::vector<TEntity> entities;
115117

@@ -122,16 +124,24 @@ class GeometryGenerator {
122124
const auto ifcEntitiesPtr = &ifcEntities;
123125
const auto ifcEntitiesCount = ifcEntities.size();
124126
const auto entitiesPtr = &entities;
127+
std::atomic<size_t> processedCount = 0;
125128

126129
#ifdef ENABLE_OPENMP
127130
Mutex entitiesPtrMutex;
128-
#pragma omp parallel default( none ) shared( entitiesPtrMutex, ifcEntitiesCount, ifcEntitiesPtr, entitiesPtr )
131+
#pragma omp parallel default( none ) shared( entitiesPtrMutex, ifcEntitiesCount, ifcEntitiesPtr, entitiesPtr, onProgressChanged, processedCount )
129132
{
130133
std::vector<TEntity> entitiesPerThread;
131134
entitiesPerThread.reserve( 1000 );
132135
#pragma omp for schedule( dynamic, 1000 )
133136
#endif
134137
for( int i = 0; i < ifcEntitiesCount; i++ ) {
138+
if( !(++processedCount % 100000) ) {
139+
auto progress = (double)processedCount / (double)ifcEntitiesCount;
140+
if( progress < 1 ) {
141+
onProgressChanged( (double)processedCount / (double)ifcEntitiesCount );
142+
}
143+
}
144+
135145
const auto object = std::dynamic_pointer_cast<IfcObjectDefinition>( ifcEntitiesPtr->at( i ) );
136146
if( !object ) {
137147
continue;
@@ -156,6 +166,7 @@ class GeometryGenerator {
156166
}
157167
}
158168
#endif
169+
onProgressChanged( 1 );
159170
return entities;
160171
}
161172

include/ifcpp/ModelLoader.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,46 @@
11
#pragma once
22

3+
#include "ifcpp/Geometry/CAdapter.h"
4+
#include "ifcpp/Model/BuildingModel.h"
5+
#include "ifcpp/Reader/ReaderSTEP.h"
6+
#include <ifcpp/Geometry/GeometryGenerator.h>
37

48
namespace ifcpp {
59

10+
template<CAdapter TAdapter>
11+
std::vector<typename TAdapter::TEntity> LoadModel( const std::string& filePath, const std::shared_ptr<Parameters>& parameters, const std::function<void(double)>& onProgressChanged ) {
612

13+
auto readerMessageCallback = [onProgressChanged]( const std::shared_ptr<StatusCallback::Message>& message ) {
14+
if( message->m_type == StatusCallback::PROGRESS_CHANGED ) {
15+
onProgressChanged( message->m_progress * 0.5 );
16+
}
17+
};
18+
19+
auto geometryGeneratorProgressChangedCallback = [onProgressChanged]( double progress ) {
20+
onProgressChanged( 0.5 + progress * 0.5 );
21+
};
22+
23+
auto ifcModel = std::make_shared<BuildingModel>();
24+
auto reader = std::make_shared<ReaderSTEP>();
25+
reader->SetMessageCallBack( readerMessageCallback );
26+
reader->loadModelFromFile( filePath, ifcModel );
27+
auto adapter = std::make_shared<TAdapter>();
28+
auto styleConverter = std::make_shared<ifcpp::StyleConverter>();
29+
auto geomUtils = std::make_shared<ifcpp::GeomUtils<typename TAdapter::TVector>>( parameters );
30+
auto primitivesConverter = std::make_shared<ifcpp::PrimitiveTypesConverter<typename TAdapter::TVector>>();
31+
auto splineConverter = std::make_shared<ifcpp::SplineConverter<typename TAdapter::TVector>>( primitivesConverter, geomUtils, parameters );
32+
auto curveConverter = std::make_shared<ifcpp::CurveConverter<typename TAdapter::TVector>>( primitivesConverter, geomUtils, splineConverter, parameters );
33+
auto extruder = std::make_shared<ifcpp::Extruder<typename TAdapter::TVector>>( geomUtils, parameters );
34+
auto profileConverter = std::make_shared<ifcpp::ProfileConverter<typename TAdapter::TVector>>( curveConverter, geomUtils, primitivesConverter, parameters );
35+
auto geometryConverter = std::make_shared<ifcpp::GeometryConverter<typename TAdapter::TVector>>( curveConverter, primitivesConverter, splineConverter,
36+
geomUtils, extruder, profileConverter, parameters );
37+
auto solidConverter = std::make_shared<ifcpp::SolidConverter<TAdapter>>( primitivesConverter, curveConverter, profileConverter, extruder, geometryConverter,
38+
adapter, geomUtils, styleConverter, parameters );
39+
auto geometryGenerator =
40+
std::make_shared<ifcpp::GeometryGenerator<TAdapter>>( ifcModel, adapter, curveConverter, extruder, geometryConverter, geomUtils, primitivesConverter,
41+
profileConverter, solidConverter, splineConverter, styleConverter, parameters );
42+
43+
return geometryGenerator->GenerateGeometry( geometryGeneratorProgressChangedCallback );
44+
}
745

846
}

0 commit comments

Comments
 (0)