From 3c429626354eb8793f5f54869d10418d907c12ac Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 23 May 2024 21:40:19 +1000 Subject: [PATCH] Fix #4716. Fix bug where IfcTester fails to verify negative numbers. --- src/ifctester/ifctester/facet.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ifctester/ifctester/facet.py b/src/ifctester/ifctester/facet.py index c5fa773ac1..bd4d0c51e5 100644 --- a/src/ifctester/ifctester/facet.py +++ b/src/ifctester/ifctester/facet.py @@ -48,6 +48,16 @@ def cast_to_value(from_value, to_value): pass +# See bug 4716. +def is_x(value, cast_value): + if cast_value >= 0: + if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + return False + elif value > cast_value * (1.0 - 1e-6) or value < cast_value * (1.0 + 1e-6): + return False + return True + + @lru_cache def get_pset(element, pset): return ifcopenshell.util.element.get_pset(element, pset) @@ -332,7 +342,7 @@ class Attribute(Facet): elif isinstance(self.value, str): cast_value = cast_to_value(self.value, value) if isinstance(value, float) and isinstance(cast_value, float): - if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + if not is_x(value, cast_value): is_pass = False reason = {"type": "VALUE", "actual": value} break @@ -858,7 +868,7 @@ class Property(Facet): # "42" = 42 cast_value = cast_to_value(self.value, value) if isinstance(value, float) and isinstance(cast_value, float): - if value < cast_value * (1.0 - 1e-6) or value > cast_value * (1.0 + 1e-6): + if not is_x(value, cast_value): is_pass = False reason = {"type": "VALUE", "actual": value} break