mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 09:48:32 +00:00
tool.Geometry method for adding a data to an empty object
This commit is contained in:
@@ -400,7 +400,7 @@ class Geometry:
|
||||
def record_object_position(cls, obj): pass
|
||||
def remove_connection(cls, connection): pass
|
||||
def rename_object(cls, obj, name): pass
|
||||
def replace_object_with_empty(cls, obj): pass
|
||||
def recreate_object_with_data(cls, obj, data): pass
|
||||
def replace_object_data_globally(cls, old_data, new_data): pass
|
||||
def resolve_mapped_representation(cls, representation): pass
|
||||
def run_geometry_update_representation(cls, obj=None): pass
|
||||
|
||||
@@ -690,13 +690,20 @@ class Geometry(blenderbim.core.tool.Geometry):
|
||||
obj.name = name
|
||||
|
||||
@classmethod
|
||||
def replace_object_with_empty(cls, obj: bpy.types.Object) -> None:
|
||||
"""Recreate a Blender object as an empty object.
|
||||
def recreate_object_with_data(cls, obj: bpy.types.Object, data: Union[bpy.types.ID, None]) -> bpy.types.Object:
|
||||
"""Recreate a Blender object with the provided `data`.
|
||||
|
||||
This method is useful when an object should no longer have associated
|
||||
data (in Blender, you cannot simply assign .data to None). Note that the
|
||||
object's original data is not handled by this method and should be
|
||||
data (in Blender, you cannot simply assign .data to None).
|
||||
Or if object is an empty and should now have a data.
|
||||
|
||||
The object's original data is not handled by this method and should be
|
||||
processed separately to avoid leaving orphan data.
|
||||
|
||||
Original `obj` is deleted and becomes invalid and should be replaced
|
||||
with an object returned by this method.
|
||||
|
||||
:return: The newly recreated object.
|
||||
"""
|
||||
element = tool.Ifc.get_entity(obj)
|
||||
name = obj.name
|
||||
@@ -704,7 +711,7 @@ class Geometry(blenderbim.core.tool.Geometry):
|
||||
tool.Ifc.unlink(element=element)
|
||||
|
||||
obj.name = ifcopenshell.guid.new()
|
||||
new_obj = bpy.data.objects.new(name, None)
|
||||
new_obj = bpy.data.objects.new(name, data)
|
||||
|
||||
if element:
|
||||
tool.Ifc.link(element, new_obj)
|
||||
@@ -712,6 +719,7 @@ class Geometry(blenderbim.core.tool.Geometry):
|
||||
collection.objects.link(new_obj)
|
||||
new_obj.matrix_world = obj.matrix_world
|
||||
bpy.data.objects.remove(obj)
|
||||
return new_obj
|
||||
|
||||
@classmethod
|
||||
def resolve_mapped_representation(
|
||||
@@ -885,7 +893,7 @@ class Geometry(blenderbim.core.tool.Geometry):
|
||||
|
||||
# `representation` is the only representation for object.
|
||||
if new_representation is None:
|
||||
cls.replace_object_with_empty(obj)
|
||||
cls.recreate_object_with_data(obj, None)
|
||||
return
|
||||
|
||||
blenderbim.core.geometry.switch_representation(
|
||||
|
||||
@@ -321,9 +321,9 @@ class TestRemoveRepresentation:
|
||||
geometry.has_data_users("data").should_be_called().will_return(True)
|
||||
geometry.get_elements_of_type("type").should_be_called().will_return(["element"])
|
||||
ifc.get_object("element").should_be_called().will_return("obj")
|
||||
geometry.replace_object_with_empty("obj").should_be_called()
|
||||
geometry.recreate_object_with_data("obj").should_be_called()
|
||||
ifc.get_object("type").should_be_called().will_return("type_obj")
|
||||
geometry.replace_object_with_empty("type_obj").should_be_called()
|
||||
geometry.recreate_object_with_data("type_obj").should_be_called()
|
||||
ifc.run("geometry.unassign_representation", product="type", representation="representation").should_be_called()
|
||||
ifc.run("geometry.remove_representation", representation="representation").should_be_called()
|
||||
geometry.delete_data("data").should_be_called()
|
||||
@@ -344,7 +344,7 @@ class TestRemoveRepresentation:
|
||||
geometry.get_element_type("element").should_be_called().will_return(None)
|
||||
geometry.get_representation_data("representation").should_be_called().will_return("data")
|
||||
geometry.has_data_users("data").should_be_called().will_return(True)
|
||||
geometry.replace_object_with_empty("obj").should_be_called()
|
||||
geometry.recreate_object_with_data("obj").should_be_called()
|
||||
ifc.run(
|
||||
"geometry.unassign_representation", product="element", representation="representation"
|
||||
).should_be_called()
|
||||
@@ -359,7 +359,7 @@ class TestRemoveRepresentation:
|
||||
geometry.is_type_product("element").should_be_called().will_return(False)
|
||||
geometry.get_representation_data("representation").should_be_called().will_return("data")
|
||||
geometry.has_data_users("data").should_be_called().will_return(True)
|
||||
geometry.replace_object_with_empty("obj").should_be_called()
|
||||
geometry.recreate_object_with_data("obj").should_be_called()
|
||||
ifc.run(
|
||||
"geometry.unassign_representation", product="element", representation="representation"
|
||||
).should_be_called()
|
||||
|
||||
@@ -375,6 +375,7 @@ class TestRenameObject(NewFile):
|
||||
assert obj.name == "name"
|
||||
|
||||
|
||||
# TODO: add a test
|
||||
class TestReplaceObjectWithEmpty(NewFile):
|
||||
def test_run(self):
|
||||
ifc = ifcopenshell.file()
|
||||
@@ -384,7 +385,7 @@ class TestReplaceObjectWithEmpty(NewFile):
|
||||
bpy.context.scene.collection.objects.link(obj)
|
||||
element = ifc.createIfcWall()
|
||||
tool.Ifc.link(element, obj)
|
||||
subject.replace_object_with_empty(obj)
|
||||
subject.recreate_object_with_data(obj, None)
|
||||
obj = bpy.data.objects.get("Object")
|
||||
assert obj.users_collection[0] == bpy.context.scene.collection
|
||||
assert tool.Ifc.get_entity(obj) == element
|
||||
|
||||
Reference in New Issue
Block a user