Skip to content
Snippets Groups Projects
io_import_sound_to_anim.py 85.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eng vlassius santos's avatar
    Eng vlassius santos committed
    #!/usr/bin/python3
    # To change this template, choose Tools | Templates
    # and open the template in the editor.
    #  ***** GPL LICENSE BLOCK *****
    #
    #  This program is free software: you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation, either version 3 of the License, or
    #  (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    #  All rights reserved.
    #  ***** GPL LICENSE BLOCK *****
    
    bl_info = {
        "name": "Import: Sound to Animation",
        "author": "Vlassius",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        "version": (0, 70),
    
        "blender": (2, 64, 0),
    
        "location": "Select a object > Object tab > Import Movement From Wav File",
        "description": "Extract movement from sound file. "
            "See the Object Panel at the end.",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        "warning": "",
    
        "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
            "Scripts/Import-Export/Import_Movement_From_Audio_File",
        "tracker_url": "https://developer.blender.org/T23565",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        "category": "Import-Export"}
    
    """
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    -- Extract movement from sound file, to help in animation - import script --<br>
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    - NOTES:
    - This script takes a wav file and get sound "movement" to help you in sync the movement to words in the wave file. <br>
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    - Supported Audio: .wav (wave) 8 bits and 16 bits - mono and multichanel file<br>
    - At least Blender 2.64.9 is necessary to run this program.
    - Curitiba - Brasil
    
    
    -v 0.70Beta-
        Included: SmartRender - Render just the frames that has changes
        Included: Options to check SmartRender for Blender Internal Render Engine:LocRotScale, Material, Transp, Mirror
        Included: User can Cancel all functions with CANCEL button- Extensive Code and flux change (bugs expected)
        Included: User can Cancel all functions with ESC
        Inclused: User friendly messages into UI while running (its no more necessary to look at terminal window to most users)
        Cleanup:  Non Stardard Chars in coments
        To Do:    Decrease overhead of timer loops
        To Do:    Try to implement Smart Render for Cycles
    
    -v 0.60Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Included: Option to use just the beat from the audio sound
        Included: Option to exclude the beat from the audio sound
        Included: More or less sensibility options when using the beat
        Included: Audio Channel Select option
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    -v 0.50Beta-
        Included: Auto Adjust Audio Sensity option
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Included: 8 bits .wav file support
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Recalibrated: Manual audio sense 1
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Cosmetic: Many changes in panel and terminal window info
        Corrected: Tracker_url
        Corrected: a few bytes in Memory Leaks
        work around: memory leak in function: bpy.ops.transform.rotate
        work around: memory leak in function: bpy.ops.anim.keyframe_insert
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    -v 0.22Beta-
        Included:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Camera Rotation
        Empty Location-Rotation-Scale
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    -v 0.21Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Changed just the meta informations like version and wiki page.
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    -v 0.20 Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        New Panel
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    -v 0.1.5 Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Change in API-> Properties
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Included the button "Get FPS from Scene" due to a problem to get it in the start
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Return to Frame 1 after import
        Filter .wav type file (by batFINGER)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    -v 0.1.4 Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        If choose negative in rotation, auto check the rotation negative to Bones
        change in register()  unregister():
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    -v 0.1.3 Beta-
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        File Cleanup
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Change to bl_info.
        Cosmetic Changes.
        Minor change in API in how to define buttons.
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        Adjust in otimization.
    
    -v 0.1.2 Beta
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    change in API- Update function bpy.ops.anim.keyframe_insert_menu
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    -v 0.1.1 Beta
    change in API- Update property of  window_manager.fileselect_add
    
    -v 0.1.0 Beta
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    new - Added support to LAMP object
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    new - improved flow to import
    new - check the type of object before show options
    bug - option max. and min. values
    change- Updated scene properties for changes in property API.
            See http://lists.blender.org/pipermail/bf-committers/2010-September/028654.html
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    new flow: 1) Process the sound file    2) Show Button to import key frames
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    - v0.0.4 ALPHA
    new - Added destructive optimizer option - LostLestSignificativeDigit lost/total -> 10/255 default
    new - Visual Graph to samples
    new - Option to just process audio file and do not import - this is to help adjust the audio values
    new - Get and show automatically the FPS (in proper field) information taking the information from scene
    bug- Display sensitivity +1
    bug - Corrected location of the script in description
    
    - v0.0.3
    Main change: Corrected to work INSIDE dir /install/linux2/2.53/scripts/addons
    Corrected position of label "Rotation Negative"
    Added correct way to deal with paths in Python os.path.join - os.path.normpath
    
    - v0.0.2
    Corrected initial error (Register() function)
    Corrected some labels R. S. L.
    Turned off "object field" for now
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    Changed target default to Z location
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    - v0.0.1
    Initial version
    
    Credit to:
    Vlassius
    
    - http://vlassius.com.br
    - vlassius@vlassius.com.br
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    - Curitiba - Brasil
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    """
    
    import bpy
    from bpy.props import *
    #from io_utils import ImportHelper
    import wave
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #para deixar global
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    def _Interna_Globals(BytesDadosTotProcess, context):
        global array
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        global arrayAutoSense
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        array= bytearray(BytesDadosTotProcess)  # cria array
        arrayAutoSense= bytearray((BytesDadosTotProcess)*2)  # cria array para AutoAudioSense
        context.scene.imp_sound_to_anim.bArrayCriado=True
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #==================================================================================================
    # BLENDER UI Panel
    #==================================================================================================
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #
    class VIEW3D_PT_CustomMenuPanel(bpy.types.Panel):
        bl_space_type = "PROPERTIES"
        bl_region_type = "WINDOW"
        bl_context = "object"
        bl_label = "Import Movement From Wav File"
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        bl_options = {'DEFAULT_CLOSED'}
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
        def draw(self, context):
            layout = self.layout
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            b=bpy.context.active_object.type=='EMPTY' or bpy.context.active_object.type=='ARMATURE' or \
                                                                bpy.context.active_object.type=='MESH' or \
                                                                bpy.context.active_object.type=='CAMERA' or \
                                                                bpy.context.active_object.type=='LAMP'
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            if not b:
                row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                row.label(text="The Selected Object is: type \"" + bpy.context.active_object.type + \
                                                                        "\", and it is not supported.")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                row.label(text="Supported Object are Type: Armature, Mesh, Camera and Lamp")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                row=layout.row()
            else:
                #print(context.scene.imp_sound_to_anim.bTypeImport)
                if context.scene.imp_sound_to_anim.bTypeImport == 0:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    #mount panel to Direct animation
                    row=layout.row()
                    layout.operator("import.sound_animation_botao_udirect")
    
                # monta as telas quando está rodando
                elif context.scene.imp_sound_to_anim.Working!="":   #its running
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    if context.scene.imp_sound_to_anim.Working== "CheckSmartRender":
                        #context.scene.imp_sound_to_anim.Info_check_smartrender=
                        row=layout.row()
                        row.label(text="Checking for Smart Render...")
                        row=layout.row()
                        row.label(text=context.scene.imp_sound_to_anim.Info_check_smartrender)
                        row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    elif context.scene.imp_sound_to_anim.Working== "SmartRender":
                        #context.scene.imp_sound_to_anim.Info_check_smartrender=
                        row=layout.row()
                        row.label(text="Processing Smart Render...")
                        row=layout.row()
                        row.label(text=context.scene.imp_sound_to_anim.Info_check_smartrender)
                        row=layout.row()
    
                    elif context.scene.imp_sound_to_anim.Working== "ProcessaSom":
                        #context.scene.imp_sound_to_anim.Info_Import=
                        row=layout.row()
                        row.label(text="Processing Sound File...")
                        row=layout.row()
                        row.label(text=context.scene.imp_sound_to_anim.Info_Import)
    
                    elif context.scene.imp_sound_to_anim.Working== "wavimport":
                        #context.scene.imp_sound_to_anim.Info_Import=
                        row=layout.row()
                        row.label(text="Importing Keys...")
                        row=layout.row()
                        row.label(text=context.scene.imp_sound_to_anim.Info_Import)
                        row=layout.row()
    
                    # botao cancel
                    layout.operator(OBJECT_OT_Botao_Cancel.bl_idname)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                elif context.scene.imp_sound_to_anim.bTypeImport == 1:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text="1)Click button \"Process Wav\",")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text="2)Click Button \"Import Key Frames\",")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
                    row.label(text="Run the animation (alt A) and Enjoy!")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_auto_audio_sense")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    if context.scene.imp_sound_to_anim.action_auto_audio_sense == 0:   # se auto audio sense desligado
                        row.prop(context.scene.imp_sound_to_anim,"audio_sense")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        row=layout.row()
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    else: #somente se autosense ligado
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        if context.scene.imp_sound_to_anim.remove_beat == 0 :
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                            row.prop(context.scene.imp_sound_to_anim,"use_just_beat")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                        if context.scene.imp_sound_to_anim.use_just_beat == 0:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                            row.prop(context.scene.imp_sound_to_anim,"remove_beat")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        if context.scene.imp_sound_to_anim.use_just_beat or context.scene.imp_sound_to_anim.remove_beat:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                            if not context.scene.imp_sound_to_anim.beat_less_sensible and not context.scene.imp_sound_to_anim.beat_more_sensible:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                row=layout.row()
                            if context.scene.imp_sound_to_anim.beat_less_sensible ==0:
                                row.prop(context.scene.imp_sound_to_anim,"beat_more_sensible")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                            if context.scene.imp_sound_to_anim.beat_more_sensible ==0:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                row.prop(context.scene.imp_sound_to_anim,"beat_less_sensible")
    
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_per_second")
                    row=layout.row()
                    row.prop(context.scene.imp_sound_to_anim,"action_escale")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    #row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text="Result from 0 to " + str(round(255/context.scene.imp_sound_to_anim.action_escale,4)) + "")
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text="Property to Change:")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"import_type")
    
                    #coluna
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"import_where1")
                    row.prop(context.scene.imp_sound_to_anim,"import_where2")
                    row.prop(context.scene.imp_sound_to_anim,"import_where3")
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text='Optional Configurations:')
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"frames_per_second")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    #coluna
                    column= layout.column()
                    split=column.split(percentage=0.5)
                    col=split.column()
    
                    row=col.row()
                    row.prop(context.scene.imp_sound_to_anim,"frames_initial")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=col.row()
                    row.prop(context.scene.imp_sound_to_anim,"action_min_value")
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    col=split.column()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                    row=col.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"optimization_destructive")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                    row=col.row()
                    row.prop(context.scene.imp_sound_to_anim,"action_max_value")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_offset_x")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_offset_y")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_offset_z")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                    row=layout.row()
                    row.prop(context.scene.imp_sound_to_anim,"audio_channel_select")
                    row.prop(context.scene.imp_sound_to_anim,"action_valor_igual")
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    #operator button
                    #OBJECT_OT_Botao_Go => Botao_GO
                    row=layout.row()
                    layout.operator(OBJECT_OT_Botao_Go.bl_idname)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.label(text=context.scene.imp_sound_to_anim.Info_Import)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                    # preciso garantir a existencia do array porque o Blender salva no arquivo como existente sem o array existir
                    try:
                        array
                    except NameError:
                        nada=0 #dummy
                    else:
                        if context.scene.imp_sound_to_anim.bArrayCriado:
                            layout.operator(OBJECT_OT_Botao_Import.bl_idname)
                            row=layout.row()
    
                    #Layout SmartRender, somente para Blender_render
                    if bpy.context.scene.render.engine == "BLENDER_RENDER":
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        row.label(text="----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------")
                        row=layout.row()
                        if context.scene.imp_sound_to_anim.Info_check_smartrender!= "":
                            row=layout.row()
                            row.label(text=context.scene.imp_sound_to_anim.Info_check_smartrender)
    
                        row=layout.row()
                        row.operator(OBJECT_OT_Botao_Check_SmartRender.bl_idname)
                        if context.scene.imp_sound_to_anim.Info_check_smartrender!= "":
                            row.operator(OBJECT_OT_Botao_SmartRender.bl_idname)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                        row=layout.row()
                        row.prop(context.scene.imp_sound_to_anim,"check_smartrender_loc_rot_sc")
                        row.prop(context.scene.imp_sound_to_anim,"check_smartrender_material_basic")
                        row=layout.row()
                        row.prop(context.scene.imp_sound_to_anim,"check_smartrender_material_transparence")
                        row.prop(context.scene.imp_sound_to_anim,"check_smartrender_material_mirror")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
                #-----------------------------
                #Use Driver
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                #-----------------------------
                if context.scene.imp_sound_to_anim.bTypeImport == 2:
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"audio_sense")
                    row=layout.row()
                    row.prop(context.scene.imp_sound_to_anim,"frames_per_second")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row=layout.row()
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                    row.prop(context.scene.imp_sound_to_anim,"action_per_second")
                    row=layout.row()
                    layout.operator(ImportWavFile.bl_idname)
    
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #
    #==================================================================================================
    # BLENDER UI PropertyGroup
    #==================================================================================================
    #
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    class ImpSoundtoAnim(bpy.types.PropertyGroup):
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #Array created
            bArrayCriado = IntProperty(name="",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Avisa que rodou process de som",
                default=0)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #Script Running
            Working = StringProperty(name="",
                description="Script esta trabalhando",
                maxlen= 1024,
                default="")
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            #Nome do objeto
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            Info_Import = StringProperty(name="",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Info about Import",
                maxlen= 1024,
                default= "")#this set the initial text
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #Mensagem Smart Render
            Info_check_smartrender = StringProperty(name="",
                description="Smart Render Message",
                maxlen= 1024,
                default= "")#this set the initial text
    
            #iAudioSensib=0    #sensibilidade volume do audio 0 a 5. Quanto maior, mais sensibilidade
            audio_sense = IntProperty(name="Audio Sens",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Audio Sensibility.",
                min=1,
                max=6,
                step=1,
                default= 1)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #iFramesPorSeg=15  #Frames por segundo para key frame
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            #fps= (bpy.types.Scene) bpy.context.scene.render.fps
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            frames_per_second = IntProperty(name="#Frames/s",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Frames you want per second. Better match your set up in Blender scene.",
                min=1,
                max=120,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1)
    
            #iMovPorSeg=1      #Sensibilidade de movimento. 3= 3 movimentos por segundo
            action_per_second = IntProperty(name="Act/s",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Actions per second. From 1 to #Frames/s",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                min=1,
                max=120,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 4)#this set the initial text
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #iDivScala=200
            #scala do valor do movimento. [se =1 - 0 a 255 ] [se=255 - 0,00000 a 1,00000] [se=1000 - 0 a 0.255]
            action_escale = IntProperty(name="Scale",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Scale the result values. See the text at right side of the field",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                min=1,
                max=99999,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=100,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 100)#this set the initial text
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #iMaxValue=255
            action_max_value = IntProperty(name="Clip Max",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Set the max value (clip higher values).",
                min=1,
                max=255,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 255)#this set the initial text
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #iMinValue=0
            action_min_value = IntProperty(name="Clip Min",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Set the min value. (clip lower values)",
                min=0,
                max=255,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 0)#this set the initial text
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            #iStartFrame=0#
            frames_initial = IntProperty(name="Frame Ini",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Where to start to put the computed values.",
                min=0,
                max=999999999,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 0)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            audio_channel_select = IntProperty(name="Audio Channel",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Choose the audio channel to use",
                min=1,
                max=10,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 1)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            action_offset_x = FloatProperty(name="XOffset",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Offset X Values",
                min=-999999,
                max=999999,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 0)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            action_offset_y = FloatProperty(name="YOffset",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Offset Y Values",
                min=-999999,
                max=999999,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 0)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            action_offset_z = FloatProperty(name="ZOffset",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Offset Z Values",
                min=-999999,
                max=999999,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=1,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default= 0)
    
            import_type= EnumProperty(items=(('imp_t_Scale', "Scale", "Apply to Scale"),
                                             ('imp_t_Rotation', "Rotation", "Apply to Rotation"),
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                             ('imp_t_Location', "Location", "Apply to Location")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                     name="",
                                     description= "Property to Import Values",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                     default='imp_t_Location')
    
            import_where1= EnumProperty(items=(('imp_w_-z', "-z", "Apply to -z"),
                                              ('imp_w_-y', "-y", "Apply to -y"),
                                              ('imp_w_-x', "-x", "Apply to -x"),
                                              ('imp_w_z', "z", "Apply to z"),
                                              ('imp_w_y', "y", "Apply to y"),
                                              ('imp_w_x', "x", "Apply to x")
                                            ),
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                     name="",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                                     description= "Where to Import",
                                     default='imp_w_z')
    
            import_where2= EnumProperty(items=(('imp_w_none', "None", ""),
                                              ('imp_w_-z', "-z", "Apply to -z"),
                                              ('imp_w_-y', "-y", "Apply to -y"),
                                              ('imp_w_-x', "-x", "Apply to -x"),
                                              ('imp_w_z', "z", "Apply to z"),
                                              ('imp_w_y', "y", "Apply to y"),
                                              ('imp_w_x', "x", "Apply to x")
                                            ),
                                     name="",
                                     description= "Where to Import",
                                     default='imp_w_none')
    
            import_where3= EnumProperty(items=(('imp_w_none', "None", ""),
                                              ('imp_w_-z', "-z", "Apply to -z"),
                                              ('imp_w_-y', "-y", "Apply to -y"),
                                              ('imp_w_-x', "-x", "Apply to -x"),
                                              ('imp_w_z', "z", "Apply to z"),
                                              ('imp_w_y', "y", "Apply to y"),
                                              ('imp_w_x', "x", "Apply to x")
                                            ),
                                     name="",
                                     description= "Where to Import",
                                     default='imp_w_none')
    
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            #========== Propriedades boolean  =============#
    
            #  INVERTIDO!!!  bNaoValorIgual=True    # nao deixa repetir valores     INVERTIDO!!!
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            action_valor_igual = BoolProperty(name="Hard Transition",
                description="Use to movements like a mouth, to a arm movement, maybe you will not use this.",
                default=1)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            action_auto_audio_sense = BoolProperty(name="Auto Audio Sensitivity",
                description="Try to discover best audio scale. ",
                default=1)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            use_just_beat=BoolProperty(name="Just Use The Beat",
                description="Try to use just the beat to extract movement.",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                default=0)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            remove_beat=BoolProperty(name="Remove The Beat",
                description="Try to remove the beat to extract movement.",
                default=0)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            beat_more_sensible=BoolProperty(name="More Sensible",
                description="Try To be more sensible about the beat.",
                default=0)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            beat_less_sensible=BoolProperty(name="Less Sensible",
                description="Try to be less sensible about the beat.",
                default=0)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    
            check_smartrender_loc_rot_sc=BoolProperty(name="Loc Rot Scale",
                description="Find changes in Location, Rotation and Scale Frame by Frame.",
                default=1)
    
            check_smartrender_material_basic=BoolProperty(name="Basic Material",
                description="Find changes in basic material settings Frame by Frame.",
                default=1)
    
            check_smartrender_material_transparence=BoolProperty(name="Material Transparence",
                description="Find changes in material transparence settings Frame by Frame.",
                default=0)
    
            check_smartrender_material_mirror=BoolProperty(name="Material Mirror",
                description="Find changes in material mirror settings Frame by Frame.",
                default=0)
    
            timer_reset_func=BoolProperty(name="Reset Counters",
                description="Reset Counters after stop",
                default=0)
    
            cancel_button_hit=BoolProperty(name="Cancel Hit",
                description="Cancel Hit",
                default=0)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            #  Optimization
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            optimization_destructive = IntProperty(name="Optimization",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Hi value = Hi optimization -> Hi loss of information.",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                min=0,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                max=254,
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                step=10,
                default= 10)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            # import as driver or direct   NOT IN USE!!
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            # not defined
            # Direct=1
            # Driver=2
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            bTypeImport = IntProperty(name="",
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
                description="Import Direct or Driver",
                default=0)
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            # globais do dialog open wave
            filter_glob = StringProperty(default="*.wav", options={'HIDDEN'})
            path =        StringProperty(name="File Path", description="Filepath used for importing the WAV file", \
                                                                                            maxlen= 1024, default= "")
            filename =    StringProperty(name="File Name", description="Name of the file")
            directory =   StringProperty(name="Directory", description="Directory of the file")
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    from bpy.props import *
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    def WavFileImport(self, context):
        self.layout.operator(ImportWavFile.bl_idname, text="Import a wav file", icon='PLUGIN')
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #==================================================================================================
    # Use Direct
    #==================================================================================================
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #
    class OBJECT_OT_Botao_uDirect(bpy.types.Operator):
        '''Import as Direct Animation'''
        bl_idname = "import.sound_animation_botao_udirect"
        bl_label = "Direct to a Property"
    
        def execute(self, context):
            context.scene.imp_sound_to_anim.bTypeImport= 1
            if context.scene.imp_sound_to_anim.frames_per_second == 0:
                 context.scene.imp_sound_to_anim.frames_per_second= bpy.context.scene.render.fps
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            return{'FINISHED'}
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        def invoke(self, context, event):
            self.execute(context)
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
            return {'FINISHED'}
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #==================================================================================================
    # Button - Import
    #==================================================================================================
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
    #
    class OBJECT_OT_Botao_Import(bpy.types.Operator):
        '''Import Key Frames to Blender'''
        bl_idname = "import.sound_animation_botao_import"
        bl_label = "Import Key Frames"
    
    
    Eng vlassius santos's avatar
    Eng vlassius santos committed
        RunFrom=0
        iSumImportFrames=0
        iSumOptimizerP1=0
        iSumOptimizerP2=0
        iSumOptimizerP3=0
    
        def wavimport(context, loop):
            obi=OBJECT_OT_Botao_Import
    
            # para de entrar no timer
            context.scene.imp_sound_to_anim.Working=""
            #reseta contadores caso seja pedido
            if context.scene.imp_sound_to_anim.timer_reset_func:
                obi.RunFrom=0
                obi.iSumOptimizerP1=0
                obi.iSumOptimizerP2=0
                obi.iSumOptimizerP3=0
                obi.iSumImportFrames=0
                context.scene.imp_sound_to_anim.timer_reset_func=False
    
            #limita o loop se estiver no fim
            tot=len(array)-1
            if obi.RunFrom+loop > tot:
                loop= tot - obi.RunFrom
    
            #scala do valor do movimento. [se =1 - 0 a 255 ] [se=255 - 0,00000 a 1,00000] [se=1000 - 0 a 0.255]
            iDivScala= int(context.scene.imp_sound_to_anim.action_escale)
    
            # nao deixa repetir valores
            bNaoValorIgual=True
            if context.scene.imp_sound_to_anim.action_valor_igual: bNaoValorIgual= False
    
            # inicia no inicio pedido pelo usuario mais ponteiro RunFrom
            iStartFrame= int(context.scene.imp_sound_to_anim.frames_initial) + obi.RunFrom
    
            iMaxValue= context.scene.imp_sound_to_anim.action_max_value
            iMinValue= context.scene.imp_sound_to_anim.action_min_value
    
            bEscala=bRotacao=bEixo=False
            if context.scene.imp_sound_to_anim.import_type=='imp_t_Scale':
                bEscala=True;
    
            if context.scene.imp_sound_to_anim.import_type=='imp_t_Rotation':
                bRotacao=True;
    
            if context.scene.imp_sound_to_anim.import_type=='imp_t_Location':
                bEixo=True;
    
            # atencao, nao eh boolean
            iEixoXneg= iEixoYneg= iEixoZneg=1
            # atencao, nao eh boolean
            iRotationNeg=1
            # atencao, nao eh boolean
            iEscalaYneg= iEscalaZneg= iEscalaXneg=1
            bEixoX=bEixoY=bEixoZ=bEscalaX=bEscalaY=bEscalaZ=bRotationX=bRotationY=bRotationZ=False
    
            # LOCAL 1
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
    
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
    
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
    
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_-x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
                iEixoXneg=-1
                iEscalaXneg=-1
                iRotationNeg=-1
    
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_-y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
                iEixoYneg=-1
                iRotationNeg=-1
                iEscalaYneg=-1
    
            if context.scene.imp_sound_to_anim.import_where1== 'imp_w_-z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
                iEixoZneg=-1
                iRotationNeg=-1
                iEscalaZneg=-1
    
    
            # LOCAL 2
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
    
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
    
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
    
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_-x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
                iEixoXneg=-1
                iEscalaXneg=-1
                iRotationNeg=-1
    
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_-y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
                iEixoYneg=-1
                iRotationNeg=-1
                iEscalaYneg=-1
    
            if context.scene.imp_sound_to_anim.import_where2== 'imp_w_-z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
                iEixoZneg=-1
                iRotationNeg=-1
                iEscalaZneg=-1
    
    
            # LOCAL 3
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
    
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
    
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
    
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_-x':
                bEixoX=True
                bEscalaX=True
                bRotationX=True
                iEixoXneg=-1
                iEscalaXneg=-1
                iRotationNeg=-1
    
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_-y':
                bEixoY=True
                bEscalaY=True
                bRotationY=True
                iEixoYneg=-1
                iRotationNeg=-1
                iEscalaYneg=-1
    
            if context.scene.imp_sound_to_anim.import_where3== 'imp_w_-z':
                bEixoZ=True
                bEscalaZ=True
                bRotationZ=True
                iEixoZneg=-1
                iRotationNeg=-1
                iEscalaZneg=-1
    
            iMinBaseX=iMinScaleBaseX=context.scene.imp_sound_to_anim.action_offset_x
            iMinBaseY=iMinScaleBaseY=context.scene.imp_sound_to_anim.action_offset_y
            iMinBaseZ=iMinScaleBaseZ=context.scene.imp_sound_to_anim.action_offset_z
    
            #escala inicia com 1 e nao com zero
            iRotationAxisBaseX=context.scene.imp_sound_to_anim.action_offset_x  +1
            iRotationAxisBaseY=context.scene.imp_sound_to_anim.action_offset_y  +1
            iRotationAxisBaseZ=context.scene.imp_sound_to_anim.action_offset_z  +1
    
            #Added destructive optimizer option - LostLestSignificativeDigit lost/total
            iDestructiveOptimizer=context.scene.imp_sound_to_anim.optimization_destructive
    
            #limita ou nao o valor - velocidade
            bLimitValue=False
    
            if iMinValue<0: iMinValue=0
            if iMaxValue>255: iMaxValue=255
            if iMinValue>255: iMinValue=255
            if iMaxValue<0: iMaxValue=0
            if iMinValue!= 0: bLimitValue= True
            if iMaxValue!= 255: bLimitValue= True
    
            if obi.RunFrom==0:
                print('')
                print("================================================================")
                from time import strftime
                print(strftime("Start Import:  %H:%M:%S"))
                print("================================================================")
                print('')
    
            ilocationXAnt=0
            ilocationYAnt=0
            ilocationZAnt=0
            iscaleXAnt=0
            iscaleYAnt=0
            iscaleZAnt=0
            iRotateValAnt=0
    
            # variavel global _Interna_Globals
            if context.scene.imp_sound_to_anim.bArrayCriado:
                for i in range(loop):
                    ival=array[i+obi.RunFrom]/iDivScala
                    #valor pequeno demais, vai dar zero na hora de aplicar
                    if ival < 0.001:
                         array[i+obi.RunFrom]=0
                         ival=0
    
                    # to increase performance and legibility
                    arrayI= array[i+obi.RunFrom]
                    arrayIP1= array[i+1+obi.RunFrom]
                    arrayIL1= array[i-1+obi.RunFrom]
    
                    # opcao de NAO colocar valores iguais sequenciais
                    if i>0 and bNaoValorIgual and arrayIL1== arrayI:
                        print("Importing Blender Frame: "+str(i+obi.RunFrom+1)+"\tof "+str(len(array)-1) + \
                                                                                "\t(skipped by optimizer)")
                        obi.iSumOptimizerP3+=1
                    else:
                        # otimizacao - nao preciso mais que 2 valores iguais.
                        # pular key frame intermediario - Ex b, a, -, -, -, a
                        # tambem otimiza pelo otimizador com perda
                        # valor atual == anterior e posterior -> pula
                        if i>0 and i< len(array)-1 and abs(arrayI - arrayIL1)<=iDestructiveOptimizer and \
                                                            abs(arrayI - arrayIP1)<=iDestructiveOptimizer:
                                print("Importing Blender Frame: "+str(i+obi.RunFrom+1)+"\tof "+str(len(array)-1) + \
                                                                                        "\t(skipped by optimizer)")
                                if iDestructiveOptimizer>0 and arrayI != arrayIL1 or arrayI != arrayIP1:
                                    obi.iSumOptimizerP1+=1
                                else: obi.iSumOptimizerP2+=1
                        else:
                                if bLimitValue:
                                    if arrayI > iMaxValue: array[i+obi.RunFrom]=iMaxValue
                                    if arrayI < iMinValue: array[i+obi.RunFrom]=iMinValue
    
                                ival=array[i+obi.RunFrom]/iDivScala
                                #passa para float com somente 3 digitos caso seja float
                                m_ival=ival*1000
                                if int(m_ival) != m_ival:
                                    ival= int(m_ival)
                                    ival = ival /1000
    
                                bpy.context.scene.frame_current = i+iStartFrame
    
                                #precisa fazer objeto ativo
                                if bpy.context.active_object.type=='MESH' or bpy.context.active_object.type=='CAMERA' or \
                                                                                bpy.context.active_object.type=='EMPTY':
                                    if bEixo:
                                        if bEixoX: bpy.context.active_object.location.x = ival*iEixoXneg+iMinBaseX
                                        if bEixoY: bpy.context.active_object.location.y = ival*iEixoYneg+iMinBaseY
                                        if bEixoZ: bpy.context.active_object.location.z = ival*iEixoZneg+iMinBaseZ
    
                                    if bEscala:
                                        if bEscalaX: bpy.context.active_object.scale.x = ival*iEscalaXneg+iMinScaleBaseX
                                        if bEscalaY: bpy.context.active_object.scale.y = ival*iEscalaYneg+iMinScaleBaseY
                                        if bEscalaZ: bpy.context.active_object.scale.z = ival*iEscalaZneg+iMinScaleBaseZ
    
                                # 'ARMATURE' or ('MESH' and bRotacao) or ('CAMERA' and bRotacao) or 'LAMP' or 'EMPTY' and bRotacao)
                                if bpy.context.active_object.type=='ARMATURE' or (bpy.context.active_object.type=='MESH' and bRotacao) or \
                                                                                (bpy.context.active_object.type=='CAMERA' and bRotacao) or \
                                                                                bpy.context.active_object.type=='LAMP' or \
                                                                                (bpy.context.active_object.type=='EMPTY' and bRotacao):
    
                                        #===========  BONE ===========#
                                        if bpy.context.active_object.type=='ARMATURE':   #precisa ser objeto ativo. Nao achei como passar para editmode
                                            if bpy.context.mode!= 'POSE':    #posemode
                                                bpy.ops.object.posemode_toggle()
    
                                        #============= ALL ===========#
                                        if bEixo:
                                            if ilocationXAnt!=0 or ilocationYAnt!=0 or ilocationZAnt!=0:
    
                                                bpy.ops.transform.translate(value=(ilocationXAnt*-1,                ilocationYAnt*-1, \
                                                                                    ilocationZAnt*-1),               constraint_axis=(bEixoX, bEixoY,bEixoZ), \
                                                                                    constraint_orientation='GLOBAL', mirror=False, \
                                                                                    proportional='DISABLED',         proportional_edit_falloff='SMOOTH', \
                                                                                    proportional_size=1,             snap=False, \
                                                                                    snap_target='CLOSEST',           snap_point=(0, 0, 0), \
                                                                                    snap_align=False,               snap_normal=(0, 0, 0), \
                                                                                    release_confirm=False)
    
                                            ilocationX=ilocationY=ilocationZ=0
                                            if bEixoX: ilocationX = ival*iEixoXneg+iMinBaseX
                                            if bEixoY: ilocationY = ival*iEixoYneg+iMinBaseY
                                            if bEixoZ: ilocationZ = ival*iEixoZneg+iMinBaseZ
    
                                            bpy.ops.transform.translate(value=(ilocationX,                       ilocationY, \
                                                                                ilocationZ),                      constraint_axis=(bEixoX, bEixoY,bEixoZ), \
                                                                                constraint_orientation='GLOBAL',  mirror=False, \
                                                                                proportional='DISABLED',          proportional_edit_falloff='SMOOTH', \
                                                                                proportional_size=1,              snap=False, \
                                                                                snap_target='CLOSEST',            snap_point=(0, 0, 0), snap_align=False, \
                                                                                snap_normal=(0, 0, 0),           release_confirm=False)
                                            ilocationXAnt= ilocationX
                                            ilocationYAnt= ilocationY
                                            ilocationZAnt= ilocationZ
    
                                        if bEscala:
                                            if iscaleXAnt!=0 or iscaleYAnt!=0 or iscaleZAnt!=0:
                                                tmpscaleXAnt=0
                                                tmpscaleYAnt=0
                                                tmpscaleZAnt=0
                                                if iscaleXAnt: tmpscaleXAnt=1/iscaleXAnt
                                                if iscaleYAnt: tmpscaleYAnt=1/iscaleYAnt
                                                if iscaleZAnt: tmpscaleZAnt=1/iscaleZAnt
    
                                                bpy.ops.transform.resize(value=(tmpscaleXAnt,                    tmpscaleYAnt, \
                                                                                tmpscaleZAnt ),                   constraint_axis=(False, False, False), \
                                                                                constraint_orientation='GLOBAL',  mirror=False, \
                                                                                proportional='DISABLED',          proportional_edit_falloff='SMOOTH', \
                                                                                proportional_size=1, snap=False, snap_target='CLOSEST', \
                                                                                snap_point=(0, 0, 0),             snap_align=False, \
                                                                                snap_normal=(0, 0, 0),            release_confirm=False)
    
                                            iscaleX=iscaleY=iscaleZ=0
                                            if bEscalaX: iscaleX = ival*iEscalaXneg+iMinScaleBaseX
                                            if bEscalaY: iscaleY = ival*iEscalaYneg+iMinScaleBaseY
                                            if bEscalaZ: iscaleZ = ival*iEscalaZneg+iMinScaleBaseZ
    
                                            bpy.ops.transform.resize(value=(iscaleX,                        iscaleY, \
                                                                            iscaleZ),                        constraint_axis=(False, False, False), \
                                                                            constraint_orientation='GLOBAL', mirror=False, \
                                                                            proportional='DISABLED',         proportional_edit_falloff='SMOOTH', \
                                                                            proportional_size=1,             snap=False, \
                                                                            snap_target='CLOSEST',           snap_point=(0, 0, 0), \
                                                                            snap_align=False,               snap_normal=(0, 0, 0), \
                                                                            release_confirm=False)
                                            iscaleXAnt= iscaleX
                                            iscaleYAnt= iscaleY
                                            iscaleZAnt= iscaleZ
    
                                        if bRotacao:
                                            if iRotateValAnt!=0:
                                                bpy.context.active_object.rotation_euler= ((iRotateValAnt*-1)+    iRotationAxisBaseX) *bRotationX , \
                                                                                            ((iRotateValAnt*-1)+  iRotationAxisBaseY) *bRotationY , \
                                                                                            ((iRotateValAnt*-1)+  iRotationAxisBaseZ) *bRotationZ
    
                                            bpy.context.active_object.rotation_euler= ((ival*iRotationNeg)+   iRotationAxisBaseX) * bRotationX, \
                                                                                        ((ival*iRotationNeg)+ iRotationAxisBaseY)  * bRotationY, \
                                                                                        ((ival*iRotationNeg)+ iRotationAxisBaseZ)  * bRotationZ
                                            iRotateValAnt= ival*iRotationNeg
    
                                ob = bpy.context.active_object
    
                                if bEixo:
                                    ob.keyframe_insert(data_path="location")