From b60438b51cb85cfb17e3822de41bb0e7ac9f309c Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 5 Aug 2020 17:18:10 +1000 Subject: [PATCH] New UI in Blender to run IFCPatch --- src/ifcblenderexport/Makefile | 15 ++++++ .../blenderbim/bim/__init__.py | 4 ++ .../blenderbim/bim/operator.py | 47 +++++++++++++++++++ src/ifcblenderexport/blenderbim/bim/prop.py | 17 +++++++ src/ifcblenderexport/blenderbim/bim/ui.py | 30 ++++++++++++ 5 files changed, 113 insertions(+) diff --git a/src/ifcblenderexport/Makefile b/src/ifcblenderexport/Makefile index 3a6fc70408..0f2b87dc5e 100644 --- a/src/ifcblenderexport/Makefile +++ b/src/ifcblenderexport/Makefile @@ -262,6 +262,21 @@ endif # Provides IFCCSV functionality cd dist/blenderbim/libs/site/packages/ && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifccsv/ifccsv.py + # Provides IFCPatch functionality + cd dist/blenderbim/libs/site/packages/ && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/ifcpatch.py + + # Required by IFCPatch + cd dist/blenderbim/libs/site/packages/ && mkdir recipes + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/__init__.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/OffsetObjectPlacements.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/OffsetStoreyElevations.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/RecycleNonRootedElements.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/RemoveSiteRepresentation.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/ResetAbsoluteCoordinates.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/ResetSpatialElementLocations.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/SetRefElevation.py + cd dist/blenderbim/libs/site/packages/recipes && wget https://raw.githubusercontent.com/IfcOpenShell/IfcOpenShell/v0.6.0/src/ifcpatch/recipes/SplitByBuildingStorey.py + cd dist/blenderbim && sed -i "s/999999/$(VERSION)/" __init__.py cd dist && zip -r blender28-bim-$(VERSION)-$(PLATFORM).zip ./* rm -rf dist/blenderbim diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index 14be29b6ff..f4785b9693 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -166,6 +166,9 @@ if bpy is not None: operator.BIMTesterPurge, operator.SelectCobieIfcFile, operator.ExecuteIfcCobie, + operator.SelectIfcPatchInput, + operator.SelectIfcPatchOutput, + operator.ExecuteIfcPatch, prop.StrProperty, prop.Variable, prop.Role, @@ -226,6 +229,7 @@ if bpy is not None: ui.BIM_PT_gis, ui.BIM_PT_diff, ui.BIM_PT_cobie, + ui.BIM_PT_patch, ui.BIM_PT_mvd, ui.BIM_PT_material, ui.BIM_PT_mesh, diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index 5d85c2379f..4e7f65f53a 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -1338,6 +1338,23 @@ class ExecuteIfcCobie(bpy.types.Operator): return {'FINISHED'} +class ExecuteIfcPatch(bpy.types.Operator): + bl_idname = 'bim.execute_ifc_patch' + bl_label = 'Execute IFCPatch' + file_format: bpy.props.StringProperty() + + def execute(self, context): + import ifcpatch + ifcpatch.execute({ + 'input': bpy.context.scene.BIMProperties.ifc_patch_input, + 'output': bpy.context.scene.BIMProperties.ifc_patch_output, + 'recipe': bpy.context.scene.BIMProperties.ifc_patch_recipes, + 'arguments': json.loads('[' + bpy.context.scene.BIMProperties.ifc_patch_args + ']'), + 'log': bpy.context.scene.BIMProperties.data_dir + 'process.log' + }) + return {'FINISHED'} + + class SelectDiffJsonFile(bpy.types.Operator): bl_idname = "bim.select_diff_json_file" bl_label = "Select Diff JSON File" @@ -3267,3 +3284,33 @@ class BIMTesterPurge(bpy.types.Operator): bimtester.TestPurger().purge() os.chdir(cwd) return {'FINISHED'} + + +class SelectIfcPatchInput(bpy.types.Operator): + bl_idname = "bim.select_ifc_patch_input" + bl_label = "Select IFC Patch Input" + filter_glob: bpy.props.StringProperty(default="*.ifc", options={'HIDDEN'}) + filepath: bpy.props.StringProperty(subtype="FILE_PATH") + + def execute(self, context): + bpy.context.scene.BIMProperties.ifc_patch_input = self.filepath + return {'FINISHED'} + + def invoke(self, context, event): + context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} + + +class SelectIfcPatchOutput(bpy.types.Operator): + bl_idname = "bim.select_ifc_patch_output" + bl_label = "Select IFC Patch Output" + filename_ext = '.ifc' + filepath: bpy.props.StringProperty(subtype="FILE_PATH") + + def execute(self, context): + bpy.context.scene.BIMProperties.ifc_patch_output = self.filepath + return {'FINISHED'} + + def invoke(self, context, event): + context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 4f207ca36c..59af1a22b7 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -30,6 +30,7 @@ profiledef_enum = [] classes_enum = [] types_enum = [] availablematerialpsets_enum = [] +ifcpatchrecipes_enum = [] featuresfiles_enum = [] scenarios_enum = [] psetnames_enum = [] @@ -173,6 +174,18 @@ def getAvailableMaterialPsets(self, context): return availablematerialpsets_enum +def getIfcPatchRecipes(self, context): + global ifcpatchrecipes_enum + if len(ifcpatchrecipes_enum) < 1: + ifcpatchrecipes_enum.clear() + for filename in Path(os.path.join(cwd, '..', 'libs', 'site', 'packages', 'recipes')).glob('*.py'): + f = str(filename.stem) + if f == '__init__': + continue + ifcpatchrecipes_enum.append((f, f, '')) + return ifcpatchrecipes_enum + + def getFeaturesFiles(self, context): global featuresfiles_enum if len(featuresfiles_enum) < 1: @@ -1070,6 +1083,10 @@ class BIMProperties(PropertyGroup): active_clash_set_index: IntProperty(name='Active Clash Set Index') constraints: CollectionProperty(name='Constraints', type=Constraint) active_constraint_index: IntProperty(name='Active Constraint Index') + ifc_patch_recipes: EnumProperty(items=getIfcPatchRecipes, name="Recipes") + ifc_patch_input: StringProperty(default='', name='IFC Patch Input IFC') + ifc_patch_output: StringProperty(default='', name='IFC Patch Output IFC') + ifc_patch_args: StringProperty(default='', name='Arguments') class BCFProperties(PropertyGroup): diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index bcc461f1ab..d77ac1c76b 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -1469,6 +1469,36 @@ class BIM_PT_cobie(Panel): op.file_format = 'xlsx' +class BIM_PT_patch(Panel): + bl_label = "IFC Patch" + bl_idname = "BIM_PT_patch" + bl_options = {'DEFAULT_CLOSED'} + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "scene" + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + + scene = context.scene + props = scene.BIMProperties + + row = layout.row() + row.prop(props, 'ifc_patch_recipes') + row = layout.row(align=True) + row.prop(props, 'ifc_patch_input') + row.operator("bim.select_ifc_patch_input", icon="FILE_FOLDER", text="") + row = layout.row(align=True) + row.prop(props, 'ifc_patch_output') + row.operator("bim.select_ifc_patch_output", icon="FILE_FOLDER", text="") + row = layout.row() + row.prop(props, 'ifc_patch_args') + + row = layout.row() + op = row.operator('bim.execute_ifc_patch') + + class BIM_PT_mvd(Panel): bl_label = "Model View Definitions (MVD)" bl_idname = "BIM_PT_mvd"