mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-10 09:48:32 +00:00
Copying an opening now tracks it as a special objects in the scene
This commit is contained in:
@@ -38,7 +38,7 @@ def copy_class(ifc, collector, geometry, root, obj=None):
|
||||
)
|
||||
collector.assign(obj)
|
||||
if root.is_opening_element(element):
|
||||
root.add_dynamic_opening_voids(element, obj)
|
||||
root.add_tracked_opening(obj)
|
||||
|
||||
|
||||
def assign_class(
|
||||
|
||||
@@ -444,7 +444,7 @@ class Resource:
|
||||
|
||||
@interface
|
||||
class Root:
|
||||
def add_dynamic_opening_voids(cls, element, obj): pass
|
||||
def add_tracked_opening(cls, obj): pass
|
||||
def does_type_have_representations(cls, element): pass
|
||||
def get_element_type(cls, element): pass
|
||||
def get_object_name(cls, obj): pass
|
||||
|
||||
@@ -26,19 +26,9 @@ from mathutils import Vector
|
||||
|
||||
class Root(blenderbim.core.tool.Root):
|
||||
@classmethod
|
||||
def add_dynamic_opening_voids(cls, element, obj):
|
||||
for rel in element.VoidsElements:
|
||||
building_obj = tool.Ifc.get_object(rel.RelatingBuildingElement)
|
||||
try:
|
||||
modifier = next(m for m in obj.modifiers if m.type == "BOOLEAN" and m.object == obj)
|
||||
except StopIteration:
|
||||
modifier = building_obj.modifiers.new("IfcOpeningElement", "BOOLEAN")
|
||||
modifier.object = obj
|
||||
finally:
|
||||
modifier.operation = "DIFFERENCE"
|
||||
modifier.solver = "EXACT"
|
||||
modifier.use_self = True
|
||||
modifier.operand_type = "OBJECT"
|
||||
def add_tracked_opening(cls, obj):
|
||||
new = bpy.context.scene.BIMModelProperties.openings.add()
|
||||
new.obj = obj
|
||||
|
||||
@classmethod
|
||||
def does_type_have_representations(cls, element):
|
||||
|
||||
@@ -86,7 +86,7 @@ class TestCopyClass:
|
||||
root.link_object_data("type_obj", "obj").should_be_called()
|
||||
collector.assign("obj").should_be_called()
|
||||
root.is_opening_element("element").should_be_called().will_return(True)
|
||||
root.add_dynamic_opening_voids("element", "obj").should_be_called()
|
||||
root.add_tracked_opening("obj").should_be_called()
|
||||
subject.copy_class(ifc, collector, geometry, root, obj="obj")
|
||||
|
||||
|
||||
|
||||
@@ -29,30 +29,12 @@ class TestImplementsTool(NewFile):
|
||||
assert isinstance(subject(), blenderbim.core.tool.Root)
|
||||
|
||||
|
||||
class TestAddDynamicOpeningVoids(NewFile):
|
||||
class TestAddTrackedOpening(NewFile):
|
||||
def test_run(self):
|
||||
ifc = ifcopenshell.file()
|
||||
tool.Ifc.set(ifc)
|
||||
|
||||
obj = bpy.data.objects.new("Object", bpy.data.meshes.new("Mesh"))
|
||||
element = ifc.createIfcOpeningElement()
|
||||
tool.Ifc.link(element, obj)
|
||||
|
||||
wall_obj = bpy.data.objects.new("Object", bpy.data.meshes.new("Mesh"))
|
||||
wall_element = ifc.createIfcOpeningElement()
|
||||
tool.Ifc.link(wall_element, wall_obj)
|
||||
|
||||
ifcopenshell.api.run("void.add_opening", ifc, opening=element, element=wall_element)
|
||||
|
||||
subject.add_dynamic_opening_voids(element, obj)
|
||||
|
||||
modifier = wall_obj.modifiers[0]
|
||||
assert modifier.type == "BOOLEAN"
|
||||
assert modifier.name == "IfcOpeningElement"
|
||||
assert modifier.operation == "DIFFERENCE"
|
||||
assert modifier.object == obj
|
||||
assert modifier.solver == "EXACT"
|
||||
assert modifier.use_self is True
|
||||
obj = bpy.data.objects.new("Object", None)
|
||||
subject.add_tracked_opening(obj)
|
||||
props = bpy.context.scene.BIMModelProperties
|
||||
assert props.openings[0].obj == obj
|
||||
|
||||
|
||||
class TestDoesTypeHaveRepresentations(NewFile):
|
||||
|
||||
Reference in New Issue
Block a user