mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-12 22:43:41 +00:00
Switching contexts and pushing contexts now works on object types
This commit is contained in:
@@ -838,7 +838,7 @@ class IfcParser():
|
|||||||
if not self.ifc_export_settings.has_representations:
|
if not self.ifc_export_settings.has_representations:
|
||||||
return
|
return
|
||||||
for product in self.selected_products \
|
for product in self.selected_products \
|
||||||
+ self.type_products \
|
+ self.selected_types \
|
||||||
+ self.selected_spatial_structure_elements:
|
+ self.selected_spatial_structure_elements:
|
||||||
self.prevent_data_name_duplicates(product)
|
self.prevent_data_name_duplicates(product)
|
||||||
self.load_product_representations(product)
|
self.load_product_representations(product)
|
||||||
|
|||||||
@@ -980,7 +980,6 @@ class AssignSweptSolidOuterCurve(bpy.types.Operator):
|
|||||||
bpy.ops.object.mode_set(mode='OBJECT')
|
bpy.ops.object.mode_set(mode='OBJECT')
|
||||||
bpy.ops.object.mode_set(mode='EDIT')
|
bpy.ops.object.mode_set(mode='EDIT')
|
||||||
vertices = [v.index for v in bpy.context.active_object.data.vertices if v.select == True]
|
vertices = [v.index for v in bpy.context.active_object.data.vertices if v.select == True]
|
||||||
print(vertices)
|
|
||||||
bpy.context.active_object.data.BIMMeshProperties.swept_solids[self.index].outer_curve = json.dumps(vertices)
|
bpy.context.active_object.data.BIMMeshProperties.swept_solids[self.index].outer_curve = json.dumps(vertices)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
@@ -1792,10 +1791,16 @@ class SwitchContext(bpy.types.Operator):
|
|||||||
element = self.file.by_id(global_id)
|
element = self.file.by_id(global_id)
|
||||||
settings = ifcopenshell.geom.settings()
|
settings = ifcopenshell.geom.settings()
|
||||||
settings.set(settings.INCLUDE_CURVES, True)
|
settings.set(settings.INCLUDE_CURVES, True)
|
||||||
rep = [r for r in element.Representation.Representations if
|
if element.is_a('IfcProduct'):
|
||||||
r.ContextOfItems.ContextType == self.context \
|
rep = [r for r in element.Representation.Representations if
|
||||||
and r.ContextOfItems.ContextIdentifier == self.subcontext \
|
r.ContextOfItems.ContextType == self.context \
|
||||||
and r.ContextOfItems.TargetView == self.target_view][0]
|
and r.ContextOfItems.ContextIdentifier == self.subcontext \
|
||||||
|
and r.ContextOfItems.TargetView == self.target_view][0]
|
||||||
|
else:
|
||||||
|
rep = [rm.MappedRepresentation for rm in element.RepresentationMaps if
|
||||||
|
rm.MappedRepresentation.ContextOfItems.ContextType == self.context \
|
||||||
|
and rm.MappedRepresentation.ContextOfItems.ContextIdentifier == self.subcontext \
|
||||||
|
and rm.MappedRepresentation.ContextOfItems.TargetView == self.target_view][0]
|
||||||
shape = ifcopenshell.geom.create_shape(settings, rep)
|
shape = ifcopenshell.geom.create_shape(settings, rep)
|
||||||
ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
|
ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
|
||||||
mesh = ifc_importer.create_mesh(element, shape)
|
mesh = ifc_importer.create_mesh(element, shape)
|
||||||
@@ -2531,21 +2536,21 @@ class PushRepresentation(bpy.types.Operator):
|
|||||||
ifc_parser = export_ifc.IfcParser(ifc_export_settings)
|
ifc_parser = export_ifc.IfcParser(ifc_export_settings)
|
||||||
ifc_parser.parse([bpy.context.active_object])
|
ifc_parser.parse([bpy.context.active_object])
|
||||||
qto_calculator = export_ifc.QtoCalculator()
|
qto_calculator = export_ifc.QtoCalculator()
|
||||||
ifc_exporter = export_ifc.IfcExporter(ifc_export_settings, ifc_parser, qto_calculator)
|
self.ifc_exporter = export_ifc.IfcExporter(ifc_export_settings, ifc_parser, qto_calculator)
|
||||||
ifc_exporter.file = ifcopenshell.open(ifc_exporter.template_file)
|
self.ifc_exporter.file = ifcopenshell.open(self.ifc_exporter.template_file)
|
||||||
ifc_exporter.create_origin()
|
self.ifc_exporter.create_origin()
|
||||||
ifc_exporter.create_rep_context()
|
self.ifc_exporter.create_rep_context()
|
||||||
ifc_exporter.create_representations()
|
self.ifc_exporter.create_representations()
|
||||||
|
|
||||||
self.context, self.subcontext, self.target_view, self.mesh_name = bpy.context.active_object.data.name.split('/')
|
self.context, self.subcontext, self.target_view, self.mesh_name = bpy.context.active_object.data.name.split('/')
|
||||||
self.file = ifc.IfcStore.get_file()
|
self.file = ifc.IfcStore.get_file()
|
||||||
rep_context = self.get_geometric_representation_context()
|
rep_context = self.get_geometric_representation_context()
|
||||||
|
|
||||||
for key, rep in ifc_exporter.ifc_parser.representations.items():
|
for key, rep in self.ifc_exporter.ifc_parser.representations.items():
|
||||||
if key != bpy.context.active_object.data.name:
|
if key != bpy.context.active_object.data.name:
|
||||||
continue
|
continue
|
||||||
if rep_context:
|
if rep_context:
|
||||||
ifc_exporter.file.add(rep_context)
|
self.ifc_exporter.file.add(rep_context)
|
||||||
rep['ifc'].MappedRepresentation.ContextOfItems = rep_context
|
rep['ifc'].MappedRepresentation.ContextOfItems = rep_context
|
||||||
self.push_representation(rep['ifc'])
|
self.push_representation(rep['ifc'])
|
||||||
break
|
break
|
||||||
@@ -2559,12 +2564,65 @@ class PushRepresentation(bpy.types.Operator):
|
|||||||
|
|
||||||
def push_representation(self, new_representation):
|
def push_representation(self, new_representation):
|
||||||
element = self.file.by_guid(bpy.context.active_object.BIMObjectProperties.attributes.get('GlobalId').string_value)
|
element = self.file.by_guid(bpy.context.active_object.BIMObjectProperties.attributes.get('GlobalId').string_value)
|
||||||
representations = list(element.Representation.Representations)
|
old_shape = None
|
||||||
for i, representation in enumerate(representations):
|
new_shape = self.file.add(new_representation.MappedRepresentation)
|
||||||
|
if element.is_a('IfcProduct'):
|
||||||
|
representations = element.Representation.Representations
|
||||||
|
else:
|
||||||
|
representations = [rm.MappedRepresentation for rm in element.RepresentationMaps]
|
||||||
|
for representation in representations:
|
||||||
if self.is_current_context(representation.ContextOfItems):
|
if self.is_current_context(representation.ContextOfItems):
|
||||||
del representations[i]
|
old_shape = self.resolve_mapped_representation(representation)
|
||||||
break
|
break
|
||||||
representations.append(self.file.add(new_representation.MappedRepresentation))
|
if old_shape:
|
||||||
|
self.swap_old_representation(old_shape, new_shape)
|
||||||
|
else:
|
||||||
|
self.add_new_representation(element, new_shape)
|
||||||
|
|
||||||
|
def resolve_mapped_representation(self, representation):
|
||||||
|
if representation.RepresentationType == 'MappedRepresentation':
|
||||||
|
if representation.Items:
|
||||||
|
return representation.Items[0].MappingSource.MappedRepresentation
|
||||||
|
return representation
|
||||||
|
|
||||||
|
def swap_old_representation(self, old, new):
|
||||||
|
inverse_elements = self.file.get_inverse(old)
|
||||||
|
for element in inverse_elements:
|
||||||
|
for i, attribute in enumerate(element):
|
||||||
|
if (isinstance(attribute, list) or isinstance(attribute, tuple)) \
|
||||||
|
and old in attribute:
|
||||||
|
items = list(attribute)
|
||||||
|
for j, item in enumerate(items):
|
||||||
|
if item == old:
|
||||||
|
del items[j]
|
||||||
|
items.append(new)
|
||||||
|
element[i] = items
|
||||||
|
elif attribute == old:
|
||||||
|
element[i] = new
|
||||||
|
|
||||||
|
def add_new_representation(self, element, new):
|
||||||
|
if element.is_a('IfcProduct'):
|
||||||
|
self.add_new_representation_to_product(element, new)
|
||||||
|
return
|
||||||
|
|
||||||
|
if element.RepresentationMaps:
|
||||||
|
representation_maps = list(element.RepresentationMaps)
|
||||||
|
representation_maps.append(self.file.createIfcRepresentationMap(self.ifc_exporter.origin, new))
|
||||||
|
element.RepresentationMaps = representation_maps
|
||||||
|
else:
|
||||||
|
element.RepresentationMaps = (self.file.createIfcRepresentationMap(self.ifc_exporter.origin, new))
|
||||||
|
|
||||||
|
if hasattr(element, 'Types'):
|
||||||
|
related_objects = element.Types[0].RelatedObjects
|
||||||
|
elif hasattr(element, 'ObjectTypeOf'): # IFC2X3
|
||||||
|
related_objects = element.ObjectTypeOf[0].RelatedObjects
|
||||||
|
|
||||||
|
for related_object in related_objects:
|
||||||
|
self.add_new_representation_to_product(related_object, new)
|
||||||
|
|
||||||
|
def add_new_representation_to_product(self, element, new):
|
||||||
|
representations = list(element.Representation.Representations)
|
||||||
|
representations.append(new)
|
||||||
element.Representation.Representations = representations
|
element.Representation.Representations = representations
|
||||||
|
|
||||||
def is_current_context(self, element):
|
def is_current_context(self, element):
|
||||||
|
|||||||
Reference in New Issue
Block a user