Commit 3c2b15fcd9c20481fbdd814f07104807266c6eb7
1 parent
ff4f2af5
Exists in
master
and in
2 other branches
Make the Y-Axis of time series dynamic
Showing
4 changed files
with
54 additions
and
23 deletions
Show diff stats
CHANGELOG.md
1 | ## Nicolas | 1 | ## Nicolas |
2 | 2 | ||
3 | - [ ] séries temporelles en échelle log ou linéaire | 3 | - [ ] séries temporelles en échelle log ou linéaire |
4 | -- [ ] permettre à l'utilisateur de choisir inner heliosphere (jusqu'à mars) ou outer heliosphere (jusqu'à saturne) pour la visualisation des éphémérides planétaires | 4 | + /!\ D3 ne supporte pes les échelles log pour un domaine qui contient le 0. |
5 | - [ ] rajouter MAVEN, New Horizons, Cassini, Galileo, ExoMars comme spacecraft cible | 5 | - [ ] rajouter MAVEN, New Horizons, Cassini, Galileo, ExoMars comme spacecraft cible |
6 | - [ ] prévoir la possibilité à l'utilisateur d'afficher le temps en Day Of Year | 6 | - [ ] prévoir la possibilité à l'utilisateur d'afficher le temps en Day Of Year |
7 | - [ ] modifier le bandeau vertical d'affichage des choix utilisateurs pour qu'il soit plus petit (en particulier les champs paramètres) | 7 | - [ ] modifier le bandeau vertical d'affichage des choix utilisateurs pour qu'il soit plus petit (en particulier les champs paramètres) |
@@ -12,6 +12,7 @@ | @@ -12,6 +12,7 @@ | ||
12 | * submit (envoyé ensuite vers un webservice d'AMDA à construire) | 12 | * submit (envoyé ensuite vers un webservice d'AMDA à construire) |
13 | - [ ] prévoir un bouton EPN-TAP ou l'on mettrait l'outil en relation avec le client VESPA développé par nathanaël | 13 | - [ ] prévoir un bouton EPN-TAP ou l'on mettrait l'outil en relation avec le client VESPA développé par nathanaël |
14 | - [ ] juno/rosetta doivent aussi bouger le long de leur orbite lorsque l'on parcourt à la souris les données de la série temporelle; pour les intervalles de temps où rosetta n'existe plus (crash à la surface de la comète) il faut qu'elle disparaisse; pour les intervalles de temps où juno est en orbite autour de jupiter il faut que juno suive jupiter | 14 | - [ ] juno/rosetta doivent aussi bouger le long de leur orbite lorsque l'on parcourt à la souris les données de la série temporelle; pour les intervalles de temps où rosetta n'existe plus (crash à la surface de la comète) il faut qu'elle disparaisse; pour les intervalles de temps où juno est en orbite autour de jupiter il faut que juno suive jupiter |
15 | + -> tout ceci est configurable dans le fichier de configuration, je n'ai pas les ids ! | ||
15 | 16 | ||
16 | 17 | ||
17 | ## Future ? | 18 | ## Future ? |
@@ -32,6 +33,7 @@ | @@ -32,6 +33,7 @@ | ||
32 | ## 1.0.0-rc7 | 33 | ## 1.0.0-rc7 |
33 | 34 | ||
34 | - [ ] Give the future data another color | 35 | - [ ] Give the future data another color |
36 | +- [x] Add buttons to the orbits plot zoom to inner or outer heliosphere | ||
35 | - [x] Make the Y-Axis of time series dynamic (at the expense of animations) | 37 | - [x] Make the Y-Axis of time series dynamic (at the expense of animations) |
36 | 38 | ||
37 | 39 |
web/static/js/swapp.js
@@ -36,7 +36,7 @@ | @@ -36,7 +36,7 @@ | ||
36 | this.configuration['parameters'].forEach(function(p){ | 36 | this.configuration['parameters'].forEach(function(p){ |
37 | return this$.parameters[p['id']] = p; | 37 | return this$.parameters[p['id']] = p; |
38 | }); | 38 | }); |
39 | - this.orbiter = null; | 39 | + this.orbits = null; |
40 | this.time_series = []; | 40 | this.time_series = []; |
41 | } | 41 | } |
42 | SpaceWeather.prototype.init = function(){ | 42 | SpaceWeather.prototype.init = function(){ |
@@ -830,24 +830,25 @@ | @@ -830,24 +830,25 @@ | ||
830 | Orbits.prototype.clear = function(){ | 830 | Orbits.prototype.clear = function(){ |
831 | return $(this.svg.node()).remove(); | 831 | return $(this.svg.node()).remove(); |
832 | }; | 832 | }; |
833 | - Orbits.prototype.resize = function(animate){ | ||
834 | - var width, height, extremum, s, o, slug, ref$, config, t, t1, this$ = this; | 833 | + Orbits.prototype.resize = function(animate, extremum){ |
834 | + var width, height, s, o, slug, ref$, config, t, t1; | ||
835 | animate == null && (animate = false); | 835 | animate == null && (animate = false); |
836 | + extremum == null && (extremum = null); | ||
836 | width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right); | 837 | width = Math.ceil($(this.container).width() - this.margin.left - this.margin.right); |
837 | height = Math.ceil(1.0 * width); | 838 | height = Math.ceil(1.0 * width); |
838 | console.debug("Resizing orbits : " + width + " × " + height + "…"); | 839 | console.debug("Resizing orbits : " + width + " × " + height + "…"); |
839 | - extremum = 1.1 * d3.max((function(){ | ||
840 | - var ref$, results$ = []; | ||
841 | - for (s in ref$ = this.orbiters) { | ||
842 | - o = ref$[s]; | ||
843 | - if (!o.hidden) { | ||
844 | - results$.push(s); | 840 | + if (extremum === null) { |
841 | + extremum = 1.1 * d3.max((function(){ | ||
842 | + var ref$, results$ = []; | ||
843 | + for (s in ref$ = this.orbiters) { | ||
844 | + o = ref$[s]; | ||
845 | + if (!o.hidden) { | ||
846 | + results$.push(this.orbitersExtrema[s]); | ||
847 | + } | ||
845 | } | 848 | } |
846 | - } | ||
847 | - return results$; | ||
848 | - }.call(this)), function(d){ | ||
849 | - return this$.orbitersExtrema[d]; | ||
850 | - }); | 849 | + return results$; |
850 | + }.call(this))); | ||
851 | + } | ||
851 | this.xScale = d3.scaleLinear().domain([-1 * extremum, extremum]); | 852 | this.xScale = d3.scaleLinear().domain([-1 * extremum, extremum]); |
852 | this.yScale = d3.scaleLinear().domain([extremum, -1 * extremum]); | 853 | this.yScale = d3.scaleLinear().domain([extremum, -1 * extremum]); |
853 | this.xScale.range([0, width]); | 854 | this.xScale.range([0, width]); |
@@ -904,6 +905,9 @@ | @@ -904,6 +905,9 @@ | ||
904 | this.repositionOrbiter(slug, null, true); | 905 | this.repositionOrbiter(slug, null, true); |
905 | return this; | 906 | return this; |
906 | }; | 907 | }; |
908 | + Orbits.prototype.zoomToTarget = function(slug){ | ||
909 | + return this.resize(true, 1.1 * this.orbitersExtrema[slug]); | ||
910 | + }; | ||
907 | Orbits.prototype.repositionOrbiter = function(slug, datum, animate){ | 911 | Orbits.prototype.repositionOrbiter = function(slug, datum, animate){ |
908 | var data, el, t; | 912 | var data, el, t; |
909 | animate == null && (animate = false); | 913 | animate == null && (animate = false); |
web/static/js/swapp.ls
@@ -63,8 +63,8 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE | @@ -63,8 +63,8 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE | ||
63 | @configuration['parameters'].forEach (p) ~> | 63 | @configuration['parameters'].forEach (p) ~> |
64 | @parameters[p['id']] = p | 64 | @parameters[p['id']] = p |
65 | 65 | ||
66 | - @orbiter = null # our Orbiter defined below | ||
67 | - @time_series = [] # a List of TimeSeries objects | 66 | + @orbits = null # an Orbiter instance (defined below) |
67 | + @time_series = [] # a List of TimeSeries instances | ||
68 | 68 | ||
69 | init: -> | 69 | init: -> |
70 | """ | 70 | """ |
@@ -237,8 +237,6 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE | @@ -237,8 +237,6 @@ https://gitlab.irap.omp.eu/CDPP/SPACEWEATHERONLINE | ||
237 | handleTarget(i+1) | 237 | handleTarget(i+1) |
238 | ) | 238 | ) |
239 | handleTarget(0) | 239 | handleTarget(0) |
240 | - | ||
241 | - | ||
242 | this | 240 | this |
243 | 241 | ||
244 | clearPlots: -> | 242 | clearPlots: -> |
@@ -784,15 +782,19 @@ export class Orbits | @@ -784,15 +782,19 @@ export class Orbits | ||
784 | clear: -> | 782 | clear: -> |
785 | $(@svg.node()).remove() | 783 | $(@svg.node()).remove() |
786 | 784 | ||
787 | - resize: (animate = false) -> | 785 | + resize: (animate = false, extremum = null) -> |
788 | width = Math.ceil($(@container).width() - @margin.left - @margin.right) | 786 | width = Math.ceil($(@container).width() - @margin.left - @margin.right) |
789 | height = Math.ceil(1.0 * width) | 787 | height = Math.ceil(1.0 * width) |
790 | 788 | ||
791 | console.debug("Resizing orbits : #{width} × #{height}…") | 789 | console.debug("Resizing orbits : #{width} × #{height}…") |
792 | 790 | ||
793 | - extremum = 1.1 * d3.max([s for s, o of @orbiters when not o.hidden], (d) ~> | ||
794 | - @orbitersExtrema[d] | ||
795 | - ) | 791 | + if extremum == null |
792 | + extremum = 1.1 * d3.max( | ||
793 | + [@orbitersExtrema[s] for s, o of @orbiters when not o.hidden] | ||
794 | + ) | ||
795 | +# extremum = 1.1 * d3.max([s for s, o of @orbiters when not o.hidden], (d) ~> | ||
796 | +# @orbitersExtrema[d] | ||
797 | +# ) | ||
796 | @xScale = d3.scaleLinear().domain([-1 * extremum, extremum]) | 798 | @xScale = d3.scaleLinear().domain([-1 * extremum, extremum]) |
797 | @yScale = d3.scaleLinear().domain([extremum, -1 * extremum]) | 799 | @yScale = d3.scaleLinear().domain([extremum, -1 * extremum]) |
798 | 800 | ||
@@ -861,6 +863,9 @@ export class Orbits | @@ -861,6 +863,9 @@ export class Orbits | ||
861 | 863 | ||
862 | this | 864 | this |
863 | 865 | ||
866 | + zoomToTarget: (slug) -> | ||
867 | + @resize(true, 1.1 * @orbitersExtrema[slug]) | ||
868 | + | ||
864 | repositionOrbiter: (slug, datum, animate = false) -> | 869 | repositionOrbiter: (slug, datum, animate = false) -> |
865 | data = @data[slug] | 870 | data = @data[slug] |
866 | if not data.length then return | 871 | if not data.length then return |
web/view/home.html.jinja2
@@ -133,6 +133,16 @@ | @@ -133,6 +133,16 @@ | ||
133 | <div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-cell--4-col-phone"> | 133 | <div class="mdl-cell mdl-cell--4-col mdl-cell--8-col-tablet mdl-cell--4-col-phone"> |
134 | <section id="orbits"></section> | 134 | <section id="orbits"></section> |
135 | <div class="plots-actions plots-buttons"> | 135 | <div class="plots-actions plots-buttons"> |
136 | + <button id="zoom_inner_heliosphere" class="mdl-button mdl-button--raised mdl-button--primary" | ||
137 | + title="Zoom to the inner heliosphere."> | ||
138 | + Zoom in | ||
139 | + </button> | ||
140 | + <button id="zoom_outer_heliosphere" class="mdl-button mdl-button--raised mdl-button--primary" | ||
141 | + title="Zoom to the outer heliosphere."> | ||
142 | + Zoom out | ||
143 | + </button> | ||
144 | + </div> | ||
145 | + <div class="plots-actions plots-buttons"> | ||
136 | <button id="download" class="mdl-button mdl-button--raised mdl-button--primary" | 146 | <button id="download" class="mdl-button mdl-button--raised mdl-button--primary" |
137 | title="Download the raw data for each selected target and parameters."> | 147 | title="Download the raw data for each selected target and parameters."> |
138 | Download | 148 | Download |
@@ -662,6 +672,16 @@ jQuery().ready(function($){ | @@ -662,6 +672,16 @@ jQuery().ready(function($){ | ||
662 | }); | 672 | }); |
663 | return false; | 673 | return false; |
664 | }); | 674 | }); |
675 | + $('#zoom_inner_heliosphere').on("click", function(e){ | ||
676 | + console.info("Zooming to inner heliosphere…"); | ||
677 | + sw.orbits.zoomToTarget('mars'); | ||
678 | + return false; | ||
679 | + }); | ||
680 | + $('#zoom_outer_heliosphere').on("click", function(e){ | ||
681 | + console.info("Zooming to outer heliosphere…"); | ||
682 | + sw.orbits.resize(true); | ||
683 | + return false; | ||
684 | + }); | ||
665 | 685 | ||
666 | }); | 686 | }); |
667 | </script> | 687 | </script> |