EG/RenderPipelineFile/toolkit/import_sun_data/import_data.py
2026-02-25 14:56:09 +08:00

109 lines
3.3 KiB
Python

"""
This script downloads real world sun position data and imports them into the
pipelines time of day system.
(c) 2016 tobpsr
"""
from __future__ import print_function, division
# You can get this data from http://sunpath.azurewebsites.net/
CONFIG = {
"year": 2016,
"month": 7,
"day": 21,
"latitude": 50.778228759765625,
"longitude": 6.088640213012695,
"height": 167,
"precision": 6
}
if __name__ == "__main__":
import sys
import math
sys.path.insert(0, "../../")
from rplibs.six.moves import urllib # pylint: disable=import-error
CONFIG["end_day"] = CONFIG["day"]
API = "http://www.nrel.gov/midc/apps/spa.pl?syear={year}&smonth={month}&sday={day}&eyear={year}&emonth={month}&eday={end_day}&step={precision}&stepunit=1&latitude={latitude}&longitude={longitude}&timezone=%2B1&elev={height}&press=1013&temp=20&dut1=0.0&deltat=64.797&azmrot=180&slope=0&refract=0.5667&field=2&field=35&field=36&field=38&zip=0" # noqa
url = API.format(**CONFIG)
query_str = ("Are you sure you want to import the data? This overrides your "
"current sun azimuth, altitude and intensity settings! (y/n): ")
if sys.version_info.major >= 3:
query_result = input(query_str)
else:
query_result = raw_input(query_str)
if query_result.strip().lower() not in ["y", "yes", "j"]:
print("Aborted.")
sys.exit(0)
print("Querying api ..")
handle = urllib.request.urlopen(url)
data = handle.read().decode("utf-8")
handle.close()
# Extract data
print("Extracting data ..")
lines = data.replace("\r", "").split("\n")[1:]
# Load render pipeline api
print("Loading plugin api ..")
sys.path.insert(0, "../../")
from rpcore.pluginbase.manager import PluginManager
from rpcore.mount_manager import MountManager
mount_mgr = MountManager(None)
mount_mgr.mount()
plugin_mgr = PluginManager(None)
plugin_mgr.load()
convert_to_linear = plugin_mgr.day_settings["scattering"]["sun_intensity"].get_linear_value
hour, minutes = 0, 0
data_points_azimuth = []
data_points_altitude = []
data_points_intensity = []
for line in lines:
if not line:
break
date, time, azim_angle, declination, ascension, elevation = line.split(",")
float_azim = (float(azim_angle) + 180) / 360
float_elev = (float(elevation) / 60) * 0.5 + 0.5
float_time = (minutes + hour * 60) / (24 * 60)
data_points_azimuth.append((float_time, float_azim))
data_points_altitude.append((float_time, float_elev))
# Approximated intensity
approx_intensity = 2.0 * (1 - math.cos(math.pi * max(0, 8.0 + float(elevation)) / 60.0))
approx_intensity = max(0, min(150.0, approx_intensity * 0.25))
data_points_intensity.append((float_time, approx_intensity))
minutes += CONFIG["precision"]
if minutes >= 60:
hour += 1
minutes = minutes % 60
print("Saving ..")
settings = plugin_mgr.day_settings["scattering"]
settings["sun_azimuth"].curves[0].control_points = data_points_azimuth
settings["sun_altitude"].curves[0].control_points = data_points_altitude
settings["sun_intensity"].curves[0].control_points = data_points_intensity
plugin_mgr.save_daytime_overrides("/$$rpconfig/daytime.yaml")
print("Done!")