| import json | |
| from typing import Optional, Dict, Any, List, Tuple | |
| def create_instruction_description(instruction: Dict[str, Any]) -> str: | |
| parts = [] | |
| movement = instruction.get('cameraMovement') | |
| shot_type = instruction.get('initialShotType') | |
| frames = instruction.get('frameCount') | |
| subject_idx = instruction.get('subjectIndex') | |
| if movement and shot_type: | |
| parts.append(f"{movement} {shot_type}") | |
| elif movement: | |
| parts.append(f"{movement} shot") | |
| elif shot_type: | |
| parts.append(f"Static {shot_type}") | |
| if subject_idx is not None: | |
| parts.append(f"of subject {subject_idx}") | |
| if frames is not None: | |
| parts.append(f"lasting {frames} frames") | |
| if not parts: | |
| return "No camera instruction details available" | |
| return " ".join(parts) | |
| def load_simulation_data(file) -> Tuple[Optional[List[Dict[str, Any]]], Optional[List[str]]]: | |
| if file is None: | |
| return None, None | |
| try: | |
| json_data = json.load(open(file.name)) | |
| simulations = json_data['simulations'] | |
| descriptions = [] | |
| for i, sim in enumerate(simulations): | |
| header = f"Simulation {i + 1}" | |
| instruction_texts = [] | |
| for j, instruction in enumerate(sim['instructions']): | |
| inst_desc = create_instruction_description(instruction) | |
| instruction_texts.append(f" {j + 1}. {inst_desc}") | |
| full_description = f"{header}\n" + "\n".join(instruction_texts) | |
| subject_count = len(sim['subjects']) | |
| full_description = f"{full_description}\n ({subject_count} subjects)" | |
| descriptions.append(full_description) | |
| return simulations, descriptions | |
| except Exception as e: | |
| print(f"Error loading simulation data: {str(e)}") | |
| return None, None | |