Files
ProjectStructure_HOME/.specstory/history/2025-08-15_18-13Z-make-file-input-draggable.md
2025-08-15 12:21:45 -06:00

9.0 KiB

Make file input draggable (2025-08-15 18:13Z)

User

can we make this draggable so the input are the file(s) dragged onto it, and the output still goes to \output ?


Assistant

I'll modify the batch file to make it draggable so you can drag .blend files onto it, and it will process those specific files while still outputting to the \output folder.


Edit file: compress_blend_files.bat

I'm modifying the batch file to accept dragged files as input instead of processing all files in an input folder, while keeping the output to the \output directory.

Chunk 1 Lines added: 11, lines removed: 2

@@ -4,6 +4,15 @@
  echo Starting Blender file compression...
  
- REM Create input and output directories if they don't exist
- if not exist "input" mkdir "input"
+ REM Check if files were dragged onto the batch file
+ if "%~1"=="" (
+     echo.
+     echo Usage: Drag .blend files onto this batch file to compress them.
+     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"
  

Chunk 2 Lines added: 23, lines removed: 22

@@ -14,38 +23,39 @@
  echo import bpy
  echo import os
- echo import glob
+ echo import sys
  echo.
  echo # Enable compression globally
  echo bpy.context.preferences.filepaths.save_version = 0
  echo bpy.context.preferences.filepaths.use_file_compression = True
  echo.
- echo # Create input and output directories if they don't exist
- echo if not os.path.exists^("input"^):
- echo     os.makedirs^("input"^)
+ echo # Create output directory if it doesn't exist
  echo if not os.path.exists^("output"^):
  echo     os.makedirs^("output"^)
  echo.
- echo # Get all .blend files in input directory
- echo blend_files = glob.glob^("input/*.blend"^)
+ 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 compress"^)
  echo.
  echo for blend_file in blend_files:
- 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^("Skipping " + blend_file + " ^(already exists in output^)"^)
- echo             continue
- echo         print^("Processing: " + blend_file^)
- echo         # Load the blend file
- echo         bpy.ops.wm.open_mainfile^(filepath=blend_file^)
- echo         # Save with compression to output folder
- echo         bpy.ops.wm.save_mainfile^(filepath=output_file, compress=True^)
- echo         print^("Successfully compressed: " + blend_file + " -^> " + output_file^)
- echo     except Exception as e:
- echo         print^("Failed to compress " + blend_file + ": " + str^(e^)^)
+ 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^("Skipping " + blend_file + " ^(already exists in output^)"^)
+ echo                 continue
+ echo             print^("Processing: " + blend_file^)
+ echo             # Load the blend file
+ echo             bpy.ops.wm.open_mainfile^(filepath=blend_file^)
+ echo             # Save with compression to output folder
+ echo             bpy.ops.wm.save_mainfile^(filepath=output_file, compress=True^)
+ echo             print^("Successfully compressed: " + blend_file + " -^> " + output_file^)
+ echo         except Exception as e:
+ echo             print^("Failed to compress " + blend_file + ": " + str^(e^)^)
+ echo     else:
+ echo         print^("Skipping " + blend_file + " ^(not a .blend file^)"^)
  echo.
  echo print^("Compression complete!"^)

Chunk 3 Lines added: 3, lines removed: 3

@@ -62,8 +72,8 @@
  )
  
- REM Run Blender once to process all files
- echo Processing all .blend files in a single Blender instance...
+ REM Run Blender to process the dragged files
+ echo Processing dragged .blend files...
  echo Using script: !TEMP_SCRIPT!
- blender --background --factory-startup --python "!TEMP_SCRIPT!"
+ blender --background --factory-startup --python "!TEMP_SCRIPT!" -- %*
  
  REM Clean up temporary script

Perfect! I've modified the batch file to make it draggable. Here are the key changes:

  1. Drag-and-drop support: The script now checks if files were dragged onto it using %~1 (first command line argument)
  2. Usage instructions: If no files are dragged, it shows helpful usage information
  3. Command line processing: The Python script now reads the dragged files from sys.argv instead of scanning an input folder
  4. File validation: Only processes files with .blend extension
  5. Output unchanged: Still saves compressed files to the \output folder

Now you can:

  • Drag one or multiple .blend files onto the batch file
  • The script will process only those specific files
  • Compressed output still goes to the \output folder
  • If you run it without dragging files, it shows usage instructions

The script is much more convenient now - just drag your .blend files onto it and it will handle the compression automatically!


User

Starting Blender file compression... Creating Python script: compress_blend_temp.py import bpy import os import sys

Enable compression globally

bpy.context.preferences.filepaths.save_version = 0 bpy.context.preferences.filepaths.use_file_compression = True

Create output directory if it doesn't exist

if not os.path.exists("output"): os.makedirs("output")

Get command line arguments (the dragged files

blend_files = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []

print("Found " + str(len(blend_files)) + " .blend files to compress")

for blend_file in blend_files: if blend_file.lower().endswith(".blend"): try: # Create output path in output folder filename = os.path.basename(blend_file) output_file = os.path.join("output", filename) # Check if output file already exists if os.path.exists(output_file): print("Skipping " + blend_file + " ^(already exists in output^)") continue print("Processing: " + blend_file) # Load the blend file bpy.ops.wm.open_mainfile(filepath=blend_file) # Save with compression to output folder bpy.ops.wm.save_mainfile(filepath=output_file, compress=True) print("Successfully compressed: " + blend_file + " -^> " + output_file) except Exception as e: print("Failed to compress " + blend_file + ": " + str(e)) else: print("Skipping " + blend_file + " ^(not a .blend file^)")

print("Compression complete") bpy.ops.wm.quit_blender() ERROR: Failed to create script file Press any key to continue . . .


Assistant

I see the issue! The problem is with the escape characters in the batch file when creating the Python script. The ^ characters are being interpreted incorrectly. Let me fix this by properly escaping the Python code in the batch file.


Edit file: compress_blend_files.bat

I'm fixing the escape character issues in the Python script generation by properly handling the quotes and special characters in the batch file.

Chunk 1 Lines added: 1, lines removed: undefined

@@ -20,4 +20,5 @@
  set "TEMP_SCRIPT=compress_blend_temp.py"
  echo Creating Python script: !TEMP_SCRIPT!
+ 
  (
  echo import bpy

Chunk 2 Lines added: 1, lines removed: 1

@@ -33,5 +34,5 @@
  echo     os.makedirs^("output"^)
  echo.
- echo # Get command line arguments (the dragged files)
+ echo # Get command line arguments ^(the dragged files^)
  echo blend_files = sys.argv[sys.argv.index^("--"^) + 1:] if "--" in sys.argv else []
  echo.

The issue was with the escape characters in the batch file. I've fixed the Python script generation by properly escaping the parentheses and quotes. The key changes:

  1. Fixed escape characters: Changed ^( to ^( and ^) to ^) for proper escaping
  2. Added spacing: Added a blank line before the Python script generation for better readability
  3. Consistent escaping: Made sure all special characters are properly escaped

Now when you drag .blend files onto the batch file, it should:

  1. Successfully create the temporary Python script
  2. Process the dragged files
  3. Save compressed versions to the \output folder

Try dragging some .blend files onto it now - it should work without the "Failed to create script file" error!