Commit 3c2b15fcd9c20481fbdd814f07104807266c6eb7

Authored by Goutte
1 parent ff4f2af5

Make the Y-Axis of time series dynamic

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>