Support for exporting IFCZIP files. See #834

This commit is contained in:
Dion Moult
2020-04-12 09:51:10 +10:00
parent bdfe197c64
commit d180c4732f
3 changed files with 26 additions and 6 deletions
@@ -139,11 +139,11 @@ if bpy is not None:
def menu_func_export(self, context):
self.layout.operator(operator.ExportIFC.bl_idname,
text="Industry Foundation Classes (.ifc)")
text="Industry Foundation Classes (.ifc/.ifczip)")
def menu_func_import(self, context):
self.layout.operator(operator.ImportIFC.bl_idname,
text="Industry Foundation Classes (.ifc)")
text="Industry Foundation Classes (.ifc/.ifczip)")
def on_register(scene):
prop.setDefaultProperties(scene)
@@ -4,6 +4,8 @@ import json
import time
import datetime
import os
import zipfile
import tempfile
from pathlib import Path
from mathutils import Vector, Matrix
from .helper import SIUnitHelper
@@ -1146,7 +1148,7 @@ class IfcExporter():
self.relate_to_objectives(self.ifc_parser.rel_associates_constraint_objective_type)
self.relate_structural_members_to_connections()
self.relate_objects_to_groups()
self.file.write(self.ifc_export_settings.output_file)
self.write_ifc_file()
def set_common_definitions(self):
# Owner history doesn't actually work like this, but for now, it does :)
@@ -2422,6 +2424,20 @@ class IfcExporter():
def convert_si_to_unit(self, co):
return co / self.ifc_parser.unit_scale
def write_ifc_file(self):
extension = self.ifc_export_settings.output_file.split('.')[-1]
if extension == 'ifczip':
with tempfile.TemporaryDirectory() as unzipped_path:
filename, ext = os.path.splitext(os.path.basename(self.ifc_export_settings.output_file))
tmp_name = '{}.ifc'.format(filename)
tmp_file = os.path.join(unzipped_path, tmp_name)
self.file.write(tmp_file)
with zipfile.ZipFile(self.ifc_export_settings.output_file,
mode='w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
zf.write(tmp_file)
elif extension == 'ifc':
self.file.write(self.ifc_export_settings.output_file)
class IfcExportSettings:
def __init__(self):
@@ -34,7 +34,7 @@ colour_list = [
class ExportIFC(bpy.types.Operator):
bl_idname = "export.ifc"
bl_label = "Export .ifc file"
bl_label = "Export IFC"
filename_ext = ".ifc"
filepath: bpy.props.StringProperty(subtype='FILE_PATH')
@@ -51,7 +51,11 @@ class ExportIFC(bpy.types.Operator):
logging.basicConfig(
filename=context.scene.BIMProperties.data_dir + 'process.log',
filemode='a', level=logging.DEBUG)
output_file = bpy.path.ensure_ext(self.filepath, '.ifc')
extension = self.filepath.split('.')[-1]
if extension == 'ifczip':
output_file = bpy.path.ensure_ext(self.filepath, '.ifczip')
else:
output_file = bpy.path.ensure_ext(self.filepath, '.ifc')
ifc_export_settings = export_ifc.IfcExportSettings.factory(context, output_file, logger)
ifc_parser = export_ifc.IfcParser(ifc_export_settings)
qto_calculator = export_ifc.QtoCalculator()
@@ -63,7 +67,7 @@ class ExportIFC(bpy.types.Operator):
class ImportIFC(bpy.types.Operator, ImportHelper):
bl_idname = "import.ifc"
bl_label = "Import .ifc file"
bl_label = "Import IFC"
filename_ext = ".ifc"
filter_glob: bpy.props.StringProperty(default="*.ifc;*.ifczip", options={'HIDDEN'})