Skip to content

Commit 155941c

Browse files
Loading cancellation (#12)
1 parent 8802177 commit 155941c

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

include/ifcpp/Geometry/GeometryGenerator.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class GeometryGenerator {
111111
this->m_parameters->m_angleFactor = ifcModel->getUnitConverter()->getAngleInRadiantFactor();
112112
}
113113

114-
std::vector<TEntity> GenerateGeometry( const std::function<void(double)>& onProgressChanged ) {
114+
std::vector<TEntity> GenerateGeometry( const std::function<void(double)>& onProgressChanged, const std::atomic<bool>& isCancellationRequested = false ) {
115115
this->ResetCaches();
116116
std::vector<TEntity> entities;
117117

@@ -128,13 +128,22 @@ class GeometryGenerator {
128128

129129
#ifdef ENABLE_OPENMP
130130
Mutex entitiesPtrMutex;
131-
#pragma omp parallel default( none ) shared( entitiesPtrMutex, ifcEntitiesCount, ifcEntitiesPtr, entitiesPtr, onProgressChanged, processedCount )
131+
#pragma omp parallel default( none ) shared( entitiesPtrMutex, ifcEntitiesCount, ifcEntitiesPtr, entitiesPtr, onProgressChanged, processedCount, isCancellationRequested )
132132
{
133133
std::vector<TEntity> entitiesPerThread;
134134
entitiesPerThread.reserve( 1000 );
135135
#pragma omp for schedule( dynamic, 1000 )
136136
#endif
137137
for( int i = 0; i < ifcEntitiesCount; i++ ) {
138+
#ifdef ENABLE_OPENMP
139+
if( isCancellationRequested ) {
140+
continue;
141+
}
142+
#else
143+
if( isCancellationRequested ) {
144+
return {};
145+
}
146+
#endif
138147
if( !(++processedCount % 100000) ) {
139148
auto progress = (double)processedCount / (double)ifcEntitiesCount;
140149
if( progress < 1 ) {
@@ -166,6 +175,9 @@ class GeometryGenerator {
166175
}
167176
}
168177
#endif
178+
if( isCancellationRequested ) {
179+
return {};
180+
}
169181
onProgressChanged( 1 );
170182
return entities;
171183
}

include/ifcpp/Model/AttributeObject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class AttributeObjectVector : public BuildingObject
2626
{
2727
public:
2828
AttributeObjectVector() = default;
29-
AttributeObjectVector( std::vector<shared_ptr<BuildingObject> >& vec ){ m_vec = vec; }
29+
AttributeObjectVector( const std::vector<shared_ptr<BuildingObject> >& vec ) : m_vec( vec ) {}
3030
virtual ~AttributeObjectVector()= default;
3131
uint32_t classID() const override { return 3667068888; }
3232
void getStepParameter( std::stringstream& /*stream*/, bool /*is_select_type = false*/ ) const override {}

include/ifcpp/Model/StatusCallback.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,5 +109,5 @@ class IFCQUERY_EXPORT StatusCallback {
109109
protected:
110110
std::function<void( const shared_ptr<Message>& )> m_messageCallback;
111111
std::function<bool()> m_isCancellationRequested;
112-
StatusCallback* m_redirectTarget;
112+
StatusCallback* m_redirectTarget = nullptr;
113113
};

include/ifcpp/ModelLoader.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22

3+
#include <atomic>
4+
35
#include "ifcpp/Geometry/CAdapter.h"
46
#include "ifcpp/Model/BuildingModel.h"
57
#include "ifcpp/Reader/ReaderSTEP.h"
@@ -8,22 +10,29 @@
810
namespace ifcpp {
911

1012
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 ) {
13+
std::vector<typename TAdapter::TEntity> LoadModel( const std::string& filePath, const std::shared_ptr<Parameters>& parameters,
14+
const std::function<void( double )>& onProgressChanged, const std::atomic<bool>& isCancellationRequest = false ) {
1215

13-
auto readerMessageCallback = [onProgressChanged]( const std::shared_ptr<StatusCallback::Message>& message ) {
16+
auto readerMessageCallback = [ onProgressChanged ]( const std::shared_ptr<StatusCallback::Message>& message ) {
1417
if( message->m_type == StatusCallback::PROGRESS_CHANGED ) {
1518
onProgressChanged( message->m_progress * 0.5 );
1619
}
1720
};
1821

19-
auto geometryGeneratorProgressChangedCallback = [onProgressChanged]( double progress ) {
20-
onProgressChanged( 0.5 + progress * 0.5 );
22+
auto readerIsCancellationRequested = [ &isCancellationRequest ] () {
23+
return (bool)isCancellationRequest;
2124
};
2225

26+
auto geometryGeneratorProgressChangedCallback = [ onProgressChanged ]( double progress ) { onProgressChanged( 0.5 + progress * 0.5 ); };
27+
2328
auto ifcModel = std::make_shared<BuildingModel>();
2429
auto reader = std::make_shared<ReaderSTEP>();
2530
reader->SetMessageCallBack( readerMessageCallback );
31+
reader->SetIsCancellationRequestedMethod( readerIsCancellationRequested );
2632
reader->loadModelFromFile( filePath, ifcModel );
33+
if( isCancellationRequest ) {
34+
return {};
35+
}
2736
auto adapter = std::make_shared<TAdapter>();
2837
auto styleConverter = std::make_shared<ifcpp::StyleConverter>();
2938
auto geomUtils = std::make_shared<ifcpp::GeomUtils<typename TAdapter::TVector>>( parameters );
@@ -40,7 +49,7 @@ std::vector<typename TAdapter::TEntity> LoadModel( const std::string& filePath,
4049
std::make_shared<ifcpp::GeometryGenerator<TAdapter>>( ifcModel, adapter, curveConverter, extruder, geometryConverter, geomUtils, primitivesConverter,
4150
profileConverter, solidConverter, splineConverter, styleConverter, parameters );
4251

43-
return geometryGenerator->GenerateGeometry( geometryGeneratorProgressChangedCallback );
52+
return geometryGenerator->GenerateGeometry( geometryGeneratorProgressChangedCallback, isCancellationRequest );
4453
}
4554

4655
}

0 commit comments

Comments
 (0)