33#include <Wt/WLineEdit>
44#include <Wt/WComboBox>
55#include <Wt/WCheckBox>
6+ #include <Wt/WSlider>
67#include <Wt/WTemplate>
78#include <Wt/WIntValidator>
89#include <Wt/Chart/WAbstractDataSeries3D>
@@ -16,6 +17,10 @@ DataSettings::DataSettings()
1617 setName_ = new WLineEdit (this );
1718 pointsize_ = new WLineEdit (this );
1819 pointsize_ -> setValidator (new WIntValidator (1 , 10 ));
20+ pointSprite_ = new WComboBox (this );
21+ pointSprite_ -> addItem ("None" );
22+ pointSprite_ -> addItem ("diamond (5x5)" );
23+ pointSprite_ -> addItem ("cross (5x5)" );
1924 colormap_ = new WComboBox (this );
2025 colormap_ -> addItem ("None" );
2126 colormap_ -> addItem ("Continuous" );
@@ -35,6 +40,19 @@ DataSettings::DataSettings()
3540 pointsize_ -> changed ().connect (std ::bind ([& ] () {
3641 data_ -> setPointSize (Wt ::asNumber (pointsize_ -> text ()));
3742 }));
43+ pointSprite_ -> changed ().connect (std ::bind ([& ] () {
44+ switch (pointSprite_ -> currentIndex ()) {
45+ case 0 :
46+ data_ -> setPointSprite ("" );
47+ break ;
48+ case 1 :
49+ data_ -> setPointSprite ("diamond.png" );
50+ break ;
51+ case 2 :
52+ data_ -> setPointSprite ("cross.png" );
53+ break ;
54+ }
55+ }));
3856 colormap_ -> changed ().connect (std ::bind ([& ] () {
3957 WStandardColorMap * colMap ;
4058 switch (colormap_ -> currentIndex ()) {
@@ -74,6 +92,7 @@ void DataSettings::bindBaseToTemplate(WTemplate* configtemplate)
7492{
7593 configtemplate -> bindWidget ("setname" , setName_ );
7694 configtemplate -> bindWidget ("ptsize" , pointsize_ );
95+ configtemplate -> bindWidget ("ptsprite" , pointSprite_ );
7796 configtemplate -> bindWidget ("colormap" , colormap_ );
7897 configtemplate -> bindWidget ("showcolormap" , showColormap_ );
7998 configtemplate -> bindWidget ("colormapside" , colormapSide_ );
@@ -89,6 +108,15 @@ void DataSettings::bindBaseDataSet(WAbstractDataSeries3D *data)
89108
90109 pointsize_ -> setText (Wt ::asString (data -> pointSize ()));
91110
111+ const std ::string & sprite = data -> pointSprite ();
112+ if (sprite == "" ) {
113+ pointSprite_ -> setCurrentIndex (0 );
114+ } else if (sprite == "diamond.png" ) {
115+ pointSprite_ -> setCurrentIndex (1 );
116+ } else if (sprite == "cross.png" ) {
117+ pointSprite_ -> setCurrentIndex (2 );
118+ }
119+
92120 if (data -> colorMap () == 0 ) {
93121 colormap_ -> setCurrentIndex (0 );
94122 } else {
@@ -125,7 +153,13 @@ void DataSettings::bindBaseDataSet(WAbstractDataSeries3D *data)
125153 * Definition of class responsible for configuring numerical grid data-sets
126154 */
127155NumGridDataSettings ::NumGridDataSettings ()
128- : gridData_ (0 )
156+ : changeXClippingMin_ (1 , this ),
157+ changeXClippingMax_ (1 , this ),
158+ changeYClippingMin_ (1 , this ),
159+ changeYClippingMax_ (1 , this ),
160+ changeZClippingMin_ (1 , this ),
161+ changeZClippingMax_ (1 , this ),
162+ gridData_ (0 )
129163{
130164 WTemplate * template_ = new WTemplate (Wt ::WString ::tr ("numgriddata-template" ), this );
131165 bindBaseToTemplate (template_ );
@@ -144,10 +178,73 @@ NumGridDataSettings::NumGridDataSettings()
144178 penColor_ -> addItem ("red" );
145179 penColor_ -> addItem ("green" );
146180 penColor_ -> addItem ("blue" );
147- penColor_ -> addItem ("something" );
148181 template_ -> bindWidget ("pencolor" , penColor_ );
149182
183+ xClippingMin_ = new WSlider (Wt ::Horizontal , this );
184+ xClippingMin_ -> setMinimum (-100 );
185+ xClippingMin_ -> setMaximum (100 );
186+ xClippingMin_ -> setValue (-100 );
187+ template_ -> bindWidget ("x-clipping-min" , xClippingMin_ );
188+ xClippingMax_ = new WSlider (Wt ::Horizontal , this );
189+ xClippingMax_ -> setMinimum (-100 );
190+ xClippingMax_ -> setMaximum (100 );
191+ xClippingMax_ -> setValue (100 );
192+ template_ -> bindWidget ("x-clipping-max" , xClippingMax_ );
193+ yClippingMin_ = new WSlider (Wt ::Horizontal , this );
194+ yClippingMin_ -> setMinimum (-100 );
195+ yClippingMin_ -> setMaximum (100 );
196+ yClippingMin_ -> setValue (-100 );
197+ template_ -> bindWidget ("y-clipping-min" , yClippingMin_ );
198+ yClippingMax_ = new WSlider (Wt ::Horizontal , this );
199+ yClippingMax_ -> setMinimum (-100 );
200+ yClippingMax_ -> setMaximum (100 );
201+ yClippingMax_ -> setValue (100 );
202+ template_ -> bindWidget ("y-clipping-max" , yClippingMax_ );
203+ zClippingMin_ = new WSlider (Wt ::Horizontal , this );
204+ zClippingMin_ -> setMinimum (-100 );
205+ zClippingMin_ -> setMaximum (100 );
206+ zClippingMin_ -> setValue (-100 );
207+ template_ -> bindWidget ("z-clipping-min" , zClippingMin_ );
208+ zClippingMax_ = new WSlider (Wt ::Horizontal , this );
209+ zClippingMax_ -> setMinimum (-100 );
210+ zClippingMax_ -> setMaximum (100 );
211+ zClippingMax_ -> setValue (100 );
212+ template_ -> bindWidget ("z-clipping-max" , zClippingMax_ );
213+ showClippingLines_ = new WCheckBox (this );
214+ template_ -> bindWidget ("clippinglines" , showClippingLines_ );
215+ clippingLinesColor_ = new WComboBox (this );
216+ clippingLinesColor_ -> addItem ("black" );
217+ clippingLinesColor_ -> addItem ("red" );
218+ clippingLinesColor_ -> addItem ("green" );
219+ clippingLinesColor_ -> addItem ("blue" );
220+ clippingLinesColor_ -> addItem ("cyan" );
221+ clippingLinesColor_ -> addItem ("magenta" );
222+ clippingLinesColor_ -> addItem ("yellow" );
223+ template_ -> bindWidget ("clippinglines-color" , clippingLinesColor_ );
224+ showIsolines_ = new WCheckBox (this );
225+ template_ -> bindWidget ("isolines" , showIsolines_ );
226+ isolineColormap_ = new WComboBox (this );
227+ isolineColormap_ -> addItem ("None (use surface's colormap)" );
228+ isolineColormap_ -> addItem ("Continuous" );
229+ isolineColormap_ -> addItem ("Continuous (5 bands)" );
230+ isolineColormap_ -> addItem ("Continuous (10 bands)" );
231+ template_ -> bindWidget ("isoline-colormap" , isolineColormap_ );
232+
150233 // make connections
234+ xClippingMin_ -> sliderMoved ().connect (changeXClippingMin_ );
235+ xClippingMax_ -> sliderMoved ().connect (changeXClippingMax_ );
236+ yClippingMin_ -> sliderMoved ().connect (changeYClippingMin_ );
237+ yClippingMax_ -> sliderMoved ().connect (changeYClippingMax_ );
238+ zClippingMin_ -> sliderMoved ().connect (changeZClippingMin_ );
239+ zClippingMax_ -> sliderMoved ().connect (changeZClippingMax_ );
240+
241+ showClippingLines_ -> checked ().connect (std ::bind ([& ] () {
242+ gridData_ -> setClippingLinesEnabled (true);
243+ }));
244+ showClippingLines_ -> unChecked ().connect (std ::bind ([& ] () {
245+ gridData_ -> setClippingLinesEnabled (false);
246+ }));
247+
151248 typeSelection_ -> changed ().connect (std ::bind ([& ] () {
152249 switch (typeSelection_ -> currentIndex ()) {
153250 case 0 :
@@ -180,26 +277,163 @@ NumGridDataSettings::NumGridDataSettings()
180277 }
181278 gridData_ -> setPen (pen );
182279 }));
280+ clippingLinesColor_ -> changed ().connect (std ::bind ([& ] () {
281+ switch (clippingLinesColor_ -> currentIndex ()) {
282+ case 0 :
283+ gridData_ -> setClippingLinesColor (black ); break ;
284+ case 1 :
285+ gridData_ -> setClippingLinesColor (red ); break ;
286+ case 2 :
287+ gridData_ -> setClippingLinesColor (green ); break ;
288+ case 3 :
289+ gridData_ -> setClippingLinesColor (blue ); break ;
290+ case 4 :
291+ gridData_ -> setClippingLinesColor (cyan ); break ;
292+ case 5 :
293+ gridData_ -> setClippingLinesColor (magenta ); break ;
294+ case 6 :
295+ gridData_ -> setClippingLinesColor (yellow ); break ;
296+ }
297+ }));
298+ showIsolines_ -> checked ().connect (std ::bind ([& ] () {
299+ std ::vector < double > isoLevels ;
300+ for (double z = -20.0 ; z <= 20.0 ; z += 0.5 ) {
301+ isoLevels .push_back (z );
302+ }
303+ gridData_ -> setIsoLevels (isoLevels );
304+ }));
305+ showIsolines_ -> unChecked ().connect (std ::bind ([& ] () {
306+ gridData_ -> setIsoLevels (std ::vector < double > ( ));
307+ }));
308+ isolineColormap_ -> changed ().connect (std ::bind ([& ] () {
309+ WStandardColorMap * colMap ;
310+ switch (isolineColormap_ -> currentIndex ()) {
311+ case 0 :
312+ gridData_ -> setIsoColorMap (0 ); break ;
313+ case 1 :
314+ gridData_ -> setIsoColorMap (new WStandardColorMap (gridData_ -> minimum (ZAxis_3D ), gridData_ -> maximum (ZAxis_3D ), true));
315+ break ;
316+ case 2 :
317+ colMap = new WStandardColorMap (gridData_ -> minimum (ZAxis_3D ), gridData_ -> maximum (ZAxis_3D ), true);
318+ colMap -> discretise (5 );
319+ gridData_ -> setIsoColorMap (colMap );
320+ break ;
321+ case 3 :
322+ colMap = new WStandardColorMap (gridData_ -> minimum (ZAxis_3D ), gridData_ -> maximum (ZAxis_3D ), true);
323+ colMap -> discretise (10 );
324+ gridData_ -> setIsoColorMap (colMap );
325+ break ;
326+ }
327+ }));
183328}
184329
185330void NumGridDataSettings ::bindDataSet (WAbstractGridData * data )
186331{
332+ for (auto & conn : clippingConnections_ ) {
333+ conn .disconnect ();
334+ }
335+
187336 gridData_ = data ;
188337
338+ changeXClippingMin_ .setJavaScript (
339+ "function (o,e,pos) { " + gridData_ -> changeClippingMin (XAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
340+ changeXClippingMax_ .setJavaScript (
341+ "function (o,e,pos) { " + gridData_ -> changeClippingMax (XAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
342+ changeYClippingMin_ .setJavaScript (
343+ "function (o,e,pos) { " + gridData_ -> changeClippingMin (YAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
344+ changeYClippingMax_ .setJavaScript (
345+ "function (o,e,pos) { " + gridData_ -> changeClippingMax (YAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
346+ changeZClippingMin_ .setJavaScript (
347+ "function (o,e,pos) { " + gridData_ -> changeClippingMin (ZAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
348+ changeZClippingMax_ .setJavaScript (
349+ "function (o,e,pos) { " + gridData_ -> changeClippingMax (ZAxis_3D ).execJs ("o" ,"e" ,"pos / 5.0" ) + " }" , 1 );
350+
351+ xClippingMin_ -> setValue (std ::max (gridData_ -> clippingMin (XAxis_3D ) * 5 , -100.0f ));
352+ xClippingMax_ -> setValue (std ::min (gridData_ -> clippingMax (XAxis_3D ) * 5 , 100.0f ));
353+ yClippingMin_ -> setValue (std ::max (gridData_ -> clippingMin (YAxis_3D ) * 5 , -100.0f ));
354+ yClippingMax_ -> setValue (std ::min (gridData_ -> clippingMax (YAxis_3D ) * 5 , 100.0f ));
355+ zClippingMin_ -> setValue (std ::max (gridData_ -> clippingMin (ZAxis_3D ) * 5 , -100.0f ));
356+ zClippingMax_ -> setValue (std ::min (gridData_ -> clippingMax (ZAxis_3D ) * 5 , 100.0f ));
357+
358+ clippingConnections_ .push_back (xClippingMin_ -> valueChanged ().connect (std ::bind ([& ] () {
359+ gridData_ -> setClippingMin (XAxis_3D , xClippingMin_ -> value () / 5.0 );
360+ })));
361+ clippingConnections_ .push_back (xClippingMax_ -> valueChanged ().connect (std ::bind ([& ] () {
362+ gridData_ -> setClippingMax (XAxis_3D , xClippingMax_ -> value () / 5.0 );
363+ })));
364+ clippingConnections_ .push_back (yClippingMin_ -> valueChanged ().connect (std ::bind ([& ] () {
365+ gridData_ -> setClippingMin (YAxis_3D , yClippingMin_ -> value () / 5.0 );
366+ })));
367+ clippingConnections_ .push_back (yClippingMax_ -> valueChanged ().connect (std ::bind ([& ] () {
368+ gridData_ -> setClippingMax (YAxis_3D , yClippingMax_ -> value () / 5.0 );
369+ })));
370+ clippingConnections_ .push_back (zClippingMin_ -> valueChanged ().connect (std ::bind ([& ] () {
371+ gridData_ -> setClippingMin (ZAxis_3D , zClippingMin_ -> value () / 5.0 );
372+ })));
373+ clippingConnections_ .push_back (zClippingMax_ -> valueChanged ().connect (std ::bind ([& ] () {
374+ gridData_ -> setClippingMax (ZAxis_3D , zClippingMax_ -> value () / 5.0 );
375+ })));
376+
377+ showClippingLines_ -> setChecked (gridData_ -> clippingLinesEnabled ());
378+
189379 // update UI fields
190380 DataSettings ::bindBaseDataSet (data );
191-
381+
192382 if (gridData_ -> type () == PointSeries3D )
193383 typeSelection_ -> setCurrentIndex (0 );
194384 else if (gridData_ -> type () == SurfaceSeries3D )
195385 typeSelection_ -> setCurrentIndex (1 );
196386
197- enableMesh_ -> setCheckState (gridData_ -> isSurfaceMeshEnabled () ?
387+ enableMesh_ -> setCheckState (gridData_ -> isSurfaceMeshEnabled () ?
198388 Checked : Unchecked );
199-
389+
200390 penSize_ -> setText (Wt ::asString (gridData_ -> pen ().width ().value ()));
201391
202- penColor_ -> setCurrentIndex (4 );
392+ WPen pen = gridData_ -> pen ();
393+ WColor penColor = pen .color ();
394+ if (penColor == WColor (black )) {
395+ penColor_ -> setCurrentIndex (0 );
396+ } else if (penColor == WColor (red )) {
397+ penColor_ -> setCurrentIndex (1 );
398+ } else if (penColor == WColor (green )) {
399+ penColor_ -> setCurrentIndex (2 );
400+ } else if (penColor == WColor (blue )) {
401+ penColor_ -> setCurrentIndex (3 );
402+ }
403+
404+ WColor clippingLinesColor = gridData_ -> clippingLinesColor ();
405+ if (clippingLinesColor == black ) {
406+ clippingLinesColor_ -> setCurrentIndex (0 );
407+ } else if (clippingLinesColor == red ) {
408+ clippingLinesColor_ -> setCurrentIndex (1 );
409+ } else if (clippingLinesColor == green ) {
410+ clippingLinesColor_ -> setCurrentIndex (2 );
411+ } else if (clippingLinesColor == blue ) {
412+ clippingLinesColor_ -> setCurrentIndex (3 );
413+ } else if (clippingLinesColor == cyan ) {
414+ clippingLinesColor_ -> setCurrentIndex (4 );
415+ } else if (clippingLinesColor == magenta ) {
416+ clippingLinesColor_ -> setCurrentIndex (5 );
417+ } else if (clippingLinesColor == yellow ) {
418+ clippingLinesColor_ -> setCurrentIndex (6 );
419+ }
420+
421+ showIsolines_ -> setChecked (gridData_ -> isoLevels ().size () > 0 );
422+
423+ if (gridData_ -> isoColorMap () == 0 ) {
424+ isolineColormap_ -> setCurrentIndex (0 );
425+ } else {
426+ const WStandardColorMap * map = dynamic_cast < const WStandardColorMap * >
427+ (gridData_ -> isoColorMap ());
428+ if (!map -> continuous ()) {
429+ if (map -> colorValuePairs ().size () == 5 )
430+ isolineColormap_ -> setCurrentIndex (2 );
431+ else if (map -> colorValuePairs ().size () == 10 )
432+ isolineColormap_ -> setCurrentIndex (3 );
433+ } else {
434+ isolineColormap_ -> setCurrentIndex (1 );
435+ }
436+ }
203437}
204438
205439
@@ -249,15 +483,14 @@ ScatterDataSettings::ScatterDataSettings()
249483 bindBaseToTemplate (template_ );
250484
251485 enableDroplines_ = new WCheckBox (this );
252- template_ -> bindWidget ("enabledroplines" , enableDroplines_ );
486+ template_ -> bindWidget ("enabledroplines" , enableDroplines_ );
253487 penSize_ = new WLineEdit (this );
254488 template_ -> bindWidget ("pensize" , penSize_ );
255489 penColor_ = new WComboBox (this );
256490 penColor_ -> addItem ("black" );
257491 penColor_ -> addItem ("red" );
258492 penColor_ -> addItem ("green" );
259493 penColor_ -> addItem ("blue" );
260- penColor_ -> addItem ("something" );
261494 template_ -> bindWidget ("pencolor" , penColor_ );
262495
263496 enableDroplines_ -> changed ().connect (std ::bind ([& ] () {
@@ -290,11 +523,21 @@ void ScatterDataSettings::bindDataSet(WScatterData *data)
290523
291524 // update the UI
292525 DataSettings ::bindBaseDataSet (data );
293-
526+
294527 enableDroplines_ -> setCheckState (scatterData_ -> droplinesEnabled () ?
295528 Checked : Unchecked );
296529
297530 penSize_ -> setText (Wt ::asString (scatterData_ -> droplinesPen ().width ().value ()));
298531
299- penColor_ -> setCurrentIndex (4 );
532+ WPen pen = scatterData_ -> droplinesPen ();
533+ WColor penColor = pen .color ();
534+ if (penColor == WColor (black )) {
535+ penColor_ -> setCurrentIndex (0 );
536+ } else if (penColor == WColor (red )) {
537+ penColor_ -> setCurrentIndex (1 );
538+ } else if (penColor == WColor (green )) {
539+ penColor_ -> setCurrentIndex (2 );
540+ } else if (penColor == WColor (blue )) {
541+ penColor_ -> setCurrentIndex (3 );
542+ }
300543}
0 commit comments