mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-27 10:51:13 +00:00
Copying elements with openings now also copies openings
This commit is contained in:
@@ -722,12 +722,12 @@ class IfcImporter:
|
|||||||
self.incrementally_merge_objects()
|
self.incrementally_merge_objects()
|
||||||
shape = iterator.get()
|
shape = iterator.get()
|
||||||
if shape:
|
if shape:
|
||||||
product = self.file.by_id(shape.guid)
|
product = self.file.by_id(shape.id)
|
||||||
if self.body_contexts:
|
if self.body_contexts:
|
||||||
self.create_product(product, shape)
|
self.create_product(product, shape)
|
||||||
results.add(product)
|
results.add(product)
|
||||||
else:
|
else:
|
||||||
if shape.context not in ["Body", "Facetation"] and IfcStore.get_element(shape.guid):
|
if shape.context not in ["Body", "Facetation"] and IfcStore.get_element(shape.id):
|
||||||
# We only load a single context, and we prioritise the Body context. See #1290.
|
# We only load a single context, and we prioritise the Body context. See #1290.
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
@@ -877,7 +877,7 @@ class IfcImporter:
|
|||||||
checkpoint = time.time()
|
checkpoint = time.time()
|
||||||
shape = iterator.get()
|
shape = iterator.get()
|
||||||
if shape:
|
if shape:
|
||||||
product = self.file.by_id(shape.guid)
|
product = self.file.by_id(shape.id)
|
||||||
self.create_product(product, shape)
|
self.create_product(product, shape)
|
||||||
results.add(product)
|
results.add(product)
|
||||||
if not iterator.next():
|
if not iterator.next():
|
||||||
|
|||||||
@@ -382,7 +382,7 @@ class OverrideDeleteTrait:
|
|||||||
|
|
||||||
def delete_opening_element(self, element):
|
def delete_opening_element(self, element):
|
||||||
obj = IfcStore.get_element(element.VoidsElements[0].RelatingBuildingElement.id())
|
obj = IfcStore.get_element(element.VoidsElements[0].RelatingBuildingElement.id())
|
||||||
bpy.ops.bim.remove_opening(opening_id=element.id(), obj=obj.name)
|
bpy.ops.bim.remove_opening(opening_id=element.id())
|
||||||
|
|
||||||
def remove_filling(self, element):
|
def remove_filling(self, element):
|
||||||
obj = IfcStore.get_element(element.id())
|
obj = IfcStore.get_element(element.id())
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
|
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
|
import ifcopenshell.util.system
|
||||||
import ifcopenshell.util.element
|
import ifcopenshell.util.element
|
||||||
|
|
||||||
|
|
||||||
@@ -69,6 +70,17 @@ class Usecase:
|
|||||||
continue
|
continue
|
||||||
elif inverse.is_a("IfcRelDefinesByType") and inverse.RelatingType == from_element:
|
elif inverse.is_a("IfcRelDefinesByType") and inverse.RelatingType == from_element:
|
||||||
continue
|
continue
|
||||||
|
elif inverse.is_a("IfcRelVoidsElement") and inverse.RelatingBuildingElement == from_element:
|
||||||
|
opening = inverse.RelatedOpeningElement
|
||||||
|
new_opening = ifcopenshell.api.run("root.copy_class", self.file, product=opening)
|
||||||
|
new_opening.VoidsElements[0].RelatingBuildingElement = to_element
|
||||||
|
if new_opening.ObjectPlacement and new_opening.ObjectPlacement.is_a("IfcLocalPlacement"):
|
||||||
|
if to_element.ObjectPlacement:
|
||||||
|
new_opening.ObjectPlacement.PlacementRelTo = to_element.ObjectPlacement
|
||||||
|
# For now, we do copy opening representations
|
||||||
|
new_opening.Representation = ifcopenshell.util.element.copy_deep(
|
||||||
|
self.file, opening.Representation
|
||||||
|
)
|
||||||
elif inverse.is_a("IfcRelFillsElement"):
|
elif inverse.is_a("IfcRelFillsElement"):
|
||||||
continue
|
continue
|
||||||
elif inverse.is_a("IfcRelConnectsPathElements"):
|
elif inverse.is_a("IfcRelConnectsPathElements"):
|
||||||
|
|||||||
@@ -105,6 +105,16 @@ class TestCopyClass(test.bootstrap.IFC4):
|
|||||||
new = ifcopenshell.api.run("root.copy_class", self.file, product=element)
|
new = ifcopenshell.api.run("root.copy_class", self.file, product=element)
|
||||||
assert new.RepresentationMaps is None
|
assert new.RepresentationMaps is None
|
||||||
|
|
||||||
|
def test_copying_an_element_with_an_opening(self):
|
||||||
|
wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
|
opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement")
|
||||||
|
ifcopenshell.api.run("void.add_opening", self.file, opening=opening, element=wall)
|
||||||
|
new = ifcopenshell.api.run("root.copy_class", self.file, product=wall)
|
||||||
|
assert wall.HasOpenings[0] != new.HasOpenings[0]
|
||||||
|
assert wall.HasOpenings[0].RelatedOpeningElement == opening
|
||||||
|
assert new.HasOpenings[0].RelatedOpeningElement != opening
|
||||||
|
assert new.HasOpenings[0].RelatedOpeningElement.is_a("IfcOpeningElement")
|
||||||
|
|
||||||
def test_copying_an_opening_voiding_an_element(self):
|
def test_copying_an_opening_voiding_an_element(self):
|
||||||
wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
wall = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcWall")
|
||||||
opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement")
|
opening = ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcOpeningElement")
|
||||||
|
|||||||
Reference in New Issue
Block a user