blender-addons/sun_position/properties.py

251 lines
7.4 KiB
Python

# SPDX-License-Identifier: GPL-2.0-or-later
import bpy
from bpy.types import AddonPreferences, PropertyGroup
from bpy.props import (StringProperty, EnumProperty, IntProperty,
FloatProperty, BoolProperty, PointerProperty)
from .sun_calc import sun_update, parse_coordinates
from .north import north_update
from math import pi
from datetime import datetime
TODAY = datetime.today()
############################################################################
# Sun panel properties
############################################################################
class SunPosProperties(PropertyGroup):
usage_mode: EnumProperty(
name="Usage mode",
description="Operate in normal mode or environment texture mode",
items=(
('NORMAL', "Normal", ""),
('HDR', "Sun + HDR texture", ""),
),
default='NORMAL',
update=sun_update)
use_daylight_savings: BoolProperty(
name="Daylight savings",
description="Daylight savings time adds 1 hour to standard time",
default=False,
update=sun_update)
use_refraction: BoolProperty(
name="Use refraction",
description="Show apparent sun position due to refraction",
default=True,
update=sun_update)
show_north: BoolProperty(
name="Show North",
description="Draw line pointing north",
default=False,
update=north_update)
north_offset: FloatProperty(
name="North Offset",
description="Rotate the scene to choose North direction",
unit="ROTATION",
soft_min=-pi, soft_max=pi, step=10.0, default=0.0,
update=sun_update)
latitude: FloatProperty(
name="Latitude",
description="Latitude: (+) Northern (-) Southern",
soft_min=-90.0, soft_max=90.0,
step=5, precision=3,
default=0.0,
update=sun_update)
longitude: FloatProperty(
name="Longitude",
description="Longitude: (-) West of Greenwich (+) East of Greenwich",
soft_min=-180.0, soft_max=180.0,
step=5, precision=3,
default=0.0,
update=sun_update)
co_parser: StringProperty(
name="Enter coordinates",
description="Enter coordinates from an online map",
update=parse_coordinates)
month: IntProperty(
name="Month",
min=1, max=12, default=TODAY.month,
update=sun_update)
day: IntProperty(
name="Day",
min=1, max=31, default=TODAY.day,
update=sun_update)
year: IntProperty(
name="Year",
min=1, max=4000, default=TODAY.year,
update=sun_update)
use_day_of_year: BoolProperty(
description="Use a single value for day of year",
name="Use day of year",
default=False,
update=sun_update)
day_of_year: IntProperty(
name="Day of year",
min=1, max=366, default=1,
update=sun_update)
UTC_zone: FloatProperty(
name="UTC zone",
description="Time zone: Difference from Greenwich, England in hours",
precision=1,
min=-14.0, max=13, step=50, default=0.0,
update=sun_update)
time: FloatProperty(
name="Time",
description="Time of the day",
precision=4,
soft_min=0.0, soft_max=23.9999, step=1.0, default=12.0,
update=sun_update)
sun_distance: FloatProperty(
name="Distance",
description="Distance to sun from origin",
unit="LENGTH",
min=0.0, soft_max=3000.0, step=10.0, default=50.0,
update=sun_update)
sun_object: PointerProperty(
name="Sun Object",
type=bpy.types.Object,
description="Sun object to set in the scene",
poll=lambda self, obj: obj.type == 'LIGHT',
update=sun_update)
object_collection: PointerProperty(
name="Collection",
type=bpy.types.Collection,
description="Collection of objects used to visualize sun motion",
update=sun_update)
object_collection_type: EnumProperty(
name="Display type",
description="Show object collection as sun motion",
items=(
('ANALEMMA', "Analemma", ""),
('DIURNAL', "Diurnal", ""),
),
default='ANALEMMA',
update=sun_update)
sky_texture: StringProperty(
name="Sky Texture",
default="",
description="Name of sky texture to be used",
update=sun_update)
hdr_texture: StringProperty(
default="Environment Texture",
name="Environment Texture",
description="Name of texture to use. World nodes must be enabled "
"and color set to Environment Texture",
update=sun_update)
hdr_azimuth: FloatProperty(
name="Rotation",
description="Rotation angle of sun and environment texture",
unit="ROTATION",
step=10.0,
default=0.0, precision=3,
update=sun_update)
hdr_elevation: FloatProperty(
name="Elevation",
description="Elevation angle of sun",
unit="ROTATION",
step=10.0,
default=0.0, precision=3,
update=sun_update)
bind_to_sun: BoolProperty(
name="Bind Texture to Sun",
description="If true, Environment texture moves with sun",
default=False,
update=sun_update)
time_spread: FloatProperty(
name="Time Spread",
description="Time period in which to spread object collection",
precision=4,
soft_min=1.0, soft_max=24.0, step=1.0, default=23.0,
update=sun_update)
############################################################################
# Preference panel properties
############################################################################
class SunPosAddonPreferences(AddonPreferences):
bl_idname = __package__
show_time_place: BoolProperty(
name="Time and place presets",
description="Show time/place presets",
default=False)
show_dms: BoolProperty(
name="D° M' S\"",
description="Show lat/long degrees, minutes, seconds labels",
default=True)
show_north: BoolProperty(
name="Show North",
description="Show north offset choice and slider",
default=True,
update=sun_update)
show_refraction: BoolProperty(
name="Refraction",
description="Show sun refraction choice",
default=True,
update=sun_update)
show_az_el: BoolProperty(
name="Azimuth and elevation info",
description="Show azimuth and solar elevation info",
default=True)
show_daylight_savings: BoolProperty(
name="Daylight savings",
description="Show daylight savings time choice",
default=True,
update=sun_update)
show_rise_set: BoolProperty(
name="Sunrise and sunset info",
description="Show sunrise and sunset labels",
default=True)
def draw(self, context):
layout = self.layout
box = layout.box()
col = box.column()
col.label(text="Show options or labels:")
flow = col.grid_flow(columns=0, even_columns=True, even_rows=False, align=False)
flow.prop(self, "show_time_place")
flow.prop(self, "show_dms")
flow.prop(self, "show_north")
flow.prop(self, "show_refraction")
flow.prop(self, "show_az_el")
flow.prop(self, "show_daylight_savings")
flow.prop(self, "show_rise_set")