1
$\begingroup$

I'd like to automate files creation for short films production. I'm making the film storyboard with the storypencil add-on. For those who aren't familiar you're in a video sequence editor, where you're editing multiple scenes. In my case a shot = a blender scene. each blender scene is name with this pattern: sequence-number_scene-number_shot-number. It's like: 001_001_001 (sequence 1, scene 1, shot 1) 001_001_002 (sequence 1, scene 1, shot 2) 001_002_001 (sequence 1, scene 2, shot 1).

Once the storyboard is finished, I'd like to make a script that create a file for each blender scene in the storyboard file and set automatically file name, frame start, frame end, and render folder.

I'm starting with this:

import bpy
import os

filepath = bpy.data.filepath
directory = os.path.dirname(filepath)

#set path to storyboard file
sbfile = directory+"/storyboard_script.blend"

with bpy.data.libraries.load(sbfile) as (data_from, data_to):
    scenesData = data_from.scenes
    print (scenesData)
    for sc in scenesData:
        print (sc)

From here I can get file name only. I don't manage to get other info. I tried

print (sc.frame_start)

and get this error: "AttributeError: 'str' object has no attribute 'frame_start'" I'm only getting a list of the scene name, but not other scene datas I need.

$\endgroup$
4
  • $\begingroup$ the libraries.load api only allows you to read datablock names and append them to the data_to in order to tell Blender which to load. So you can't read datablock properties. You may want to investigate a tool like this: projects.blender.org/blender/blender-asset-tracer also related: How can I read the properties of a node group in a blend file? $\endgroup$ Commented Jan 26, 2024 at 12:11
  • $\begingroup$ I believe having multiple scenes in a single file is the intended functionality for this. Bpy cannot interact with files that are not open well. I would recommend reconsidering this workflow. You can have different assets in different files and link them to your scenes in a single file. Might be better to do things the way they are done. Lots of functionality for working this way exists and will make your life easier. I believe you can get Blender's open movie production files if you pay for subscription. You could explore how they do it. studio.blender.org/films $\endgroup$ Commented Jan 26, 2024 at 12:12
  • $\begingroup$ You'll need to open each file individually and tweak the scene data there $\endgroup$ Commented Jan 26, 2024 at 15:27
  • $\begingroup$ Markus, Martynas, Gorgious, Thank you all for your time and answer. I don't need to link any asset at the moment. I manage to do the work by exporting data from the storyboard file, then use this csv data in an empty blend file to create all the files I need. $\endgroup$ Commented Feb 1, 2024 at 7:33

1 Answer 1

0
$\begingroup$

I manage to do the work by adding some step

  • Draw the storyboard, 1 blender scene per shot
  • export data in a csv file from the storyboard file
  • open an empty file the launch a script that use the csv file to create all the files I need

storyboard script:

import bpy
import os
from pathlib import Path
import csv

#global_data

filepath = bpy.data.filepath
directory = os.path.dirname(filepath)

scriptsFolder = directory+"/scripts/"

    
if not os.path.exists(scriptsFolder):
    os.makedirs(scriptsFolder)
    

#create csv file
datafile = scriptsFolder+"film_data.csv"
open(datafile,"w")

#store scenes data
scenes_list = bpy.data.scenes

#for sc in scenes_list:
#    if sc.name != "Scene" and sc.name != "Template":
#        print(sc.name)
#        print(sc.frame_start)
#        print(sc.frame_end)

#write csv file
with open (datafile, 'w', newline='') as dataf:
    writer = csv.writer(dataf)
    for sc in scenes_list:
        if sc.name != "Scene" and sc.name != "Template":
            writer = csv.writer(dataf)
            writer.writerow([sc.name,sc.frame_start,sc.frame_end])

csv test file

001_001_001,1,250
001_001_002,1,450
001_002_001,1,100
import bpy
import os
from pathlib import Path
import csv


#global_data

filepath = bpy.data.filepath
directory = os.path.dirname(filepath)

filmID = "monFilm"
filmXres = 1920
filmYres = 1080
filmFrameRate = 24

#working step ws
ws1= "animation"
ws2= "compositing"


filmLocation = "/home/xxxxxxx/projets/film_pipeline/"
animationFilesFolder = filmLocation+ws1+"/"
compositingFilesFolder = filmLocation+ws2+"/"
scriptsFolder = filmLocation+"scripts/"
rendersFolder = filmLocation+"renders/"
renderAnimFolder = rendersFolder+ws1+"/"
renderCompFolder = rendersFolder+ws2+"/"



# create animation, compositing and scripts folder
if not os.path.exists(animationFilesFolder):
    os.makedirs(animationFilesFolder)
    
if not os.path.exists(compositingFilesFolder):
    os.makedirs(compositingFilesFolder)
    
if not os.path.exists(scriptsFolder):
    os.makedirs(scriptsFolder)
    
if not os.path.exists(rendersFolder):
    os.makedirs(rendersFolder)
    
if not os.path.exists(rendersFolder):
    os.makedirs(renderAnimFolder)
    
if not os.path.exists(rendersFolder):
    os.makedirs(renderCompFolder)

#set scene data
bpy.data.scenes["Scene"].render.resolution_x = filmXres
bpy.data.scenes["Scene"].render.resolution_y = filmXres
bpy.data.scenes["Scene"].render.fps = filmFrameRate 


#use csv to create files
tab =[]

def set_up_files (workingstep, rs1, rs2, rs3, rs4,ws):
    with open(directory+'/scripts/film_data.csv',newline='') as fdata:
        reader = csv.reader(fdata,delimiter=',')
        i = 0
        for row in reader:
            tab.append(row)
            bpy.data.scenes["Scene"].frame_start = int(tab[i][1])
            bpy.data.scenes["Scene"].frame_end = int(tab[i][2])
            fileName= filmID+"_"+workingstep+"_"+str(tab[i][0])+"_01"
            bpy.data.scenes["Scene"].render.filepath = "//renders/"+workingstep+"/"+str(fileName)+"/"+str(fileName)+"_"
            bpy.context.scene.render.image_settings.file_format = rs1
            bpy.context.scene.render.image_settings.color_depth = rs2
            bpy.context.scene.render.image_settings.exr_codec = rs3
            bpy.context.scene.render.image_settings.color_mode = rs4
            bpy.context.window.workspace = bpy.data.workspaces[ws]
            bpy.ops.wm.save_as_mainfile(filepath=filmLocation+workingstep+"/"+str(fileName)+".blend")
            i +=1

set_up_files(ws1, 'OPEN_EXR_MULTILAYER', '32', 'DWAA', 'RGBA', 'Layout')

set_up_files(ws2, 'OPEN_EXR', '32', 'DWAA', 'RGB', 'Compositing')

bpy.context.window.workspace = bpy.data.workspaces['Scripting']

bpy.ops.wm.save_as_mainfile(filepath=filepath)

        

I'm sure it could be improve a lot but as the beginner this the best I can do at the moment.

$\endgroup$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.