[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1670] contrib/py/scripts/addons/ lamp_geographical_sun.py: Added lamp_geographical_sun addon

Doug Hammond doughammond at hamsterfight.co.uk
Wed Mar 2 20:24:54 CET 2011


Revision: 1670
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1670
Author:   dougal2
Date:     2011-03-02 19:24:54 +0000 (Wed, 02 Mar 2011)
Log Message:
-----------
Added lamp_geographical_sun addon

Added Paths:
-----------
    contrib/py/scripts/addons/lamp_geographical_sun.py

Added: contrib/py/scripts/addons/lamp_geographical_sun.py
===================================================================
--- contrib/py/scripts/addons/lamp_geographical_sun.py	                        (rev 0)
+++ contrib/py/scripts/addons/lamp_geographical_sun.py	2011-03-02 19:24:54 UTC (rev 1670)
@@ -0,0 +1,516 @@
+# -*- coding: utf8 -*-
+#
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# --------------------------------------------------------------------------
+# Blender 2.5 Geographical Sun Add-On
+# --------------------------------------------------------------------------
+#
+# Authors:
+# Doug Hammond
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# ***** END GPL LICENCE BLOCK *****
+#
+
+# System imports
+#-----------------------------------------------------------------------------
+import datetime, math, time
+today = datetime.datetime.now()
+
+# Blender imports
+#----------------------------------------------------------------------------- 
+import bpy
+from extensions_framework import Addon, declarative_property_group
+from extensions_framework.ui import property_group_renderer
+
+# Addon setup
+#----------------------------------------------------------------------------- 
+bl_info = {
+	"name": "Geographical Sun",
+	"author": "Doug Hammond (dougal2)",
+	"version": (0, 0, 1),
+	"blender": (2, 5, 6),
+	"api": 35078,
+	"category": "Object",
+	"location": "Lamp data > Geographical Sun",
+	"warning": "",
+	"wiki_url": "",
+	"tracker_url": "",
+	"description": "Set SUN Lamp rotation according to geographical time and location."
+}
+GeoSunAddon = Addon(bl_info)
+
+# Sun rotation calculator implementation
+#----------------------------------------------------------------------------- 
+class sun_calculator(object):
+	"""
+	Based on SunLight v1.0 by Miguel Kabantsov (miguelkab at gmail.com)
+	Replaces the faulty sun position calculation algorythm with a precise calculation (Source for algorythm: http://de.wikipedia.org/wiki/Sonnenstand),
+	Co-Ordinates: http://www.bcca.org/misc/qiblih/latlong.html
+	Author: Nils-Peter Fischer (Nils-Peter.Fischer at web.de)
+	"""
+	
+	location_list = [
+		("EUROPE",[
+			("Antwerp, Belgium",			67),
+			("Berlin, Germany",				1),
+			("Bratislava, Slovak Republic",	70),
+			("Brno, Czech Republic",		72),
+			("Brussles, Belgium",			68),
+			("Geneva, Switzerland",			65),
+			("Helsinki, Finland",			7),
+			("Innsbruck, Austria",			62),
+			("Kyiv, Ukraine",				64),
+			("London, England",				10),
+			("Lyon, France",				66),
+			("Nitra, Slovak Republic",		69),
+			("Oslo, Norway",				58),
+			("Paris, France",				15),
+			("Praha, Czech Republic",		71),
+			("Rome, Italy",					18),
+			("Telfs, Austria",				63),
+			("Warsaw, Poland",				74),
+			("Wroclaw, Poland",				73),
+			("Zurich, Switzerland",			21),
+		]),
+		
+		("WORLD CITIES", [
+			("Beijing, China",				0),
+			("Bombay, India",				2),
+			("Buenos Aires, Argentina",		3),
+			("Cairo, Egypt",				4),
+			("Cape Town, South Africa",		5),
+			("Caracas, Venezuela",			6),
+			("Curitiba, Brazil",			60),
+			("Hong Kong, China",			8),
+			("Jerusalem, Israel",			9),
+			("Joinville, Brazil",			61),
+			("Mexico City, Mexico",			11),
+			("Moscow, Russia",				12),
+			("New Delhi, India",			13),
+			("Ottawa, Canada",				14),
+			("Rio de Janeiro, Brazil",		16),
+			("Riyadh, Saudi Arabia",		17),
+			("Sao Paulo, Brazil",			59),
+			("Sydney, Australia",			19),
+			("Tokyo, Japan",				20),
+		]),
+		
+		("US CITIES", [
+			("Albuquerque, NM",				22),
+			("Anchorage, AK",				23),
+			("Atlanta, GA",					24),
+			("Austin, TX",					25),
+			("Birmingham, AL",				26),
+			("Bismarck, ND",				27),
+			("Boston, MA",					28),
+			("Boulder, CO",					29),
+			("Chicago, IL",					30),
+			("Dallas, TX",					31),
+			("Denver, CO",					32),
+			("Detroit, MI",					33),
+			("Honolulu, HI",				34),
+			("Houston, TX",					35),
+			("Indianapolis, IN",			36),
+			("Jackson, MS",					37),
+			("Kansas City, MO",				38),
+			("Los Angeles, CA",				39),
+			("Menomonee Falls, WI",			40),
+			("Miami, FL",					41),
+			("Minneapolis, MN",				42),
+			("New Orleans, LA",				43),
+			("New York City, NY",			44),
+			("Oklahoma City, OK",			45),
+			("Philadelphia, PA",			46),
+			("Phoenix, AZ",					47),
+			("Pittsburgh, PA",				48),
+			("Portland, ME",				49),
+			("Portland, OR",				50),
+			("Raleigh, NC",					51),
+			("Richmond, VA",				52),
+			("Saint Louis, MO",				53),
+			("San Diego, CA",				54),
+			("San Francisco, CA",			55),
+			("Seattle, WA",					56),
+			("Washington DC",				57),
+		])
+	]
+	
+	location_data = {
+		# Europe
+		67:	( 51.2167, -4.4, 1),
+		1:	( 52.33, -13.30, 1),
+		70:	( 48.17, -17.17, 1),
+		72:	( 49.2, -16.63, 1),
+		68:	( 58.8467, -4.3525, 1),
+		65:	( 46.217, -6.150, 1),
+		7:	( 60.1667, -24.9667,2),
+		62:	( 47.2672, -11.3928, 1),
+		64:	( 50.75, -30.0833, 2),
+		10:	( 51.50, 0.0, 0),
+		66:	( 45.767, -4.833, 1),
+		69:	( 48.32, -18.07, 1),
+		58:	( 59.56, -10.41, 1),
+		15:	( 48.8667, -2.667, 1),
+		71:	( 50.08, -14.46, 1),
+		18:	( 41.90, -12.4833, 1),
+		63:	( 47.3, -11.0667, 1),
+		74:	( 52.232, -21.008, 1),
+		73:	( 51.108, -17.038, 1),
+		21:	( 47.3833, -8.5333, 1),
+		
+		# World Cities
+		0:	( 39.9167, -116.4167, 8),
+		2:	( 18.9333, -72.8333, 5.5),
+		3:	(-34.60, 58.45, -3),
+		4:	( 30.10, -31.3667, 2),
+		5:	(-33.9167, -18.3667, 2),
+		6:	( 10.50, 66.9333, -4),
+		60:	(-25.4278, 49.2731, -3),
+		8:	( 22.25, -114.1667, 8),
+		9:	( 31.7833, -35.2333, 2),
+		61:	(-29.3044, 48.8456, -3),
+		11:	( 19.4, 99.15, -6),
+		12:	( 55.75, -37.5833, 3),
+		13:	( 28.6, -77.2, 5.5),
+		14:	( 45.41667, 75.7, -5),
+		16:	(-22.90, 43.2333, -3),
+		17:	( 24.633, -46.71667, 3),
+		59:	( -23.5475, 46.6361, -3),
+		19:	(-33.8667, -151.2167,10),
+		20:	( 35.70, -139.7667, 9), 
+		
+		# US Cities
+		22:	( 35.0833, 106.65, -7),
+		23:	( 61.217, 149.90, -9),
+		24:	( 33.733, 84.383, -5),
+		25:	( 30.283, 97.733, -6),
+		26:	( 33.521, 86.8025, -6),
+		27:	( 46.817, 100.783, -6),
+		28:	( 42.35, 71.05, -5),
+		29:	( 40.125, 105.237, -7),
+		30:	( 41.85, 87.65, -6),
+		31:	( 32.46, 96.47, -6),
+		32:	( 39.733, 104.983, -7),
+		33:	( 42.333, 83.05, -5),
+		34:	( 21.30, 157.85, -10),
+		35:	( 29.75, 95.35, -6),
+		36:	( 39.767, 86.15, -5),
+		37:	( 32.283, 90.183, -6),
+		38:	( 39.083, 94.567, -6),
+		39:	( 34.05, 118.233, -8),
+		40:	( 43.11, 88.10, -6),
+		41:	( 25.767, 80.183, -5),
+		42:	( 44.967, 93.25, -6),
+		43:	( 29.95, 90.067, -6),
+		44:	( 40.7167, 74.0167, -5),
+		45:	( 35.483, 97.533, -6),
+		46:	( 39.95, 75.15, -5),
+		47:	( 33.433, 112.067,-7),
+		48:	( 40.433, 79.9833, -5),
+		49:	( 43.666, 70.283, -5),
+		50:	( 45.517, 122.65, -8),
+		51:	( 35.783, 78.65, -5),
+		52:	( 37.5667, 77.450, -5),
+		53:	( 38.6167, 90.1833, -6),
+		54:	( 32.7667, 117.2167, -8),
+		55:	( 37.7667, 122.4167, -8),
+		56:	( 47.60, 122.3167, -8),
+		57:	( 38.8833, 77.0333, -5),
+	}
+	
+	# mathematical helpers
+	@staticmethod
+	def sind(deg):
+		return math.sin(math.radians(deg))
+	
+	@staticmethod
+	def cosd(deg):
+		return math.cos(math.radians(deg))
+	
+	@staticmethod
+	def tand(deg):
+		return math.tan(math.radians(deg))
+	
+	@staticmethod
+	def asind(deg):
+		return math.degrees(math.asin(deg))
+	
+	@staticmethod
+	def atand(deg):
+		return math.degrees(math.atan(deg))
+	
+	@staticmethod
+	def geo_sun_astronomicJulianDate(Year, Month, Day, LocalTime, Timezone):
+		if Month > 2.0:
+			Y = Year
+			M = Month
+		else:
+			Y = Year - 1.0
+			M = Month + 12.0
+			
+		UT = LocalTime - Timezone
+		hour = UT / 24.0
+		A = int(Y/100.0)
+		
+		JD = math.floor(365.25*(Y+4716.0)) + math.floor(30.6001*(M+1.0)) + Day + hour - 1524.4
+		
+		# The following section is adopted from netCDF4 netcdftime implementation.
+		# Copyright: 2008 by Jeffrey Whitaker
+		# License: http://www.opensource.org/licenses/mit-license.php
+		if JD >= 2299170.5:
+			# 1582 October 15 (Gregorian Calendar)
+			B = 2.0 - A + int(A/4.0)
+		elif JD < 2299160.5:
+			# 1582 October 5 (Julian Calendar)
+			B = 0
+		else:
+			raise Exception('ERROR: Date falls in the gap between Julian and Gregorian calendars.')
+			B = 0
+		
+		return JD+B
+	
+	@staticmethod
+	def geoSunData(Latitude, Longitude, Year, Month, Day, LocalTime, Timezone):
+		JD = sun_calculator.geo_sun_astronomicJulianDate(Year, Month, Day, LocalTime, Timezone)
+		
+		phi = Latitude
+		llambda = Longitude
+				
+		n = JD - 2451545.0
+		LDeg = (280.460 + 0.9856474*n) - (math.floor((280.460 + 0.9856474*n)/360.0) * 360.0)
+		gDeg = (357.528 + 0.9856003*n) - (math.floor((357.528 + 0.9856003*n)/360.0) * 360.0)
+		LambdaDeg = LDeg + 1.915 * sun_calculator.sind(gDeg) + 0.02 * sun_calculator.sind(2.0*gDeg)
+		
+		epsilonDeg = 23.439 - 0.0000004*n
+		
+		alphaDeg = sun_calculator.atand( (sun_calculator.cosd(epsilonDeg) * sun_calculator.sind(LambdaDeg)) / sun_calculator.cosd(LambdaDeg) )
+		if sun_calculator.cosd(LambdaDeg) < 0.0:
+			alphaDeg += 180.0
+			
+		deltaDeg = sun_calculator.asind( sun_calculator.sind(epsilonDeg) * sun_calculator.sind(LambdaDeg) )
+		
+		JDNull = sun_calculator.geo_sun_astronomicJulianDate(Year, Month, Day, 0.0, 0.0)
+		
+		TNull = (JDNull - 2451545.0) / 36525.0
+		T = LocalTime - Timezone
+		
+		thetaGh = 6.697376 + 2400.05134*TNull + 1.002738*T
+		thetaGh -= math.floor(thetaGh/24.0) * 24.0
+		
+		thetaG = thetaGh * 15.0
+		theta = thetaG + llambda
+		
+		tau = theta - alphaDeg
+		
+		a = sun_calculator.atand( sun_calculator.sind(tau) / ( sun_calculator.cosd(tau)*sun_calculator.sind(phi) - sun_calculator.tand(deltaDeg)*sun_calculator.cosd(phi)) )
+		if sun_calculator.cosd(tau)*sun_calculator.sind(phi) - sun_calculator.tand(deltaDeg)*sun_calculator.cosd(phi) < 0.0:
+			a += 180.0
+		
+		h = sun_calculator.asind( sun_calculator.cosd(deltaDeg)*sun_calculator.cosd(tau)*sun_calculator.cosd(phi) + sun_calculator.sind(deltaDeg)*sun_calculator.sind(phi) )
+		
+		R = 1.02 / (sun_calculator.tand (h+(10.3/(h+5.11))))
+		hR = h + R/60.0
+		
+		azimuth = a

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list