mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 22:22:26 +00:00
Add workaround for importing wrongly geolocated Revit buildings.
This commit is contained in:
@@ -160,11 +160,13 @@ class IfcImporter():
|
|||||||
return
|
return
|
||||||
if applications[0].ApplicationIdentifier == 'Revit':
|
if applications[0].ApplicationIdentifier == 'Revit':
|
||||||
self.ifc_import_settings.should_treat_styled_item_as_material = True
|
self.ifc_import_settings.should_treat_styled_item_as_material = True
|
||||||
if self.is_site_far_away():
|
if self.is_ifc_class_far_away('IfcSite'):
|
||||||
self.ifc_import_settings.should_ignore_site_coordinates = True
|
self.ifc_import_settings.should_ignore_site_coordinates = True
|
||||||
|
if self.is_ifc_class_far_away('IfcBuilding'):
|
||||||
|
self.ifc_import_settings.should_ignore_building_coordinates = True
|
||||||
|
|
||||||
def is_site_far_away(self):
|
def is_ifc_class_far_away(self, ifc_class):
|
||||||
for site in self.file.by_type('IfcSite'):
|
for site in self.file.by_type(ifc_class):
|
||||||
if not site.ObjectPlacement \
|
if not site.ObjectPlacement \
|
||||||
or not site.ObjectPlacement.RelativePlacement \
|
or not site.ObjectPlacement.RelativePlacement \
|
||||||
or not site.ObjectPlacement.RelativePlacement.Location:
|
or not site.ObjectPlacement.RelativePlacement.Location:
|
||||||
@@ -177,18 +179,34 @@ class IfcImporter():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def patch_ifc(self):
|
def patch_ifc(self):
|
||||||
|
project = self.file.by_type('IfcProject')[0]
|
||||||
if self.ifc_import_settings.should_ignore_site_coordinates:
|
if self.ifc_import_settings.should_ignore_site_coordinates:
|
||||||
project = self.file.by_type('IfcProject')[0]
|
sites = self.find_decomposed_ifc_class(project, 'IfcSite')
|
||||||
rel_aggregates = project.IsDecomposedBy
|
for site in sites:
|
||||||
for rel_aggregate in rel_aggregates:
|
self.patch_placement_to_origin(site)
|
||||||
for site in rel_aggregate.RelatedObjects:
|
if self.ifc_import_settings.should_ignore_building_coordinates:
|
||||||
if not site.is_a('IfcSite'):
|
buildings = self.find_decomposed_ifc_class(project, 'IfcBuilding')
|
||||||
continue
|
for building in buildings:
|
||||||
site.ObjectPlacement.RelativePlacement.Location.Coordinates = (0., 0., 0.)
|
self.patch_placement_to_origin(building)
|
||||||
if site.ObjectPlacement.RelativePlacement.Axis:
|
|
||||||
site.ObjectPlacement.RelativePlacement.Axis.DirectionRatios = (0., 0., 1.)
|
def find_decomposed_ifc_class(self, element, ifc_class):
|
||||||
if site.ObjectPlacement.RelativePlacement.RefDirection:
|
results = []
|
||||||
site.ObjectPlacement.RelativePlacement.RefDirection.DirectionRatios = (1., 0., 0.)
|
rel_aggregates = element.IsDecomposedBy
|
||||||
|
if not rel_aggregates:
|
||||||
|
return results
|
||||||
|
for rel_aggregate in rel_aggregates:
|
||||||
|
for part in rel_aggregate.RelatedObjects:
|
||||||
|
if part.is_a(ifc_class):
|
||||||
|
results.append(part)
|
||||||
|
results.extend(self.find_decomposed_ifc_class(part, ifc_class))
|
||||||
|
return results
|
||||||
|
|
||||||
|
def patch_placement_to_origin(self, element):
|
||||||
|
element.ObjectPlacement.RelativePlacement.Location.Coordinates = (0., 0., 0.)
|
||||||
|
if element.ObjectPlacement.RelativePlacement.Axis:
|
||||||
|
element.ObjectPlacement.RelativePlacement.Axis.DirectionRatios = (0., 0., 1.)
|
||||||
|
if element.ObjectPlacement.RelativePlacement.RefDirection:
|
||||||
|
element.ObjectPlacement.RelativePlacement.RefDirection.DirectionRatios = (1., 0., 0.)
|
||||||
|
|
||||||
def create_products_legacy(self):
|
def create_products_legacy(self):
|
||||||
elements = self.file.by_type('IfcElement') + self.file.by_type('IfcSpace')
|
elements = self.file.by_type('IfcElement') + self.file.by_type('IfcSpace')
|
||||||
@@ -526,6 +544,7 @@ class IfcImportSettings:
|
|||||||
self.input_file = None
|
self.input_file = None
|
||||||
self.should_auto_set_workarounds = True
|
self.should_auto_set_workarounds = True
|
||||||
self.should_ignore_site_coordinates = False
|
self.should_ignore_site_coordinates = False
|
||||||
|
self.should_ignore_building_coordinates = False
|
||||||
self.should_import_curves = False
|
self.should_import_curves = False
|
||||||
self.should_treat_styled_item_as_material = False
|
self.should_treat_styled_item_as_material = False
|
||||||
self.should_use_cpu_multiprocessing = False
|
self.should_use_cpu_multiprocessing = False
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class ImportIFC(bpy.types.Operator, ImportHelper):
|
|||||||
ifc_import_settings.input_file = self.filepath
|
ifc_import_settings.input_file = self.filepath
|
||||||
ifc_import_settings.diff_file = bpy.context.scene.BIMProperties.diff_json_file
|
ifc_import_settings.diff_file = bpy.context.scene.BIMProperties.diff_json_file
|
||||||
ifc_import_settings.should_ignore_site_coordinates = bpy.context.scene.BIMProperties.import_should_ignore_site_coordinates
|
ifc_import_settings.should_ignore_site_coordinates = bpy.context.scene.BIMProperties.import_should_ignore_site_coordinates
|
||||||
|
ifc_import_settings.should_ignore_building_coordinates = bpy.context.scene.BIMProperties.import_should_ignore_building_coordinates
|
||||||
ifc_import_settings.should_import_curves = bpy.context.scene.BIMProperties.import_should_import_curves
|
ifc_import_settings.should_import_curves = bpy.context.scene.BIMProperties.import_should_import_curves
|
||||||
ifc_import_settings.should_auto_set_workarounds = bpy.context.scene.BIMProperties.import_should_auto_set_workarounds
|
ifc_import_settings.should_auto_set_workarounds = bpy.context.scene.BIMProperties.import_should_auto_set_workarounds
|
||||||
ifc_import_settings.should_treat_styled_item_as_material = bpy.context.scene.BIMProperties.import_should_treat_styled_item_as_material
|
ifc_import_settings.should_treat_styled_item_as_material = bpy.context.scene.BIMProperties.import_should_treat_styled_item_as_material
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ class BIMProperties(PropertyGroup):
|
|||||||
export_should_export_all_materials_as_styled_items: BoolProperty(name="Export All Materials as Styled Items", default=False)
|
export_should_export_all_materials_as_styled_items: BoolProperty(name="Export All Materials as Styled Items", default=False)
|
||||||
export_should_use_presentation_style_assignment: BoolProperty(name="Export with Presentation Style Assignment", default=False)
|
export_should_use_presentation_style_assignment: BoolProperty(name="Export with Presentation Style Assignment", default=False)
|
||||||
import_should_ignore_site_coordinates: BoolProperty(name="Import Ignoring Site Coordinates", default=False)
|
import_should_ignore_site_coordinates: BoolProperty(name="Import Ignoring Site Coordinates", default=False)
|
||||||
|
import_should_ignore_building_coordinates: BoolProperty(name="Import Ignoring Building Coordinates", default=False)
|
||||||
import_should_import_curves: BoolProperty(name="Import Curves", default=False)
|
import_should_import_curves: BoolProperty(name="Import Curves", default=False)
|
||||||
import_should_auto_set_workarounds: BoolProperty(name="Automatically Set Vendor Workarounds", default=True)
|
import_should_auto_set_workarounds: BoolProperty(name="Automatically Set Vendor Workarounds", default=True)
|
||||||
import_should_treat_styled_item_as_material: BoolProperty(name="Import Treating Styled Item as Material", default=False)
|
import_should_treat_styled_item_as_material: BoolProperty(name="Import Treating Styled Item as Material", default=False)
|
||||||
|
|||||||
@@ -596,4 +596,6 @@ class BIM_PT_mvd(Panel):
|
|||||||
row = layout.row()
|
row = layout.row()
|
||||||
row.prop(bim_properties, "import_should_ignore_site_coordinates")
|
row.prop(bim_properties, "import_should_ignore_site_coordinates")
|
||||||
row = layout.row()
|
row = layout.row()
|
||||||
|
row.prop(bim_properties, "import_should_ignore_building_coordinates")
|
||||||
|
row = layout.row()
|
||||||
row.prop(bim_properties, "import_should_treat_styled_item_as_material")
|
row.prop(bim_properties, "import_should_treat_styled_item_as_material")
|
||||||
|
|||||||
Reference in New Issue
Block a user