diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/add_context.py b/src/ifcblenderexport/blenderbim/bim/module/context/add_context.py new file mode 100644 index 0000000000..73d683c0cc --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/context/add_context.py @@ -0,0 +1,36 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = { + "context": None, + "subcontext": None, + "target_view": None, + } + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + parent = [ + c + for c in self.file.by_type("IfcGeometricRepresentationContext") + if c.ContextType == self.settings["context"] + ] + if not parent: + self.create_origin() + if self.settings["context"] == "Plan": + return self.file.createIfcGeometricRepresentationContext(None, "Plan", 2, 1.0e-05, self.origin) + return self.file.createIfcGeometricRepresentationContext(None, "Model", 3, 1.0e-05, self.origin) + parent = parent[0] + return self.file.create_entity("IfcGeometricRepresentationSubContext", **{ + "ContextIdentifier": self.settings["subcontext"], + "ContextType": self.settings["context"], + "ParentContext": parent, + "TargetView": self.settings["target_view"], + }) + + def create_origin(self): + self.origin = self.file.createIfcAxis2Placement3D( + self.file.createIfcCartesianPoint((0.0, 0.0, 0.0)), + self.file.createIfcDirection((0.0, 0.0, 1.0)), + self.file.createIfcDirection((1.0, 0.0, 0.0)), + ) diff --git a/src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py b/src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py new file mode 100644 index 0000000000..ce17b0ef2d --- /dev/null +++ b/src/ifcblenderexport/blenderbim/bim/module/context/remove_context.py @@ -0,0 +1,12 @@ +class Usecase: + def __init__(self, file, settings=None): + self.file = file + self.settings = {"context": None} + for key, value in settings.items(): + self.settings[key] = value + + def execute(self): + # TODO: this is a light remove only + for subcontext in self.settings["context"].HasSubContexts: + self.file.remove(subcontext) + self.file.remove(self.settings["context"]) diff --git a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_object_placement.py b/src/ifcblenderexport/blenderbim/bim/module/geometry/add_object_placement.py index 6d7fc56eaf..69bedc302c 100644 --- a/src/ifcblenderexport/blenderbim/bim/module/geometry/add_object_placement.py +++ b/src/ifcblenderexport/blenderbim/bim/module/geometry/add_object_placement.py @@ -5,10 +5,7 @@ import ifcopenshell.util.placement class Usecase: def __init__(self, file, settings=None): self.file = file - self.settings = { - "product": None, - "matrix": np.eye(4) - } + self.settings = {"product": None, "matrix": np.eye(4)} for key, value in settings.items(): self.settings[key] = value @@ -18,9 +15,7 @@ class Usecase: placement_rel_to = None else: placement_rel_to = self.settings["product"].ObjectPlacement.PlacementRelTo - placement = self.file.createIfcLocalPlacement( - placement_rel_to, self.get_relative_placement(placement_rel_to) - ) + placement = self.file.createIfcLocalPlacement(placement_rel_to, self.get_relative_placement(placement_rel_to)) self.settings["product"].ObjectPlacement = placement return placement @@ -37,12 +32,11 @@ class Usecase: z = np.array((m[0][2], m[1][2], m[2][2])) o = np.array((m[0][3], m[1][3], m[2][3])) object_matrix = ifcopenshell.util.placement.a2p(o, z, x) - #relative_placement_matrix = relating_object_matrix.inverted() @ object_matrix relative_placement_matrix = relating_object_matrix @ object_matrix return self.create_ifc_axis_2_placement_3d( - relative_placement_matrix[:,3][0:3], - relative_placement_matrix[:,2][0:3], - relative_placement_matrix[:,0][0:3], + relative_placement_matrix[:, 3][0:3], + relative_placement_matrix[:, 2][0:3], + relative_placement_matrix[:, 0][0:3], ) def create_ifc_axis_2_placement_3d(self, point, up, forward): diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index 66480ba6ab..08ba59cf3a 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -2102,10 +2102,20 @@ class AddSubcontext(bpy.types.Operator): context: bpy.props.StringProperty() def execute(self, context): + self.file = ifc.IfcStore.get_file() + import blenderbim.bim.module.context.add_context as add_context + usecase = add_context.Usecase(self.file, { + "context": self.context.capitalize(), + "subcontext": bpy.context.scene.BIMProperties.available_subcontexts, + "target_view": bpy.context.scene.BIMProperties.available_target_views, + }) + result = usecase.execute() + props = bpy.context.scene.BIMProperties subcontext = getattr(bpy.context.scene.BIMProperties, "{}_subcontexts".format(self.context)).add() subcontext.name = bpy.context.scene.BIMProperties.available_subcontexts subcontext.target_view = bpy.context.scene.BIMProperties.available_target_views + subcontext.ifc_definition_id = int(result) return {"FINISHED"} @@ -2117,7 +2127,16 @@ class RemoveSubcontext(bpy.types.Operator): def execute(self, context): context, subcontext_index = self.indexes.split("-") subcontext_index = int(subcontext_index) - getattr(bpy.context.scene.BIMProperties, "{}_subcontexts".format(context)).remove(subcontext_index) + subcontexts = getattr(bpy.context.scene.BIMProperties, "{}_subcontexts".format(context)) + + self.file = ifc.IfcStore.get_file() + import blenderbim.bim.module.context.remove_context as remove_context + usecase = remove_context.Usecase(self.file, { + "context": self.file.by_id(subcontexts[subcontext_index].ifc_definition_id) + }) + usecase.execute() + + subcontexts.remove(subcontext_index) return {"FINISHED"}