diff --git a/src/blenderbim/blenderbim/bim/module/brick/__init__.py b/src/blenderbim/blenderbim/bim/module/brick/__init__.py index 63b5a981ae..7a7285b043 100644 --- a/src/blenderbim/blenderbim/bim/module/brick/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/brick/__init__.py @@ -27,6 +27,7 @@ classes = ( operator.ConvertBrickProject, operator.ConvertIfcToBrick, operator.LoadBrickProject, + operator.NewBrickFile, operator.RewindBrickClass, operator.ViewBrickClass, operator.ViewBrickItem, diff --git a/src/blenderbim/blenderbim/bim/module/brick/operator.py b/src/blenderbim/blenderbim/bim/module/brick/operator.py index ba7f6e21d4..81c2970d31 100644 --- a/src/blenderbim/blenderbim/bim/module/brick/operator.py +++ b/src/blenderbim/blenderbim/bim/module/brick/operator.py @@ -154,3 +154,12 @@ class ConvertIfcToBrick(bpy.types.Operator, Operator): if props.libraries: library = tool.Ifc.get().by_id(int(props.libraries)) core.convert_ifc_to_brick(tool.Brick, namespace=props.namespace, library=library) + + +class NewBrickFile(bpy.types.Operator, Operator): + bl_idname = "bim.new_brick_file" + bl_label = "New Brick File" + bl_options = {"REGISTER", "UNDO"} + + def _execute(self, context): + core.new_brick_file(tool.Brick) diff --git a/src/blenderbim/blenderbim/bim/module/brick/ui.py b/src/blenderbim/blenderbim/bim/module/brick/ui.py index 2ecadd7fd0..0aa7cebf34 100644 --- a/src/blenderbim/blenderbim/bim/module/brick/ui.py +++ b/src/blenderbim/blenderbim/bim/module/brick/ui.py @@ -35,8 +35,9 @@ class BIM_PT_brickschema(Panel): self.props = context.scene.BIMBrickProperties if not BrickschemaData.data["is_loaded"]: - row = self.layout.row() - row.operator("bim.load_brick_project") + row = self.layout.row(align=True) + row.operator("bim.new_brick_file", text="Create Project") + row.operator("bim.load_brick_project", text="Load Project") return row = self.layout.row(align=True) diff --git a/src/blenderbim/blenderbim/core/brick.py b/src/blenderbim/blenderbim/core/brick.py index a4c7c801c9..23d1f08ca3 100644 --- a/src/blenderbim/blenderbim/core/brick.py +++ b/src/blenderbim/blenderbim/core/brick.py @@ -87,3 +87,7 @@ def convert_ifc_to_brick(brick, namespace=None, library=None): if not brick_class: continue brick.run_add_brick(obj=obj, namespace=namespace, brick_class=brick_class, library=library) + + +def new_brick_file(brick): + brick.new_brick_file() diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 65b75af91f..83d14902c0 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -63,6 +63,7 @@ class Brick: def import_brick_classes(cls, brick_class): pass def import_brick_items(cls, brick_class): pass def load_brick_file(cls, filepath): pass + def new_brick_file(cls): pass def pop_brick_breadcrumb(cls): pass def run_add_brick(cls, obj=None, namespace=None, brick_class=None, library=None): pass def run_assign_brick_reference(cls, obj=None, library=None, brick_uri=None): pass diff --git a/src/blenderbim/blenderbim/tool/brick.py b/src/blenderbim/blenderbim/tool/brick.py index 415deafeaf..ff0cf546b1 100644 --- a/src/blenderbim/blenderbim/tool/brick.py +++ b/src/blenderbim/blenderbim/tool/brick.py @@ -248,6 +248,16 @@ class Brick(blenderbim.core.tool.Brick): BrickStore.graph = brickschema.Graph().load_file(filepath) + BrickStore.schema BrickStore.path = filepath + @classmethod + def new_brick_file(cls): + if not BrickStore.schema: + BrickStore.schema = brickschema.Graph() + cwd = os.path.dirname(os.path.realpath(__file__)) + schema_path = os.path.join(cwd, "..", "bim", "schema", "Brick.ttl") + BrickStore.schema.load_file(schema_path) + BrickStore.graph = brickschema.Graph() + BrickStore.schema + BrickStore.graph.bind("digitaltwin", Namespace("https://example.org/digitaltwin#")) + @classmethod def pop_brick_breadcrumb(cls): crumb = bpy.context.scene.BIMBrickProperties.brick_breadcrumbs[-1] diff --git a/src/blenderbim/test/core/test_brick.py b/src/blenderbim/test/core/test_brick.py index aefcfa7f4b..6a616043e0 100644 --- a/src/blenderbim/test/core/test_brick.py +++ b/src/blenderbim/test/core/test_brick.py @@ -151,3 +151,9 @@ class TestConvertIfcToBrick: brick.get_convertable_brick_objects_and_elements().should_be_called().will_return([("obj", "element")]) brick.get_brick_class("element").should_be_called().will_return(None) subject.convert_ifc_to_brick(brick, namespace="namespace", library="library") + + +class TestNewBrickFile: + def test_run(self, brick): + brick.new_brick_file().should_be_called() + subject.new_brick_file(brick) diff --git a/src/blenderbim/test/tool/test_brick.py b/src/blenderbim/test/tool/test_brick.py index 9441b5cc88..e79368a6e2 100644 --- a/src/blenderbim/test/tool/test_brick.py +++ b/src/blenderbim/test/tool/test_brick.py @@ -298,6 +298,25 @@ class TestLoadBrickFile(NewFile): assert BrickStore.graph +class TestNewBrickFile(NewFile): + def test_run(self): + # We stub the schema to make tests run faster + BrickStore.schema = brickschema.Graph() + cwd = os.path.dirname(os.path.realpath(__file__)) + schema_path = os.path.join(cwd, "..", "files", "BrickStub.ttl") + BrickStore.schema.load_file(schema_path) + + # This is the actual test + ns_alias = "digitaltwin" + ns_uri = "https://example.org/digitaltwin#" + subject.new_brick_file() + assert BrickStore.graph + for ns in BrickStore.graph.namespaces(): + if ns[0] == ns_alias and ns[1].toPython() == ns_uri: + return + assert False + + class TestPopBrickBreadcrumb(NewFile): def test_run(self): bpy.context.scene.BIMBrickProperties.brick_breadcrumbs.add().name = "foo"