diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 0f75b4450c..a23e123354 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -35,6 +35,7 @@ classes = ( operator.SwitchRepresentation, operator.UpdateParametricRepresentation, operator.UpdateRepresentation, + prop.BIMObjectGeometryProperties, prop.BIMGeometryProperties, ui.BIM_PT_derived_placements, ui.BIM_PT_representations, @@ -48,6 +49,7 @@ addon_keymaps = [] 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) @@ -71,6 +73,7 @@ def unregister(): bpy.types.VIEW3D_MT_object.remove(ui.object_menu) bpy.types.OBJECT_PT_transform.remove(ui.BIM_PT_transform) del bpy.types.Scene.BIMGeometryProperties + del bpy.types.Object.BIMGeometryProperties wm = bpy.context.window_manager kc = wm.keyconfigs.addon if kc: diff --git a/src/blenderbim/blenderbim/bim/module/geometry/data.py b/src/blenderbim/blenderbim/bim/module/geometry/data.py index 935cb68d28..b17c0870ed 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/data.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/data.py @@ -35,6 +35,7 @@ class RepresentationsData: @classmethod def load(cls): cls.data = {"representations": cls.representations()} + cls.data["contexts"] = cls.contexts() cls.is_loaded = True @classmethod @@ -64,6 +65,25 @@ class RepresentationsData: results.append(data) return results + @classmethod + def contexts(cls): + results = [] + for element in tool.Ifc.get().by_type("IfcGeometricRepresentationContext", include_subtypes=False): + results.append((str(element.id()), element.ContextType or "Unnamed", "")) + for element in tool.Ifc.get().by_type("IfcGeometricRepresentationSubContext", include_subtypes=False): + results.append( + ( + str(element.id()), + "{}/{}/{}".format( + element.ContextType or "Unnamed", + element.ContextIdentifier or "Unnamed", + element.TargetView or "Unnamed", + ), + "", + ) + ) + return results + class ConnectionsData: data = {} diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 8a9a715322..726ce584a1 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -34,7 +34,6 @@ import blenderbim.bim.handler from mathutils import Vector from blenderbim.bim import import_ifc from blenderbim.bim.ifc import IfcStore -from blenderbim.bim.module.root.prop import get_contexts class Operator: @@ -60,27 +59,20 @@ class AddRepresentation(bpy.types.Operator, Operator): bl_idname = "bim.add_representation" bl_label = "Add Representation" bl_options = {"REGISTER", "UNDO"} - obj: bpy.props.StringProperty() - context_id: bpy.props.IntProperty() - ifc_representation_class: bpy.props.StringProperty() - profile_set_usage: bpy.props.IntProperty() def _execute(self, context): - ifc_context = self.context_id - if not ifc_context and get_contexts(self, context): - ifc_context = int(context.scene.BIMRootProperties.contexts or "0") or None + ifc_context = int(context.active_object.BIMGeometryProperties.contexts or "0") or None if ifc_context: ifc_context = tool.Ifc.get().by_id(ifc_context) - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object core.add_representation( tool.Ifc, tool.Geometry, tool.Style, tool.Surveyor, - obj=obj, + obj=context.active_object, context=ifc_context, - ifc_representation_class=self.ifc_representation_class, - profile_set_usage=tool.Ifc.get().by_id(self.profile_set_usage) if self.profile_set_usage else None, + ifc_representation_class=None, + profile_set_usage=None, ) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/prop.py b/src/blenderbim/blenderbim/bim/module/geometry/prop.py index 289a81a6ea..e3fbd5517b 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/prop.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/prop.py @@ -18,6 +18,7 @@ import bpy from blenderbim.bim.prop import StrProperty, Attribute +from blenderbim.bim.module.geometry.data import RepresentationsData from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, @@ -31,6 +32,16 @@ from bpy.props import ( ) +def get_contexts(self, context): + if not RepresentationsData.is_loaded: + RepresentationsData.load() + return RepresentationsData.data["contexts"] + + +class BIMObjectGeometryProperties(PropertyGroup): + contexts: EnumProperty(items=get_contexts, name="Contexts") + + class BIMGeometryProperties(PropertyGroup): # Revit workaround should_use_presentation_style_assignment: BoolProperty(name="Force Presentation Style Assignment", default=False) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/ui.py b/src/blenderbim/blenderbim/bim/module/geometry/ui.py index 372db71f04..5ebd3f1a96 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/ui.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/ui.py @@ -58,7 +58,7 @@ class BIM_PT_representations(Panel): layout.label(text="No representations found") row = layout.row(align=True) - prop_with_search(row, context.scene.BIMRootProperties, "contexts", text="") + prop_with_search(row, context.active_object.BIMGeometryProperties, "contexts", text="") row.operator("bim.add_representation", icon="ADD", text="") for representation in RepresentationsData.data["representations"]: