From eb0f2de197c94e18d6eed83e56351e1c189e07ed Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 21 Dec 2020 18:26:39 +1100 Subject: [PATCH] New snap spaces together utility for cleaning up spaces for energy modeling --- .../blenderbim/bim/__init__.py | 1 + .../blenderbim/bim/operator.py | 46 +++++++++++++++++++ src/ifcblenderexport/blenderbim/bim/ui.py | 2 + 3 files changed, 49 insertions(+) diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index d2b38f8258..8cdb13edd9 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -238,6 +238,7 @@ if bpy is not None: operator.ExecuteBlenderClash, operator.CleanWireframes, operator.LinkIfc, + operator.SnapSpacesTogether, prop.StrProperty, prop.Attribute, prop.MaterialLayer, diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index f6474d0d68..15aaee35b6 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -5010,3 +5010,49 @@ class LinkIfc(bpy.types.Operator): def invoke(self, context, event): context.window_manager.fileselect_add(self) return {"RUNNING_MODAL"} + + +class SnapSpacesTogether(bpy.types.Operator): + bl_idname = "bim.snap_spaces_together" + bl_label = "Snap Spaces Together" + + def execute(self, context): + threshold = 0.5 + processed_polygons = set() + for obj in bpy.context.selected_objects: + if obj.type != "MESH": + continue + for polygon in obj.data.polygons: + center = obj.matrix_world @ polygon.center + distance = None + for obj2 in bpy.context.selected_objects: + if obj2 == obj or obj.type != "MESH": + continue + result = obj2.ray_cast( + obj2.matrix_world.inverted() @ center, + polygon.normal, + distance=threshold + ) + if not result[0]: + continue + hit = obj2.matrix_world @ result[1] + distance = (hit - center).length / 2 + if distance < 0.01: + distance = None + break + + if (obj2.name, result[3]) in processed_polygons: + distance *= 2 + continue + + offset = polygon.normal * distance * -1 + processed_polygons.add((obj2.name, result[3])) + for v in obj2.data.polygons[result[3]].vertices: + obj2.data.vertices[v].co += offset + break + if distance: + offset = polygon.normal * distance + processed_polygons.add((obj.name, polygon.index)) + for v in polygon.vertices: + obj.data.vertices[v].co += offset + return {"FINISHED"} diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index 91b23aa6cd..01eb0d76a3 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -2525,6 +2525,8 @@ class BIM_PT_misc_utilities(Panel): row.operator("bim.set_override_colour") row = layout.row(align=True) row.operator("bim.set_viewport_shadow_from_sun") + row = layout.row(align=True) + row.operator("bim.snap_spaces_together") class BIM_PT_debug(Panel):