79 lines
2.0 KiB
Markdown
79 lines
2.0 KiB
Markdown
# MzTranslator 架構設計
|
||
|
||
## 概述
|
||
使用 Maya Python API 建立一個 `.mz` 檔案格式的 Maya Translator 插件。
|
||
|
||
## .mz 檔案格式
|
||
- 本質是 ZIP 壓縮格式
|
||
- 內部包含 `data.ma` 文件(Maya ASCII 格式)
|
||
|
||
## 系統架構
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph Maya
|
||
A[Maya GUI] -->|另存為/開啟| B[mz_translator.py]
|
||
end
|
||
|
||
subgraph Core
|
||
B --> D[mz_writer]
|
||
B --> E[mz_reader]
|
||
end
|
||
|
||
subgraph FileSystem
|
||
D --> F[.mz]
|
||
E --> F
|
||
end
|
||
```
|
||
|
||
## 實現步驟
|
||
|
||
### 1. 文件結構
|
||
|
||
```
|
||
d:/workspace/MzTranslator/
|
||
├── mz_translator.py # 插件入口,包含 MPxFileTranslator 和插件註冊
|
||
└── mz_core/
|
||
├── __init__.py # 模組初始化
|
||
├── reader.py # 讀取模組
|
||
└── writer.py # 寫入模組
|
||
```
|
||
|
||
### 2. mz_translator.py
|
||
- 繼承 `maya.api.MPxFileTranslator`
|
||
- 包含 `initializePlugin()` 和 `uninitializePlugin()` 函數
|
||
- `writer(fileObject, options)`: 調用 mz_writer
|
||
- `reader(fileObject, options)`: 調用 mz_reader
|
||
- `haveWriteSupport()` / `haveReadSupport()`: 返回 True
|
||
- `fileType()` / `defaultExtension()`: 返回 "mz"
|
||
- `optionsScript()`: Export Options UI
|
||
|
||
### 3. MzTranslator/mz/core/mz_writer.py
|
||
- `write_to_mz(filePath, options)`: 將 Maya 場景寫入 .mz
|
||
- 內部調用 Maya API 寫入 temp data.ma
|
||
- 使用 zipfile 壓縮成 .mz
|
||
|
||
### 4. MzTranslator/mz/core/mz_reader.py
|
||
- `read_from_mz(filePath, buffer)`: 從 .mz 讀取
|
||
- 使用 zipfile 解壓縮
|
||
- 讀取到內存緩衝區
|
||
|
||
### 5. Export Options 對話框
|
||
- 版本號
|
||
- 壓縮等級
|
||
|
||
## 技術要點
|
||
|
||
1. **MPxFileTranslator 繼承**: 使用 `maya.app.audio.MPxFileTranslator`
|
||
|
||
2. **Stream I/O**: reader 使用 buffer/stream 讀取
|
||
|
||
3. **臨時文件管理**: 使用 `tempfile` 模組
|
||
|
||
4. **Error Handling**: 處理各種異常情況
|
||
|
||
## 預期行為
|
||
|
||
- **保存**: Maya 另存為 → 選擇 .mz → 導出到 temp data.ma → 壓縮成 .mz
|
||
- **開啟**: 選擇 .mz 文件 → 解壓讀取 data.ma → 加載到 Maya
|