1

I am traying to make a popup menu that will add a modifier if the object has none and then draw the menu, or just draw it if the modifier is already on it.

But i am not sure how to go about it, the script i have is working, but it only adds the modifier after i close the panel. Tried creating another class just for the operation but didn't work also.

import bpy

class DC_MT_popup_star(bpy.types.Operator): bl_idname = "popup.dc_star" bl_label = "Str Popup" bl_space_type = "VIEW_3D"

def execute(self, context):
    pass

def invoke(self, context, event):
    wm = context.window_manager       
    return wm.invoke_popup(self, width=200)

def draw(self, context):
    layout = self.layout
    row = layout.row()
    split = layout.split()
    col = split.column()

    ob = context.object
    mm = ob.modifiers

    row.label(text="Bevel")

    if "Bevel" in ob.modifiers:           
        col.prop(mm["Bevel"], "width", text= "Offset")
        col.prop(mm["Bevel"], "segments", text= "Segments")
        col.prop(mm["Bevel"], "angle_limit", text= "Angle")
        col.prop(ob.data, "auto_smooth_angle", text="Smooth")

        col = split.column()
        col.prop(mm["Bevel"], "limit_method", text= "")
        col.prop(mm["Bevel"], "use_clamp_overlap", text= "Clip")
        col.prop(ob.data, "use_auto_smooth", text="Auto Smooth")

    else:
        mm.new(name="Bevel", type='BEVEL')
        mm["Bevel"].use_clamp_overlap = False

        return {'FINISHED'}

classes = ( DC_MT_popup_star, ) register, unregister = bpy.utils.register_classes_factory(classes)

if name == "main": register()

Ray Mairlot
  • 29,192
  • 11
  • 103
  • 125
Udjani
  • 117
  • 4
  • 2
    You can either add an invoke method: https://blender.stackexchange.com/a/19431/31447 or add a second operator and call this one while execution, not sure what's better in your case. Notice your class name should be DC_OT_po... since class type is operator. Does that help? – brockmann Jun 20 '20 at 19:23
  • @brockmann Does exactly what i wanted, thank you!, i thought invoke was just for ui stuff. But just so i know.. when you say that it can be done with a second operator, this new operator would still have to be reference on the invoke to be triggered first than the panel draw? – Udjani Jun 20 '20 at 20:28
  • @brockmann Could you add a short answer? Or could we pass this off as a duplicate? – Leander Jun 20 '20 at 20:53
  • 1
    Only draw properties in a draw method. Re my previous comment with mm ... above would be something like bm = ob.modifiers.get("Bevel") and to test if it does not exist if bm is None: and then add a new one bm = ob.modifiers.new(...) then will be layout.prop(bm, "width") This is known as "by reference" (regardless of name) rather "by key" ob.modifiers["key"]. Blender automatically appends numbers if two objects have same name, eg a second bevel modifier would be given the name "Bevel.001" if "Bevel" is taken. To be sure [m for m in ob.modifiers if m.type == 'BEVEL'] is – batFINGER Jun 21 '20 at 03:00
  • 1
    a list of all bevel modifiers on the object. – batFINGER Jun 21 '20 at 03:00

0 Answers0