diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 1b64ef180e..5766368c50 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -49,10 +49,11 @@ classes = ( operator.UpdateRepresentation, prop.BIMObjectGeometryProperties, prop.BIMGeometryProperties, - ui.BIM_PT_derived_placements, + ui.BIM_PT_placement, ui.BIM_PT_representations, ui.BIM_PT_connections, ui.BIM_PT_mesh, + ui.BIM_PT_derived_coordinates, ui.BIM_PT_workarounds, ui.BIM_MT_object_set_origin, ui.BIM_MT_separate, @@ -72,7 +73,6 @@ def register(): bpy.types.Object.BIMGeometryProperties = bpy.props.PointerProperty(type=prop.BIMObjectGeometryProperties) bpy.types.Scene.BIMGeometryProperties = bpy.props.PointerProperty(type=prop.BIMGeometryProperties) - bpy.types.OBJECT_PT_transform.append(ui.BIM_PT_transform) bpy.types.VIEW3D_MT_object.append(ui.object_menu) bpy.types.OUTLINER_MT_object.append(ui.outliner_menu) bpy.types.VIEW3D_MT_object_context_menu.append(ui.object_menu) @@ -117,7 +117,6 @@ def register(): def unregister(): bpy.types.VIEW3D_MT_object.remove(ui.object_menu) - bpy.types.OBJECT_PT_transform.remove(ui.BIM_PT_transform) bpy.types.OUTLINER_MT_object.remove(ui.outliner_menu) bpy.types.VIEW3D_MT_object_context_menu.remove(ui.outliner_menu) bpy.types.VIEW3D_MT_edit_mesh.remove(ui.edit_mesh_menu) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index 22575778d3..b5536fa53a 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -23,7 +23,8 @@ from mathutils import Vector def refresh(): - DerivedPlacementsData.is_loaded = False + PlacementData.is_loaded = False + DerivedCoordinatesData.is_loaded = False RepresentationsData.is_loaded = False ConnectionsData.is_loaded = False @@ -184,7 +185,7 @@ class ConnectionsData: return results -class DerivedPlacementsData: +class DerivedCoordinatesData: data = {} is_loaded = False @@ -263,6 +264,25 @@ class DerivedPlacementsData: for i, storey in enumerate(storeys): if storey[0] != element: continue - if i >= len(storeys): + if i >= len(storeys) - 1: return "N/A" return "{0:.3f}".format(round(storeys[i + 1][1] - storey[1], 3)) + + +class PlacementData: + data = {} + is_loaded = False + + @classmethod + def load(cls): + cls.data = { + "has_placement": cls.has_placement(), + } + cls.is_loaded = True + + @classmethod + def has_placement(cls): + element = tool.Ifc.get_entity(bpy.context.active_object) + if element and hasattr(element, "ObjectPlacement"): + return True + return False diff --git a/src/blenderbim/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py index a91cf340ee..c52a98c064 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -21,7 +21,12 @@ import blenderbim.tool as tool from bpy.types import Panel, Menu from blenderbim.bim.ifc import IfcStore from blenderbim.bim.helper import prop_with_search -from blenderbim.bim.module.geometry.data import RepresentationsData, ConnectionsData, DerivedPlacementsData +from blenderbim.bim.module.geometry.data import ( + RepresentationsData, + ConnectionsData, + PlacementData, + DerivedCoordinatesData, +) def object_menu(self, context): @@ -251,49 +256,89 @@ class BIM_PT_mesh(Panel): op.ifc_representation_class = "IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids" -def BIM_PT_transform(self, context): - if context.active_object and context.active_object.BIMObjectProperties.ifc_definition_id: - row = self.layout.row(align=True) - row.label(text="Blender Offset") - row.label(text=context.active_object.BIMObjectProperties.blender_offset_type) - row = self.layout.row() - row.operator("bim.edit_object_placement") - - -class BIM_PT_derived_placements(Panel): - bl_label = "Derived Placements" - bl_idname = "BIM_PT_derived_placements" - bl_options = {"DEFAULT_CLOSED"} +class BIM_PT_placement(Panel): + bl_label = "Placement" + bl_idname = "BIM_PT_placement" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" - bl_context = "object" + bl_context = "scene" bl_order = 1 - bl_parent_id = "OBJECT_PT_transform" + bl_parent_id = "BIM_PT_tab_placement" + bl_options = {"HIDE_HEADER"} + + @classmethod + def poll(cls, context): + return context.active_object and context.active_object.BIMObjectProperties.ifc_definition_id def draw(self, context): - if not DerivedPlacementsData.is_loaded: - DerivedPlacementsData.load() + if not PlacementData.is_loaded: + PlacementData.load() + + if PlacementData.data["has_placement"]: + row = self.layout.row() + row.prop(context.active_object, "location", text="Location") + row = self.layout.row() + row.prop(context.active_object, "rotation_euler", text="Rotation") + else: + row = self.layout.row() + row.label(text="No Object Placement Found") + + if context.active_object.BIMObjectProperties.blender_offset_type != "NONE": + row = self.layout.row(align=True) + row.label(text="Blender Offset", icon="TRACKING_REFINE_FORWARDS") + row.label(text=context.active_object.BIMObjectProperties.blender_offset_type) + + +class BIM_PT_derived_coordinates(Panel): + bl_label = "Derived Coordinates" + bl_idname = "BIM_PT_derived_coordinates" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_order = 3 + bl_parent_id = "BIM_PT_tab_placement" + bl_options = {"DEFAULT_CLOSED"} + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def draw(self, context): + if not DerivedCoordinatesData.is_loaded: + DerivedCoordinatesData.load() + + row = self.layout.row() + row.operator("bim.edit_object_placement", icon="EXPORT") + + row = self.layout.row() + row.label(text="XYZ Dimensions") + + row = self.layout.row(align=True) + row.enabled=False + row.prop(context.active_object, "dimensions", text="X", index=0, slider=True) + row.prop(context.active_object, "dimensions", text="Y", index=1, slider=True) + row.prop(context.active_object, "dimensions", text="Z", index=2, slider=True) row = self.layout.row(align=True) row.label(text="Min Global Z") - row.label(text=DerivedPlacementsData.data["min_global_z"]) + row.label(text=DerivedCoordinatesData.data["min_global_z"]) row = self.layout.row(align=True) row.label(text="Max Global Z") - row.label(text=DerivedPlacementsData.data["max_global_z"]) + row.label(text=DerivedCoordinatesData.data["max_global_z"]) - if DerivedPlacementsData.data["has_collection"]: + if DerivedCoordinatesData.data["has_collection"]: row = self.layout.row(align=True) row.label(text="Min Decomposed Z") - row.label(text=DerivedPlacementsData.data["min_decomposed_z"]) + row.label(text=DerivedCoordinatesData.data["min_decomposed_z"]) row = self.layout.row(align=True) row.label(text="Max Decomposed Z") - row.label(text=DerivedPlacementsData.data["max_decomposed_z"]) + row.label(text=DerivedCoordinatesData.data["max_decomposed_z"]) - if DerivedPlacementsData.data["is_storey"]: + if DerivedCoordinatesData.data["is_storey"]: row = self.layout.row(align=True) row.label(text="Storey Height") - row.label(text=DerivedPlacementsData.data["storey_height"]) + row.label(text=DerivedCoordinatesData.data["storey_height"]) class BIM_PT_workarounds(Panel): diff --git a/src/blenderbim/blenderbim/bim/ui.py b/src/blenderbim/blenderbim/bim/ui.py index 8a5a324fff..b773f81a49 100644 --- a/src/blenderbim/blenderbim/bim/ui.py +++ b/src/blenderbim/blenderbim/bim/ui.py @@ -552,6 +552,21 @@ class BIM_PT_tab_object_metadata(Panel): pass +class BIM_PT_tab_placement(Panel): + bl_label = "Placement" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_order = 1 + + @classmethod + def poll(cls, context): + return tool.Blender.is_tab(context, "GEOMETRY") and tool.Ifc.get() + + def draw(self, context): + pass + + class BIM_PT_tab_representations(Panel): bl_label = "Representations" bl_space_type = "PROPERTIES"