@@ -124,17 +124,17 @@ class CurveConverter {
124
124
if ( conic ) {
125
125
// ENTITY IfcConic ABSTRACT SUPERTYPE OF(ONEOF(IfcCircle, IfcEllipse))
126
126
const auto placement = this ->m_primitivesConverter ->ConvertPlacement ( conic->m_Position );
127
- float radius1 = 0 .0f ;
128
- float radius2 = 0 .0f ;
127
+ double radius1 = 0.0 ;
128
+ double radius2 = 0.0 ;
129
129
130
130
const auto ellipse = dynamic_pointer_cast<IfcEllipse>( conic );
131
131
if ( ellipse && ellipse->m_SemiAxis1 && ellipse->m_SemiAxis2 ) {
132
- radius1 = ( float ) ellipse->m_SemiAxis1 ->m_value ;
133
- radius2 = ( float ) ellipse->m_SemiAxis2 ->m_value ;
132
+ radius1 = ellipse->m_SemiAxis1 ->m_value ;
133
+ radius2 = ellipse->m_SemiAxis2 ->m_value ;
134
134
}
135
135
const auto circle = dynamic_pointer_cast<IfcCircle>( conic );
136
136
if ( circle && circle->m_Radius ) {
137
- radius1 = radius2 = ( float ) circle->m_Radius ->m_value ;
137
+ radius1 = radius2 = circle->m_Radius ->m_value ;
138
138
}
139
139
140
140
int n = this ->m_parameters ->m_numVerticesPerCircle ; // TODO: should be calculated from radius
@@ -208,23 +208,23 @@ class CurveConverter {
208
208
if ( conic ) {
209
209
// ENTITY IfcConic ABSTRACT SUPERTYPE OF(ONEOF(IfcCircle, IfcEllipse))
210
210
const auto placement = this ->m_primitivesConverter ->ConvertPlacement ( conic->m_Position );
211
- float radius1 = 0 .0f ;
212
- float radius2 = 0 .0f ;
211
+ double radius1 = 0.0 ;
212
+ double radius2 = 0.0 ;
213
213
214
214
const auto ellipse = dynamic_pointer_cast<IfcEllipse>( conic );
215
215
if ( ellipse && ellipse->m_SemiAxis1 && ellipse->m_SemiAxis2 ) {
216
- radius1 = ( float ) ellipse->m_SemiAxis1 ->m_value ;
217
- radius2 = ( float ) ellipse->m_SemiAxis2 ->m_value ;
216
+ radius1 = ellipse->m_SemiAxis1 ->m_value ;
217
+ radius2 = ellipse->m_SemiAxis2 ->m_value ;
218
218
}
219
219
shared_ptr<IfcCircle> circle = dynamic_pointer_cast<IfcCircle>( conic );
220
220
if ( circle && circle->m_Radius ) {
221
- radius1 = radius2 = ( float ) circle->m_Radius ->m_value ;
221
+ radius1 = radius2 = circle->m_Radius ->m_value ;
222
222
}
223
223
224
224
int n = this ->m_parameters ->m_numVerticesPerCircle ; // TODO: should be calculated from radius
225
225
n = std::max ( n, this ->m_parameters ->m_minNumVerticesPerArc );
226
226
if ( radius1 > this ->m_parameters ->m_epsilon && radius2 > this ->m_parameters ->m_epsilon ) {
227
- result = this ->m_geomUtils ->BuildEllipse ( radius1, radius2, 0 .0f , ( float ) ( M_PI * 2 ), n );
227
+ result = this ->m_geomUtils ->BuildEllipse ( radius1, radius2, 0.0 , ( M_PI * 2 ), n );
228
228
} else {
229
229
result.push_back ( AVector::New () );
230
230
}
@@ -236,8 +236,8 @@ class CurveConverter {
236
236
const auto origin = this ->m_primitivesConverter ->ConvertPoint ( line->m_Pnt );
237
237
const auto direction = AVector::Normalized ( this ->m_primitivesConverter ->ConvertVector ( line->m_Dir ) );
238
238
result = {
239
- origin - direction * this ->m_parameters ->m_modelMaxSize * 0 .5f ,
240
- origin + direction * this ->m_parameters ->m_modelMaxSize * 0 .5f ,
239
+ origin - direction * this ->m_parameters ->m_modelMaxSize * 0.5 ,
240
+ origin + direction * this ->m_parameters ->m_modelMaxSize * 0.5 ,
241
241
};
242
242
}
243
243
@@ -259,11 +259,12 @@ class CurveConverter {
259
259
result = {};
260
260
}
261
261
262
+ auto resultCopy = result;
262
263
{
263
264
#ifdef ENABLE_OPENMP
264
265
ScopedLock lock ( this ->m_curveToPointsMapMutex );
265
266
#endif
266
- this ->m_curveToPointsMap [ curve ] = result ;
267
+ this ->m_curveToPointsMap [ curve ] = std::move ( resultCopy ) ;
267
268
}
268
269
return result;
269
270
}
@@ -304,10 +305,10 @@ class CurveConverter {
304
305
}
305
306
306
307
private:
307
- std::tuple<float , float > GetTrimmingsForCircle ( const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t1,
308
- const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t2, TVector center, bool senseAgreement ) {
309
- float l = this ->GetTrimmingForCircle ( t1, center );
310
- float r = this ->GetTrimmingForCircle ( t2, center );
308
+ std::tuple<double , double > GetTrimmingsForCircle ( const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t1,
309
+ const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t2, TVector center, bool senseAgreement ) {
310
+ double l = this ->GetTrimmingForCircle ( t1, center );
311
+ double r = this ->GetTrimmingForCircle ( t2, center );
311
312
312
313
if ( senseAgreement && l < r ) {
313
314
return { l, r - l };
@@ -321,10 +322,10 @@ class CurveConverter {
321
322
if ( !senseAgreement && l > r ) {
322
323
return { l, l - r };
323
324
}
324
- return { l, 0 .0f };
325
+ return { l, 0.0 };
325
326
}
326
327
327
- float GetTrimmingForCircle ( std::vector<std::shared_ptr<IfcTrimmingSelect>> t, TVector center ) {
328
+ double GetTrimmingForCircle ( std::vector<std::shared_ptr<IfcTrimmingSelect>> t, TVector center ) {
328
329
if ( t.size () > 1 && std::dynamic_pointer_cast<IfcParameterValue>( t[ 1 ] ) ) {
329
330
std::swap ( t[ 0 ], t[ 1 ] );
330
331
}
@@ -333,34 +334,35 @@ class CurveConverter {
333
334
const auto dir = AVector::Normalized ( this ->m_primitivesConverter ->ConvertPoint ( cartesianPoint ) - center );
334
335
// TODO: Verify code
335
336
if ( dir.x >= this ->m_parameters ->m_epsilon && dir.y >= this ->m_parameters ->m_epsilon ) {
336
- return acosf ( AVector::Dot ( AVector::New ( 1 , 0 , 0 ), dir ) );
337
+ return acos ( AVector::Dot ( AVector::New ( 1 , 0 , 0 ), dir ) );
337
338
} else if ( dir.x < -this ->m_parameters ->m_epsilon && dir.y >= this ->m_parameters ->m_epsilon ) {
338
- return M_PI_2 + acosf ( AVector::Dot ( AVector::New ( 0 , 1 , 0 ), dir ) );
339
+ return M_PI_2 + acos ( AVector::Dot ( AVector::New ( 0 , 1 , 0 ), dir ) );
339
340
} else if ( dir.x < -this ->m_parameters ->m_epsilon && dir.y < -this ->m_parameters ->m_epsilon ) {
340
- return M_PI + acosf ( AVector::Dot ( AVector::New ( -1 , 0 , 0 ), dir ) );
341
+ return M_PI + acos ( AVector::Dot ( AVector::New ( -1 , 0 , 0 ), dir ) );
341
342
} else {
342
- return M_PI + M_PI_2 + acosf ( AVector::Dot ( AVector::New ( 0 , -1 , 0 ), dir ) );
343
+ return M_PI + M_PI_2 + acos ( AVector::Dot ( AVector::New ( 0 , -1 , 0 ), dir ) );
343
344
}
344
345
}
345
346
const auto parameterValue = std::dynamic_pointer_cast<IfcParameterValue>( t[ 0 ] );
346
347
if ( parameterValue ) {
347
- return (float )( parameterValue->m_value * this ->m_parameters ->m_angleFactor );
348
+ return ( parameterValue->m_value * this ->m_parameters ->m_angleFactor );
348
349
}
349
350
// TODO: Log error
350
351
return 0 ;
351
352
}
352
353
353
- std::tuple<float , float > GetTrimmingsForLine ( const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t1,
354
- const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t2, TVector origin, TVector dir, bool senseArgement ) {
355
- float l = this ->GetTrimmingForLine ( t1, origin, dir );
356
- float r = this ->GetTrimmingForLine ( t2, origin, dir );
354
+ std::tuple<double , double > GetTrimmingsForLine ( const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t1,
355
+ const std::vector<std::shared_ptr<IfcTrimmingSelect>>& t2, TVector origin, TVector dir,
356
+ bool senseArgement ) {
357
+ double l = this ->GetTrimmingForLine ( t1, origin, dir );
358
+ double r = this ->GetTrimmingForLine ( t2, origin, dir );
357
359
if ( senseArgement && l > r || !senseArgement && l < r ) {
358
360
std::swap ( l, r );
359
361
}
360
362
return { l, r };
361
363
}
362
364
363
- float GetTrimmingForLine ( std::vector<std::shared_ptr<IfcTrimmingSelect>> t, TVector origin, TVector dir ) {
365
+ double GetTrimmingForLine ( std::vector<std::shared_ptr<IfcTrimmingSelect>> t, TVector origin, TVector dir ) {
364
366
if ( t.size () > 1 && std::dynamic_pointer_cast<IfcParameterValue>( t[ 1 ] ) ) {
365
367
std::swap ( t[ 0 ], t[ 1 ] );
366
368
}
@@ -370,18 +372,18 @@ class CurveConverter {
370
372
}
371
373
const auto parameterValue = std::dynamic_pointer_cast<IfcParameterValue>( t[ 0 ] );
372
374
if ( parameterValue ) {
373
- return ( float ) parameterValue->m_value ;
375
+ return parameterValue->m_value ;
374
376
}
375
377
// TODO: Log error
376
378
return 0 ;
377
379
}
378
380
379
381
TVector GetClosestPointOnCurve ( const TCurve& curve, const TVector& point ) {
380
382
TVector result = curve[ 0 ];
381
- float distance2 = AVector::Len2 ( point - result );
383
+ double distance2 = AVector::Len2 ( point - result );
382
384
for ( int i = 1 ; i < curve.size (); i++ ) {
383
385
TVector r = this ->m_geomUtils ->ClosestPointOnEdge ( curve[ i - 1 ], curve[ i ], point );
384
- float d2 = AVector::Len2 ( point - r );
386
+ double d2 = AVector::Len2 ( point - r );
385
387
if ( d2 < distance2 ) {
386
388
result = r;
387
389
distance2 = d2;
0 commit comments