mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 06:32:09 +00:00
Collection assignment is now synced on export, so you don't need to manually manage your tree
This commit is contained in:
@@ -8,6 +8,7 @@ import tempfile
|
|||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
import ifcopenshell.util.placement
|
import ifcopenshell.util.placement
|
||||||
import ifcopenshell.api
|
import ifcopenshell.api
|
||||||
|
from ifcopenshell.api.spatial.data import Data as SpatialData
|
||||||
from blenderbim.bim.ifc import IfcStore
|
from blenderbim.bim.ifc import IfcStore
|
||||||
import addon_utils
|
import addon_utils
|
||||||
|
|
||||||
@@ -81,9 +82,12 @@ class IfcExporter:
|
|||||||
self.sync_object_placement(obj)
|
self.sync_object_placement(obj)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if self.should_delete(guid, obj):
|
self.sync_object_container(guid, obj)
|
||||||
|
if self.should_delete(obj):
|
||||||
to_delete.append(guid)
|
to_delete.append(guid)
|
||||||
|
|
||||||
|
SpatialData.purge()
|
||||||
|
|
||||||
for guid in to_delete:
|
for guid in to_delete:
|
||||||
product = self.file.by_id(guid)
|
product = self.file.by_id(guid)
|
||||||
IfcStore.unlink_element(product)
|
IfcStore.unlink_element(product)
|
||||||
@@ -121,7 +125,33 @@ class IfcExporter:
|
|||||||
if not np.allclose(ifc_matrix, blender_matrix, atol=0.0001):
|
if not np.allclose(ifc_matrix, blender_matrix, atol=0.0001):
|
||||||
bpy.ops.bim.edit_object_placement(obj=obj.name)
|
bpy.ops.bim.edit_object_placement(obj=obj.name)
|
||||||
|
|
||||||
def should_delete(self, guid, obj):
|
def sync_object_container(self, guid, obj):
|
||||||
|
element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
|
element_collection = bpy.data.collections.get(obj.name)
|
||||||
|
|
||||||
|
if element.is_a("IfcProject"):
|
||||||
|
return
|
||||||
|
|
||||||
|
if (element.is_a("IfcElement") and element_collection) or element.is_a("IfcSpatialStructureElement"):
|
||||||
|
try:
|
||||||
|
parent_collection = [c for c in bpy.data.collections if c.children.get(element_collection.name)][0]
|
||||||
|
except:
|
||||||
|
return # Out of the spatial tree
|
||||||
|
else:
|
||||||
|
parent_collection = obj.users_collection[0]
|
||||||
|
|
||||||
|
parent_obj = bpy.data.objects.get(parent_collection.name)
|
||||||
|
if not parent_obj or not parent_obj.BIMObjectProperties.ifc_definition_id:
|
||||||
|
return
|
||||||
|
parent = self.file.by_id(parent_obj.BIMObjectProperties.ifc_definition_id)
|
||||||
|
|
||||||
|
if parent.is_a("IfcSpatialStructureElement") and not element.is_a("IfcSpatialStructureElement"):
|
||||||
|
if parent != ifcopenshell.util.element.get_container(element):
|
||||||
|
bpy.ops.bim.assign_container(relating_structure=parent.id(), related_element=obj.name)
|
||||||
|
elif parent != ifcopenshell.util.element.get_aggregate(element):
|
||||||
|
bpy.ops.bim.assign_object(relating_object=parent_obj.name, related_object=obj.name)
|
||||||
|
|
||||||
|
def should_delete(self, obj):
|
||||||
try:
|
try:
|
||||||
# This will throw an exception if the Blender object no longer exists
|
# This will throw an exception if the Blender object no longer exists
|
||||||
foo = obj.name
|
foo = obj.name
|
||||||
|
|||||||
@@ -88,6 +88,11 @@ def get_container(element):
|
|||||||
return element.ContainedInStructure[0].RelatingStructure
|
return element.ContainedInStructure[0].RelatingStructure
|
||||||
|
|
||||||
|
|
||||||
|
def get_aggregate(element):
|
||||||
|
if hasattr(element, "Decomposes") and element.Decomposes:
|
||||||
|
return element.Decomposes[0].RelatingObject
|
||||||
|
|
||||||
|
|
||||||
def replace_attribute(element, old, new):
|
def replace_attribute(element, old, new):
|
||||||
for i, attribute in enumerate(element):
|
for i, attribute in enumerate(element):
|
||||||
if attribute == old:
|
if attribute == old:
|
||||||
|
|||||||
Reference in New Issue
Block a user