diff --git a/src/ifcblenderexport/io_export_ifc/__init__.py b/src/ifcblenderexport/io_export_ifc/__init__.py index a00ce89375..eeec88f5c2 100644 --- a/src/ifcblenderexport/io_export_ifc/__init__.py +++ b/src/ifcblenderexport/io_export_ifc/__init__.py @@ -28,11 +28,16 @@ classes = ( operator.RejectClass, operator.SelectAudited, operator.RejectElement, + operator.SelectExternalMaterialDir, + operator.AssignSweptSolidProfile, + operator.AssignSweptSolidExtrusion, ui.BIMProperties, ui.MaterialProperties, + ui.MeshProperties, ui.BIMPanel, ui.MVDPanel, ui.MaterialPanel, + ui.MeshPanel, ) def menu_func_export(self, context): @@ -50,6 +55,7 @@ def register(): bpy.types.TOPBAR_MT_file_import.append(menu_func_import) bpy.types.Scene.BIMProperties = bpy.props.PointerProperty(type=ui.BIMProperties) bpy.types.Material.MaterialProperties = bpy.props.PointerProperty(type=ui.MaterialProperties) + bpy.types.Mesh.MeshProperties = bpy.props.PointerProperty(type=ui.MeshProperties) def unregister(): for cls in reversed(classes): @@ -57,7 +63,8 @@ def unregister(): bpy.types.TOPBAR_MT_file_export.remove(menu_func_export) bpy.types.TOPBAR_MT_file_import.remove(menu_func_import) del(bpy.types.Scene.BIMProperties) - del(bpy.types.Scene.MaterialProperties) + del(bpy.types.Material.MaterialProperties) + del(bpy.types.Mesh.MeshProperties) if __name__ == "__main__": register() diff --git a/src/ifcblenderexport/io_export_ifc/export_ifc.py b/src/ifcblenderexport/io_export_ifc/export_ifc.py index 8d0f4f5395..860968198e 100644 --- a/src/ifcblenderexport/io_export_ifc/export_ifc.py +++ b/src/ifcblenderexport/io_export_ifc/export_ifc.py @@ -547,8 +547,8 @@ class IfcParser(): 'raw_object': object, 'context': context, 'subcontext': subcontext, - 'is_wireframe': True if 'IsWireframe' in mesh else False, - 'is_swept_solid': True if 'IsSweptSolid' in mesh else False, + 'is_wireframe': mesh.MeshProperties.is_wireframe, + 'is_swept_solid': mesh.MeshProperties.is_swept_solid, 'is_generated': is_generated, 'attributes': { 'Name': mesh.name } } diff --git a/src/ifcblenderexport/io_export_ifc/operator.py b/src/ifcblenderexport/io_export_ifc/operator.py index 21a98ae5bc..34a5dfb346 100644 --- a/src/ifcblenderexport/io_export_ifc/operator.py +++ b/src/ifcblenderexport/io_export_ifc/operator.py @@ -201,6 +201,51 @@ class SelectAudited(bpy.types.Operator): object.select_set(True) return {'FINISHED'} +class AssignSweptSolidProfile(bpy.types.Operator): + bl_idname = 'bim.assign_swept_solid_profile' + bl_label = 'Assign Profile' + + def execute(self, context): + if bpy.context.mode != 'EDIT_MESH': + return {'FINISHED'} + for vg in bpy.context.active_object.vertex_groups: + if vg.name == 'profile': + bpy.ops.object.vertex_group_set_active(group=vg.name) + bpy.ops.object.vertex_group_remove() + break + bpy.ops.object.vertex_group_assign_new() + bpy.context.active_object.vertex_groups[bpy.context.active_object.vertex_groups[-1].name].name = 'profile' + return {'FINISHED'} + +class AssignSweptSolidExtrusion(bpy.types.Operator): + bl_idname = 'bim.assign_swept_solid_extrusion' + bl_label = 'Assign Extrusion' + + def execute(self, context): + if bpy.context.mode != 'EDIT_MESH': + return {'FINISHED'} + for vg in bpy.context.active_object.vertex_groups: + if vg.name == 'extrusion': + bpy.ops.object.vertex_group_set_active(group=vg.name) + bpy.ops.object.vertex_group_remove() + break + bpy.ops.object.vertex_group_assign_new() + bpy.context.active_object.vertex_groups[bpy.context.active_object.vertex_groups[-1].name].name = 'extrusion' + return {'FINISHED'} + +class SelectExternalMaterialDir(bpy.types.Operator): + bl_idname = "bim.select_external_material_dir" + bl_label = "Select Material File" + filepath: bpy.props.StringProperty(subtype="FILE_PATH") + + def execute(self, context): + bpy.context.active_object.active_material.MaterialProperties.location = self.filepath + return {'FINISHED'} + + def invoke(self, context, event): + context.window_manager.fileselect_add(self) + return {'RUNNING_MODAL'} + class SelectDataDir(bpy.types.Operator): bl_idname = "bim.select_data_dir" bl_label = "Select Data Directory" diff --git a/src/ifcblenderexport/io_export_ifc/ui.py b/src/ifcblenderexport/io_export_ifc/ui.py index 7f83cd1dfb..8f57124c54 100644 --- a/src/ifcblenderexport/io_export_ifc/ui.py +++ b/src/ifcblenderexport/io_export_ifc/ui.py @@ -41,6 +41,29 @@ class MaterialProperties(bpy.types.PropertyGroup): identification: bpy.props.StringProperty(name="Identification") name: bpy.props.StringProperty(name="Name") +class MeshProperties(bpy.types.PropertyGroup): + is_wireframe: bpy.props.BoolProperty(name="Is Wireframe") + is_swept_solid: bpy.props.BoolProperty(name="Is Swept Solid") + +class MeshPanel(bpy.types.Panel): + bl_label = 'IFC Representations' + bl_idname = 'BIM_PT_mesh' + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = 'data' + + def draw(self, context): + if not bpy.context.active_object.data: + return + layout = self.layout + row = layout.row() + row.prop(bpy.context.active_object.data.MeshProperties, 'is_wireframe') + row = layout.row() + row.prop(bpy.context.active_object.data.MeshProperties, 'is_swept_solid') + row = layout.row(align=True) + row.operator('bim.assign_swept_solid_profile') + row.operator('bim.assign_swept_solid_extrusion') + class MaterialPanel(bpy.types.Panel): bl_label = 'IFC Materials' bl_idname = 'BIM_PT_material' @@ -54,8 +77,9 @@ class MaterialPanel(bpy.types.Panel): layout = self.layout row = layout.row() row.prop(bpy.context.active_object.active_material.MaterialProperties, 'is_external') - row = layout.row() + row = layout.row(align=True) row.prop(bpy.context.active_object.active_material.MaterialProperties, 'location') + row.operator('bim.select_external_material_dir', icon="FILE_FOLDER", text="") row = layout.row() row.prop(bpy.context.active_object.active_material.MaterialProperties, 'identification') row = layout.row()