0
$\begingroup$

i'm trying to write a little addon to show all strips used in a vse timeline. and i also want it to have a "reveal file in explorer" button. So far so good, i have this to show strips with a pop up menu :

        scene = bpy.context.scene
        strip = scene.sequence_editor.sequences_all
        activeST = scene.sequence_editor.active_strip
        rstrip = activeST
        print(rstrip)

        #images/videos/sons
        for s in strip:
            if s.type == 'IMAGE':
                layout.label(s.name, icon='FILE_IMAGE')
                layout.label("  Start : " + str(s.frame_start) + "   End : " + str(int(s.frame_start)+int(s.frame_final_duration)-1))
                layout.operator('reveal.file_explorer')
            if s.type == 'SOUND':
                layout.label(s.name, icon='FILE_SOUND')
                layout.label("  Start : " + str(s.frame_start) + "   End : " + str(int(s.frame_start)+int(s.frame_final_duration)-1))
                layout.operator('reveal.file_explorer')
            if s.type == 'MOVIE':
                layout.label(s.name, icon='FILE_MOVIE')
                layout.label("  Start : " + str(s.frame_start) + "   End : " + str(int(s.frame_start)+int(s.frame_final_duration)-1))
                layout.operator('reveal.file_explorer')

all is working except for the custom "reveal.file_explorer" operator, here's its code :

def revealfileexplorer (s):

    if rstrip.type=='IMAGE':
        name='\\' + rstrip.elements[0].filename
        path=rstrip.directory
        Npath=os.path.abspath(bpy.path.abspath(path)) + name
        print(Npath)
        subprocess.Popen('explorer /select,"'+Npath+'"')

    if rstrip.type=='MOVIE':
        path=rstrip.filepath
        Npath=os.path.abspath(bpy.path.abspath(path))
        print(Npath)
        subprocess.Popen('explorer /select,"'+Npath+'"')

    if rstrip.type=='SOUND':
        path=rstrip.sound.filepath
        Npath=os.path.abspath(bpy.path.abspath(path))
        print(Npath)
        subprocess.Popen('explorer /select,"'+Npath+'"')

class RevealFile(bpy.types.Operator):
    """Reveal file in Explorer"""
    bl_idname = "reveal.file_explorer"
    bl_label = "Reveal"
    bl_options = {'REGISTER'}

    def execute(self, context):
        revealfileexplorer(s)
        return {'FINISHED'}

I tried to pass the "s" value to make the operator different with every file, and opening the right one... but "name "s" is not defined" according to blender. I'm not a coder basically, and no clue on how to do this... Any help would be greatly appreciated :D thanks in advance !

$\endgroup$
2
$\begingroup$

The problem is that in the execute function, s is not defined, you need to tell the operator what is s.

A solution you could use is to add a property to the operator:

class AnimOperator(bpy.types.Operator):
    bl_idname = "object.anim_operator"
    bl_label = "Pose Anim Operator"
    s = bpy.props.StringProperty()
    ...
    def execute(self, context):
        revealfileexplorer(self.s)
        return {'FINISHED'}

notice the self.s to access the s in the AnimOperator class instance

Then when calling the operator, you have to define the value of s.

op=layout.operator('reveal.file_explorer')
op.s = s

I didn't try this code so I maybe made some mistakes but you have the idea.

Those are object oriented programming and concepts and the scope of a variable problems, you'll maybe need to learn a little about that if you want to use programming language for more complex program.

Edit: I'm a little tired right now but looking back to you code there is another problem, you don't use s but rstrip in the revealfileexplorer function. I also suggest you to use the StringProperty but this will only accept text. I never tried to use complex types as operator parameter I think you are limited to Blender properties types but I'm not sure about that, I will test that tomorrow to give you a more precise answer if you need, but for now I think that you can solve your problem using only string, maybe with multiple StringProperty if needed. You can also use a IntProperty, and pass the index as parameter, and then find your strip like that:

def revealfileexplorer (id):
     s = bpy.context.scene.sequence_editor.sequences_all[id] 
| improve this answer | |
$\endgroup$
  • $\begingroup$ bpy.ops.transform.translate(value=(0, 0, 10)) Passing the parameters down this way works too. $\endgroup$ – TeaCrab Jun 25 '17 at 1:13
  • $\begingroup$ hey thank you very much for the answer ! you're right about rstrip, it was part of another little "test script' i forgot to change ! I had it work using your example, using a string value to store the entire filepath before calling the operator. so the operator is just composed by the subprocess ! Thanks for the quick reply and the explanation ! :) $\endgroup$ – tonton Jun 25 '17 at 10:40

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.