00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <string>
00012 #include <map>
00013
00014 #include "TGDoubleSlider.h"
00015 #include "TGColorSelect.h"
00016 #include "TGNumberEntry.h"
00017 #include "TVirtualPad.h"
00018 #include "TGListBox.h"
00019 #include "TGSlider.h"
00020 #include "TGButton.h"
00021 #include "TGLabel.h"
00022 #include "TString.h"
00023 #include "TColor.h"
00024 #include "TAxis.h"
00025
00026 #include "TGL5DDataSetEditor.h"
00027 #include "TGL5DPainter.h"
00028 #include "TGLUtil.h"
00029 #include "TGL5D.h"
00030
00031
00032
00033
00034
00035
00036
00037 namespace {
00038
00039 typedef TGL5DPainter::SurfIter_t SurfIter_t;
00040 typedef std::map<Int_t, SurfIter_t> IterMap_t;
00041 typedef IterMap_t::iterator IterMapIter_t;
00042
00043 }
00044
00045
00046
00047
00048 class TGL5DDataSetEditor::TGL5DEditorPrivate {
00049 public:
00050 IterMap_t fIterators;
00051 Bool_t IsValid(Int_t index)const
00052 {
00053 return fIterators.find(index) != fIterators.end();
00054 }
00055 };
00056
00057 ClassImp(TGL5DDataSetEditor);
00058
00059
00060 TGL5DDataSetEditor::TGL5DDataSetEditor(const TGWindow *p, Int_t width, Int_t height,
00061 UInt_t options, Pixel_t back) :
00062 TGedFrame(p, width, height, options | kVerticalFrame, back),
00063
00064 fNCellsXEntry(0),
00065 fNCellsYEntry(0),
00066 fNCellsZEntry(0),
00067 fXRangeSlider(0),
00068 fXRangeSliderMin(0),
00069 fXRangeSliderMax(0),
00070 fYRangeSlider(0),
00071 fYRangeSliderMin(0),
00072 fYRangeSliderMax(0),
00073 fZRangeSlider(0),
00074 fZRangeSliderMin(0),
00075 fZRangeSliderMax(0),
00076 fCancelGridBtn(0),
00077 fOkGridBtn(0),
00078
00079 fV4MinEntry(0),
00080 fV4MaxEntry(0),
00081 fHighlightCheck(0),
00082 fIsoList(0),
00083 fVisibleCheck(0),
00084 fShowCloud(0),
00085 fSurfColorSelect(0),
00086 fSurfAlphaSlider(0),
00087 fSurfRemoveBtn(0),
00088 fNewIsoEntry(0),
00089 fAddNewIsoBtn(0),
00090
00091 fShowBoxCut(),
00092 fNumberOfPlanes(0),
00093 fAlpha(0),
00094 fLogScale(0),
00095 fSlideRange(0),
00096 fApplyAlpha(0),
00097 fApplyPlanes(0),
00098
00099 fDataSet(0),
00100 fPainter(0),
00101 fHidden(0),
00102 fSelectedSurface(-1)
00103 {
00104
00105 CreateStyleTab();
00106 CreateGridTab();
00107 CreateIsoTab();
00108
00109 fHidden = new TGL5DEditorPrivate;
00110 }
00111
00112
00113
00114 TGL5DDataSetEditor::~TGL5DDataSetEditor()
00115 {
00116
00117 delete fHidden;
00118 }
00119
00120
00121 void TGL5DDataSetEditor::ConnectSignals2Slots()
00122 {
00123
00124
00125
00126 fShowBoxCut->Connect("Toggled(Bool_t)", "TGL5DDataSetEditor", this, "BoxCutToggled()");
00127 fAlpha->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
00128 fAlpha->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "AlphaChanged()");
00129 fNumberOfPlanes->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
00130 fNumberOfPlanes->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "NContoursChanged()");
00131 fApplyPlanes->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyPlanes()");
00132 fApplyAlpha->Connect("Clicked()", "TGL5DDataSetEditor", this, "ApplyAlpha()");
00133
00134
00135 fNCellsXEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00136 fNCellsXEntry->Connect("ValueChanged(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00137
00138 fNCellsYEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00139 fNCellsZEntry->Connect("ValueSet(Long_t)", "TGL5DDataSetEditor", this, "GridParametersChanged()");
00140
00141 fXRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "XSliderChanged()");
00142 fXRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMin()");
00143 fXRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "XSliderSetMax()");
00144
00145 fYRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "YSliderChanged()");
00146 fYRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMin()");
00147 fYRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "YSliderSetMax()");
00148
00149 fZRangeSlider->Connect("PositionChanged()", "TGL5DDataSetEditor", this, "ZSliderChanged()");
00150 fZRangeSliderMin->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMin()");
00151 fZRangeSliderMax->Connect("ReturnPressed()", "TGL5DDataSetEditor", this, "ZSliderSetMax()");
00152
00153 fCancelGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RollbackGridParameters()");
00154 fOkGridBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "ApplyGridParameters()");
00155
00156
00157 fIsoList->Connect("Selected(Int_t)", "TGL5DDataSetEditor", this, "SurfaceSelected(Int_t)");
00158 fIsoList->GetContainer()->RemoveInput(kKeyPressMask);
00159
00160 fHighlightCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "HighlightClicked()");
00161 fVisibleCheck->Connect("Clicked()", "TGL5DDataSetEditor", this, "VisibleClicked()");
00162 fSurfColorSelect->Connect("ColorSelected(Pixel_t)", "TGL5DDataSetEditor", this, "ColorChanged(Pixel_t)");
00163 fSurfAlphaSlider->Connect("PositionChanged(Int_t)", "TGL5DDataSetEditor", this, "AlphaChanged(Int_t)");
00164 fSurfRemoveBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "RemoveSurface()");
00165
00166 fAddNewIsoBtn->Connect("Pressed()", "TGL5DDataSetEditor", this, "AddNewSurface()");
00167
00168 fInit = kFALSE;
00169 }
00170
00171
00172 namespace
00173 {
00174
00175
00176
00177 void make_slider_range_entries(TGCompositeFrame *parent, TGNumberEntryField *&minEntry,
00178 const TString &minToolTip, TGNumberEntryField *&maxEntry,
00179 const TString &maxToolTip)
00180 {
00181 TGCompositeFrame *frame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
00182
00183 minEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
00184 TGNumberFormat::kNEAAnyNumber);
00185 minEntry->SetToolTipText(minToolTip.Data());
00186 minEntry->Resize(57, 20);
00187 frame->AddFrame(minEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00188
00189 maxEntry = new TGNumberEntryField(frame, -1, 0., TGNumberFormat::kNESRealThree,
00190 TGNumberFormat::kNEAAnyNumber);
00191 maxEntry->SetToolTipText(maxToolTip.Data());
00192 maxEntry->Resize(57, 20);
00193 frame->AddFrame(maxEntry, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00194 parent->AddFrame(frame, new TGLayoutHints(kLHintsTop, 5, 0, 0, 0));
00195 }
00196
00197
00198 TGHorizontalFrame *make_labeled_hframe(TGCompositeFrame *p, const char *text)
00199 {
00200 TGHorizontalFrame *frame = new TGHorizontalFrame(p);
00201 TGLabel *label = new TGLabel(frame, text);
00202 frame->AddFrame(label, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0));
00203 p->AddFrame(frame, new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
00204
00205 return frame;
00206 }
00207
00208
00209 TGDoubleHSlider *make_double_hslider(TGCompositeFrame *parent, const char *labelName)
00210 {
00211 TGCompositeFrame *sliderFrame = new TGCompositeFrame(parent, 80, 20, kHorizontalFrame);
00212 TGLabel *sliderLabel = new TGLabel(sliderFrame, labelName);
00213 sliderFrame->AddFrame(sliderLabel,
00214 new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2));
00215 TGDoubleHSlider *slider = new TGDoubleHSlider(sliderFrame, 1, 2);
00216 slider->Resize(110, 20);
00217
00218 sliderFrame->AddFrame(slider, new TGLayoutHints(kLHintsLeft));
00219 parent->AddFrame(sliderFrame, new TGLayoutHints(kLHintsTop, 2, 2, 2, 2));
00220
00221 return slider;
00222 }
00223
00224 }
00225
00226
00227 void TGL5DDataSetEditor::CreateStyleTab()
00228 {
00229
00230
00231 TGHorizontalFrame *f;
00232
00233 fShowBoxCut = new TGCheckButton(this, "Show Box Cut");
00234 fShowBoxCut->SetToolTipText("Box cut. When attached to a plot, cuts away a part of it");
00235 AddFrame(fShowBoxCut, new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
00236
00237 MakeTitle("isosurfaces");
00238 f = new TGHorizontalFrame(this, 200, 50);
00239 f->AddFrame(new TGLabel(f, "Number:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
00240 fNumberOfPlanes = new TGNumberEntry(f, 0, 3, -1, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
00241 TGNumberFormat::kNELLimitMinMax, 1, 200);
00242 fNumberOfPlanes->GetNumberEntry()->SetToolTipText("Set number of isosurfaces");
00243 f->AddFrame(fNumberOfPlanes, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00244 fApplyPlanes = new TGTextButton(f, " Apply ");
00245 f->AddFrame(fApplyPlanes, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00246 AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
00247
00248
00249 MakeTitle("Alpha");
00250 f = new TGHorizontalFrame(this, 200, 50);
00251 f->AddFrame(new TGLabel(f, "Value:"), new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5, 2, 2, 2));
00252 fAlpha = new TGNumberEntry(f, 0, 1, -1, TGNumberFormat::kNESRealThree, TGNumberFormat::kNEANonNegative,
00253 TGNumberFormat::kNELLimitMinMax, 0.1, 0.5);
00254 fAlpha->GetNumberEntry()->SetToolTipText("Value of alpha parameter");
00255 f->AddFrame(fAlpha, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00256 fApplyAlpha = new TGTextButton(f, " Apply ");
00257 f->AddFrame(fApplyAlpha, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00258 AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0, 0, 0, 0));
00259 fApplyAlpha->SetState(kButtonDisabled);
00260
00261 fLogScale = new TGCheckButton(this, "Log Scale");
00262 AddFrame(fLogScale, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 2, 2, 2));
00263
00264 AddFrame(new TGLabel(this, "Slide Range:"), new TGLayoutHints(kLHintsLeft, 5, 2, 2, 2));
00265 fSlideRange = new TGDoubleHSlider(this, 200, kDoubleScaleDownRight);
00266 AddFrame(fSlideRange, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 2, 2, 2));
00267 }
00268
00269
00270 void TGL5DDataSetEditor::CreateGridTab()
00271 {
00272
00273
00274 TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Grid");
00275
00276 TGGroupFrame *gridGroup = new TGGroupFrame(tabFrame, "Grid parameters", kVerticalFrame);
00277
00278 const UInt_t min = 10, max = 300;
00279 const UInt_t nDigits = 4;
00280
00281 TGHorizontalFrame *frame = make_labeled_hframe(gridGroup, "Cells along X:");
00282 fNCellsXEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
00283 TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00284 min, max);
00285 frame->AddFrame(fNCellsXEntry,
00286 new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00287
00288 frame = make_labeled_hframe(gridGroup, "Cells along Y:");
00289 fNCellsYEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
00290 TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00291 min, max);
00292 frame->AddFrame(fNCellsYEntry,
00293 new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00294
00295 frame = make_labeled_hframe(gridGroup, "Cells along Z:");
00296 fNCellsZEntry = new TGNumberEntry(frame, 0., nDigits, -1, TGNumberFormat::kNESInteger,
00297 TGNumberFormat::kNEAPositive, TGNumberFormat::kNELLimitMinMax,
00298 min, max);
00299 frame->AddFrame(fNCellsZEntry,
00300 new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00301 tabFrame->AddFrame(gridGroup, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2, 3, 3, 0));
00302
00303
00304 TGGroupFrame *rangeGroup = new TGGroupFrame(tabFrame, "Ranges", kVerticalFrame);
00305
00306 fXRangeSlider = make_double_hslider(rangeGroup, "X:");
00307 make_slider_range_entries(rangeGroup, fXRangeSliderMin, "Set the minimum value of the x-axis",
00308 fXRangeSliderMax, "Set the maximum value of the x-axis");
00309 fYRangeSlider = make_double_hslider(rangeGroup, "Y:");
00310 make_slider_range_entries(rangeGroup, fYRangeSliderMin, "Set the minimum value of the y-axis",
00311 fYRangeSliderMax, "Set the maximum value of the y-axis");
00312 fZRangeSlider = make_double_hslider(rangeGroup, "Z:");
00313 make_slider_range_entries(rangeGroup, fZRangeSliderMin, "Set the minimum value of the z-axis",
00314 fZRangeSliderMax, "Set the maximum value of the z-axis");
00315
00316 tabFrame->AddFrame(rangeGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00317
00318
00319 TGHorizontalFrame *horizontalFrame = new TGHorizontalFrame(tabFrame, 200, 50);
00320 fCancelGridBtn = new TGTextButton(horizontalFrame, " Cancel ");
00321 horizontalFrame->AddFrame(fCancelGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00322 fOkGridBtn = new TGTextButton(horizontalFrame, " Apply ");
00323 horizontalFrame->AddFrame(fOkGridBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2, 2, 2, 2));
00324 tabFrame->AddFrame(horizontalFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX, 2, 3, 0, 0));
00325 }
00326
00327
00328 void TGL5DDataSetEditor::CreateIsoTab()
00329 {
00330
00331 TGCompositeFrame *tabFrame = CreateEditorTabSubFrame("Surfaces");
00332
00333
00334 TGGroupFrame *v4Group = new TGGroupFrame(tabFrame, "V4 Range", kVerticalFrame);
00335
00336 make_slider_range_entries(v4Group, fV4MinEntry, "Minimum value of V4",
00337 fV4MaxEntry, "Maximum value of V4");
00338
00339 tabFrame->AddFrame(v4Group, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00340
00341 fV4MinEntry->SetState(kFALSE);
00342 fV4MaxEntry->SetState(kFALSE);
00343
00344
00345
00346 TGGroupFrame *isoGroup = new TGGroupFrame(tabFrame, "Iso-surfaces", kVerticalFrame);
00347
00348 fHighlightCheck = new TGCheckButton(isoGroup, "Highlight selected");
00349 fHighlightCheck->SetToolTipText("Highlight selected surface");
00350 fHighlightCheck->SetState(kButtonDown);
00351 isoGroup->AddFrame(fHighlightCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00352
00353 TGHorizontalFrame *hf = new TGHorizontalFrame(isoGroup);
00354 fIsoList = new TGListBox(hf);
00355 fIsoList->Resize(120, 120);
00356 hf->AddFrame(fIsoList, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5));
00357 isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
00358
00359 fVisibleCheck = new TGCheckButton(isoGroup, "Visible");
00360 fVisibleCheck->SetToolTipText("Show/hide surface");
00361 isoGroup->AddFrame(fVisibleCheck, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00362
00363 fShowCloud = new TGCheckButton(isoGroup, "Show cloud");
00364 fShowCloud->SetToolTipText("Show/hide cloud for surface");
00365 isoGroup->AddFrame(fShowCloud, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00366
00367
00368 hf = new TGHorizontalFrame(isoGroup);
00369 TGLabel* lab = new TGLabel(hf, "Color");
00370 hf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 8, 3));
00371 fSurfColorSelect = new TGColorSelect(hf, 0, -1);
00372 hf->AddFrame(fSurfColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 8, 1));
00373 isoGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
00374
00375 TGHorizontalFrame *frame = make_labeled_hframe(isoGroup, "Opacity: ");
00376 fSurfAlphaSlider = new TGHSlider(frame, 80);
00377 fSurfAlphaSlider->SetRange(0, 100);
00378 frame->AddFrame(fSurfAlphaSlider, new TGLayoutHints(kLHintsLeft));
00379
00380 fSurfRemoveBtn = new TGTextButton(isoGroup, " Remove surface ");
00381 isoGroup->AddFrame(fSurfRemoveBtn, new TGLayoutHints(kLHintsLeft, 2, 2, 2, 2));
00382 tabFrame->AddFrame(isoGroup, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00383
00384
00385 TGGroupFrame *newGroup = new TGGroupFrame(tabFrame, "New iso-surface", kVerticalFrame);
00386 hf = new TGHorizontalFrame(newGroup);
00387 fNewIsoEntry = new TGNumberEntry(hf, 0., 12, -1, TGNumberFormat::kNESReal);
00388 hf->AddFrame(fNewIsoEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
00389 fNewIsoEntry->Resize(60, 20);
00390 fAddNewIsoBtn = new TGTextButton(hf, " Add ");
00391 hf->AddFrame(fAddNewIsoBtn, new TGLayoutHints(kLHintsLeft | kLHintsCenterY | kLHintsExpandX, 2, 2, 2, 2));
00392 newGroup->AddFrame(hf, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
00393
00394 tabFrame->AddFrame(newGroup, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 3, 0, 0));
00395 }
00396
00397
00398 void TGL5DDataSetEditor::SetModel(TObject* obj)
00399 {
00400
00401 fPainter = 0;
00402 Bool_t needUpdate = fSelectedSurface != -1;
00403
00404 if ((fDataSet = dynamic_cast<TGL5DDataSet *>(obj))) {
00405 fPainter = fDataSet->GetRealPainter();
00406
00407 SetStyleTabWidgets();
00408 SetGridTabWidgets();
00409 SetIsoTabWidgets();
00410
00411 DisableGridTabButtons();
00412 DisableSurfaceControls();
00413
00414 if (fInit)
00415 ConnectSignals2Slots();
00416 }
00417
00418 if (needUpdate && gPad)
00419 gPad->Update();
00420 }
00421
00422 namespace {
00423
00424 void set_grid_range_widgets(const TAxis *a, const Rgl::Range_t r, TGDoubleHSlider *slider,
00425 TGNumberEntryField *eMin, TGNumberEntryField *eMax)
00426 {
00427 slider->SetRange(r.first, r.second);
00428 slider->SetPosition(a->GetBinLowEdge(1), a->GetBinUpEdge(a->GetLast()));
00429
00430 eMin->SetNumber(a->GetBinLowEdge(1));
00431 eMin->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
00432 eMax->SetNumber(a->GetBinUpEdge(a->GetLast()));
00433 eMax->SetLimits(TGNumberFormat::kNELLimitMinMax, r.first, r.second);
00434 }
00435
00436 }
00437
00438
00439 void TGL5DDataSetEditor::SetStyleTabWidgets()
00440 {
00441
00442
00443 fShowBoxCut->SetState(fPainter->IsBoxCutShown() ? kButtonDown : kButtonUp);
00444 fNumberOfPlanes->SetNumber(fPainter->GetNContours());
00445 fAlpha->SetNumber(fPainter->GetAlpha());
00446 }
00447
00448
00449 void TGL5DDataSetEditor::SetGridTabWidgets()
00450 {
00451
00452
00453 const TAxis *xA = fDataSet->GetXAxis();
00454 const TAxis *yA = fDataSet->GetYAxis();
00455 const TAxis *zA = fDataSet->GetZAxis();
00456 const Rgl::Range_t &xR = fDataSet->GetXRange();
00457 const Rgl::Range_t &yR = fDataSet->GetYRange();
00458 const Rgl::Range_t &zR = fDataSet->GetZRange();
00459
00460 fNCellsXEntry->SetIntNumber(xA->GetNbins());
00461 fNCellsYEntry->SetIntNumber(yA->GetNbins());
00462 fNCellsZEntry->SetIntNumber(zA->GetNbins());
00463
00464 set_grid_range_widgets(xA, xR, fXRangeSlider, fXRangeSliderMin, fXRangeSliderMax);
00465
00466 set_grid_range_widgets(yA, yR, fYRangeSlider, fYRangeSliderMin, fYRangeSliderMax);
00467
00468 set_grid_range_widgets(zA, zR, fZRangeSlider, fZRangeSliderMin, fZRangeSliderMax);
00469 }
00470
00471
00472 void TGL5DDataSetEditor::SetIsoTabWidgets()
00473 {
00474
00475 const Rgl::Range_t &v4R = fDataSet->GetV4Range();
00476
00477 fV4MinEntry->SetNumber(v4R.first);
00478 fV4MaxEntry->SetNumber(v4R.second);
00479
00480 fIsoList->RemoveAll();
00481 fHidden->fIterators.clear();
00482
00483 SurfIter_t curr = fPainter->SurfacesBegin();
00484
00485 for (Int_t ind = 0; curr != fPainter->SurfacesEnd(); ++curr, ++ind) {
00486 TString entry(TString::Format("Level: %f", curr->f4D));
00487 fIsoList->AddEntry(entry.Data(), ind);
00488 fIsoList->Layout();
00489 curr->fHighlight = kFALSE;
00490
00491
00492
00493
00494
00495 fHidden->fIterators[ind] = curr;
00496 }
00497
00498 fNewIsoEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, v4R.first, v4R.second);
00499 fNewIsoEntry->SetNumber(v4R.first);
00500
00501 fSelectedSurface = -1;
00502 }
00503
00504
00505 void TGL5DDataSetEditor::GridParametersChanged()
00506 {
00507
00508 EnableGridTabButtons();
00509 }
00510
00511
00512 void TGL5DDataSetEditor::EnableGridTabButtons()
00513 {
00514
00515 fCancelGridBtn->SetState(kButtonUp);
00516 fOkGridBtn->SetState(kButtonUp);
00517 }
00518
00519
00520 void TGL5DDataSetEditor::DisableGridTabButtons()
00521 {
00522
00523 fCancelGridBtn->SetState(kButtonDisabled);
00524 fOkGridBtn->SetState(kButtonDisabled);
00525 }
00526
00527
00528 void TGL5DDataSetEditor::EnableSurfaceControls()
00529 {
00530
00531 fVisibleCheck->SetState(kButtonUp);
00532
00533
00534 fSurfRemoveBtn->SetState(kButtonUp);
00535 }
00536
00537
00538 void TGL5DDataSetEditor::DisableSurfaceControls()
00539 {
00540
00541 fVisibleCheck->SetState(kButtonDisabled);
00542 fShowCloud->SetState(kButtonDisabled);
00543
00544 fSurfRemoveBtn->SetState(kButtonDisabled);
00545 }
00546
00547
00548 void TGL5DDataSetEditor::XSliderChanged()
00549 {
00550
00551 fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
00552 fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
00553
00554 EnableGridTabButtons();
00555 }
00556
00557
00558 void TGL5DDataSetEditor::YSliderChanged()
00559 {
00560
00561 fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
00562 fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
00563
00564 EnableGridTabButtons();
00565 }
00566
00567
00568 void TGL5DDataSetEditor::ZSliderChanged()
00569 {
00570
00571 fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
00572 fZRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
00573
00574 EnableGridTabButtons();
00575 }
00576
00577
00578 void TGL5DDataSetEditor::XSliderSetMin()
00579 {
00580
00581 if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
00582 fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(),
00583 fXRangeSliderMax->GetNumber());
00584 EnableGridTabButtons();
00585 } else
00586 fXRangeSliderMin->SetNumber(fXRangeSlider->GetMinPosition());
00587 }
00588
00589
00590 void TGL5DDataSetEditor::XSliderSetMax()
00591 {
00592
00593 if (fXRangeSliderMin->GetNumber() < fXRangeSliderMax->GetNumber()) {
00594 fXRangeSlider->SetPosition(fXRangeSliderMin->GetNumber(),
00595 fXRangeSliderMax->GetNumber());
00596 EnableGridTabButtons();
00597 } else
00598 fXRangeSliderMax->SetNumber(fXRangeSlider->GetMaxPosition());
00599 }
00600
00601
00602
00603 void TGL5DDataSetEditor::YSliderSetMin()
00604 {
00605
00606 if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
00607 fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(),
00608 fYRangeSliderMax->GetNumber());
00609 EnableGridTabButtons();
00610 } else
00611 fYRangeSliderMin->SetNumber(fYRangeSlider->GetMinPosition());
00612 }
00613
00614
00615 void TGL5DDataSetEditor::YSliderSetMax()
00616 {
00617
00618 if (fYRangeSliderMin->GetNumber() < fYRangeSliderMax->GetNumber()) {
00619 fYRangeSlider->SetPosition(fYRangeSliderMin->GetNumber(),
00620 fYRangeSliderMax->GetNumber());
00621 EnableGridTabButtons();
00622 } else
00623 fYRangeSliderMax->SetNumber(fYRangeSlider->GetMaxPosition());
00624 }
00625
00626
00627 void TGL5DDataSetEditor::ZSliderSetMin()
00628 {
00629
00630 if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
00631 fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(),
00632 fZRangeSliderMax->GetNumber());
00633 EnableGridTabButtons();
00634 } else
00635 fZRangeSliderMin->SetNumber(fZRangeSlider->GetMinPosition());
00636
00637 }
00638
00639
00640 void TGL5DDataSetEditor::ZSliderSetMax()
00641 {
00642
00643 if (fZRangeSliderMin->GetNumber() < fZRangeSliderMax->GetNumber()) {
00644 fZRangeSlider->SetPosition(fZRangeSliderMin->GetNumber(),
00645 fZRangeSliderMax->GetNumber());
00646 EnableGridTabButtons();
00647 } else
00648 fYRangeSliderMax->SetNumber(fZRangeSlider->GetMaxPosition());
00649 }
00650
00651
00652 void TGL5DDataSetEditor::RollbackGridParameters()
00653 {
00654
00655
00656 SetGridTabWidgets();
00657 DisableGridTabButtons();
00658 }
00659
00660
00661 void TGL5DDataSetEditor::ApplyGridParameters()
00662 {
00663
00664
00665 DisableGridTabButtons();
00666
00667 fDataSet->GetXAxis()->Set(fNCellsXEntry->GetIntNumber(),
00668 fXRangeSlider->GetMinPosition(),
00669 fXRangeSlider->GetMaxPosition());
00670
00671 fDataSet->GetYAxis()->Set(fNCellsYEntry->GetIntNumber(),
00672 fYRangeSlider->GetMinPosition(),
00673 fYRangeSlider->GetMaxPosition());
00674
00675 fDataSet->GetZAxis()->Set(fNCellsZEntry->GetIntNumber(),
00676 fZRangeSlider->GetMinPosition(),
00677 fZRangeSlider->GetMaxPosition());
00678
00679 fPainter->ResetGeometryRanges();
00680 if (gPad)
00681 gPad->Update();
00682 }
00683
00684
00685 void TGL5DDataSetEditor::HighlightClicked()
00686 {
00687
00688 if (fSelectedSurface == -1)
00689 return;
00690
00691 fHidden->fIterators[fSelectedSurface]->fHighlight = fHighlightCheck->IsOn();
00692
00693 if (gPad)
00694 gPad->Update();
00695 }
00696
00697
00698 void TGL5DDataSetEditor::SurfaceSelected(Int_t id)
00699 {
00700
00701
00702
00703 if (id >= 0) {
00704
00705 if (!fHidden->IsValid(id)) {
00706 Error("SurfaceSelected", "Got wrong index %d", id);
00707 return;
00708 }
00709
00710 if (fSelectedSurface != -1) {
00711
00712
00713 fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
00714 }
00715
00716 EnableSurfaceControls();
00717
00718
00719 SurfIter_t surf = fHidden->fIterators[fSelectedSurface = id];
00720 surf->fHighlight = fHighlightCheck->IsOn();
00721
00722 fVisibleCheck->SetOn(!surf->fHide);
00723 fSurfColorSelect->SetColor(TColor::Number2Pixel(surf->fColor), kFALSE);
00724 fSurfAlphaSlider->SetPosition(surf->fAlpha);
00725
00726 if (gPad)
00727 gPad->Update();
00728 } else if (fSelectedSurface != -1) {
00729
00730 fHidden->fIterators[fSelectedSurface]->fHighlight = kFALSE;
00731 fSelectedSurface = -1;
00732 DisableSurfaceControls();
00733 if (gPad)
00734 gPad->Update();
00735 }
00736 }
00737
00738
00739 void TGL5DDataSetEditor::VisibleClicked()
00740 {
00741
00742
00743
00744
00745
00746
00747 if (fSelectedSurface != -1) {
00748 fHidden->fIterators[fSelectedSurface]->fHide = !(fVisibleCheck->IsOn());
00749 if (gPad)
00750 gPad->Update();
00751 }
00752 }
00753
00754
00755 void TGL5DDataSetEditor::ColorChanged(Pixel_t pixel)
00756 {
00757
00758
00759 if (fSelectedSurface != -1) {
00760 fHidden->fIterators[fSelectedSurface]->fColor = Color_t(TColor::GetColor(pixel));
00761 if (gPad)
00762 gPad->Update();
00763 }
00764 }
00765
00766
00767 void TGL5DDataSetEditor::AlphaChanged(Int_t alpha)
00768 {
00769
00770
00771 if (fSelectedSurface != -1) {
00772 fHidden->fIterators[fSelectedSurface]->fAlpha = alpha;
00773 if (gPad)
00774 gPad->Update();
00775 }
00776 }
00777
00778
00779 void TGL5DDataSetEditor::RemoveSurface()
00780 {
00781
00782 if (fSelectedSurface != -1) {
00783
00784 SurfIter_t it = fHidden->fIterators[fSelectedSurface];
00785 fHidden->fIterators.erase(fSelectedSurface);
00786 fIsoList->RemoveEntry(fSelectedSurface);
00787 fIsoList->Layout();
00788 fPainter->RemoveSurface(it);
00789 DisableSurfaceControls();
00790 fSelectedSurface = -1;
00791
00792 if (gPad)
00793 gPad->Update();
00794 }
00795 }
00796
00797
00798 void TGL5DDataSetEditor::AddNewSurface()
00799 {
00800
00801 fPainter->AddSurface(fNewIsoEntry->GetNumber());
00802 SetModel(fDataSet);
00803
00804 if (gPad)
00805 gPad->Update();
00806 }
00807
00808
00809 void TGL5DDataSetEditor::ApplyAlpha()
00810 {
00811
00812
00813 if (fPainter) {
00814 fApplyAlpha->SetState(kButtonDisabled);
00815 fPainter->SetAlpha(fAlpha->GetNumber());
00816 fAlpha->SetNumber(fPainter->GetAlpha());
00817
00818
00819 SetModel(fDataSet);
00820 }
00821
00822 if (gPad)
00823 gPad->Update();
00824 }
00825
00826
00827
00828 void TGL5DDataSetEditor::ApplyPlanes()
00829 {
00830
00831
00832 if (fPainter) {
00833
00834 fPainter->SetNContours((Int_t)fNumberOfPlanes->GetIntNumber());
00835 fNumberOfPlanes->SetIntNumber(fPainter->GetNContours());
00836
00837
00838 SetModel(fDataSet);
00839 }
00840
00841 if (gPad)
00842 gPad->Update();
00843 }
00844
00845
00846 void TGL5DDataSetEditor::BoxCutToggled()
00847 {
00848
00849
00850 if (fPainter)
00851 fPainter->ShowBoxCut(fShowBoxCut->IsOn());
00852 if (gPad)
00853 gPad->Update();
00854 }
00855
00856
00857 void TGL5DDataSetEditor::AlphaChanged()
00858 {
00859
00860
00861 fApplyAlpha->SetState(kButtonUp);
00862 }
00863
00864
00865 void TGL5DDataSetEditor::NContoursChanged()
00866 {
00867
00868
00869
00870 }