0
$\begingroup$

How do I get this design of an EnumProperty?

My code(basically just the standard Operator File Export template):

import bpy


def write_some_data(context, filepath, use_some_setting):
    print("running write_some_data...")
    f = open(filepath, 'w', encoding='utf-8')
    f.write("Hello World %s" % use_some_setting)
    f.close()

    return {'FINISHED'}


# ExportHelper is a helper class, defines filename and
# invoke() function which calls the file selector.
from bpy_extras.io_utils import ExportHelper
from bpy.props import StringProperty, BoolProperty, EnumProperty
from bpy.types import Operator


class ExportSomeData(Operator, ExportHelper):   
    """This appears in the tooltip of the operator and in the gener ated docs"""
    bl_idname = "export_test.some_data"  # important since its how  bpy.ops.import_test.some_data is constructed
    bl_label = "Export Some Data"

    # ExportHelper mixin class uses this
    filename_ext = ".txt"

    filter_glob: StringProperty(
        default="*.txt",
        options={'HIDDEN'},
        maxlen=255,  # Max internal buffer length, longer would be clamped.
    )

    # List of operator properties, the attributes will be assigned
    # to the class instance from the operator settings before calling.
    use_setting: BoolProperty(
        name="Example Boolean",
        description="Example Tooltip",
        default=True,
    )

    type: EnumProperty(
        name="Example Enum",
        description="Choose between two items",
        items=(
            ('OPT_A', "First Option", "Description one"),
            ('OPT_B', "Second Option", "Description two"),
        ),
        default='OPT_A',
    )

    def execute(self, context):
        return write_some_data(context, self.filepath, self.use_setting)


# Only needed if you want to add into a dynamic menu
def menu_func_export(self, context):
    self.layout.operator(ExportSomeData.bl_idname, text="Text Export Operator")


def register():
    bpy.utils.register_class(ExportSomeData)
    bpy.types.TOPBAR_MT_file_export.append(menu_func_export)


def unregister():
    bpy.utils.unregister_class(ExportSomeData)
    bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)


if __name__ == "__main__":
    register()

    # test call
    bpy.ops.export_test.some_data('INVOKE_DEFAULT')

enter image description here

$\endgroup$
5
  • $\begingroup$ Just regular operator properties... There are tons of examples over here, eg: blender.stackexchange.com/a/31825/31447 Even the operator_file_export.py template comes with two example properties and how to implement them properly. $\endgroup$ – brockmann Mar 29 at 12:39
  • $\begingroup$ In Edit>Preferences>Interface turn on Developer Extras. Then you can right click on anything, hit Edit Source, and switch to the Text Editor to see the source code for what you clicked on. This is an EnumProperty with options={'ENUM_FLAG'}. $\endgroup$ – scurest Mar 29 at 12:43
  • $\begingroup$ @brockmann the basic implementation is not the problem, I get that It's rather this specific UI element $\endgroup$ – Lala_Ghost Mar 29 at 12:48
  • $\begingroup$ @scurest yes, it is this one and big thanks for the Developer Extras thing $\endgroup$ – Lala_Ghost Mar 29 at 12:48
  • 2
    $\begingroup$ ATM you're asking how to "Replicate the Export Window", recommend edit your question, especially your title and add the current state of your code in order to make this useful to future visitors, blender.stackexchange.com/help/how-to-ask @Lala_Ghost $\endgroup$ – brockmann Mar 29 at 12:54
1
$\begingroup$

You also need to add a draw method to your operator like this

    def draw(self, context):
        layout = self.layout
        layout.use_property_split = True
        layout.use_property_decorate = False  # No animation.

        # column() is what makes it go vertically
        layout.column().prop(self, "type")
$\endgroup$
0
$\begingroup$

By editing the line 48, replacing the "default='OPT_A'," with "options={'ENUM_FLAG'}," you almost get the desired result only the orientation is not correct.

import bpy


def write_some_data(context, filepath, use_some_setting):
    print("running write_some_data...")
    f = open(filepath, 'w', encoding='utf-8')
    f.write("Hello World %s" % use_some_setting)
    f.close()

    return {'FINISHED'}


# ExportHelper is a helper class, defines filename and
# invoke() function which calls the file selector.
from bpy_extras.io_utils import ExportHelper
from bpy.props import StringProperty, BoolProperty, EnumProperty
from bpy.types import Operator


class ExportSomeData(Operator, ExportHelper):
    """This appears in the tooltip of the operator and in the generated docs"""
    bl_idname = "export_test.some_data"  # important since its how  bpy.ops.import_test.some_data is constructed    
    bl_label = "Export Some Data"   

    # ExportHelper mixin class uses this
    filename_ext = ".txt"

    filter_glob: StringProperty(
        default="*.txt",
        options={'HIDDEN'},
        maxlen=255,  # Max internal buffer length, longer would be clamped.
    )

    # List of operator properties, the attributes will be assigned
    # to the class instance from the operator settings before calling.
    use_setting: BoolProperty(
        name="Example Boolean",
        description="Example Tooltip",
        default=True,
    )

    type: EnumProperty(
        name="Example Enum",
        description="Choose between two items",
        items=(
            ('OPT_A', "First Option", "Description one"),
            ('OPT_B', "Second Option", "Description two"),),
        options={'ENUM_FLAG'},
    )

    def execute(self, context):
        return write_some_data(context, self.filepath, self.use_setting)


# Only needed if you want to add into a dynamic menu
def menu_func_export(self, context):
    self.layout.operator(ExportSomeData.bl_idname, text="Text Export Operator")


def register():
    bpy.utils.register_class(ExportSomeData)
    bpy.types.TOPBAR_MT_file_export.append(menu_func_export)


def unregister():
    bpy.utils.unregister_class(ExportSomeData)
    bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)


if __name__ == "__main__":
    register()
    bpy.ops.export_test.some_data('INVOKE_DEFAULT')
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.