HANSOL
Fix landform animations: barchan, U-valley, volcanoes, lava plateau; add Lab page, zone overlay
857bbdd | import numpy as np | |
| import math | |
| from .grid import WorldGrid | |
| from .fluids import HydroKernel | |
| from .erosion_process import ErosionProcess | |
| class ScriptExecutor: | |
| """ | |
| ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ ์คํ ์์ง | |
| ๋ณด์์ ์ํด ์ ํ๋ ํ๊ฒฝ์์ Python ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. | |
| """ | |
| def __init__(self, grid: WorldGrid): | |
| self.grid = grid | |
| self.hydro = HydroKernel(grid) | |
| self.erosion = ErosionProcess(grid) | |
| def execute(self, script: str, dt: float = 1.0, allowed_modules: list = ['numpy', 'math']): | |
| """ | |
| ์คํฌ๋ฆฝํธ ์คํ | |
| Args: | |
| script: ์คํํ Python ์ฝ๋ ๋ฌธ์์ด | |
| dt: ์๊ฐ ๊ฐ๊ฒฉ (Time Step) | |
| allowed_modules: ํ์ฉํ ๋ชจ๋ ๋ฆฌ์คํธ (๊ธฐ๋ณธ: numpy, math) | |
| Available Variables in Context: | |
| - grid: WorldGrid ๊ฐ์ฒด | |
| - elevation: grid.elevation (Numpy Array) | |
| - bedrock: grid.bedrock | |
| - sediment: grid.sediment | |
| - water_depth: grid.water_depth | |
| - dt: Delta Time | |
| - np: numpy module | |
| - math: math module | |
| - hydro: HydroKernel ๊ฐ์ฒด | |
| - erosion: ErosionProcess ๊ฐ์ฒด | |
| """ | |
| # 1. ์คํ ์ปจํ ์คํธ(Namespace) ์ค๋น | |
| context = { | |
| 'grid': self.grid, | |
| 'elevation': self.grid.elevation, | |
| 'bedrock': self.grid.bedrock, | |
| 'sediment': self.grid.sediment, | |
| 'water_depth': self.grid.water_depth, | |
| 'dt': dt, | |
| 'np': np, | |
| 'math': math, | |
| 'hydro': self.hydro, | |
| 'erosion': self.erosion, | |
| # Helper functions | |
| 'max': max, | |
| 'min': min, | |
| 'abs': abs, | |
| 'pow': pow, | |
| 'print': print, # ๋๋ฒ๊น ์ฉ | |
| 'range': range, | |
| 'len': len, | |
| 'int': int, | |
| 'float': float, | |
| 'round': round, | |
| 'sum': sum, | |
| 'enumerate': enumerate, | |
| 'zip': zip, | |
| 'list': list, | |
| 'tuple': tuple, | |
| 'dict': dict, | |
| 'set': set, | |
| 'str': str, | |
| 'bool': bool, | |
| 'True': True, | |
| 'False': False, | |
| 'None': None, | |
| } | |
| # 2. ๊ธ์ง๋ ํค์๋ ์ฒดํฌ (๊ธฐ๋ณธ์ ์ธ ๋ณด์) | |
| # ์๋ฒฝํ ์๋๋ฐ์ค๋ ์๋์ง๋ง, ์ค์ ๋ฐฉ์ง์ฉ | |
| forbidden = ['import os', 'import sys', 'open(', 'exec(', 'eval(', '__import__'] | |
| for bad in forbidden: | |
| if bad in script: | |
| raise ValueError(f"๋ณด์ ๊ฒฝ๊ณ : ํ์ฉ๋์ง ์๋ ํค์๋ '{bad}'๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.") | |
| # 3. ์ฝ๋ ์คํ | |
| try: | |
| exec(script, {"__builtins__": {}}, context) | |
| # 4. ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์ (Elevation์ derived property์ง๋ง, ์ง์ ์์ ํ์ ์ ์์ผ๋ฏ๋ก) | |
| # ์ฌ์ฉ์๊ฐ elevation์ ์์ ํ๋ค๋ฉด bedrock/sediment ์ ๋ฐ์ดํธ๊ฐ ๋ชจํธํด์ง. | |
| # Grid ํด๋์ค์ update_elevation()์ bedrock+sediment -> elevation์ด๋ฏ๋ก, | |
| # ์ฌ์ฉ์๊ฐ elevation์ ์์ ํ๋ฉด ๋ฌด์๋ ์ ์์. | |
| # ๊ฐ์ด๋: "bedrock"์ด๋ "sediment"๋ฅผ ์์ ํ์ธ์. | |
| # ํ์ง๋ง ํธ์๋ฅผ ์ํด elevation์ด ๋ฐ๋์์ผ๋ฉด bedrock์ ๋ฐ์ํ๋ ๋ก์ง ์ถ๊ฐ | |
| # ๋ณ๊ฒฝ ์ elevation๊ณผ ๋น๊ตํด์ผ ํ๋? | |
| # ์ผ๋จ grid.update_elevation()์ ํธ์ถํ์ฌ ๋๊ธฐํ | |
| # (๋ง์ฝ ์ฌ์ฉ์๊ฐ bedrock์ ๋ฐ๊ฟจ๋ค๋ฉด ๋ฐ์๋จ) | |
| self.grid.update_elevation() | |
| return True, "์คํ ์ฑ๊ณต" | |
| except Exception as e: | |
| return False, f"์คํ ์ค๋ฅ: {str(e)}" | |