Fix #1956. One-button upgrade from IFC2X3 to IFC4.

This commit is contained in:
Dion Moult
2022-01-17 16:20:01 +11:00
parent 1a735c4bef
commit 9ebe0aaa95
18 changed files with 206 additions and 24 deletions
@@ -9,3 +9,8 @@ Scenario: Execute IFC Patch
And I set "scene.BIMPatchProperties.ifc_patch_args" to "[123454321,0,0,0]"
When I press "bim.execute_ifc_patch"
Then the file "{cwd}/test/files/basic-patched.ifc" should contain "123454321"
Scenario: Run migrate patch
Given an empty Blender session
When I press "bim.run_migrate_patch(infile='{cwd}/test/files/ifc2x3.ifc', outfile='{cwd}/test/files/ifc2x3-migrated.ifc', schema='IFC4')"
Then the file "{cwd}/test/files/ifc2x3-migrated.ifc" should contain "IFC4"
+7
View File
@@ -112,6 +112,13 @@ def owner():
prophet.verify()
@pytest.fixture
def patch():
prophet = Prophecy(blenderbim.core.tool.Patch)
yield prophet
prophet.verify()
@pytest.fixture
def pset():
prophet = Prophecy(blenderbim.core.tool.Pset)
+3 -1
View File
@@ -122,7 +122,9 @@ class TestAddBrick:
brick.add_brick_from_element("element", "namespace", "brick_class").should_be_called().will_return("brick_uri")
brick.run_assign_brick_reference(element="element", library="library", brick_uri="brick_uri").should_be_called()
brick.run_refresh_brick_viewer().should_be_called()
subject.add_brick(ifc, brick, element="element", namespace="namespace", brick_class="brick_class", library="library")
subject.add_brick(
ifc, brick, element="element", namespace="namespace", brick_class="brick_class", library="library"
)
def test_adding_a_plain_brick(self, ifc, brick):
brick.add_brick("namespace", "brick_class").should_be_called()
+3 -1
View File
@@ -60,7 +60,9 @@ class TestEditTextProduct:
def test_run(self, ifc, drawing):
ifc.get_entity("obj").should_be_called().will_return("element")
drawing.get_text_product("element").should_be_called().will_return("existing_product")
ifc.run("drawing.unassign_product", relating_product="existing_product", related_object="element").should_be_called()
ifc.run(
"drawing.unassign_product", relating_product="existing_product", related_object="element"
).should_be_called()
ifc.run("drawing.assign_product", relating_product="product", related_object="element").should_be_called()
drawing.update_text_value("obj").should_be_called()
drawing.disable_editing_text_product("obj").should_be_called()
+26
View File
@@ -0,0 +1,26 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
#
# 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 <http://www.gnu.org/licenses/>.
import blenderbim.core.owner as subject
from test.core.bootstrap import patch
class TestRunMigratePatch:
def test_run(self, patch):
patch.run_migrate_patch("infile", "outfile", "schema").should_be_called()
assert subject.run_migrate_patch(patch, infile="infile", outfile="outfile", schema="schema")
+12
View File
@@ -0,0 +1,12 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2021-09-03T08:40:25',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC2X3'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,$,$,$,$,$,$);
#2=IFCORGANIZATION('abc','Foobar','http://www.example.com',$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
ENDSEC;
END-ISO-10303-21;
+4 -4
View File
@@ -37,12 +37,12 @@ class TestImplementsTool(NewFile):
class TestAddBrick(NewFile):
def test_run(self):
BrickStore.graph = brickschema.Graph()
result = subject.add_brick(
"http://example.org/digitaltwin#", "https://brickschema.org/schema/Brick#Equipment"
)
result = subject.add_brick("http://example.org/digitaltwin#", "https://brickschema.org/schema/Brick#Equipment")
assert "http://example.org/digitaltwin#" in result
assert list(
BrickStore.graph.triples((URIRef(result), RDF.type, URIRef("https://brickschema.org/schema/Brick#Equipment")))
BrickStore.graph.triples(
(URIRef(result), RDF.type, URIRef("https://brickschema.org/schema/Brick#Equipment"))
)
)
assert list(
BrickStore.graph.triples(
+40
View File
@@ -0,0 +1,40 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2022 Dion Moult <dion@thinkmoult.com>
#
# 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 <http://www.gnu.org/licenses/>.
import os
import bpy
import ifcopenshell
import blenderbim.core.tool
import blenderbim.tool as tool
from test.bim.bootstrap import NewFile
from blenderbim.tool.patch import Patch as subject
class TestImplementsTool(NewFile):
def test_run(self):
assert isinstance(subject(), blenderbim.core.tool.Patch)
class TestRunMigratePatch(NewFile):
def test_run(self):
cwd = os.path.dirname(os.path.realpath(__file__))
infile = os.path.join(cwd, "..", "files", "ifc2x3.ifc")
outfile = os.path.join(cwd, "..", "files", "ifc2x3-migrated.ifc")
subject.run_migrate_patch(infile, outfile, "IFC4")
ifc = ifcopenshell.open(outfile)
assert ifc.schema == "IFC4"