# render_3d

## Что делает

Рендерит PNG-скриншоты ракурсов из STL-файла через OpenSCAD CLI.

**Требует:** OpenSCAD установлен в системе (`openscad` в PATH).

## Предпосылки

1. **STL-файл уже должен существовать.** Сгенерируйте его через `model_3d` заранее.
2. **OpenSCAD должен быть установлен.**

## Формат вызова

```python
render_3d(
    source="session_files/{session_id}/bracket.stl",
    views=["iso", "front", "top"]
)
```

## Параметры

| Параметр | Обязательно | Описание |
|---|---|---|
| `source` | Да | Путь к существующему `.stl`-файлу |
| `views` | Нет | Список ракурсов (макс. 3). Доступные: `front`, `back`, `top`, `bottom`, `left`, `right`, `iso`. По умолчанию `["iso"]`. |

## Доступные ракурсы

| Ракурс | Описание |
|---|---|
| `front` | Вид спереди |
| `back` | Вид сзади |
| `top` | Вид сверху |
| `bottom` | Вид снизу |
| `left` | Вид слева |
| `right` | Вид справа |
| `iso` | Изометрия (по умолчанию) |

## Workflow

### 1. Сгенерировать STL

```
model_3d(scad_path="...", output_path="...")
```

### 2. Отрендерить ракурсы

```
render_3d(
    source="session_files/sess-abc/bracket.stl",
    views=["iso", "front", "top"]
)
```

### 3. Показать пользователю

Каждый PNG сохраняется рядом с STL с суффиксом вида:
- `bracket.iso.png`
- `bracket.front.png`
- `bracket.top.png`

Опубликуйте каждый отдельно:

```
content_publish(filename="bracket.iso.png", title="Bracket — Isometric")
content_publish(filename="bracket.front.png", title="Bracket — Front")
content_publish(filename="bracket.top.png", title="Bracket — Top")
```

## Что возвращает

При успехе:
```
Generated 3 image(s):
  bracket.iso.png
  bracket.front.png
  bracket.top.png
```

При ошибке:
- `openscad_not_found` — OpenSCAD не установлен
- `stl_not_found` — исходный файл не найден
- `too_many_views` — больше 3 ракурсов за раз
- `invalid_views` — неизвестное имя ракурса
- `render_failed` — все рендеры не удались

## Важные правила

1. **Максимум 3 ракурса за вызов** — если нужно больше, разбейте на несколько вызовов.
2. **Фиксированное разрешение** — 400×300, не настраивается.
3. **PNG сохраняются рядом с STL** — в той же директории, с суффиксом ракурса.
4. **Всегда preview mode** — быстрый рендер, не полный CSG.
5. **Не склеивает в сетку** — каждый ракурс — отдельный файл. Нави сама публикует каждый через `content_publish`.
