Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGeoMatrixEditor.cxx
Go to the documentation of this file.
1 // @(#):$Id$
2 // Author: M.Gheata
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 /** \class TGeoTranslationEditor
13 \ingroup Geometry_builder
14 
15 Editor for a TGeoTranslation.
16 
17 */
18 
19 #include "TGeoMatrixEditor.h"
20 #include "TGeoTabManager.h"
21 #include "TGeoMatrix.h"
22 #include "TPad.h"
23 #include "TGTab.h"
24 #include "TGComboBox.h"
25 #include "TGButton.h"
26 #include "TGButtonGroup.h"
27 #include "TGTextEntry.h"
28 #include "TGNumberEntry.h"
29 #include "TGLabel.h"
30 
31 ClassImp(TGeoTranslationEditor);
32 
33 enum ETGeoMatrixWid {
34  kMATRIX_NAME, kMATRIX_DX, kMATRIX_DY, kMATRIX_DZ,
35  kMATRIX_PHI, kMATRIX_THETA, kMATRIX_PSI,
36  kMATRIX_APPLY, kMATRIX_CANCEL, kMATRIX_UNDO
37 };
38 
39 ////////////////////////////////////////////////////////////////////////////////
40 /// Constructor for translation editor
41 
42 TGeoTranslationEditor::TGeoTranslationEditor(const TGWindow *p, Int_t width,
43  Int_t height, UInt_t options, Pixel_t back)
44  : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
45 {
46  fTranslation = 0;
47  fDxi = fDyi = fDzi = 0.0;
48  fNamei = "";
49  fIsModified = kFALSE;
50  fIsEditable = kFALSE;
51 
52  // TextEntry for name
53  MakeTitle("Name");
54  fTransName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
55  fTransName->Resize(135, fTransName->GetDefaultHeight());
56  fTransName->SetToolTipText("Enter the translation name");
57  fTransName->Associate(this);
58  AddFrame(fTransName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
59 
60  TGTextEntry *nef;
61  MakeTitle("Translations on axes");
62  TGCompositeFrame *compxyz = new TGCompositeFrame(this, 118, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
63  // Number entry for dx
64  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
65  kLHintsExpandX | kFixedWidth | kOwnBackground);
66  f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
67  fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
68  nef = (TGTextEntry*)fTransDx->GetNumberEntry();
69  nef->SetToolTipText("Enter the translation on X");
70  fTransDx->Associate(this);
71  f1->AddFrame(fTransDx, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
72  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
73 
74  // Number entry for dy
75  TGCompositeFrame *f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
76  kLHintsExpandX | kFixedWidth | kOwnBackground);
77  f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
78  fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
79  nef = (TGTextEntry*)fTransDy->GetNumberEntry();
80  nef->SetToolTipText("Enter the translation on Y");
81  fTransDy->Associate(this);
82  f2->AddFrame(fTransDy, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
83  compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
84 
85  // Number entry for dx
86  TGCompositeFrame *f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
87  kLHintsExpandX | kFixedWidth | kOwnBackground);
88  f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
89  fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
90  nef = (TGTextEntry*)fTransDz->GetNumberEntry();
91  nef->SetToolTipText("Enter the translation on Z");
92  fTransDz->Associate(this);
93  f3->AddFrame(fTransDz, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
94  compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
95 
96  compxyz->Resize(150,30);
97  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
98 
99  // Buttons
100  TGCompositeFrame *f23 = new TGCompositeFrame(this, 118, 20, kHorizontalFrame | kSunkenFrame | kDoubleBorder);
101  fApply = new TGTextButton(f23, "&Apply");
102  f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
103  fApply->Associate(this);
104  fCancel = new TGTextButton(f23, "&Cancel");
105  f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
106  fCancel->Associate(this);
107  fUndo = new TGTextButton(f23, " &Undo ");
108  f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight , 2, 2, 4, 4));
109  fUndo->Associate(this);
110  AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
111  fUndo->SetSize(fCancel->GetSize());
112  fApply->SetSize(fCancel->GetSize());
113 }
114 
115 ////////////////////////////////////////////////////////////////////////////////
116 /// Destructor.
117 
118 TGeoTranslationEditor::~TGeoTranslationEditor()
119 {
120  TGFrameElement *el;
121  TIter next(GetList());
122  while ((el = (TGFrameElement *)next())) {
123  if (el->fFrame->IsComposite())
124  TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
125  }
126  Cleanup();
127 }
128 
129 ////////////////////////////////////////////////////////////////////////////////
130 /// Connect signals to slots.
131 
132 void TGeoTranslationEditor::ConnectSignals2Slots()
133 {
134  fApply->Connect("Clicked()", "TGeoTranslationEditor", this, "DoApply()");
135  fCancel->Connect("Clicked()", "TGeoTranslationEditor", this, "DoCancel()");
136  fUndo->Connect("Clicked()", "TGeoTranslationEditor", this, "DoUndo()");
137  fTransName->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoModified()");
138  fTransDx->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDx()");
139  fTransDy->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDy()");
140  fTransDz->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDz()");
141  fTransDx->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDx()");
142  fTransDy->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDy()");
143  fTransDz->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDz()");
144  fInit = kFALSE;
145 }
146 
147 
148 ////////////////////////////////////////////////////////////////////////////////
149 /// Connect to the new matrix.
150 
151 void TGeoTranslationEditor::SetModel(TObject* obj)
152 {
153  if (obj == 0 || (obj->IsA()!=TGeoTranslation::Class())) {
154  SetActive(kFALSE);
155  return;
156  }
157  fTranslation = (TGeoTranslation*)obj;
158  fDxi = fTranslation->GetTranslation()[0];
159  fDyi = fTranslation->GetTranslation()[1];
160  fDzi = fTranslation->GetTranslation()[2];
161  const char *sname = fTranslation->GetName();
162  if (!strcmp(sname, fTranslation->ClassName())) fTransName->SetText("no_name");
163  else {
164  fTransName->SetText(sname);
165  fNamei = sname;
166  }
167  fTransDx->SetNumber(fDxi);
168  fTransDy->SetNumber(fDyi);
169  fTransDz->SetNumber(fDzi);
170  fApply->SetEnabled(kFALSE);
171  fUndo->SetEnabled(kFALSE);
172  fCancel->SetEnabled(kFALSE);
173 
174  if (fInit) ConnectSignals2Slots();
175  SetActive();
176 }
177 
178 ////////////////////////////////////////////////////////////////////////////////
179 /// Slot for name.
180 
181 void TGeoTranslationEditor::DoName()
182 {
183  const char *name = fTransName->GetText();
184  if (!strcmp(name, "no_name") || !strcmp(name, fTranslation->GetName())) return;
185  fTranslation->SetName(name);
186 }
187 
188 ////////////////////////////////////////////////////////////////////////////////
189 /// Slot for checking parameters.
190 
191 Bool_t TGeoTranslationEditor::DoParameters()
192 {
193  Double_t dx = fTransDx->GetNumber();
194  Double_t dy = fTransDy->GetNumber();
195  Double_t dz = fTransDz->GetNumber();
196  Bool_t changed = kFALSE;
197  if (dx != fTranslation->GetTranslation()[0] ||
198  dy != fTranslation->GetTranslation()[1] ||
199  dz != fTranslation->GetTranslation()[2]) changed = kTRUE;
200  if (!changed) return kFALSE;
201  fUndo->SetEnabled();
202  fTranslation->SetTranslation(dx, dy, dz);
203  if (fPad) {
204  fPad->Modified();
205  fPad->Update();
206  }
207  return kTRUE;
208 }
209 
210 ////////////////////////////////////////////////////////////////////////////////
211 /// Slot for applying changes.
212 
213 void TGeoTranslationEditor::DoApply()
214 {
215  DoName();
216  if (DoParameters()) {
217  fUndo->SetEnabled();
218  fCancel->SetEnabled(kFALSE);
219  fApply->SetEnabled(kFALSE);
220  }
221 }
222 
223 ////////////////////////////////////////////////////////////////////////////////
224 /// Slot for cancelling last modifications non-applied.
225 
226 void TGeoTranslationEditor::DoCancel()
227 {
228  if (!fNamei.Length()) fTransName->SetText("no_name");
229  else fTransName->SetText(fNamei.Data());
230  fTransDx->SetNumber(fDxi);
231  fTransDy->SetNumber(fDyi);
232  fTransDz->SetNumber(fDzi);
233  fApply->SetEnabled(kFALSE);
234  fUndo->SetEnabled(kFALSE);
235  fCancel->SetEnabled(kFALSE);
236 }
237 
238 ////////////////////////////////////////////////////////////////////////////////
239 /// Slot for notifying changes.
240 
241 void TGeoTranslationEditor::DoModified()
242 {
243  fApply->SetEnabled();
244  if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
245 }
246 
247 ////////////////////////////////////////////////////////////////////////////////
248 /// Slot for undoing last operation.
249 
250 void TGeoTranslationEditor::DoUndo()
251 {
252  DoCancel();
253  DoParameters();
254  fCancel->SetEnabled(kFALSE);
255  fUndo->SetEnabled(kFALSE);
256  fApply->SetEnabled(kFALSE);
257 }
258 
259 ////////////////////////////////////////////////////////////////////////////////
260 /// Slot for dx.
261 
262 void TGeoTranslationEditor::DoDx()
263 {
264  DoModified();
265 }
266 
267 ////////////////////////////////////////////////////////////////////////////////
268 /// Slot for dx.
269 
270 void TGeoTranslationEditor::DoDy()
271 {
272  DoModified();
273 }
274 
275 ////////////////////////////////////////////////////////////////////////////////
276 /// Slot for dx.
277 
278 void TGeoTranslationEditor::DoDz()
279 {
280  DoModified();
281 }
282 
283 /** \class TGeoRotationEditor
284 \ingroup Geometry_builder
285 
286 Editor for a TGeoRotation.
287 
288 */
289 
290 ClassImp(TGeoRotationEditor);
291 
292 ////////////////////////////////////////////////////////////////////////////////
293 /// Constructor for rotation editor
294 
295 TGeoRotationEditor::TGeoRotationEditor(const TGWindow *p, Int_t width,
296  Int_t height, UInt_t options, Pixel_t back)
297  : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
298 {
299  fRotation = 0;
300  fPhii = fThetai = fPsii = 0.0;
301  fAngleX = fAngleY = fAngleZ = 0.0;
302  fNamei = "";
303  fIsModified = kFALSE;
304  fIsEditable = kFALSE;
305 
306  // TextEntry for name
307  MakeTitle("Name");
308  fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
309  fRotName->Resize(135, fRotName->GetDefaultHeight());
310  fRotName->SetToolTipText("Enter the rotation name");
311  fRotName->Associate(this);
312  AddFrame(fRotName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
313 
314  TGTextEntry *nef;
315  MakeTitle("Euler angles");
316  TGCompositeFrame *compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
317  // Number entry for phi angle
318  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
319  kLHintsExpandX | kFixedWidth | kOwnBackground);
320  f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
321  fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
322  nef = (TGTextEntry*)fRotPhi->GetNumberEntry();
323  nef->SetToolTipText("Modify the first rotation angle about Z");
324  fRotPhi->Associate(this);
325  fRotPhi->Resize(90, fRotPhi->GetDefaultHeight());
326  f1->AddFrame(fRotPhi, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
327  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
328 
329  // Number entry for theta angle
330  TGCompositeFrame *f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
331  kLHintsExpandX | kFixedWidth | kOwnBackground);
332  f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
333  fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
334  nef = (TGTextEntry*)fRotTheta->GetNumberEntry();
335  nef->SetToolTipText("Modify the second rotation angle about the new X");
336  fRotTheta->Associate(this);
337  fRotTheta->Resize(90, fRotTheta->GetDefaultHeight());
338  f2->AddFrame(fRotTheta, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
339  compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
340 
341  // Number entry for psi angle
342  TGCompositeFrame *f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
343  kLHintsExpandX | kFixedWidth | kOwnBackground);
344  f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
345  fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
346  nef = (TGTextEntry*)fRotPsi->GetNumberEntry();
347  nef->SetToolTipText("Modify the third rotation angle about Z");
348  fRotPsi->Associate(this);
349  fRotPsi->Resize(90, fRotPsi->GetDefaultHeight());
350  f3->AddFrame(fRotPsi, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
351  compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
352 
353  compxyz->Resize(150,compxyz->GetDefaultHeight());
354  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
355 
356  MakeTitle("Rotate about axis");
357  compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
358  // Number entry for rotation angle about one axis
359  f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
360  kLHintsExpandX | kFixedWidth | kOwnBackground);
361  f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
362  fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
363  nef = (TGTextEntry*)fRotAxis->GetNumberEntry();
364  nef->SetToolTipText("Enter the new rotation angle about the selected axis");
365  fRotAxis->Associate(this);
366  fRotAxis->Resize(90, fRotAxis->GetDefaultHeight());
367  f1->AddFrame(fRotAxis, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
368  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
369 
370  // Radio buttons group for axis selection
371  TGHButtonGroup *bg1 = new TGHButtonGroup(compxyz, " Axis ");
372  fRotX = new TGRadioButton(bg1, " &X ", kMATRIX_DX);
373  fRotY = new TGRadioButton(bg1, " &Y ", kMATRIX_DY);
374  fRotZ = new TGRadioButton(bg1, " &Z ", kMATRIX_DZ);
375  bg1->SetRadioButtonExclusive();
376  bg1->Show();
377  compxyz->AddFrame(bg1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
378 
379  compxyz->Resize(150,compxyz->GetDefaultHeight());
380  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
381 
382 
383  // Buttons
384  TGCompositeFrame *f23 = new TGCompositeFrame(this, 118, 20, kHorizontalFrame | kSunkenFrame | kDoubleBorder);
385  fApply = new TGTextButton(f23, "Apply");
386  f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
387  fApply->Associate(this);
388  fCancel = new TGTextButton(f23, "Cancel");
389  f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
390  fCancel->Associate(this);
391  fUndo = new TGTextButton(f23, " Undo ");
392  f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight , 2, 2, 4, 4));
393  fUndo->Associate(this);
394  AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
395  fUndo->SetSize(fCancel->GetSize());
396  fApply->SetSize(fCancel->GetSize());
397 }
398 
399 ////////////////////////////////////////////////////////////////////////////////
400 /// Destructor
401 
402 TGeoRotationEditor::~TGeoRotationEditor()
403 {
404  TGFrameElement *el;
405  TIter next(GetList());
406  while ((el = (TGFrameElement *)next())) {
407  if (el->fFrame->IsComposite())
408  TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
409  }
410  Cleanup();
411 }
412 
413 ////////////////////////////////////////////////////////////////////////////////
414 /// Connect signals to slots.
415 
416 void TGeoRotationEditor::ConnectSignals2Slots()
417 {
418  fApply->Connect("Clicked()", "TGeoRotationEditor", this, "DoApply()");
419  fCancel->Connect("Clicked()", "TGeoRotationEditor", this, "DoCancel()");
420  fUndo->Connect("Clicked()", "TGeoRotationEditor", this, "DoUndo()");
421  fRotName->Connect("TextChanged(const char *)", "TGeoRotationEditor", this, "DoModified()");
422  fRotPhi->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotPhi()");
423  fRotTheta->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotTheta()");
424  fRotPsi->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotPsi()");
425  fRotAxis->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotAngle()");
426  fInit = kFALSE;
427 }
428 
429 
430 ////////////////////////////////////////////////////////////////////////////////
431 /// Connect to the selected rotation.
432 
433 void TGeoRotationEditor::SetModel(TObject* obj)
434 {
435  if (obj == 0 || (obj->IsA()!=TGeoRotation::Class())) {
436  SetActive(kFALSE);
437  return;
438  }
439  fRotation = (TGeoRotation*)obj;
440  fRotation->GetAngles(fPhii, fThetai, fPsii);
441  const char *sname = fRotation->GetName();
442  if (!strcmp(sname, fRotation->ClassName())) fRotName->SetText("no_name");
443  else {
444  fRotName->SetText(sname);
445  fNamei = sname;
446  }
447  fRotPhi->SetNumber(fPhii);
448  fRotTheta->SetNumber(fThetai);
449  fRotPsi->SetNumber(fPsii);
450  fRotAxis->SetNumber(0.0);
451 
452  fApply->SetEnabled(kFALSE);
453  fUndo->SetEnabled(kFALSE);
454  fCancel->SetEnabled(kFALSE);
455 
456  if (fInit) ConnectSignals2Slots();
457  SetActive();
458 }
459 
460 ////////////////////////////////////////////////////////////////////////////////
461 /// Slot for name.
462 
463 void TGeoRotationEditor::DoName()
464 {
465  const char *name = fRotName->GetText();
466  if (!strcmp(name, "no_name") || !strcmp(name, fRotation->GetName())) return;
467  fRotation->SetName(name);
468 }
469 
470 ////////////////////////////////////////////////////////////////////////////////
471 /// Slot for phi (Euler X convention)
472 
473 void TGeoRotationEditor::DoRotPhi()
474 {
475  if (fRotPhi->GetNumber() < 0.) fRotPhi->SetNumber(fRotPhi->GetNumber()+360.);
476  if (fRotPhi->GetNumber() >= 360.) fRotPhi->SetNumber(fRotPhi->GetNumber()-360.);
477  DoModified();
478 }
479 
480 ////////////////////////////////////////////////////////////////////////////////
481 /// Slot for theta (Euler X convention)
482 
483 void TGeoRotationEditor::DoRotTheta()
484 {
485  if (fRotTheta->GetNumber() < 0.) fRotTheta->SetNumber(fRotTheta->GetNumber()+360.);
486  if (fRotTheta->GetNumber() >= 360.) fRotTheta->SetNumber(fRotTheta->GetNumber()-360.);
487  DoModified();
488 }
489 
490 ////////////////////////////////////////////////////////////////////////////////
491 /// Slot for psi (Euler X convention)
492 
493 void TGeoRotationEditor::DoRotPsi()
494 {
495  if (fRotPsi->GetNumber() < 0.) fRotPsi->SetNumber(fRotPsi->GetNumber()+360.);
496  if (fRotPsi->GetNumber() >= 360.) fRotPsi->SetNumber(fRotPsi->GetNumber()-360.);
497  DoModified();
498 }
499 
500 ////////////////////////////////////////////////////////////////////////////////
501 /// Slot for additional rotation about one axis.
502 
503 void TGeoRotationEditor::DoRotAngle()
504 {
505  if (fRotAxis->GetNumber() < 0.) fRotAxis->SetNumber(fRotAxis->GetNumber()+360.);
506  if (fRotAxis->GetNumber() >= 360.) fRotAxis->SetNumber(fRotAxis->GetNumber()-360.);
507  DoModified();
508 }
509 
510 ////////////////////////////////////////////////////////////////////////////////
511 /// Slot for checking parameters.
512 
513 Bool_t TGeoRotationEditor::DoParameters()
514 {
515  Double_t phi = fRotPhi->GetNumber();
516  Double_t theta = fRotTheta->GetNumber();
517  Double_t psi = fRotPsi->GetNumber();
518  Double_t angle = fRotAxis->GetNumber();
519  Double_t phi0 = 0., theta0 = 0., psi0 = 0.;
520  fRotation->GetAngles(phi0,theta0,psi0);
521  Bool_t changed = kFALSE;
522  if (phi != psi0 || theta != theta0 || psi != psi0) changed = kTRUE;
523  if (changed) fRotation->SetAngles(phi, theta, psi);
524  // Check if we have to rotate about one axis
525  if (angle != 0.0) {
526  if (fRotX->IsOn()) {fRotation->RotateX(angle); changed = kTRUE;}
527  if (fRotY->IsOn()) {fRotation->RotateY(angle); changed = kTRUE;}
528  if (fRotZ->IsOn()) {fRotation->RotateZ(angle); changed = kTRUE;}
529  }
530  if (!changed) return kFALSE;
531  fRotAxis->SetNumber(0.0);
532  fUndo->SetEnabled();
533  if (fPad) {
534  fPad->Modified();
535  fPad->Update();
536  }
537  return kTRUE;
538 }
539 
540 ////////////////////////////////////////////////////////////////////////////////
541 /// Slot for applying modifications.
542 
543 void TGeoRotationEditor::DoApply()
544 {
545  DoName();
546  if (DoParameters()) {
547  fUndo->SetEnabled();
548  fCancel->SetEnabled(kFALSE);
549  fApply->SetEnabled(kFALSE);
550  }
551 }
552 
553 ////////////////////////////////////////////////////////////////////////////////
554 /// Slot for cancelling last un-applied operations.
555 
556 void TGeoRotationEditor::DoCancel()
557 {
558  if (!fNamei.Length()) fRotName->SetText("no_name");
559  else fRotName->SetText(fNamei.Data());
560  fRotPhi->SetNumber(fPhii);
561  fRotTheta->SetNumber(fThetai);
562  fRotPsi->SetNumber(fPsii);
563  fRotAxis->SetNumber(0.0);
564  fApply->SetEnabled(kFALSE);
565  fUndo->SetEnabled(kFALSE);
566  fCancel->SetEnabled(kFALSE);
567 }
568 
569 ////////////////////////////////////////////////////////////////////////////////
570 /// Slot for notifying changes.
571 
572 void TGeoRotationEditor::DoModified()
573 {
574  fApply->SetEnabled();
575  if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
576 }
577 
578 ////////////////////////////////////////////////////////////////////////////////
579 /// Slot for undoing last changes.
580 
581 void TGeoRotationEditor::DoUndo()
582 {
583  DoCancel();
584  DoParameters();
585  fCancel->SetEnabled(kFALSE);
586  fUndo->SetEnabled(kFALSE);
587  fApply->SetEnabled(kFALSE);
588 }
589 
590 /** \class TGeoCombiTransEditor
591 \ingroup Geometry_builder
592 
593 Editor for a TGeoCombiTrans.
594 
595 */
596 
597 ClassImp(TGeoCombiTransEditor);
598 
599 ////////////////////////////////////////////////////////////////////////////////
600 /// Constructor for combi matrix editor
601 
602 TGeoCombiTransEditor::TGeoCombiTransEditor(const TGWindow *p, Int_t width,
603  Int_t height, UInt_t options, Pixel_t back)
604  : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
605 {
606  fCombi = 0;
607  fPhii = fThetai = fPsii = 0.0;
608  fDxi = fDyi = fDzi = 0.0;
609  fAngleX = fAngleY = fAngleZ = 0.0;
610  fNamei = "";
611  fIsModified = kFALSE;
612  fIsEditable = kFALSE;
613 
614  // TextEntry for name
615  MakeTitle("Name");
616  fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
617  fRotName->Resize(135, fRotName->GetDefaultHeight());
618  fRotName->SetToolTipText("Enter the rotation name");
619  fRotName->Associate(this);
620  AddFrame(fRotName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
621 
622  TGTextEntry *nef;
623  MakeTitle("Translations on axes");
624  TGCompositeFrame *compxyz = new TGCompositeFrame(this, 118, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
625  // Number entry for dx
626  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
627  kLHintsExpandX | kFixedWidth | kOwnBackground);
628  f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
629  fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
630  nef = (TGTextEntry*)fTransDx->GetNumberEntry();
631  nef->SetToolTipText("Enter the translation on X");
632  fTransDx->Associate(this);
633  f1->AddFrame(fTransDx, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
634  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
635 
636  // Number entry for dy
637  TGCompositeFrame *f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
638  kLHintsExpandX | kFixedWidth | kOwnBackground);
639  f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
640  fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
641  nef = (TGTextEntry*)fTransDy->GetNumberEntry();
642  nef->SetToolTipText("Enter the translation on Y");
643  fTransDy->Associate(this);
644  f2->AddFrame(fTransDy, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
645  compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
646 
647  // Number entry for dx
648  TGCompositeFrame *f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
649  kLHintsExpandX | kFixedWidth | kOwnBackground);
650  f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
651  fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
652  nef = (TGTextEntry*)fTransDz->GetNumberEntry();
653  nef->SetToolTipText("Enter the translation on Z");
654  fTransDz->Associate(this);
655  f3->AddFrame(fTransDz, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
656  compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
657 
658  compxyz->Resize(150,30);
659  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
660 
661 
662  MakeTitle("Euler angles");
663  compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
664  // Number entry for phi angle
665  f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
666  kLHintsExpandX | kFixedWidth | kOwnBackground);
667  f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
668  fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
669  nef = (TGTextEntry*)fRotPhi->GetNumberEntry();
670  nef->SetToolTipText("Modify the first rotation angle about Z");
671  fRotPhi->Associate(this);
672  fRotPhi->Resize(90, fRotPhi->GetDefaultHeight());
673  f1->AddFrame(fRotPhi, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
674  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
675 
676  // Number entry for theta angle
677  f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
678  kLHintsExpandX | kFixedWidth | kOwnBackground);
679  f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
680  fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
681  nef = (TGTextEntry*)fRotTheta->GetNumberEntry();
682  nef->SetToolTipText("Modify the second rotation angle about the new X");
683  fRotTheta->Associate(this);
684  fRotTheta->Resize(90, fRotTheta->GetDefaultHeight());
685  f2->AddFrame(fRotTheta, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
686  compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
687 
688  // Number entry for psi angle
689  f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
690  kLHintsExpandX | kFixedWidth | kOwnBackground);
691  f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
692  fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
693  nef = (TGTextEntry*)fRotPsi->GetNumberEntry();
694  nef->SetToolTipText("Modify the third rotation angle about Z");
695  fRotPsi->Associate(this);
696  fRotPsi->Resize(90, fRotPsi->GetDefaultHeight());
697  f3->AddFrame(fRotPsi, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
698  compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
699 
700  compxyz->Resize(150,compxyz->GetDefaultHeight());
701  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
702 
703  MakeTitle("Rotate about axis");
704  compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
705  // Number entry for rotation angle about one axis
706  f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
707  kLHintsExpandX | kFixedWidth | kOwnBackground);
708  f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
709  fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
710  nef = (TGTextEntry*)fRotAxis->GetNumberEntry();
711  nef->SetToolTipText("Enter the new rotation angle about the selected axis");
712  fRotAxis->Associate(this);
713  fRotAxis->Resize(90, fRotAxis->GetDefaultHeight());
714  f1->AddFrame(fRotAxis, new TGLayoutHints(kLHintsRight , 2, 2, 2, 2));
715  compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
716 
717  // Radio buttons group for axis selection
718  TGHButtonGroup *bg1 = new TGHButtonGroup(compxyz, " Axis ");
719  fRotX = new TGRadioButton(bg1, " &X ", kMATRIX_DX);
720  fRotY = new TGRadioButton(bg1, " &Y ", kMATRIX_DY);
721  fRotZ = new TGRadioButton(bg1, " &Z ", kMATRIX_DZ);
722  bg1->SetRadioButtonExclusive();
723  bg1->Show();
724  compxyz->AddFrame(bg1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
725 
726  compxyz->Resize(150,compxyz->GetDefaultHeight());
727  AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
728 
729 
730  // Buttons
731  TGCompositeFrame *f23 = new TGCompositeFrame(this, 118, 20, kHorizontalFrame | kSunkenFrame | kDoubleBorder);
732  fApply = new TGTextButton(f23, "&Apply");
733  f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
734  fApply->Associate(this);
735  fCancel = new TGTextButton(f23, "&Cancel");
736  f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
737  fCancel->Associate(this);
738  fUndo = new TGTextButton(f23, " &Undo ");
739  f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight , 2, 2, 4, 4));
740  fUndo->Associate(this);
741  AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
742  fUndo->SetSize(fCancel->GetSize());
743  fApply->SetSize(fCancel->GetSize());
744 }
745 
746 ////////////////////////////////////////////////////////////////////////////////
747 /// Destructor
748 
749 TGeoCombiTransEditor::~TGeoCombiTransEditor()
750 {
751  TGFrameElement *el;
752  TIter next(GetList());
753  while ((el = (TGFrameElement *)next())) {
754  if (el->fFrame->IsComposite())
755  TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
756  }
757  Cleanup();
758 }
759 
760 ////////////////////////////////////////////////////////////////////////////////
761 /// Connect signals to slots.
762 
763 void TGeoCombiTransEditor::ConnectSignals2Slots()
764 {
765  fApply->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoApply()");
766  fCancel->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoCancel()");
767  fUndo->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoUndo()");
768  fRotName->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoModified()");
769  fRotPhi->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotPhi()");
770  fRotTheta->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotTheta()");
771  fRotPsi->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotPsi()");
772  fRotAxis->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotAngle()");
773  fTransDx->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDx()");
774  fTransDy->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDy()");
775  fTransDz->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDz()");
776  fTransDx->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDx()");
777  fTransDy->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDy()");
778  fTransDz->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDz()");
779  fInit = kFALSE;
780 }
781 
782 
783 ////////////////////////////////////////////////////////////////////////////////
784 /// Connect to the selected combi matrix.
785 
786 void TGeoCombiTransEditor::SetModel(TObject* obj)
787 {
788  if (obj == 0 || (obj->IsA()!=TGeoCombiTrans::Class())) {
789  SetActive(kFALSE);
790  return;
791  }
792  fCombi = (TGeoCombiTrans*)obj;
793  TGeoRotation *rot = fCombi->GetRotation();
794  if (rot) rot->GetAngles(fPhii, fThetai, fPsii);
795  const char *sname = fCombi->GetName();
796  if (!strcmp(sname, fCombi->ClassName())) fRotName->SetText("no_name");
797  else {
798  fRotName->SetText(sname);
799  fNamei = sname;
800  }
801 
802  fDxi = fCombi->GetTranslation()[0];
803  fDyi = fCombi->GetTranslation()[1];
804  fDzi = fCombi->GetTranslation()[2];
805  fTransDx->SetNumber(fDxi);
806  fTransDy->SetNumber(fDyi);
807  fTransDz->SetNumber(fDzi);
808 
809  fRotPhi->SetNumber(fPhii);
810  fRotTheta->SetNumber(fThetai);
811  fRotPsi->SetNumber(fPsii);
812  fRotAxis->SetNumber(0.0);
813 
814  fApply->SetEnabled(kFALSE);
815  fUndo->SetEnabled(kFALSE);
816  fCancel->SetEnabled(kFALSE);
817 
818  if (fInit) ConnectSignals2Slots();
819  SetActive();
820 }
821 
822 ////////////////////////////////////////////////////////////////////////////////
823 /// Slot for name.
824 
825 void TGeoCombiTransEditor::DoName()
826 {
827  const char *name = fRotName->GetText();
828  if (!strcmp(name, "no_name") || !strcmp(name, fCombi->GetName())) return;
829  fCombi->SetName(name);
830 }
831 
832 ////////////////////////////////////////////////////////////////////////////////
833 /// Slot for phi (Euler X convention)
834 
835 void TGeoCombiTransEditor::DoRotPhi()
836 {
837  if (fRotPhi->GetNumber() < 0.) fRotPhi->SetNumber(fRotPhi->GetNumber()+360.);
838  if (fRotPhi->GetNumber() >= 360.) fRotPhi->SetNumber(fRotPhi->GetNumber()-360.);
839  DoModified();
840 }
841 
842 ////////////////////////////////////////////////////////////////////////////////
843 /// Slot for theta (Euler X convention)
844 
845 void TGeoCombiTransEditor::DoRotTheta()
846 {
847  if (fRotTheta->GetNumber() < 0.) fRotTheta->SetNumber(fRotTheta->GetNumber()+360.);
848  if (fRotTheta->GetNumber() >= 360.) fRotTheta->SetNumber(fRotTheta->GetNumber()-360.);
849  DoModified();
850 }
851 
852 ////////////////////////////////////////////////////////////////////////////////
853 /// Slot for psi (Euler X convention)
854 
855 void TGeoCombiTransEditor::DoRotPsi()
856 {
857  if (fRotPsi->GetNumber() < 0.) fRotPsi->SetNumber(fRotPsi->GetNumber()+360.);
858  if (fRotPsi->GetNumber() >= 360.) fRotPsi->SetNumber(fRotPsi->GetNumber()-360.);
859  DoModified();
860 }
861 
862 ////////////////////////////////////////////////////////////////////////////////
863 /// Slot for additional rotation about one axis.
864 
865 void TGeoCombiTransEditor::DoRotAngle()
866 {
867  if (fRotAxis->GetNumber() < 0.) fRotAxis->SetNumber(fRotAxis->GetNumber()+360.);
868  if (fRotAxis->GetNumber() >= 360.) fRotAxis->SetNumber(fRotAxis->GetNumber()-360.);
869  DoModified();
870 }
871 
872 ////////////////////////////////////////////////////////////////////////////////
873 /// Slot for checking parameters.
874 
875 Bool_t TGeoCombiTransEditor::DoParameters()
876 {
877  Double_t dx = fTransDx->GetNumber();
878  Double_t dy = fTransDy->GetNumber();
879  Double_t dz = fTransDz->GetNumber();
880  Bool_t changedtr = kFALSE;
881  if (dx != fCombi->GetTranslation()[0] ||
882  dy != fCombi->GetTranslation()[1] ||
883  dz != fCombi->GetTranslation()[2]) changedtr = kTRUE;
884  if (changedtr) fCombi->SetTranslation(dx, dy, dz);
885  Double_t phi = fRotPhi->GetNumber();
886  Double_t theta = fRotTheta->GetNumber();
887  Double_t psi = fRotPsi->GetNumber();
888  Double_t angle = fRotAxis->GetNumber();
889  Double_t phi0 = 0., theta0 = 0., psi0 = 0.;
890  TGeoRotation *rot = fCombi->GetRotation();
891  if (rot) rot->GetAngles(phi0,theta0,psi0);
892  else {
893  if (phi!=fPhii || theta!=fThetai || psi!=fPsii) {
894  TGeoRotation r("rot",10.,0.,0.);
895  fCombi->SetRotation(r);
896  rot = fCombi->GetRotation();
897  rot->SetAngles(0.,0.,0.);
898  }
899  }
900  Bool_t changed = kFALSE;
901  if (phi != psi0 || theta != theta0 || psi != psi0) changed = kTRUE;
902  if (changed && rot) rot->SetAngles(phi, theta, psi);
903  // Check if we have to rotate about one axis
904  if (angle != 0.0) {
905  if (fRotX->IsOn()) {fCombi->RotateX(angle); changed = kTRUE;}
906  if (fRotY->IsOn()) {fCombi->RotateY(angle); changed = kTRUE;}
907  if (fRotZ->IsOn()) {fCombi->RotateZ(angle); changed = kTRUE;}
908  }
909  if (changedtr) changed = kTRUE;
910  if (!changed) return kFALSE;
911  fRotAxis->SetNumber(0.0);
912  fUndo->SetEnabled();
913  if (fPad) {
914  fPad->Modified();
915  fPad->Update();
916  }
917  return kTRUE;
918 }
919 
920 ////////////////////////////////////////////////////////////////////////////////
921 /// Slot for applying modifications.
922 
923 void TGeoCombiTransEditor::DoApply()
924 {
925  DoName();
926  if (DoParameters()) {
927  fUndo->SetEnabled();
928  fCancel->SetEnabled(kFALSE);
929  fApply->SetEnabled(kFALSE);
930  }
931 }
932 
933 ////////////////////////////////////////////////////////////////////////////////
934 /// Slot for cancelling last un-applied operations.
935 
936 void TGeoCombiTransEditor::DoCancel()
937 {
938  if (!fNamei.Length()) fRotName->SetText("no_name");
939  else fRotName->SetText(fNamei.Data());
940  fTransDx->SetNumber(fDxi);
941  fTransDy->SetNumber(fDyi);
942  fTransDz->SetNumber(fDzi);
943  fRotPhi->SetNumber(fPhii);
944  fRotTheta->SetNumber(fThetai);
945  fRotPsi->SetNumber(fPsii);
946  fRotAxis->SetNumber(0.0);
947  fApply->SetEnabled(kFALSE);
948  fUndo->SetEnabled(kFALSE);
949  fCancel->SetEnabled(kFALSE);
950 }
951 
952 ////////////////////////////////////////////////////////////////////////////////
953 /// Slot for notifying changes.
954 
955 void TGeoCombiTransEditor::DoModified()
956 {
957  fApply->SetEnabled();
958  if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
959 }
960 
961 ////////////////////////////////////////////////////////////////////////////////
962 /// Slot for undoing last changes.
963 
964 void TGeoCombiTransEditor::DoUndo()
965 {
966  DoCancel();
967  DoParameters();
968  fCancel->SetEnabled(kFALSE);
969  fUndo->SetEnabled(kFALSE);
970  fApply->SetEnabled(kFALSE);
971 }
972 
973 ////////////////////////////////////////////////////////////////////////////////
974 /// Slot for X.
975 
976 void TGeoCombiTransEditor::DoDx()
977 {
978  DoModified();
979 }
980 
981 ////////////////////////////////////////////////////////////////////////////////
982 /// Slot for Y.
983 
984 void TGeoCombiTransEditor::DoDy()
985 {
986  DoModified();
987 }
988 
989 ////////////////////////////////////////////////////////////////////////////////
990 /// Slot for Z.
991 
992 void TGeoCombiTransEditor::DoDz()
993 {
994  DoModified();
995 }
996