mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-23 15:06:25 +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)
|
collector.assign(obj)
|
||||||
if root.is_opening_element(element):
|
if root.is_opening_element(element):
|
||||||
root.add_dynamic_opening_voids(element, obj)
|
root.add_tracked_opening(obj)
|
||||||
|
|
||||||
|
|
||||||
def assign_class(
|
def assign_class(
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ class Resource:
|
|||||||
|
|
||||||
@interface
|
@interface
|
||||||
class Root:
|
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 does_type_have_representations(cls, element): pass
|
||||||
def get_element_type(cls, element): pass
|
def get_element_type(cls, element): pass
|
||||||
def get_object_name(cls, obj): pass
|
def get_object_name(cls, obj): pass
|
||||||
|
|||||||
@@ -26,19 +26,9 @@ from mathutils import Vector
|
|||||||
|
|
||||||
class Root(blenderbim.core.tool.Root):
|
class Root(blenderbim.core.tool.Root):
|
||||||
@classmethod
|
@classmethod
|
||||||
def add_dynamic_opening_voids(cls, element, obj):
|
def add_tracked_opening(cls, obj):
|
||||||
for rel in element.VoidsElements:
|
new = bpy.context.scene.BIMModelProperties.openings.add()
|
||||||
building_obj = tool.Ifc.get_object(rel.RelatingBuildingElement)
|
new.obj = obj
|
||||||
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"
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def does_type_have_representations(cls, element):
|
def does_type_have_representations(cls, element):
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class TestCopyClass:
|
|||||||
root.link_object_data("type_obj", "obj").should_be_called()
|
root.link_object_data("type_obj", "obj").should_be_called()
|
||||||
collector.assign("obj").should_be_called()
|
collector.assign("obj").should_be_called()
|
||||||
root.is_opening_element("element").should_be_called().will_return(True)
|
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")
|
subject.copy_class(ifc, collector, geometry, root, obj="obj")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,30 +29,12 @@ class TestImplementsTool(NewFile):
|
|||||||
assert isinstance(subject(), blenderbim.core.tool.Root)
|
assert isinstance(subject(), blenderbim.core.tool.Root)
|
||||||
|
|
||||||
|
|
||||||
class TestAddDynamicOpeningVoids(NewFile):
|
class TestAddTrackedOpening(NewFile):
|
||||||
def test_run(self):
|
def test_run(self):
|
||||||
ifc = ifcopenshell.file()
|
obj = bpy.data.objects.new("Object", None)
|
||||||
tool.Ifc.set(ifc)
|
subject.add_tracked_opening(obj)
|
||||||
|
props = bpy.context.scene.BIMModelProperties
|
||||||
obj = bpy.data.objects.new("Object", bpy.data.meshes.new("Mesh"))
|
assert props.openings[0].obj == obj
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
class TestDoesTypeHaveRepresentations(NewFile):
|
class TestDoesTypeHaveRepresentations(NewFile):
|
||||||
|
|||||||
Reference in New Issue
Block a user