Quick user feedback about import action

Issue #1778 invalid
Joe Morris @ FAST Animation Studio Toolz created an issue

This was a test I did I added three anblocks the first two were the Forward walk cycle and the third one was the corner left these are the standard Genesis 8 aniblocks and baked the key frames and then I deleted all of the forward walk cycle part and saved posepreset and then I undid that and then I deleted all of the corner frames and then I saved the pose preset so I had you know a continuously cycling animation with the two post presets combined

now I think this would be more intuitive ….I imported the Genesis 8 base and then with import action I imported the first walk cycle the one with the two forward walk cycles and then I named that walk number one and set it start frame on frame zero and imported it… it imported fine and then I went to import the corner animation and set that to action walk number two and set that to start at frame 73 and imported that then played the animation and it only played the corner animation it appears maybe blenders import or blenders actions don’t stay active if they're for the whole character it's either one or the other

so then I undid all that and then I did import action and imported the same doubled forward walk cycle and did that the same way but the second time with the corner I imported that to a walk one the same action and it overwrote the original action even though clear pose wasn’It selected now I think this would be more seamless and more intuitive if I could essentially just paste keyframes with the import action and you know if I want to add to the current action have that second situation that I did have that work so if I imported you know the corner walk cycle I would have the full walk cycle that I had in Daz Studio

I'm making my own sitcom in blender… And designing the perfect workflow to make it happen. and Can tell you for fast animation production purposes for everybody it would be way better to have this functionality…

Usually when I create an animation it's just you know the character saying one phrase like hey how are you doing and then I'll import it into blender And then maybe make a few edits to it and edit the characters materials and you know fix some clothes poke through and then you know come up with the idea for the next part of my scene and usually I save an animation file that's different from my character in the base pose and then when it's time to import another animation or create another animation i'll go to that same file create the animation so it blends in with the first animation and then export just those new frames as pose preset it would be nice to be able to go into blender and just add those easily

I know I could create the whole animation in Daz Studio …. I could make the first part of the animation with as my current system in my addon allows for importing a character with animation that's parented to an empty when I want to add to the animation I could add to it in Daz studio and then import it back into blender delete the first character but leave the empty and then just do a selected to cursor kind of thing and you know send my newly imported character with the extra animation right to the original spot and of the original empty so it lines up ….. And then fix clothes poke through at the end and you know make any edits that are necessary at the end and that's what I plan on doing now with my system but I am thinking about the overall end user experience and then still that's a tiny hitch in the process not being able to fix clothes poke through you know immediately so it's beautiful when I animate I'm just talking about my add on functionality to help make the point.….. I think this functionality would be better coming from the source from you guys of course I'll add it if you guys don’t but I think and I know I mentioned this before but I think this is really really important workflow improvement

just think ANIBLOCKS that's a really really awesome feature and to mirror that functionality in DAZ Would be awesome…

And just for note I created some sort of miracle and got my nudge functionality for my lights to an awesome level and it's very easy and very portable for dynamic editing of step and precision values of properties while blenders running and it's easily portable to change any custom/blender property… Now again I'm not talking about lights here it's shader node properties mostly… If you see how fine my nudge gets on my light properties v5.8.8 and later you would know how it would Look adding it to say a distance on the bump node because you know… what's that slider even there for because you touch it it takes like off like a rocket and there's no point to a slider for that property… Imagine being able to just sit back in your chair and comfortably adjusting normal/distance values instantly with a long slider drag I mean think what kind of art you can create if you could get that precise instantly you're not wasting time going to your keyboard or typing in values ever…. A lot of your properties are good as far as on your nodes but like top coat roughness even pressing shift on the keyboard you can't get really much good out of that and this is true even with a lot of blender default properties even with shift on your keyboard in the shader editor you can't get it to a nice perfect artistic level easily… Take it or leave it i'm just bringing it up again because um I got to a better level on mine and just for note it the secret was using scene properties to make dynamic editing of property values possible

But all that being said still thanks for creating the absolute best thing ever…

take care and have an awesome weekend!

And just remember my motto the more clicks we save we create better professionals out of our end users and since I'm mentioning a few things ….on import action there's a drop down for add preset I don't know what preset to add i'm certain it's in the operators folder but that says daz easy import on it so the end user might be confused I haven't tried it out yet…

Comments (15)

  1. Joe Morris @ FAST Animation Studio Toolz reporter

    And I'm pretty sure you told me about this could you let me know if there's a way to clear an entire animation like clear figure pose in DAZ

    And if some of these processes seem like too much or something or too much of a hassle let me know and I could go ahead and like code the upgrades and send them to you…you know the ones that would be better coming directly from your add on because I know you guys do a lot… and I'm definitely not opposed to pitching in

  2. Alessandro Padovani

    You can import multiple daz animations in blender and assign them to different actions using the action editor, as usual. There’s plenty of tutorials how to use the action editor.

  3. Joe Morris @ FAST Animation Studio Toolz reporter

    Yeah right now I'm trying a system utilizing your current where I import one character the first half of a daz studio animation and set it on frame zero then import the second half say new animation I added later on a different character to frame 100 say and then just hiding the collections and because I made the animation's work seamlessly in DAZ studio I'm just going to see how that looks

  4. Joe Morris @ FAST Animation Studio Toolz reporter

    And one more thing doing the above thing where I imported two parts of ADAZ studio animation as two different pose presets I was making a tutorial about that and I imported the first half at frame 0 just how I exported the pose preset in DAZ that one started at frame zero I mistakenly actually imported that at 24 frames per second but it imported fine but when importing the second half I started it at frame 155 and attempted to import it and I got the below errors as the second time I imported it 24 frames per second but in this instance it got an error and it wasn't really verbose in your console output… to warn the end user that the only issue was importing at wrong frames per second

    I was hoping maybe you could let me know if there’s some sort of way to derive the frames per second from Daz Studio in your code or in the DUF pose files directly so maybe I could write something for that as well to warn the end user in this instance.. OK and then this happened with my own add-on but I verified it in yours as well that the error was the same when trying these steps with your easy import daz button

    Traceback (most recent call last):
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\error.py", line 223, in execute
        self.run(context)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 1555, in run
        StandardAnimation.run(self, context)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 1457, in run
        self.nameAnimation(rig, dazfiles)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 757, in nameAnimation
        act.name = self.actionName
    AttributeError: 'NoneType' object has no attribute 'name'
    Error: Python: Traceback (most recent call last):
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\error.py", line 223, in execute
        self.run(context)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 1555, in run
        StandardAnimation.run(self, context)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 1457, in run
        self.nameAnimation(rig, dazfiles)
      File "C:\Users\W\AppData\Roaming\Blender Foundation\Blender\3.6\scripts\addons\import_daz\animation.py", line 757, in nameAnimation
        act.name = self.actionName
    AttributeError: 'NoneType' object has no attribute 'name'
    Location: C:\Program Files\Blender Foundation\Blender 3.6\3.6\scripts\modules\bpy\ops.py:113
    

  5. Thomas Larsson repo owner

    You are not using the most recent version. The bug is there in the latest version, but it happens on line 762 rather than 757. Fixed in last commit.

  6. Joe Morris @ FAST Animation Studio Toolz reporter

    Thank you very much I appreciate it … You guys have an awesome day

  7. Joe Morris @ FAST Animation Studio Toolz reporter

    OK that error fix worked awesome and let me know did you do something different to the How the shaders are displayed because I forgot to add my asset library and number one when I brought in my character this character had this awesome rich black skin tone which I thought was awesome……………. and ………..I just loaded the character with the right asset library set and she came in fine but I was just getting ready to figure out how I'm going to edit this character's face materials because she never looked just like DAZ studio when I was in render mode in EVEE blender but then right when I imported her …. I went into render mode and the character skin looked perfect and her face looked just like she did in DAZ studio so it looks like you really did something to the shaders on your end

  8. Joe Morris @ FAST Animation Studio Toolz reporter

    Yeah I just tested Victoria 8.1 in EVE and same thing her shaders look way better I don't know what you guys did I just updated to the latest DAZ studio so not sure if that's the reason if DAZ upgraded but if it was you guys… And to note because we’re you know all about the same thing I'm coming up with new ideas that I might implement or mention to you guys so you could implement about matching the exact experience of DAZ studio in EV mode in blender and one idea is because GPT can recognize images i'm not certain if they could do it with the API but you know if we fed GPT the proper data set that would include like slider position compared to the look of a specific render in EV and also fed It the image of the DAZ studio render and have it sit there and adjust sliders and output a render and analyze the image and adjust sliders and repeat until it got all encompassing value that would work on every character because you know DAZ is so perfect as far as their renders and it would be great to match that IN Evie or we could use torch neural networks either based on a large data set gain from constant user tweaking what the user does in order to improve their materials you know save all that to an extremely large JSON file as a data set and every time you start up blender run a neural network on that and update your or update your shader node settings whenever you import A DAZ studio model just something to think about you know to make this process really pop like DAZ… Either way I'm gonna start running it through GPT and getting a game plan set up and then start trying to implement because you know Evie render times are so perfect when you do viewport render animation and if I could figure out some way to make that match daze studio renders…. Eve next is coming out it should be easier… But I would say that's the next step because my add-ons all about fast animation production I'm certain your angle is all encompassing cycles and EVE but either way… I'll figure out a game plan and if I come up with something viable i'll send it to you

  9. Joe Morris @ FAST Animation Studio Toolz reporter

    And no you don't even have to do torch or if linear regression with skimage(Not sure Which one to use) is better because GPT will just lay it out for you you don't even have to know the internals… But the main thing is just link blender with ADAZ script that'll output a render whenever you import a model and then just use some sort of logic to fine tune the shader I'm sure you guys have been had it the best you could do but you know artificial intelligence could probably figure this out perfect some sort of automatic normal generation would be important because many daisy models come through not having face normals and tutorials about how to make a realistic render from that is invariably to go to materialize window software and create a normal map so we'd have to automate that…. so if this sounds interesting at all if your guys are interested let me know and we can even team on this you know like I could get some normal map creation software going or I could get the artificial intelligence angle going or if you're not interested I'll just do them both and send to your finished product and see if you want to implement it

  10. Joe Morris @ FAST Animation Studio Toolz reporter

    And I think I just figured out something in this regard if diffeo had an offset because I just tried to import an animation that was 82 frames in Daz I wanted it to start on frame 100 but that frame wasn't available in Daz so you know the animation was skipped when I set it to 100 but if there was an offset that would push whatever frame the animation starts on up to frame a hundred considering it's only eighty two frames…. That would save a step going to the dope sheet selecting all key frames and sliding them up

  11. Joe Morris @ FAST Animation Studio Toolz reporter

    And a quick note you don't even have to respond to this just want you to know but while encoding with hand brake I got a 167 second import time for a DUF so maybe running in a separate thread (no idea)could help GPT could optimize and help you figure the right angle for this you know more about running this kind of code in a separate thread than I do

    Fitting objects with dbz file...
    Building objects...
    File "C:/Users/W/AppData/Roaming/Blender Foundation/Blender/3.6/scripts/addons/FAST/daz_studio_save/VICKI.duf" loaded in 167.767 seconds
    WARN (bpy.rna): C:\Users\blender\git\blender-v360\blender.git\source\blender\python\intern\bpy_rna.c:1343 pyrna_enum_to_py: current value '0' matches no enum in 'Scene', 'Scene', 'DazMorphCatsContent'
    WARN (bpy.rna): C:\Users\blender\git\blender-v360\blender.git\source\blender\python\intern\bpy_rna.c:1343 pyrna_enum_to_py: current value '0' matches no enum in 'Scene', 'Scene', 'DazMorphCatsContent'

    Some assets were not found. Check that all DAZ root paths have been set up correctly.
    /data/fenixphoenix/hd face staples and stitches for genesis 8 female/fssf s04 staples/fssf_s04_staples_96.dsf
    Unsupported or partially supported shaders found:
    support/DAZ/Uber/shaderDefinitions/surface/omUberSurfaceDef.dse
    Cap
    OOT Hairblending Hair

    Merge materials

  12. Joe Morris @ FAST Animation Studio Toolz reporter

    and with import action I guess I must not have been doing it right but I just imported an action and unchecked new action actually and imported it to the same action no problem so if you change something thanks!

  13. Joe Morris @ FAST Animation Studio Toolz reporter

    Just real quick note I did this and it is a lot of fun

    def add_audio_to_sequencer_for_action_import(filepath, frame_start):
        context = bpy.context
        scene = context.scene
    
        # Check if the filepath ends with the right audio extensions
        if not filepath.lower().endswith(('.mp3', '.wav', '.ogg')):
            print("Unsupported file format.")
            return None
    
        base_directory = os.path.dirname(filepath)
    
        if not scene.sequence_editor:
            scene.sequence_editor_create()
    
        # Find first available channel
        occupied_channels = [seq.channel for seq in scene.sequence_editor.sequences_all]
        channel = max(occupied_channels, default=0) + 1
    
        # Extracting the filename from the filepath for naming the audio strip
        filename = os.path.basename(filepath)
        last_separator_index = filename.rfind('.')
        cleaned_string = filename[:last_separator_index] if last_separator_index != -1 else filename
    
        # Iterate through all screen areas and temporarily switch any matching area to 'SEQUENCE_EDITOR'.
        areas = [area for area in bpy.context.screen.areas if area.ui_type in ['SEQUENCE_EDITOR', 'TIMELINE', 'DOPESHEET_EDITOR', 'GRAPH_EDITOR', 'NLA_EDITOR']]
    
        if not areas:
            areas = [area for area in bpy.context.screen.areas]
    
        area = areas[0]
        original_area_type = area.ui_type
        area.ui_type = 'SEQUENCE_EDITOR'
    
        with context.temp_override(area=area):
            bpy.ops.sequencer.sound_strip_add(filepath=filepath, channel=channel, frame_start=frame_start)
            new_strip = context.scene.sequence_editor.active_strip
            new_strip.show_waveform = True
            bpy.ops.sequencer.strip_color_tag_set(color='COLOR_05')
            try:
                bpy.ops.sound.pack()
                print_color("AB", "\nSound packed into file successfully!")
            except Exception as e:
                print(f"Error packing sound: {e}")    
    
        area.ui_type = original_area_type
    
        audio_clip = context.scene.sequence_editor.active_strip
        audio_clip.name = cleaned_string
    
        return audio_clip
    
    
    
    
    #aia
    class FAST_OT_ImportActionToCurrentAction(bpy.types.Operator):
        bl_idname = "fast.import_action_to_current_action"
        bl_label = "Import to Current Action"
        bl_options = {"REGISTER", "UNDO"}
    
        @classmethod
        def description(cls, context, event):
            manager = bpy.context.preferences.addons[__name__].preferences.Prop
            if manager.verbose_tooltip:
                return (
                    "Import an action and audio and append it to the current active action,\n\n"
                    "at the current frame in the timeline...set first & last frame & FPS below.\n\n"
                    "add one Pose Preset to DAZ_STUDIO_SAVE/POSE directory.\n\n"
                    "add one audio file ('wav', 'mp3', 'ogg') to DAZ_STUDIO_SAVE/AUDIO directory.\n\n"
                    "Files are not moved/backed up to zip-file like DIFFEOMORPHIC_IMPORT,\n\n"
                    "but are moved to their respective .temp when you run DIFFEOMORPHIC_IMPORT, RE-IMPORT.\n\n"
                    "As a result, you can keep clicking the button and add animation/audio multiple places"
                )
            else:
                return "Import action from DAZ_STUDIO_SAVE/POSE & audio from DAZ_STUDIO_SAVE/AUDIO to current action/current frame"
    
    
        def execute(self, context):
    
            manager = context.preferences.addons[__name__].preferences.Prop
            manager.monitor_daz_studio_save_directory = False
    
            fps = float(manager.diffeomorphic_fps)
            first_frame = int(manager.diffeomorphic_first_frame)
            last_frame = int(manager.diffeomorphic_last_frame)
    
            scripts_path = bpy.utils.resource_path('USER')
            addon_folder = "FAST"
    
            # Base directory for addon
            base_addon_directory = os.path.join(scripts_path, "scripts", "addons", addon_folder)
    
            # Construct the various directory paths
            pose_save_directory_path = os.path.join(base_addon_directory, "daz_studio_save")
    
            # Ensure pose directory exists, if not create it
            pose_dir = os.path.join(pose_save_directory_path, 'pose')
            if not os.path.exists(pose_dir):
                os.makedirs(pose_dir)
    
            # Obtain the list of DUF files in pose_dir
            pose_files = [f for f in os.listdir(pose_dir) if f.lower().endswith(".duf")]
            if len(pose_files) != 1:
                self.report({'ERROR'}, "Multiple or no pose files found. Expected only one pose file in the directory.")
                return {'CANCELLED'}
    
            action_file_path = os.path.join(pose_dir, pose_files[0])
    
            try:
                result = bpy.ops.fast.attempt_import_daz()
                if 'CANCELLED' in result:
                    return {'CANCELLED'}
    
                try:
                    import import_daz
                except ModuleNotFoundError:
                    self.report({'ERROR'}, "The 'import_daz' module was not found!")
                    return {'CANCELLED'}
    
                # Set the action file for DAZ importer
                import_daz.set_selection([action_file_path])
    
                # Import the action
                bpy.ops.daz.import_action(
                    makeNewAction=False,
                    actionName=manager.diffeomorphic_action_name,
                    fps=fps,
                    atFrameOne=False,
                    firstFrame=first_frame,
                    lastFrame=last_frame
                )
    
                # Assuming the audio directory is named "audio" and is located inside the "daz_studio_save" directory
                audio_directory_path = os.path.join(base_addon_directory, "daz_studio_save", "audio")  
    
                audio_check, audio_path = check_audio_directory(audio_directory_path)
    
                if audio_check:
                    playhead_position = bpy.context.scene.frame_current
                    add_audio_to_sequencer_for_action_import(audio_path, playhead_position)
                else:
                    self.report({'INFO'}, "Noticed either no audio or multiple audio files. If you're okay without audio, so are we!")
    
            except ModuleNotFoundError:
                self.report({'ERROR'}, "The 'import_daz' module was not found!")
                return {'CANCELLED'}
            except Exception as e:
                traceback.print_exc()
                self.report({'ERROR'}, str(e))
                return {'CANCELLED'}
    
            return {'FINISHED'}
    
    
    
    and thank you more than anything for making it all possible
    

  14. Log in to comment