From a9a48bdd1d62bf65c1cb54f7b706dc8a7cd09500 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 18 Oct 2021 11:21:49 +1100 Subject: [PATCH] Refactor misc functions into new misc module for better organisation. --- src/blenderbim/blenderbim/bim/__init__.py | 4 +- .../blenderbim/bim/module/misc/__init__.py | 36 ++++++ .../blenderbim/bim/module/misc/operator.py | 111 ++++++++++++++++++ .../blenderbim/bim/module/misc/prop.py | 37 ++++++ .../blenderbim/bim/module/misc/ui.py | 40 +++++++ .../blenderbim/bim/module/model/__init__.py | 1 - .../blenderbim/bim/module/model/ui.py | 21 ---- .../blenderbim/bim/module/owner/operator.py | 1 - src/blenderbim/blenderbim/bim/operator.py | 84 ------------- src/blenderbim/blenderbim/bim/prop.py | 3 - src/blenderbim/pytest.ini | 1 + src/blenderbim/test/bim/feature/misc.feature | 25 ++++ src/blenderbim/test/bim/test_feature.py | 6 + 13 files changed, 257 insertions(+), 113 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/module/misc/__init__.py create mode 100644 src/blenderbim/blenderbim/bim/module/misc/operator.py create mode 100644 src/blenderbim/blenderbim/bim/module/misc/prop.py create mode 100644 src/blenderbim/blenderbim/bim/module/misc/ui.py create mode 100644 src/blenderbim/test/bim/feature/misc.feature diff --git a/src/blenderbim/blenderbim/bim/__init__.py b/src/blenderbim/blenderbim/bim/__init__.py index 6878061ba1..4ab53bd41d 100644 --- a/src/blenderbim/blenderbim/bim/__init__.py +++ b/src/blenderbim/blenderbim/bim/__init__.py @@ -30,6 +30,7 @@ modules = { "georeference": None, "context": None, "drawing": None, + "misc": None, "attribute": None, "type": None, "spatial": None, @@ -80,9 +81,6 @@ classes = [ operator.ReloadIfcFile, operator.AddIfcFile, operator.RemoveIfcFile, - operator.SetOverrideColour, - operator.SetViewportShadowFromSun, - operator.SnapSpacesTogether, prop.StrProperty, prop.Attribute, prop.BIMProperties, diff --git a/src/blenderbim/blenderbim/bim/module/misc/__init__.py b/src/blenderbim/blenderbim/bim/module/misc/__init__.py new file mode 100644 index 0000000000..5e226b3884 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/misc/__init__.py @@ -0,0 +1,36 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2020, 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +from . import ui, prop, operator + +classes = ( + operator.SetOverrideColour, + operator.SetViewportShadowFromSun, + operator.SnapSpacesTogether, + prop.BIMMiscProperties, + ui.BIM_PT_misc_utilities, +) + + +def register(): + bpy.types.Scene.BIMMiscProperties = bpy.props.PointerProperty(type=prop.BIMMiscProperties) + + +def unregister(): + del bpy.types.Scene.BIMMiscProperties diff --git a/src/blenderbim/blenderbim/bim/module/misc/operator.py b/src/blenderbim/blenderbim/bim/module/misc/operator.py new file mode 100644 index 0000000000..25e8c5c60f --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/misc/operator.py @@ -0,0 +1,111 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2020, 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +import blenderbim.bim.handler +from blenderbim.bim.ifc import IfcStore +from mathutils import Vector, Matrix, Euler + + +class Operator: + def execute(self, context): + IfcStore.execute_ifc_operator(self, context) + blenderbim.bim.handler.refresh_ui_data() + return {"FINISHED"} + + +class SetOverrideColour(bpy.types.Operator): + bl_idname = "bim.set_override_colour" + bl_label = "Set Override Colour" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.selected_objects + + def execute(self, context): + for obj in context.selected_objects: + obj.color = context.scene.BIMMiscProperties.override_colour + area = next(area for area in context.screen.areas if area.type == "VIEW_3D") + area.spaces[0].shading.color_type = "OBJECT" + return {"FINISHED"} + + +class SetViewportShadowFromSun(bpy.types.Operator): + bl_idname = "bim.set_viewport_shadow_from_sun" + bl_label = "Set Viewport Shadow from Sun" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.active_object + + def execute(self, context): + # Does this belong in the drawing module? Perhaps. + # The vector used for the light direction is a bit funny + mat = Matrix(((-1.0, 0.0, 0.0, 0.0), (0.0, 0, 1.0, 0.0), (-0.0, -1.0, 0, 0.0), (0.0, 0.0, 0.0, 1.0))) + context.scene.display.light_direction = mat.inverted() @ ( + context.active_object.matrix_world.to_quaternion() @ Vector((0, 0, -1)) + ) + return {"FINISHED"} + + +class SnapSpacesTogether(bpy.types.Operator): + bl_idname = "bim.snap_spaces_together" + bl_label = "Snap Spaces Together" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return context.selected_objects + + def execute(self, context): + threshold = 0.5 + processed_polygons = set() + selected_mesh_objects = [o for o in context.selected_objects if o.type == "MESH"] + for obj in selected_mesh_objects: + for polygon in obj.data.polygons: + center = obj.matrix_world @ polygon.center + distance = None + for obj2 in selected_mesh_objects: + if obj2 == obj: + 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/blenderbim/blenderbim/bim/module/misc/prop.py b/src/blenderbim/blenderbim/bim/module/misc/prop.py new file mode 100644 index 0000000000..696c0c7c8d --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/misc/prop.py @@ -0,0 +1,37 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2020, 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +from blenderbim.bim.prop import StrProperty, Attribute +from bpy.types import PropertyGroup +from bpy.props import ( + PointerProperty, + StringProperty, + EnumProperty, + BoolProperty, + IntProperty, + FloatProperty, + FloatVectorProperty, + CollectionProperty, +) + + +class BIMMiscProperties(PropertyGroup): + override_colour: FloatVectorProperty( + name="Override Colour", subtype="COLOR", default=(1, 0, 0, 1), min=0.0, max=1.0, size=4 + ) diff --git a/src/blenderbim/blenderbim/bim/module/misc/ui.py b/src/blenderbim/blenderbim/bim/module/misc/ui.py new file mode 100644 index 0000000000..557667aac4 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/misc/ui.py @@ -0,0 +1,40 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2020, 2021 Dion Moult +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy + + +class BIM_PT_misc_utilities(bpy.types.Panel): + bl_idname = "BIM_PT_misc_utilities" + bl_label = "Miscellaneous" + bl_options = {"DEFAULT_CLOSED"} + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + bl_category = "BlenderBIM" + + def draw(self, context): + layout = self.layout + props = context.scene.BIMMiscProperties + + row = layout.split(factor=0.2, align=True) + row.prop(props, "override_colour", text="") + 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") diff --git a/src/blenderbim/blenderbim/bim/module/model/__init__.py b/src/blenderbim/blenderbim/bim/module/model/__init__.py index 00f3ab557c..4bc02e32f8 100644 --- a/src/blenderbim/blenderbim/bim/module/model/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/model/__init__.py @@ -34,7 +34,6 @@ classes = ( prop.BIMModelProperties, ui.BIM_PT_authoring, ui.BIM_PT_authoring_architectural, - ui.BIM_PT_misc_utilities, grid.BIM_OT_add_object, stair.BIM_OT_add_object, door.BIM_OT_add_object, diff --git a/src/blenderbim/blenderbim/bim/module/model/ui.py b/src/blenderbim/blenderbim/bim/module/model/ui.py index 68891e71e6..cc2c038ad0 100644 --- a/src/blenderbim/blenderbim/bim/module/model/ui.py +++ b/src/blenderbim/blenderbim/bim/module/model/ui.py @@ -74,24 +74,3 @@ class BIM_PT_authoring_architectural(Panel): row = self.layout.row(align=True) row.operator("bim.flip_wall", icon="ORIENTATION_NORMAL", text="Flip") row.operator("bim.split_wall", icon="MOD_PHYSICS", text="Split") - - -class BIM_PT_misc_utilities(Panel): - bl_idname = "BIM_PT_misc_utilities" - bl_label = "Miscellaneous" - bl_options = {"DEFAULT_CLOSED"} - bl_space_type = "VIEW_3D" - bl_region_type = "UI" - bl_category = "BlenderBIM" - - def draw(self, context): - layout = self.layout - props = context.scene.BIMProperties - - row = layout.split(factor=0.2, align=True) - row.prop(props, "override_colour", text="") - 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") diff --git a/src/blenderbim/blenderbim/bim/module/owner/operator.py b/src/blenderbim/blenderbim/bim/module/owner/operator.py index 890566325b..f4aea75214 100644 --- a/src/blenderbim/blenderbim/bim/module/owner/operator.py +++ b/src/blenderbim/blenderbim/bim/module/owner/operator.py @@ -20,7 +20,6 @@ import bpy import ifcopenshell.api import blenderbim.tool as tool import blenderbim.core.owner as core -import blenderbim.bim.module.owner.data import blenderbim.bim.handler from blenderbim.bim.ifc import IfcStore diff --git a/src/blenderbim/blenderbim/bim/operator.py b/src/blenderbim/blenderbim/bim/operator.py index f0dcc9a148..8f18464cda 100644 --- a/src/blenderbim/blenderbim/bim/operator.py +++ b/src/blenderbim/blenderbim/bim/operator.py @@ -18,10 +18,7 @@ import os import bpy -import time import json -import tempfile -import logging import webbrowser import ifcopenshell import blenderbim.bim.handler @@ -361,87 +358,6 @@ class RemoveIfcFile(bpy.types.Operator): return {"FINISHED"} -class SetOverrideColour(bpy.types.Operator): - bl_idname = "bim.set_override_colour" - bl_label = "Set Override Colour" - bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - return context.selected_objects - - def execute(self, context): - for obj in context.selected_objects: - obj.color = context.scene.BIMProperties.override_colour - area = next(area for area in context.screen.areas if area.type == "VIEW_3D") - area.spaces[0].shading.color_type = "OBJECT" - return {"FINISHED"} - - -class SetViewportShadowFromSun(bpy.types.Operator): - bl_idname = "bim.set_viewport_shadow_from_sun" - bl_label = "Set Viewport Shadow from Sun" - bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - return context.active_object - - def execute(self, context): - # The vector used for the light direction is a bit funny - mat = Matrix(((-1.0, 0.0, 0.0, 0.0), (0.0, 0, 1.0, 0.0), (-0.0, -1.0, 0, 0.0), (0.0, 0.0, 0.0, 1.0))) - context.scene.display.light_direction = mat.inverted() @ ( - context.active_object.matrix_world.to_quaternion() @ Vector((0, 0, -1)) - ) - return {"FINISHED"} - - -class SnapSpacesTogether(bpy.types.Operator): - bl_idname = "bim.snap_spaces_together" - bl_label = "Snap Spaces Together" - bl_options = {"REGISTER", "UNDO"} - - @classmethod - def poll(cls, context): - return context.selected_objects - - def execute(self, context): - threshold = 0.5 - processed_polygons = set() - selected_mesh_objects = [o for o in context.selected_objects if o.type == "MESH"] - for obj in selected_mesh_objects: - for polygon in obj.data.polygons: - center = obj.matrix_world @ polygon.center - distance = None - for obj2 in selected_mesh_objects: - if obj2 == obj: - 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"} - - class SelectExternalMaterialDir(bpy.types.Operator): bl_idname = "bim.select_external_material_dir" bl_label = "Select Material File" diff --git a/src/blenderbim/blenderbim/bim/prop.py b/src/blenderbim/blenderbim/bim/prop.py index fd65f955c8..d7cb01cbb3 100644 --- a/src/blenderbim/blenderbim/bim/prop.py +++ b/src/blenderbim/blenderbim/bim/prop.py @@ -234,9 +234,6 @@ class BIMProperties(PropertyGroup): ], name="Drawing Imperial Precision", ) - override_colour: FloatVectorProperty( - name="Override Colour", subtype="COLOR", default=(1, 0, 0, 1), min=0.0, max=1.0, size=4 - ) class IfcParameter(PropertyGroup): diff --git a/src/blenderbim/pytest.ini b/src/blenderbim/pytest.ini index 90c1731b61..d250114cb2 100644 --- a/src/blenderbim/pytest.ini +++ b/src/blenderbim/pytest.ini @@ -4,6 +4,7 @@ markers = context geometry material + misc owner project pset_template diff --git a/src/blenderbim/test/bim/feature/misc.feature b/src/blenderbim/test/bim/feature/misc.feature new file mode 100644 index 0000000000..900a4563f8 --- /dev/null +++ b/src/blenderbim/test/bim/feature/misc.feature @@ -0,0 +1,25 @@ +@misc +Feature: Misc + +Scenario: Set override colour + Given an empty IFC project + And I add a cube + And the object "Cube" is selected + When I press "bim.set_override_colour" + Then nothing happens + +Scenario: Set viewport shadow from sun + Given an empty IFC project + And I add a sun + And the object "Sun" is selected + When I press "bim.set_viewport_shadow_from_sun" + Then nothing happens + +Scenario: Snap spaces together + Given an empty IFC project + And I add a cube + And I add a cube + And the object "Cube" is selected + And additionally the object "Cube.001" is selected + When I press "bim.snap_spaces_together" + Then nothing happens diff --git a/src/blenderbim/test/bim/test_feature.py b/src/blenderbim/test/bim/test_feature.py index cdc9349fc5..4e002a33af 100644 --- a/src/blenderbim/test/bim/test_feature.py +++ b/src/blenderbim/test/bim/test_feature.py @@ -78,6 +78,12 @@ def i_add_an_empty(): bpy.ops.object.empty_add() +@given("I add a sun") +@when("I add an sun") +def i_add_an_empty(): + bpy.ops.object.light_add(type="SUN") + + @given("I add a material") def i_add_a_material(): bpy.context.active_object.active_material = bpy.data.materials.new("Material")