Scripts de arquivo e automação no C4D
Organizar pastas, renomear arquivos, mover renders, automatizar tarefas repetitivas no C4D — Python resolve tudo isso em poucas linhas. Aqui estão os scripts que uso mais.
Renomear sequência de frames
import osimport glob
def renomear_sequencia(pasta, prefixo_novo, extensao=".exr"): arquivos = sorted(glob.glob(os.path.join(pasta, f"*{extensao}")))
for i, arquivo in enumerate(arquivos): nome_novo = f"{prefixo_novo}_{i:04d}{extensao}" destino = os.path.join(pasta, nome_novo) os.rename(arquivo, destino) print(f"OK: {os.path.basename(arquivo)} renomeado para {nome_novo}")
# uso:renomear_sequencia("/renders/cena01", "render_final")Organizar renders por cena
import osimport shutilimport re
def organizar_renders(pasta_origem, pasta_destino): for arquivo in os.listdir(pasta_origem): if not arquivo.endswith(('.exr', '.png', '.jpg')): continue
match = re.match(r'(sc\d+)', arquivo) if match: cena = match.group(1) pasta_cena = os.path.join(pasta_destino, cena) os.makedirs(pasta_cena, exist_ok=True) shutil.move( os.path.join(pasta_origem, arquivo), os.path.join(pasta_cena, arquivo) ) print(f"Movido: {arquivo} para {cena}/")
organizar_renders("/renders/misturado", "/renders/organizado")Verificar frames faltando
import os
def verificar_sequencia(pasta, prefixo, extensao=".exr", inicio=1, fim=240): faltando = [] for frame in range(inicio, fim + 1): nome = f"{prefixo}.{frame:04d}{extensao}" caminho = os.path.join(pasta, nome) if not os.path.exists(caminho): faltando.append(frame)
if faltando: print(f"FALTANDO {len(faltando)} frames: {faltando}") else: print(f"OK — todos os {fim - inicio + 1} frames presentes")
return faltando
verificar_sequencia("/renders/cena01", "render", inicio=1, fim=240)Converter ProRes para H.264 em batch
import osimport subprocessimport glob
def batch_converter(pasta, extensao_entrada=".mov", crf=18): arquivos = glob.glob(os.path.join(pasta, f"*{extensao_entrada}"))
for entrada in arquivos: saida = entrada.replace(extensao_entrada, "_web.mp4")
if os.path.exists(saida): print(f"Ja existe: {os.path.basename(saida)}") continue
print(f"Convertendo: {os.path.basename(entrada)}")
subprocess.run([ "ffmpeg", "-i", entrada, "-c:v", "libx264", "-crf", str(crf), "-preset", "slow", "-pix_fmt", "yuv420p", "-movflags", "+faststart", saida ], check=True)
print(f"Concluido: {os.path.basename(saida)}")
batch_converter("/entregas/v2")Automação no C4D: renomear objetos em batch
import c4d
def rename_objects(): doc = c4d.documents.GetActiveDocument() selected = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
if not selected: c4d.gui.MessageDialog("Selecione ao menos um objeto.") return
app.beginUndoGroup() for i, obj in enumerate(selected): doc.AddUndo(c4d.UNDOTYPE_CHANGE_NOCHILDREN, obj) obj.SetName(f"Elemento_{i+1:03d}") app.endUndoGroup()
c4d.EventAdd() print(f"{len(selected)} objetos renomeados.")
rename_objects()Aplicar material a objetos selecionados (C4D)
import c4d
def apply_material_to_selected(): doc = c4d.documents.GetActiveDocument()
# pega o primeiro material da cena mat = doc.GetFirstMaterial() if not mat: c4d.gui.MessageDialog("Nenhum material encontrado.") return
selected = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
app.beginUndoGroup() for obj in selected: tag = obj.MakeTag(c4d.Ttexture) tag[c4d.TEXTURETAG_MATERIAL] = mat doc.AddUndo(c4d.UNDOTYPE_NEWOBJ, tag) app.endUndoGroup()
c4d.EventAdd()
apply_material_to_selected()Criar objetos a partir de CSV (C4D)
import c4dimport csv
def create_from_csv(csv_path): doc = c4d.documents.GetActiveDocument()
with open(csv_path, newline='') as f: reader = csv.DictReader(f)
app.beginUndoGroup() for row in reader: obj = c4d.BaseObject(c4d.Ocube) obj.SetName(row['name']) obj.SetAbsPos(c4d.Vector( float(row['x']), float(row['y']), float(row['z']) )) doc.InsertObject(obj) doc.AddUndo(c4d.UNDOTYPE_NEWOBJ, obj) app.endUndoGroup()
c4d.EventAdd()
# CSV esperado: name,x,y,zcreate_from_csv('/tmp/objects.csv')Info
Para exportar variações de render com cores diferentes no C4D, veja o script export_variations() que itera sobre uma lista de c4d.Vector de cores e usa c4d.documents.RenderDocument().