Files
HartOMat/plan.md
T
Hartmut 47b5d42bb5 refactor(P1): M1 dead code removal + M3 blender_render.py split
M1 — dead code removed:
- Delete blender-renderer/ and threejs-renderer/ source files
- Remove PIL/Pillow fallback block from step_processor.py
  (_generate_thumbnail_placeholder, _finalise_image JPG path)
- Remove stl_quality param from render_blender.py, render_still_task,
  render_turntable_task (was always "low"; hardcode deflection values)
- render_turntable_task now reads scene_linear/angular_deflection from
  system_settings (consistent with export_glb.py pipeline)

M3 — blender_render.py split from 263 → 68 lines:
- _blender_args.py: parse_args() — all 25 positional + named args
- _blender_scene_setup.py: setup_scene() — MODE A/B including USD import
- _blender_render_config.py: configure_and_render() — engine + output

Post-review fixes:
- _db_engine.dispose() after settings read in render_turntable_task
- _finalise_image() fmt param removed (always PNG; PIL never installed)
- _blender_import.py committed together with new submodules to satisfy
  import_usd_file dependency

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 12:54:40 +01:00

89 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Plan: P1 Remaining Cleanup — M1 Dead Code + M3 blender_render.py Split
## Context
Three categories of cleanup:
1. **M1a**: Two legacy HTTP renderer directories (`blender-renderer/`, `threejs-renderer/`) still exist in repo root despite the services being removed in Phase A.
2. **M1b**: Dead code in backend services — PIL fallback in `step_processor.py`, `stl_quality` param (always "low") in `render_blender.py` and `domains/rendering/tasks.py`.
3. **M3**: `render-worker/scripts/blender_render.py` is 263 lines (target < 80) — argparse, scene setup, and render config should move to submodules.
`domains/rendering/tasks.py` is **NOT dead code** — contains 6 active Celery tasks (`render_still_task`, `render_turntable_task`, `render_order_line_still_task`, `export_gltf_for_order_line_task`, `export_blend_for_order_line_task`, `apply_asset_library_materials_task`). Only the `stl_quality` param needs removal.
## Affected Files
- `blender-renderer/` — delete entire directory
- `threejs-renderer/` — delete entire directory
- `backend/app/services/step_processor.py` — remove PIL fallback block (~line 565)
- `backend/app/services/render_blender.py` — remove `stl_quality` param from `_glb_from_step()`, `render_still()`, `render_turntable_to_file()`
- `backend/app/domains/rendering/tasks.py` — remove `stl_quality` param from `render_still_task`, `render_turntable_task`
- `render-worker/scripts/blender_render.py` — thin to < 80 lines
- `render-worker/scripts/_blender_args.py` — new file (argument parsing)
- `render-worker/scripts/_blender_scene_setup.py` — new file (MODE A/B scene setup)
- `render-worker/scripts/_blender_render_config.py` — new file (engine + output config)
## Tasks (in order)
### [x] Task 1: Delete legacy renderer directories
- **File**: `blender-renderer/`, `threejs-renderer/` (repo root)
- **What**: `git rm -rf blender-renderer/ threejs-renderer/` — removes both legacy HTTP service directories superseded by the Celery render-worker in Phase A
- **Acceptance gate**: `ls blender-renderer/ threejs-renderer/` both return "no such file or directory"
- **Dependencies**: none
- **Risk**: Low — not imported by any active pipeline code
### [x] Task 2: Remove PIL fallback from step_processor.py
- **File**: `backend/app/services/step_processor.py`
- **What**: Find `from PIL import Image` (~line 565, inside `_generate_thumbnail()`) and the PIL thumbnail generation conditional branch. Remove the import and the branch — leave only the render-worker path.
- **Acceptance gate**: `grep -n "PIL\|Pillow" backend/app/services/step_processor.py` returns nothing
- **Dependencies**: none
- **Risk**: Low — PIL path unreachable; render-worker handles all thumbnails
### [x] Task 3: Remove stl_quality param from render_blender.py
- **File**: `backend/app/services/render_blender.py`
- **What**:
- `_glb_from_step(step_path, output_dir, quality="low")``_glb_from_step(step_path, output_dir)` — hardcode the low-quality deflection values inline (no conditional on quality)
- Remove `stl_quality: str = "low"` from `render_still(...)` and `render_turntable_to_file(...)`
- Remove all internal `quality=stl_quality` pass-throughs
- **Acceptance gate**: `grep -n "stl_quality" backend/app/services/render_blender.py` returns nothing
- **Dependencies**: none (Task 4 updates callers)
- **Risk**: Medium — callers in tasks.py pass `stl_quality`; update in Task 4 immediately after
### [x] Task 4: Remove stl_quality param from domains/rendering/tasks.py
- **File**: `backend/app/domains/rendering/tasks.py`
- **What**:
- `render_still_task` (~line 48): remove `stl_quality: str = "low"` from signature and from the `render_still(...)` call
- `render_turntable_task` (~line 152): remove `stl_quality: str = "low"` from signature. Lines ~210228 inline OCC GLB generation reads `stl_quality` to choose deflection values — replace hardcoded quality-based values with DB settings reads (`scene_linear_deflection`, `scene_angular_deflection`). Pattern to follow: `export_glb.py` reads these settings via `sys_settings.get("scene_linear_deflection", 0.03)`.
- **Acceptance gate**: `grep -n "stl_quality" backend/app/domains/rendering/tasks.py` returns nothing
- **Dependencies**: Task 3
- **Risk**: Medium — inline tessellation block must correctly read DB settings; verify key names match migration 062 output
### [x] Task 5: Extract _blender_args.py
- **File**: `render-worker/scripts/blender_render.py`, new `render-worker/scripts/_blender_args.py`
- **What**: Move the `argparse` block (lines ~44110, ~67 lines) into `_blender_args.py` as a `parse_args()` function. `blender_render.py` calls `from _blender_args import parse_args` and uses `args = parse_args()`.
- **Acceptance gate**: `_blender_args.py` exists with the parser; `blender_render.py` line count drops by ~60
- **Dependencies**: none
- **Risk**: Low — pure refactor, no logic change
### [x] Task 6: Extract _blender_scene_setup.py
- **File**: `render-worker/scripts/blender_render.py`, new `render-worker/scripts/_blender_scene_setup.py`
- **What**: Move the MODE A / MODE B scene setup branches (lines ~131214, ~84 lines) into `_blender_scene_setup.py` as `setup_scene(args, scene)` (dispatches internally to mode A or B based on `args.blend_template`). Import and call in `blender_render.py`.
- **Acceptance gate**: `_blender_scene_setup.py` exists; `blender_render.py` line count drops by ~80
- **Dependencies**: Task 5
- **Risk**: Low — pure refactor; `bpy` available in Blender Python context
### [x] Task 7: Extract _blender_render_config.py and verify ≤ 80 lines
- **File**: `render-worker/scripts/blender_render.py`, new `render-worker/scripts/_blender_render_config.py`
- **What**: Move engine/render settings + output path logic (lines ~216258, ~43 lines) into `_blender_render_config.py` as `configure_render(scene, args, output_path, gpu_type)`. After extraction, `blender_render.py` must be ≤ 80 lines.
- **Acceptance gate**: `wc -l render-worker/scripts/blender_render.py` shows ≤ 80
- **Dependencies**: Task 6
- **Risk**: Low — pure refactor
## Migration Check
No new Alembic migration required. Task 4 reads existing keys (`scene_linear_deflection`, `scene_angular_deflection`) from the `system_settings` table, already present after migration 062.
## Order Recommendation
Tasks 1 and 2 are independent — can run in parallel.
Tasks 3 and 4 are coupled — run 3 immediately before 4.
Tasks 5, 6, 7 are sequential — each further reduces blender_render.py line count.
## Risks / Open Questions
- `render_turntable_task` inline tessellation: confirm exact key names are `scene_linear_deflection` / `scene_angular_deflection` (not the old `gltf_preview_*` names) by reading `export_glb.py` before Task 4.
- After Task 7, do a smoke-test render to confirm submodule imports work inside Blender's Python interpreter.