diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 2256b0b49a..21d69e7f78 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with BlenderBIM Add-on. If not, see . +import re import bpy import blenderbim.core.tool import blenderbim.tool as tool @@ -80,5 +81,13 @@ class Drawing(blenderbim.core.tool.Drawing): @classmethod def update_text_value(cls, obj): element = cls.get_text_literal(obj) - if element: - obj.BIMTextProperties.value = element.Literal + if not element: + return + value = element.Literal + product = cls.get_text_product(tool.Ifc.get_entity(obj)) + if product: + selector = ifcopenshell.util.selector.Selector() + variables = {} + for variable in re.findall("{{.*?}}", value): + value = value.replace(variable, selector.get_element_value(product, variable[2:-2]) or "") + obj.BIMTextProperties.value = value diff --git a/src/blenderbim/test/tool/test_drawing.py b/src/blenderbim/test/tool/test_drawing.py index 876872b762..f7127b0f6e 100644 --- a/src/blenderbim/test/tool/test_drawing.py +++ b/src/blenderbim/test/tool/test_drawing.py @@ -138,8 +138,38 @@ class TestImportTextProduct(NewFile): class TestUpdateTextValue(NewFile): - def test_run(self): + def test_updating_arbitrary_strings(self): TestGetTextLiteral().test_run() obj = bpy.data.objects.get("Object") subject.update_text_value(obj) assert obj.BIMTextProperties.value == "Literal" + + def test_using_attribute_variables(self): + TestGetTextLiteral().test_run() + + obj = bpy.data.objects.get("Object") + ifc = tool.Ifc.get() + wall = ifc.createIfcWall(Name="Baz") + label = ifc.by_type("IfcAnnotation")[0] + ifcopenshell.api.run("drawing.assign_product", ifc, relating_product=wall, related_object=label) + + ifc.by_type("IfcTextLiteralWithExtent")[0].Literal = "Foo {{Name}} Bar" + + subject.update_text_value(obj) + assert obj.BIMTextProperties.value == "Foo Baz Bar" + + def test_using_property_variables(self): + TestGetTextLiteral().test_run() + + obj = bpy.data.objects.get("Object") + ifc = tool.Ifc.get() + wall = ifc.createIfcWall() + pset = ifcopenshell.api.run("pset.add_pset", ifc, name="Custom_Pset", product=wall) + ifcopenshell.api.run("pset.edit_pset", ifc, pset=pset, properties={"Key": "Baz"}) + label = ifc.by_type("IfcAnnotation")[0] + ifcopenshell.api.run("drawing.assign_product", ifc, relating_product=wall, related_object=label) + + ifc.by_type("IfcTextLiteralWithExtent")[0].Literal = "Foo {{Custom_Pset.Key}} Bar" + + subject.update_text_value(obj) + assert obj.BIMTextProperties.value == "Foo Baz Bar"