2025-09-10 11:33:02 -06:00
|
|
|
@echo off
|
|
|
|
|
setlocal enabledelayedexpansion
|
|
|
|
|
|
|
|
|
|
echo Starting fake user removal for actions...
|
|
|
|
|
|
|
|
|
|
REM Check if files were dragged onto the batch file
|
|
|
|
|
if "%~1"=="" (
|
|
|
|
|
echo.
|
|
|
|
|
echo Usage: Drag .blend files onto this batch file to remove fake users from actions.
|
|
|
|
|
echo Output will be saved to the \output folder.
|
|
|
|
|
echo.
|
|
|
|
|
pause
|
|
|
|
|
exit /b 1
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
REM Create output directory if it doesn't exist
|
|
|
|
|
if not exist "output" mkdir "output"
|
|
|
|
|
|
|
|
|
|
REM Initialize counters and tracking
|
|
|
|
|
set "processed=0"
|
|
|
|
|
set "crashed=0"
|
|
|
|
|
set "skipped=0"
|
2025-09-10 11:41:11 -06:00
|
|
|
set "deleted_similar=0"
|
|
|
|
|
set "threshold_percent=10"
|
2025-09-10 11:33:02 -06:00
|
|
|
set "updated_total=0"
|
|
|
|
|
|
|
|
|
|
REM Create a temporary Python script for processing
|
|
|
|
|
set "TEMP_SCRIPT=remove_action_fake_users_temp.py"
|
|
|
|
|
echo Creating Python script: !TEMP_SCRIPT!
|
|
|
|
|
|
|
|
|
|
(
|
|
|
|
|
echo import bpy
|
|
|
|
|
echo import os
|
|
|
|
|
echo import sys
|
|
|
|
|
echo.
|
|
|
|
|
echo # Create output directory if it doesn't exist
|
|
|
|
|
echo if not os.path.exists^("output"^):
|
|
|
|
|
echo os.makedirs^("output"^)
|
|
|
|
|
echo.
|
|
|
|
|
echo # Get command line arguments ^(the dragged files^)
|
|
|
|
|
echo blend_files = sys.argv[sys.argv.index^("--"^) + 1:] if "--" in sys.argv else []
|
|
|
|
|
echo.
|
|
|
|
|
echo print^("Found " + str^(len^(blend_files^)^) + " .blend files to process"^)
|
|
|
|
|
echo.
|
|
|
|
|
echo for blend_file in blend_files:
|
|
|
|
|
echo ^ if blend_file.lower^(^).endswith^(".blend"^):
|
|
|
|
|
echo ^ try:
|
|
|
|
|
echo ^ # Create output path in output folder
|
|
|
|
|
echo ^ filename = os.path.basename^(blend_file^)
|
|
|
|
|
echo ^ output_file = os.path.join^("output", filename^)
|
|
|
|
|
echo ^ # Check if output file already exists
|
|
|
|
|
echo ^ if os.path.exists^(output_file^):
|
|
|
|
|
echo ^ print^("SKIP_EXISTING:" + blend_file^)
|
|
|
|
|
echo ^ continue
|
|
|
|
|
echo ^ print^("PROCESSING:" + blend_file^)
|
|
|
|
|
echo ^ # Load the blend file
|
|
|
|
|
echo ^ bpy.ops.wm.open_mainfile^(filepath=blend_file^)
|
|
|
|
|
echo ^ # Remove fake users from all actions
|
|
|
|
|
echo ^ changed = 0
|
|
|
|
|
echo ^ for action in bpy.data.actions:
|
|
|
|
|
echo ^ if getattr^(action, "use_fake_user", False^):
|
|
|
|
|
echo ^ action.use_fake_user = False
|
|
|
|
|
echo ^ changed += 1
|
|
|
|
|
echo ^ print^("UPDATED:" + blend_file + ":" + str^(changed^)^)
|
|
|
|
|
echo ^ # Save to output folder
|
|
|
|
|
echo ^ bpy.ops.wm.save_mainfile^(filepath=output_file, compress=True^)
|
|
|
|
|
echo ^ print^("SUCCESS:" + blend_file + ":" + output_file^)
|
|
|
|
|
echo ^ except Exception as e:
|
|
|
|
|
echo ^ print^("CRASH:" + blend_file + ":" + str^(e^)^)
|
|
|
|
|
echo ^ else:
|
|
|
|
|
echo ^ print^("SKIP_NOT_BLEND:" + blend_file^)
|
|
|
|
|
echo.
|
|
|
|
|
echo print^("FAKE_USER_REMOVAL_COMPLETE"^)
|
|
|
|
|
echo bpy.ops.wm.quit_blender^(^)
|
|
|
|
|
) > "!TEMP_SCRIPT!"
|
|
|
|
|
|
|
|
|
|
REM Check if script was created successfully
|
|
|
|
|
if exist "!TEMP_SCRIPT!" (
|
|
|
|
|
echo Script created successfully: !TEMP_SCRIPT!
|
|
|
|
|
) else (
|
|
|
|
|
echo ERROR: Failed to create script file!
|
|
|
|
|
pause
|
|
|
|
|
exit /b 1
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
REM Run Blender to process the dragged files
|
|
|
|
|
echo Processing dragged .blend files...
|
|
|
|
|
echo Using script: !TEMP_SCRIPT!
|
2025-09-17 13:22:51 -06:00
|
|
|
del /f /q "blender_output.txt" 2>nul
|
2025-09-10 11:33:02 -06:00
|
|
|
blender --background --factory-startup --python "!TEMP_SCRIPT!" -- %* 2^>^&1 | powershell -NoProfile -Command "$input | Tee-Object -FilePath 'blender_output.txt'"
|
|
|
|
|
|
|
|
|
|
REM Clean up temporary script
|
|
|
|
|
echo Cleaning up temporary script...
|
|
|
|
|
del "!TEMP_SCRIPT!" 2>nul
|
|
|
|
|
|
|
|
|
|
REM Parse output and generate report
|
|
|
|
|
echo.
|
|
|
|
|
echo ========================================
|
|
|
|
|
echo ACTION FAKE USER REMOVAL REPORT
|
|
|
|
|
echo ========================================
|
|
|
|
|
echo.
|
|
|
|
|
|
|
|
|
|
REM Track updated counts per file during parse
|
|
|
|
|
for /f "tokens=1,2,3 delims=:" %%a in (blender_output.txt) do (
|
|
|
|
|
if "%%a"=="SUCCESS" (
|
|
|
|
|
set /a processed+=1
|
|
|
|
|
echo [!processed!] SUCCESS: %%b
|
|
|
|
|
echo Saved to: %%c
|
2025-09-10 11:41:11 -06:00
|
|
|
REM Compare sizes and delete if reduction < threshold
|
|
|
|
|
for %%f in ("%%b") do set "original_size=%%~zf"
|
|
|
|
|
for %%f in ("%%c") do set "compressed_size=%%~zf"
|
|
|
|
|
set /a savings=original_size-compressed_size
|
|
|
|
|
if !original_size! gtr 0 (set /a percent=(savings*100)/original_size) else (set percent=0)
|
|
|
|
|
echo Original: !original_size! bytes
|
|
|
|
|
echo Output: !compressed_size! bytes
|
|
|
|
|
echo Reduction: !percent!%%
|
|
|
|
|
if !percent! lss !threshold_percent! (
|
|
|
|
|
del "%%c" 2>nul
|
|
|
|
|
set /a deleted_similar+=1
|
|
|
|
|
echo Deleted: too similar to original
|
|
|
|
|
)
|
2025-09-10 11:33:02 -06:00
|
|
|
echo.
|
|
|
|
|
) else if "%%a"=="CRASH" (
|
|
|
|
|
set /a crashed+=1
|
|
|
|
|
echo [!crashed!] CRASHED: %%b
|
|
|
|
|
echo Error: %%c
|
|
|
|
|
echo.
|
|
|
|
|
) else if "%%a"=="SKIP_EXISTING" (
|
|
|
|
|
set /a skipped+=1
|
|
|
|
|
echo [!skipped!] SKIPPED ^(already exists^): %%b
|
|
|
|
|
echo.
|
|
|
|
|
) else if "%%a"=="SKIP_NOT_BLEND" (
|
|
|
|
|
set /a skipped+=1
|
|
|
|
|
echo [!skipped!] SKIPPED ^(not .blend^): %%b
|
|
|
|
|
echo.
|
|
|
|
|
) else if "%%a"=="UPDATED" (
|
|
|
|
|
REM Accumulate total updated actions
|
|
|
|
|
for /f "delims= tokens=1" %%x in ("%%c") do set "updated_in_file=%%x"
|
|
|
|
|
set /a updated_total+=updated_in_file
|
|
|
|
|
echo Updated actions: !updated_in_file!
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
REM Clean up output file
|
2025-09-10 11:43:23 -06:00
|
|
|
del /f /q "blender_output.txt" 2>nul
|
2025-09-10 11:33:02 -06:00
|
|
|
|
|
|
|
|
echo ========================================
|
|
|
|
|
echo SUMMARY
|
|
|
|
|
echo ========================================
|
|
|
|
|
echo Processed: !processed! files
|
|
|
|
|
echo Crashed: !crashed! files
|
|
|
|
|
echo Skipped: !skipped! files
|
2025-09-10 11:41:11 -06:00
|
|
|
echo Deleted ^(too similar^): !deleted_similar! files
|
2025-09-10 11:33:02 -06:00
|
|
|
echo Total actions updated: !updated_total!
|
|
|
|
|
echo Total: %* files
|
|
|
|
|
echo ========================================
|
|
|
|
|
echo.
|
|
|
|
|
echo Done!
|
|
|
|
|
pause
|
|
|
|
|
|
|
|
|
|
|