diff --git a/src/ifcgeom/IfcGeomIterator.h b/src/ifcgeom/IfcGeomIterator.h index 9fe6ff335c..71fd7f7336 100644 --- a/src/ifcgeom/IfcGeomIterator.h +++ b/src/ifcgeom/IfcGeomIterator.h @@ -183,7 +183,16 @@ namespace IfcGeom { } if (any_precision_encountered) { - kernel.setValue(IfcGeom::Kernel::GV_PRECISION, lowest_precision_encountered); + // Some arbitrary factor that has proven to work better for the models in the set of test files. + lowest_precision_encountered *= 10.; + + lowest_precision_encountered *= unit_magnitude; + if (lowest_precision_encountered < 1.e-7) { + Logger::Message(Logger::LOG_WARNING, "Precision lower than 0.0000001 meter not enforced"); + kernel.setValue(IfcGeom::Kernel::GV_PRECISION, 1.e-7); + } else { + kernel.setValue(IfcGeom::Kernel::GV_PRECISION, lowest_precision_encountered); + } } else { kernel.setValue(IfcGeom::Kernel::GV_PRECISION, 1.e-5); } diff --git a/src/ifcwrap/IfcGeomWrapper.i b/src/ifcwrap/IfcGeomWrapper.i index 38ba18ee62..84a67747e7 100644 --- a/src/ifcwrap/IfcGeomWrapper.i +++ b/src/ifcwrap/IfcGeomWrapper.i @@ -242,12 +242,16 @@ context = subcontext->ParentContext(); } - double precision = 1.e-5; + double precision = 1.e-6; if (context->hasPrecision()) { precision = context->Precision(); } std::pair length_unit = kernel.initializeUnits(project->UnitsInContext()); precision *= length_unit.second; + + // Some arbitrary factor that has proven to work better for the models in the set of test files. + precision *= 10.; + kernel.setValue(IfcGeom::Kernel::GV_PRECISION, precision); IfcGeom::BRepElement* brep = kernel.create_brep_for_representation_and_product(settings, representation, product);