mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-12 02:23:34 +00:00
Purge deprecated feature to enable coordination mode / merge modes in favour of new link IFC feature
This commit is contained in:
@@ -289,9 +289,8 @@ class IfcImporter:
|
||||
self.profile_code("Create spatial elements")
|
||||
self.create_structural_items()
|
||||
self.profile_code("Create structural items")
|
||||
if not self.ifc_import_settings.is_coordinating:
|
||||
self.create_element_types()
|
||||
self.profile_code("Create element types")
|
||||
self.create_element_types()
|
||||
self.profile_code("Create element types")
|
||||
self.place_objects_in_collections()
|
||||
self.profile_code("Place objects in collections")
|
||||
self.add_project_to_scene()
|
||||
@@ -444,9 +443,6 @@ class IfcImporter:
|
||||
self.annotations -= drawing_annotations
|
||||
|
||||
self.elements = [e for e in self.elements if not e.is_a("IfcFeatureElement") or e.is_a("IfcSurfaceFeature")]
|
||||
if self.ifc_import_settings.is_coordinating:
|
||||
self.elements = [e for e in self.elements if e.Representation]
|
||||
|
||||
self.elements = set(self.elements[offset:offset_limit])
|
||||
|
||||
if self.ifc_import_settings.has_filter or offset or offset_limit < len(self.elements):
|
||||
@@ -875,7 +871,6 @@ class IfcImporter:
|
||||
)
|
||||
)
|
||||
checkpoint = time.time()
|
||||
self.incrementally_merge_objects()
|
||||
native_data = self.native_data[element.GlobalId]
|
||||
mesh_name = f"{native_data['context'].id()}/{native_data['geometry_id']}"
|
||||
mesh = self.meshes.get(mesh_name)
|
||||
@@ -1024,7 +1019,6 @@ class IfcImporter:
|
||||
)
|
||||
checkpoint = time.time()
|
||||
self.update_progress((percent_average / 100 * progress_range) + start_progress)
|
||||
self.incrementally_merge_objects()
|
||||
shape = iterator.get()
|
||||
if shape:
|
||||
product = self.file.by_id(shape.id)
|
||||
@@ -1035,19 +1029,6 @@ class IfcImporter:
|
||||
print("Done creating geometry")
|
||||
return results
|
||||
|
||||
def incrementally_merge_objects(self):
|
||||
if not self.ifc_import_settings.is_coordinating:
|
||||
return
|
||||
if self.ifc_import_settings.merge_mode == "IFC_CLASS":
|
||||
self.merge_by_class()
|
||||
self.profile_code("Merging by class")
|
||||
elif self.ifc_import_settings.merge_mode == "IFC_TYPE":
|
||||
self.merge_by_type()
|
||||
self.profile_code("Merging by type")
|
||||
elif self.ifc_import_settings.merge_mode == "MATERIAL":
|
||||
self.merge_by_material()
|
||||
self.profile_code("Merging by material")
|
||||
|
||||
def create_structural_items(self):
|
||||
self.create_generic_elements(set(self.file.by_type("IfcStructuralCurveMember")))
|
||||
self.create_generic_elements(set(self.file.by_type("IfcStructuralCurveConnection")))
|
||||
@@ -1404,78 +1385,6 @@ class IfcImporter:
|
||||
curve.use_fill_caps = True
|
||||
return curve
|
||||
|
||||
def merge_by_class(self):
|
||||
merge_set = {}
|
||||
id_set = {}
|
||||
for ifc_definition_id, obj in self.added_data.items():
|
||||
if not isinstance(obj, bpy.types.Object) or not obj.data:
|
||||
continue
|
||||
element = self.file.by_id(ifc_definition_id)
|
||||
if not element.is_a("IfcElement"):
|
||||
continue
|
||||
merge_set.setdefault(element.is_a(), []).append(obj)
|
||||
id_set.setdefault(element.is_a(), []).append(ifc_definition_id)
|
||||
self.merge_objects(merge_set, id_set)
|
||||
|
||||
def merge_by_type(self):
|
||||
merge_set = {}
|
||||
id_set = {}
|
||||
for ifc_definition_id, obj in self.added_data.items():
|
||||
if not isinstance(obj, bpy.types.Object) or not obj.data:
|
||||
continue
|
||||
element = self.file.by_id(ifc_definition_id)
|
||||
if not element.is_a("IfcElement"):
|
||||
continue
|
||||
element_type = ifcopenshell.util.element.get_type(element)
|
||||
if not element_type:
|
||||
continue
|
||||
merge_key = str(element_type.id()) + "-" + (element_type.Name or "Unnamed")
|
||||
merge_set.setdefault(merge_key, []).append(obj)
|
||||
id_set.setdefault(merge_key, []).append(ifc_definition_id)
|
||||
self.merge_objects(merge_set, id_set)
|
||||
|
||||
def merge_by_material(self):
|
||||
merge_set = {}
|
||||
id_set = {}
|
||||
for ifc_definition_id, obj in self.added_data.items():
|
||||
if not isinstance(obj, bpy.types.Object) or not obj.data:
|
||||
continue
|
||||
element = self.file.by_id(ifc_definition_id)
|
||||
if not element.is_a("IfcElement"):
|
||||
continue
|
||||
merge_key = obj.material_slots[0].name if obj.material_slots else "no-material"
|
||||
merge_set.setdefault(merge_key, []).append(obj)
|
||||
id_set.setdefault(merge_key, []).append(ifc_definition_id)
|
||||
self.merge_objects(merge_set, id_set)
|
||||
|
||||
def merge_objects(self, merge_set, id_set):
|
||||
total_objs = sum([len(o) for o in merge_set.values()])
|
||||
cumulative_total = 0
|
||||
merge_set = {k: v for k, v in sorted(merge_set.items(), key=lambda i: len(i[1]), reverse=True)}
|
||||
for group_name, objs in merge_set.items():
|
||||
total_group_objs = len(objs)
|
||||
if total_group_objs < 10:
|
||||
continue
|
||||
merge_potential = total_objs - cumulative_total
|
||||
if merge_potential < 250:
|
||||
print("Merge target achieved")
|
||||
return
|
||||
cumulative_total += total_group_objs
|
||||
print(f"Merging {total_group_objs} objects, {merge_potential} potentially remaining -", group_name)
|
||||
try:
|
||||
target = objs[0]
|
||||
target.data = target.data.copy()
|
||||
context_override = {}
|
||||
context_override["object"] = context_override["active_object"] = target
|
||||
context_override["selected_objects"] = context_override["selected_editable_objects"] = objs
|
||||
with bpy.context.temp_override(**context_override):
|
||||
bpy.ops.object.join()
|
||||
target.data.name += "-merge"
|
||||
for ifc_definition_id in id_set[group_name][1:]:
|
||||
del self.added_data[ifc_definition_id]
|
||||
except:
|
||||
print("Merge failed")
|
||||
|
||||
def merge_materials_by_colour(self):
|
||||
cleaned_materials = {}
|
||||
for m in bpy.data.materials:
|
||||
@@ -1846,13 +1755,11 @@ class IfcImportSettings:
|
||||
self.input_file = None
|
||||
self.diff_file = None
|
||||
self.should_use_cpu_multiprocessing = True
|
||||
self.merge_mode = None
|
||||
self.should_merge_materials_by_colour = False
|
||||
self.should_load_geometry = True
|
||||
self.should_use_native_meshes = False
|
||||
self.should_clean_mesh = False
|
||||
self.should_cache = True
|
||||
self.is_coordinating = True
|
||||
self.deflection_tolerance = 0.001
|
||||
self.angular_tolerance = 0.5
|
||||
self.void_limit = 30
|
||||
@@ -1876,13 +1783,11 @@ class IfcImportSettings:
|
||||
settings.logger = logger
|
||||
settings.diff_file = scene_diff.diff_json_file
|
||||
settings.should_use_cpu_multiprocessing = props.should_use_cpu_multiprocessing
|
||||
settings.merge_mode = props.merge_mode
|
||||
settings.should_merge_materials_by_colour = props.should_merge_materials_by_colour
|
||||
settings.should_load_geometry = props.should_load_geometry
|
||||
settings.should_use_native_meshes = props.should_use_native_meshes
|
||||
settings.should_clean_mesh = props.should_clean_mesh
|
||||
settings.should_cache = props.should_cache
|
||||
settings.is_coordinating = props.is_coordinating
|
||||
settings.deflection_tolerance = props.deflection_tolerance
|
||||
settings.angular_tolerance = props.angular_tolerance
|
||||
settings.void_limit = props.void_limit
|
||||
|
||||
@@ -143,23 +143,12 @@ class BIMProjectProperties(PropertyGroup):
|
||||
filter_query: StringProperty(name="Filter Query")
|
||||
should_filter_spatial_elements: BoolProperty(name="Filter Spatial Elements", default=False)
|
||||
should_use_cpu_multiprocessing: BoolProperty(name="CPU Multiprocessing", default=True)
|
||||
merge_mode: bpy.props.EnumProperty(
|
||||
items=[
|
||||
("NONE", "None", "No objects are merged"),
|
||||
("IFC_CLASS", "IFC Class", "One object per IFC class"),
|
||||
("IFC_TYPE", "IFC Type", "One object per IFC construction type"),
|
||||
("MATERIAL", "Material", "One object per material"),
|
||||
],
|
||||
name="Merge Mode",
|
||||
default="NONE",
|
||||
)
|
||||
should_merge_materials_by_colour: BoolProperty(name="Merge Materials by Colour", default=False)
|
||||
should_stream: BoolProperty(name="Stream Data From IFC-SPF (Only for advanced users)", default=False)
|
||||
should_load_geometry: BoolProperty(name="Load Geometry", default=True)
|
||||
should_use_native_meshes: BoolProperty(name="Native Meshes", default=False)
|
||||
should_clean_mesh: BoolProperty(name="Clean Meshes", default=False)
|
||||
should_cache: BoolProperty(name="Cache", default=False)
|
||||
is_coordinating: BoolProperty(name="For Coordination Only", default=False)
|
||||
deflection_tolerance: FloatProperty(name="Deflection Tolerance", default=0.001)
|
||||
angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5)
|
||||
void_limit: IntProperty(name="Void Limit", default=30)
|
||||
|
||||
@@ -137,10 +137,6 @@ class BIM_PT_project(Panel):
|
||||
row = self.layout.row()
|
||||
row.prop(pprops, "should_merge_materials_by_colour")
|
||||
row = self.layout.row()
|
||||
row.prop(pprops, "is_coordinating")
|
||||
if pprops.is_coordinating:
|
||||
prop_with_search(self.layout, pprops, "merge_mode")
|
||||
row = self.layout.row()
|
||||
row.prop(pprops, "deflection_tolerance")
|
||||
row = self.layout.row()
|
||||
row.prop(pprops, "angular_tolerance")
|
||||
|
||||
Reference in New Issue
Block a user