diff --git a/src/bonsai/bonsai/bim/module/drawing/data.py b/src/bonsai/bonsai/bim/module/drawing/data.py index cd24989981..af8fac3cdf 100644 --- a/src/bonsai/bonsai/bim/module/drawing/data.py +++ b/src/bonsai/bonsai/bim/module/drawing/data.py @@ -235,8 +235,8 @@ class DecoratorData: cut_cache = {} slice_cache = {} fill_cache = {} - camera_location_checksum = None - camera_rotation_checksum = None + camera_location_checksum = "" + camera_rotation_checksum = "" @classmethod def clear_cache(cls): diff --git a/src/bonsai/bonsai/bim/module/drawing/decoration.py b/src/bonsai/bonsai/bim/module/drawing/decoration.py index 2e5a75c9be..f6db70462f 100644 --- a/src/bonsai/bonsai/bim/module/drawing/decoration.py +++ b/src/bonsai/bonsai/bim/module/drawing/decoration.py @@ -1731,20 +1731,23 @@ class CutDecorator: def cache_camera_matrix(self): obj = bpy.context.scene.camera - DecoratorData.camera_location_checksum = repr(np.array(obj.matrix_world.translation).tobytes()) - DecoratorData.camera_rotation_checksum = repr(np.array(obj.matrix_world.to_3x3()).tobytes()) + # Explicit `dtype` for Blender <5.0 compatibility. + DecoratorData.camera_location_checksum = repr( + np.array(obj.matrix_world.translation, dtype=np.float32).tobytes() + ) + DecoratorData.camera_rotation_checksum = repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) def is_camera_moved(self): if not DecoratorData.camera_location_checksum: self.cache_camera_matrix() return True # Let's be conservative obj = bpy.context.scene.camera - loc_check = np.frombuffer(eval(DecoratorData.camera_location_checksum)) + loc_check = np.frombuffer(eval(DecoratorData.camera_location_checksum), dtype=np.float32) loc_real = np.array(obj.matrix_world.translation).flatten() if not np.allclose(loc_check, loc_real, atol=1e-4): # 0.1 mm self.cache_camera_matrix() return True - rot_check = np.frombuffer(eval(DecoratorData.camera_rotation_checksum)).reshape(3, 3) + rot_check = np.frombuffer(eval(DecoratorData.camera_rotation_checksum), dtype=np.float32).reshape(3, 3) rot_real = np.array(obj.matrix_world.to_3x3()) rot_dot = np.dot(rot_check, rot_real.T) angle_rad = np.arccos(np.clip((np.trace(rot_dot) - 1) / 2, -1, 1)) diff --git a/src/bonsai/bonsai/tool/geometry.py b/src/bonsai/bonsai/tool/geometry.py index 6df540ef13..b7aa4ff15b 100644 --- a/src/bonsai/bonsai/tool/geometry.py +++ b/src/bonsai/bonsai/tool/geometry.py @@ -1146,8 +1146,9 @@ class Geometry(bonsai.core.tool.Geometry): def record_object_position(cls, obj: bpy.types.Object) -> None: # These are recorded separately because they have different numerical tolerances props = tool.Blender.get_object_bim_props(obj) - props.location_checksum = repr(np.array(obj.matrix_world.translation).tobytes()) - props.rotation_checksum = repr(np.array(obj.matrix_world.to_3x3()).tobytes()) + # Explicit dtype for Blender <5.0 compatibility. + props.location_checksum = repr(np.array(obj.matrix_world.translation, dtype=np.float32).tobytes()) + props.rotation_checksum = repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) @classmethod def remove_connection(cls, connection: ifcopenshell.entity_instance) -> None: diff --git a/src/bonsai/bonsai/tool/ifc.py b/src/bonsai/bonsai/tool/ifc.py index a85a8bd3e8..dfb2370272 100644 --- a/src/bonsai/bonsai/tool/ifc.py +++ b/src/bonsai/bonsai/tool/ifc.py @@ -110,11 +110,11 @@ class Ifc(bonsai.core.tool.Ifc): oprops = tool.Blender.get_object_bim_props(obj) if not oprops.location_checksum: return True # Let's be conservative - loc_check = np.frombuffer(eval(oprops.location_checksum)) + loc_check = np.frombuffer(eval(oprops.location_checksum), dtype=np.float32) loc_real = np.array(obj.matrix_world.translation).flatten() if not np.allclose(loc_check, loc_real, atol=1e-4): # 0.1 mm return True - rot_check = np.frombuffer(eval(oprops.rotation_checksum)).reshape(3, 3) + rot_check = np.frombuffer(eval(oprops.rotation_checksum), dtype=np.float32).reshape(3, 3) rot_real = np.array(obj.matrix_world.to_3x3()) rot_dot = np.dot(rot_check, rot_real.T) angle_rad = np.arccos(np.clip((np.trace(rot_dot) - 1) / 2, -1, 1)) diff --git a/src/bonsai/test/tool/test_geometry.py b/src/bonsai/test/tool/test_geometry.py index 93198a2f51..af7670275d 100644 --- a/src/bonsai/test/tool/test_geometry.py +++ b/src/bonsai/test/tool/test_geometry.py @@ -321,8 +321,8 @@ class TestRecordObjectPosition(NewFile): obj = bpy.data.objects.new("Object", None) props = tool.Blender.get_object_bim_props(obj) subject.record_object_position(obj) - assert props.location_checksum == repr(np.array(obj.matrix_world.translation).tobytes()) - assert props.rotation_checksum == repr(np.array(obj.matrix_world.to_3x3()).tobytes()) + assert props.location_checksum == repr(np.array(obj.matrix_world.translation, dtype=np.float32).tobytes()) + assert props.rotation_checksum == repr(np.array(obj.matrix_world.to_3x3(), dtype=np.float32).tobytes()) class TestRemoveConnection(NewFile):