Logo ROOT   6.12/07
Reference Guide
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 
32 
37 };
38 
39 ////////////////////////////////////////////////////////////////////////////////
40 /// Constructor for translation editor
41 
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 = "";
51 
52  // TextEntry for name
53  MakeTitle("Name");
54  fTransName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
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");
63  // Number entry for dx
64  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
66  f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
67  fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
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 |
77  f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
78  fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
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 |
88  f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
89  fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
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
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));
113 }
114 
115 ////////////////////////////////////////////////////////////////////////////////
116 /// Destructor.
117 
119 {
120  TGFrameElement *el;
121  TIter next(GetList());
122  while ((el = (TGFrameElement *)next())) {
123  if (el->fFrame->IsComposite())
125  }
126  Cleanup();
127 }
128 
129 ////////////////////////////////////////////////////////////////////////////////
130 /// Connect signals to slots.
131 
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 
152 {
153  if (obj == 0 || (obj->IsA()!=TGeoTranslation::Class())) {
154  SetActive(kFALSE);
155  return;
156  }
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  }
173 
175  SetActive();
176 }
177 
178 ////////////////////////////////////////////////////////////////////////////////
179 /// Slot for name.
180 
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 
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 
214 {
215  DoName();
216  if (DoParameters()) {
217  fUndo->SetEnabled();
220  }
221 }
222 
223 ////////////////////////////////////////////////////////////////////////////////
224 /// Slot for cancelling last modifications non-applied.
225 
227 {
228  if (!fNamei.Length()) fTransName->SetText("no_name");
229  else fTransName->SetText(fNamei.Data());
236 }
237 
238 ////////////////////////////////////////////////////////////////////////////////
239 /// Slot for notifying changes.
240 
242 {
243  fApply->SetEnabled();
245 }
246 
247 ////////////////////////////////////////////////////////////////////////////////
248 /// Slot for undoing last operation.
249 
251 {
252  DoCancel();
253  DoParameters();
257 }
258 
259 ////////////////////////////////////////////////////////////////////////////////
260 /// Slot for dx.
261 
263 {
264  DoModified();
265 }
266 
267 ////////////////////////////////////////////////////////////////////////////////
268 /// Slot for dx.
269 
271 {
272  DoModified();
273 }
274 
275 ////////////////////////////////////////////////////////////////////////////////
276 /// Slot for dx.
277 
279 {
280  DoModified();
281 }
282 
283 /** \class TGeoRotationEditor
284 \ingroup Geometry_builder
285 
286 Editor for a TGeoRotation.
287 
288 */
289 
291 
292 ////////////////////////////////////////////////////////////////////////////////
293 /// Constructor for rotation editor
294 
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 = "";
305 
306  // TextEntry for name
307  MakeTitle("Name");
308  fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
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");
317  // Number entry for phi angle
318  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
320  f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
321  fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
323  nef->SetToolTipText("Modify the first rotation angle about Z");
324  fRotPhi->Associate(this);
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 |
332  f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
333  fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
335  nef->SetToolTipText("Modify the second rotation angle about the new X");
336  fRotTheta->Associate(this);
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 |
344  f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
345  fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
347  nef->SetToolTipText("Modify the third rotation angle about Z");
348  fRotPsi->Associate(this);
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 |
361  f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
362  fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
364  nef->SetToolTipText("Enter the new rotation angle about the selected axis");
365  fRotAxis->Associate(this);
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);
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
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));
397 }
398 
399 ////////////////////////////////////////////////////////////////////////////////
400 /// Destructor
401 
403 {
404  TGFrameElement *el;
405  TIter next(GetList());
406  while ((el = (TGFrameElement *)next())) {
407  if (el->fFrame->IsComposite())
409  }
410  Cleanup();
411 }
412 
413 ////////////////////////////////////////////////////////////////////////////////
414 /// Connect signals to slots.
415 
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 
434 {
435  if (obj == 0 || (obj->IsA()!=TGeoRotation::Class())) {
436  SetActive(kFALSE);
437  return;
438  }
439  fRotation = (TGeoRotation*)obj;
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  }
450  fRotAxis->SetNumber(0.0);
451 
455 
457  SetActive();
458 }
459 
460 ////////////////////////////////////////////////////////////////////////////////
461 /// Slot for name.
462 
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 
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 
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 
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 
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 
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 
544 {
545  DoName();
546  if (DoParameters()) {
547  fUndo->SetEnabled();
550  }
551 }
552 
553 ////////////////////////////////////////////////////////////////////////////////
554 /// Slot for cancelling last un-applied operations.
555 
557 {
558  if (!fNamei.Length()) fRotName->SetText("no_name");
559  else fRotName->SetText(fNamei.Data());
563  fRotAxis->SetNumber(0.0);
567 }
568 
569 ////////////////////////////////////////////////////////////////////////////////
570 /// Slot for notifying changes.
571 
573 {
574  fApply->SetEnabled();
576 }
577 
578 ////////////////////////////////////////////////////////////////////////////////
579 /// Slot for undoing last changes.
580 
582 {
583  DoCancel();
584  DoParameters();
588 }
589 
590 /** \class TGeoCombiTransEditor
591 \ingroup Geometry_builder
592 
593 Editor for a TGeoCombiTrans.
594 
595 */
596 
598 
599 ////////////////////////////////////////////////////////////////////////////////
600 /// Constructor for combi matrix editor
601 
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 = "";
613 
614  // TextEntry for name
615  MakeTitle("Name");
616  fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
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");
625  // Number entry for dx
626  TGCompositeFrame *f1 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame |
628  f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
629  fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
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 |
639  f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
640  fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
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 |
650  f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
651  fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
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 |
667  f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
668  fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
670  nef->SetToolTipText("Modify the first rotation angle about Z");
671  fRotPhi->Associate(this);
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 |
679  f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
680  fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
682  nef->SetToolTipText("Modify the second rotation angle about the new X");
683  fRotTheta->Associate(this);
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 |
691  f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
692  fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
694  nef->SetToolTipText("Modify the third rotation angle about Z");
695  fRotPsi->Associate(this);
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 |
708  f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
709  fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
711  nef->SetToolTipText("Enter the new rotation angle about the selected axis");
712  fRotAxis->Associate(this);
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);
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
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));
744 }
745 
746 ////////////////////////////////////////////////////////////////////////////////
747 /// Destructor
748 
750 {
751  TGFrameElement *el;
752  TIter next(GetList());
753  while ((el = (TGFrameElement *)next())) {
754  if (el->fFrame->IsComposite())
756  }
757  Cleanup();
758 }
759 
760 ////////////////////////////////////////////////////////////////////////////////
761 /// Connect signals to slots.
762 
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 
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];
808 
812  fRotAxis->SetNumber(0.0);
813 
817 
819  SetActive();
820 }
821 
822 ////////////////////////////////////////////////////////////////////////////////
823 /// Slot for name.
824 
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 
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 
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 
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 
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 
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 
924 {
925  DoName();
926  if (DoParameters()) {
927  fUndo->SetEnabled();
930  }
931 }
932 
933 ////////////////////////////////////////////////////////////////////////////////
934 /// Slot for cancelling last un-applied operations.
935 
937 {
938  if (!fNamei.Length()) fRotName->SetText("no_name");
939  else fRotName->SetText(fNamei.Data());
946  fRotAxis->SetNumber(0.0);
950 }
951 
952 ////////////////////////////////////////////////////////////////////////////////
953 /// Slot for notifying changes.
954 
956 {
957  fApply->SetEnabled();
959 }
960 
961 ////////////////////////////////////////////////////////////////////////////////
962 /// Slot for undoing last changes.
963 
965 {
966  DoCancel();
967  DoParameters();
971 }
972 
973 ////////////////////////////////////////////////////////////////////////////////
974 /// Slot for X.
975 
977 {
978  DoModified();
979 }
980 
981 ////////////////////////////////////////////////////////////////////////////////
982 /// Slot for Y.
983 
985 {
986  DoModified();
987 }
988 
989 ////////////////////////////////////////////////////////////////////////////////
990 /// Slot for Z.
991 
993 {
994  DoModified();
995 }
996 
void DoRotTheta()
Slot for theta (Euler X convention)
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
virtual void Resize(UInt_t w=0, UInt_t h=0)
Resize the frame.
Definition: TGFrame.cxx:587
TGTextEntry * fTransName
void SetRotation(const TGeoRotation &other)
Copy the rotation from another one.
void DoRotAngle()
Slot for additional rotation about one axis.
TGRadioButton * fRotZ
void DoDz()
Slot for dx.
TGTextButton * fCancel
TGNumberEntry * fTransDx
void DoRotPsi()
Slot for psi (Euler X convention)
void DoRotTheta()
Slot for theta (Euler X convention)
TGTextButton * fUndo
void DoModified()
Slot for notifying changes.
TGTextEntry * fRotName
virtual void SetToolTipText(const char *text, Long_t delayms=500)
Set tool tip text associated with this text entry.
virtual void Update()=0
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
void DoApply()
Slot for applying changes.
void DoName()
Slot for name.
virtual void RotateX(Double_t angle)
Rotate about X axis of the master frame with angle expressed in degrees.
TGNumberEntry * fTransDz
virtual void SetNumber(Double_t val)
void DoRotPsi()
Slot for psi (Euler X convention)
Bool_t DoParameters()
Slot for checking parameters.
Class describing translations.
Definition: TGeoMatrix.h:121
virtual ~TGeoRotationEditor()
Destructor.
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
virtual UInt_t GetDefaultHeight() const
Definition: TGFrame.h:373
virtual Bool_t IsComposite() const
Definition: TGFrame.h:259
TGTextButton * fCancel
TGRadioButton * fRotZ
void SetTranslation(const TGeoTranslation &tr)
copy the translation component
virtual void RotateY(Double_t angle)
Rotate about Y axis with angle expressed in degrees.
virtual void RotateX(Double_t angle)
Rotate about X axis with angle expressed in degrees.
TGNumberEntry * fRotTheta
TGNumberEntry * fRotAxis
TGRadioButton * fRotX
virtual void SetModel(TObject *obj)
Connect to the new matrix.
static void Cleanup(TGCompositeFrame *frame)
Static method to cleanup hierarchically all daughters of a composite frame.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:128
ULong_t Pixel_t
Definition: GuiTypes.h:39
void Class()
Definition: Class.C:29
void DoApply()
Slot for applying modifications.
TGRadioButton * fRotX
virtual void SetModel(TObject *obj)
Connect to the selected rotation.
virtual void SetActive(Bool_t active=kTRUE)
Set active GUI attribute frames related to the selected object.
TGCompositeFrame(const TGCompositeFrame &)
virtual void SetRadioButtonExclusive(Bool_t flag=kTRUE)
If enable is kTRUE, this button group will treat radio buttons as mutually exclusive, and other buttons according to IsExclusive().
void DoDz()
Slot for Z.
virtual TList * GetList() const
Definition: TGFrame.h:369
TGeoRotation * fRotation
Editor for a TGeoRotation.
virtual void RotateY(Double_t angle)
Rotate about Y axis of the master frame with angle expressed in degrees.
virtual EButtonState GetState() const
Definition: TGButton.h:112
void DoRotPhi()
Slot for phi (Euler X convention)
TGeoRotationEditor(const TGWindow *p=0, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for rotation editor.
virtual const Double_t * GetTranslation() const
Definition: TGeoMatrix.h:160
TGNumberEntry * fRotPhi
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot...
Definition: TQObject.cxx:867
virtual void Associate(const TGWindow *w)
Make w the window that will receive the generated messages.
TGNumberEntry * fRotTheta
void DoDy()
Slot for Y.
TGNumberEntry * fTransDy
void DoRotAngle()
Slot for additional rotation about one axis.
void DoUndo()
Slot for undoing last changes.
TGeoCombiTrans * fCombi
virtual void SetSize(const TGDimension &s)
Definition: TGFrame.h:299
Editor for a TGeoCombiTrans.
void DoUndo()
Slot for undoing last operation.
ROOT::R::TRInterface & r
Definition: Object.C:4
Class describing rotation + translation.
Definition: TGeoMatrix.h:291
TGNumberEntry * fRotPsi
virtual void Associate(const TGWindow *w)
Definition: TGWidget.h:84
TGTextButton * fCancel
void DoCancel()
Slot for cancelling last modifications non-applied.
void DoCancel()
Slot for cancelling last un-applied operations.
unsigned int UInt_t
Definition: RtypesCore.h:42
Ssiz_t Length() const
Definition: TString.h:386
TGFrame * fFrame
Definition: TGLayout.h:119
virtual const Double_t * GetTranslation() const
Definition: TGeoMatrix.h:336
TGeoRotation * GetRotation() const
Definition: TGeoMatrix.h:334
TGNumberEntry * fRotAxis
Bool_t DoParameters()
Slot for checking parameters.
void DoCancel()
Slot for cancelling last un-applied operations.
TGTextButton * fApply
virtual void RotateZ(Double_t angle)
Rotate about Z axis of the master frame with angle expressed in degrees.
Class describing rotations.
Definition: TGeoMatrix.h:174
const Bool_t kFALSE
Definition: RtypesCore.h:88
TGDimension GetSize() const
Definition: TGFrame.h:277
void DoName()
Slot for name.
const char * GetText() const
Definition: TGTextEntry.h:134
virtual void Modified(Bool_t flag=1)=0
virtual UInt_t GetDefaultHeight() const
Definition: TGFrame.h:238
virtual ~TGeoCombiTransEditor()
Destructor.
TGNumberEntry * fRotPsi
void DoName()
Slot for name.
#define ClassImp(name)
Definition: Rtypes.h:359
void GetAngles(Double_t &theta1, Double_t &phi1, Double_t &theta2, Double_t &phi2, Double_t &theta3, Double_t &phi3) const
Retrieve rotation angles.
double Double_t
Definition: RtypesCore.h:55
virtual void ConnectSignals2Slots()
Connect signals to slots.
virtual void SetEnabled(Bool_t e=kTRUE)
Set enabled or disabled state of button.
Definition: TGButton.cxx:409
virtual Double_t GetNumber() const
void DoApply()
Slot for applying modifications.
TGNumberEntry * fTransDz
void DoModified()
Slot for notifying changes.
void DoDy()
Slot for dx.
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=0)
Add frame to the composite frame using the specified layout hints.
Definition: TGFrame.cxx:1099
virtual void Show()
Show group of buttons.
TGRadioButton * fRotY
TGNumberEntry * fRotPhi
Editor for a TGeoTranslation.
Mother of all ROOT objects.
Definition: TObject.h:37
TGeoCombiTransEditor(const TGWindow *p=0, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for combi matrix editor.
void DoDx()
Slot for dx.
Bool_t fInit
Definition: TGedFrame.h:53
TGNumberEntry * fTransDy
TGNumberEntryField * GetNumberEntry() const
virtual Bool_t IsOn() const
Definition: TGButton.h:370
Bool_t DoParameters()
Slot for checking parameters.
TGeoTranslationEditor(const TGWindow *p=0, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for translation editor.
virtual void ConnectSignals2Slots()
Connect signals to slots.
TF1 * f1
Definition: legend1.C:11
void SetAngles(Double_t phi, Double_t theta, Double_t psi)
Set matrix elements according to Euler angles.
virtual void SetText(const char *text, Bool_t emit=kTRUE)
Sets text entry to text, clears the selection and moves the cursor to the end of the line...
void DoDx()
Slot for X.
TVirtualPad * fPad
Definition: TGeoGedFrame.h:18
virtual void Cleanup()
Cleanup and delete all objects contained in this composite frame.
Definition: TGFrame.cxx:949
virtual void RotateZ(Double_t angle)
Rotate about Z axis with angle expressed in degrees.
const Bool_t kTRUE
Definition: RtypesCore.h:87
virtual void MakeTitle(const char *title)
Create attribute frame title.
Definition: TGedFrame.cxx:96
void DoUndo()
Slot for undoing last changes.
virtual void ConnectSignals2Slots()
Connect signals to slots.
void DoModified()
Slot for notifying changes.
TGNumberEntry * fTransDx
void SetTranslation(Double_t dx, Double_t dy, Double_t dz)
Set translation components.
Definition: TGeoMatrix.cxx:750
char name[80]
Definition: TGX11.cxx:109
TGeoTranslation * fTranslation
void DoRotPhi()
Slot for phi (Euler X convention)
UInt_t GetDefaultHeight() const
TGRadioButton * fRotY
Common base class for geombuilder editors.
Definition: TGeoGedFrame.h:13
virtual void SetModel(TObject *obj)
Connect to the selected combi matrix.
virtual ~TGeoTranslationEditor()
Destructor.
ETGeoMatrixWid
const char * Data() const
Definition: TString.h:345