Skip to main content

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 os
import 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 os
import shutil
import 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 os
import subprocess
import 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 c4d
import 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,z
create_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().