Source code for pywwt.solar_system

from astropy import units as u
from traitlets import HasTraits, validate

from .traits import Bool, Int

__all__ = ['SolarSystem']


[docs]class SolarSystem(HasTraits): """ A supplemental class that enables tab-completion for settings associated with solar system mode. """ def __init__(self, base_wwt_widget): super(SolarSystem, self).__init__() self.base_widget = base_wwt_widget self.observe(self._on_trait_change, type='change') self._tracked_obj_id = 0 # Default to tracking sun def _on_trait_change(self, changed): # This method gets called anytime a trait gets changed. Since this class # gets inherited by the Jupyter widgets class which adds some traits of # its own, we only want to react to changes in traits that have the wwt # metadata attribute (which indicates the name of the corresponding WWT # setting). wwt_name = self.trait_metadata(changed['name'], 'wwt') new_value = changed['new'] if wwt_name is not None: if isinstance(new_value, u.Quantity): new_value = new_value.value self.base_widget._send_msg(event='setting_set', setting=wwt_name, value=new_value) # cmb = Bool(False, help='Whether to show the cosmic microwave background in solar system mode (`bool`)').tag(wwt='solarSystemCMB') cosmos = Bool(True, help='Whether to show data from the SDSS survey (`bool`)').tag(wwt='solarSystemCosmos') # display = Bool(False, help='Whether to show the solar system while in solar system mode (`bool`)').tag(wwt='solarSystemOverlays') lighting = Bool(True, help='Whether to show the lighting effect of the Sun on the' ' solar system (`bool`)').tag(wwt='solarSystemLighting') milky_way = Bool(True, help='Whether to show the galactic bulge in the ' 'background in solar system mode ' '(`bool`)').tag(wwt='solarSystemMilkyWay') # multi_res = Bool(False, help='Whether to show the multi-resolution textures for planets where available (`bool`)').tag(wwt='solarSystemMultiRes') minor_orbits = Bool(False, help='Whether to show the orbits of minor planets ' 'in solar system mode (`bool`)').tag(wwt='solarSystemMinorOrbits') # minor_planets = Bool(False, help='Whether to show minor planets in solar system mode (`bool`)').tag(wwt='solarSystemMinorPlanets') orbits = Bool(True, help='Whether to show orbit paths when the solar system is ' 'displayed (`bool`)').tag(wwt='solarSystemOrbits') objects = Bool(True, help='Whether to show the objects of the solar system in ' 'solar system mode (`bool`)').tag(wwt='solarSystemPlanets') scale = Int(1, help='Specifies how to scale objects\' size in solar ' 'system mode, with 1 as actual size and 100 as the ' 'maximum (`int`)').tag(wwt='solarSystemScale') stars = Bool(True, help='Whether to show background stars in solar system ' 'mode (`bool`)').tag(wwt='solarSystemStars') @validate('scale') def _validate_scale(self, proposal): if 1 <= proposal['value'] <= 100: return proposal['value'] else: raise ValueError('scale takes integers from 1-100')
[docs] def track_object(self, obj): """ Focus the viewer on a particular object while in solar system mode. Available objects include the Sun, the planets, the Moon, Jupiter's Galilean moons, and Pluto. Parameters ---------- obj : `str` The desired solar system object. """ obj = obj.lower() mappings = {'sun': 0, 'mercury': 1, 'venus': 2, 'mars': 3, 'jupiter': 4, 'saturn': 5, 'uranus': 6, 'neptune': 7, 'pluto': 8, 'moon': 9, 'io': 10, 'europa': 11, 'ganymede': 12, 'callisto': 13, 'ioshadow': 14, 'europashadow': 15, 'ganymedeshadow': 16, 'callistoshadow': 17, 'suneclipsed': 18, 'earth': 19} if obj in mappings: self.base_widget._send_msg(event='track_object', code=mappings[obj]) self._tracked_obj_id = mappings[obj] else: raise ValueError('the given object cannot be tracked')
def _add_settings_to_serialization(self, wwt_state): for trait in self.traits().values(): wwt_name = trait.metadata.get('wwt') if wwt_name: trait_val = trait.get(self) if isinstance(trait_val, u.Quantity): trait_val = trait_val.value wwt_state['wwt_settings'][wwt_name] = trait_val wwt_state['view_settings']['tracked_object_id'] = self._tracked_obj_id