Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
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
15Editor for a TGeoTranslation.
16
17*/
18
19#include "TGeoMatrixEditor.h"
20#include "TGeoTabManager.h"
21#include "TGeoMatrix.h"
22#include "TVirtualPad.h"
23#include "TGButton.h"
24#include "TGButtonGroup.h"
25#include "TGTextEntry.h"
26#include "TGNumberEntry.h"
27#include "TGLabel.h"
28
29
42
43////////////////////////////////////////////////////////////////////////////////
44/// Constructor for translation editor
45
47 : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
48{
49 fTranslation = nullptr;
50 fDxi = fDyi = fDzi = 0.0;
51 fNamei = "";
54
55 // TextEntry for name
56 MakeTitle("Name");
57 fTransName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
58 fTransName->Resize(135, fTransName->GetDefaultHeight());
59 fTransName->SetToolTipText("Enter the translation name");
60 fTransName->Associate(this);
62
63 TGTextEntry *nef;
64 MakeTitle("Translations on axes");
66 // Number entry for dx
69 f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
70 fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
71 nef = (TGTextEntry *)fTransDx->GetNumberEntry();
72 nef->SetToolTipText("Enter the translation on X");
73 fTransDx->Associate(this);
74 f1->AddFrame(fTransDx, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
75 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
76
77 // Number entry for dy
80 f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
81 fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
82 nef = (TGTextEntry *)fTransDy->GetNumberEntry();
83 nef->SetToolTipText("Enter the translation on Y");
84 fTransDy->Associate(this);
86 compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
87
88 // Number entry for dx
91 f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
92 fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
93 nef = (TGTextEntry *)fTransDz->GetNumberEntry();
94 nef->SetToolTipText("Enter the translation on Z");
95 fTransDz->Associate(this);
97 compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
98
99 compxyz->Resize(150, 30);
100 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
101
102 // Buttons
104 fApply = new TGTextButton(f23, "&Apply");
105 f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
106 fApply->Associate(this);
107 fCancel = new TGTextButton(f23, "&Cancel");
108 f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
109 fCancel->Associate(this);
110 fUndo = new TGTextButton(f23, " &Undo ");
111 f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
112 fUndo->Associate(this);
113 AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
114 fUndo->SetSize(fCancel->GetSize());
115 fApply->SetSize(fCancel->GetSize());
116}
117
118////////////////////////////////////////////////////////////////////////////////
119/// Destructor.
120
122{
123 TGFrameElement *el;
124 TIter next(GetList());
125 while ((el = (TGFrameElement *)next())) {
126 if (el->fFrame->IsComposite())
128 }
129 Cleanup();
130}
131
132////////////////////////////////////////////////////////////////////////////////
133/// Connect signals to slots.
134
136{
137 fApply->Connect("Clicked()", "TGeoTranslationEditor", this, "DoApply()");
138 fCancel->Connect("Clicked()", "TGeoTranslationEditor", this, "DoCancel()");
139 fUndo->Connect("Clicked()", "TGeoTranslationEditor", this, "DoUndo()");
140 fTransName->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoModified()");
141 fTransDx->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDx()");
142 fTransDy->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDy()");
143 fTransDz->Connect("ValueSet(Long_t)", "TGeoTranslationEditor", this, "DoDz()");
144 fTransDx->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDx()");
145 fTransDy->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDy()");
146 fTransDz->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoTranslationEditor", this, "DoDz()");
147 fInit = kFALSE;
148}
149
150////////////////////////////////////////////////////////////////////////////////
151/// Connect to the new matrix.
152
154{
155 if (obj == nullptr || (obj->IsA() != TGeoTranslation::Class())) {
157 return;
158 }
160 fDxi = fTranslation->GetTranslation()[0];
161 fDyi = fTranslation->GetTranslation()[1];
162 fDzi = fTranslation->GetTranslation()[2];
163 const char *sname = fTranslation->GetName();
164 if (!strcmp(sname, fTranslation->ClassName()))
165 fTransName->SetText("no_name");
166 else {
167 fTransName->SetText(sname);
168 fNamei = sname;
169 }
170 fTransDx->SetNumber(fDxi);
171 fTransDy->SetNumber(fDyi);
172 fTransDz->SetNumber(fDzi);
173 fApply->SetEnabled(kFALSE);
174 fUndo->SetEnabled(kFALSE);
175 fCancel->SetEnabled(kFALSE);
176
177 if (fInit)
179 SetActive();
180}
181
182////////////////////////////////////////////////////////////////////////////////
183/// Slot for name.
184
186{
187 const char *name = fTransName->GetText();
188 if (!strcmp(name, "no_name") || !strcmp(name, fTranslation->GetName()))
189 return;
190 fTranslation->SetName(name);
191}
192
193////////////////////////////////////////////////////////////////////////////////
194/// Slot for checking parameters.
195
197{
198 Double_t dx = fTransDx->GetNumber();
199 Double_t dy = fTransDy->GetNumber();
200 Double_t dz = fTransDz->GetNumber();
201 Bool_t changed = kFALSE;
202 if (dx != fTranslation->GetTranslation()[0] || dy != fTranslation->GetTranslation()[1] ||
203 dz != fTranslation->GetTranslation()[2])
204 changed = kTRUE;
205 if (!changed)
206 return kFALSE;
207 fUndo->SetEnabled();
208 fTranslation->SetTranslation(dx, dy, dz);
209 if (fPad) {
210 fPad->Modified();
211 fPad->Update();
212 }
213 return kTRUE;
214}
215
216////////////////////////////////////////////////////////////////////////////////
217/// Slot for applying changes.
218
220{
221 DoName();
222 if (DoParameters()) {
223 fUndo->SetEnabled();
224 fCancel->SetEnabled(kFALSE);
225 fApply->SetEnabled(kFALSE);
226 }
227}
228
229////////////////////////////////////////////////////////////////////////////////
230/// Slot for cancelling last modifications non-applied.
231
233{
234 if (!fNamei.Length())
235 fTransName->SetText("no_name");
236 else
237 fTransName->SetText(fNamei.Data());
238 fTransDx->SetNumber(fDxi);
239 fTransDy->SetNumber(fDyi);
240 fTransDz->SetNumber(fDzi);
241 fApply->SetEnabled(kFALSE);
242 fUndo->SetEnabled(kFALSE);
243 fCancel->SetEnabled(kFALSE);
244}
245
246////////////////////////////////////////////////////////////////////////////////
247/// Slot for notifying changes.
248
250{
251 fApply->SetEnabled();
252 if (fUndo->GetState() == kButtonDisabled)
253 fCancel->SetEnabled();
254}
255
256////////////////////////////////////////////////////////////////////////////////
257/// Slot for undoing last operation.
258
260{
261 DoCancel();
262 DoParameters();
263 fCancel->SetEnabled(kFALSE);
264 fUndo->SetEnabled(kFALSE);
265 fApply->SetEnabled(kFALSE);
266}
267
268////////////////////////////////////////////////////////////////////////////////
269/// Slot for dx.
270
275
276////////////////////////////////////////////////////////////////////////////////
277/// Slot for dx.
278
283
284////////////////////////////////////////////////////////////////////////////////
285/// Slot for dx.
286
291
292/** \class TGeoRotationEditor
293\ingroup Geometry_builder
294
295Editor for a TGeoRotation.
296
297*/
298
299
300////////////////////////////////////////////////////////////////////////////////
301/// Constructor for rotation editor
302
304 : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
305{
306 fRotation = nullptr;
307 fPhii = fThetai = fPsii = 0.0;
308 fAngleX = fAngleY = fAngleZ = 0.0;
309 fNamei = "";
312
313 // TextEntry for name
314 MakeTitle("Name");
315 fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
316 fRotName->Resize(135, fRotName->GetDefaultHeight());
317 fRotName->SetToolTipText("Enter the rotation name");
318 fRotName->Associate(this);
319 AddFrame(fRotName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
320
321 TGTextEntry *nef;
322 MakeTitle("Euler angles");
324 // Number entry for phi angle
327 f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
328 fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
329 nef = (TGTextEntry *)fRotPhi->GetNumberEntry();
330 nef->SetToolTipText("Modify the first rotation angle about Z");
331 fRotPhi->Associate(this);
332 fRotPhi->Resize(90, fRotPhi->GetDefaultHeight());
333 f1->AddFrame(fRotPhi, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
334 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
335
336 // Number entry for theta angle
337 TGCompositeFrame *f2 =
339 f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
340 fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
341 nef = (TGTextEntry *)fRotTheta->GetNumberEntry();
342 nef->SetToolTipText("Modify the second rotation angle about the new X");
343 fRotTheta->Associate(this);
344 fRotTheta->Resize(90, fRotTheta->GetDefaultHeight());
345 f2->AddFrame(fRotTheta, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
346 compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
347
348 // Number entry for psi angle
349 TGCompositeFrame *f3 =
351 f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
352 fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
353 nef = (TGTextEntry *)fRotPsi->GetNumberEntry();
354 nef->SetToolTipText("Modify the third rotation angle about Z");
355 fRotPsi->Associate(this);
356 fRotPsi->Resize(90, fRotPsi->GetDefaultHeight());
357 f3->AddFrame(fRotPsi, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
358 compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
359
360 compxyz->Resize(150, compxyz->GetDefaultHeight());
361 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
362
363 MakeTitle("Rotate about axis");
364 compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
365 // Number entry for rotation angle about one axis
367 f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
368 fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
369 nef = (TGTextEntry *)fRotAxis->GetNumberEntry();
370 nef->SetToolTipText("Enter the new rotation angle about the selected axis");
371 fRotAxis->Associate(this);
372 fRotAxis->Resize(90, fRotAxis->GetDefaultHeight());
373 f1->AddFrame(fRotAxis, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
374 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
375
376 // Radio buttons group for axis selection
377 TGHButtonGroup *bg1 = new TGHButtonGroup(compxyz, " Axis ");
378 fRotX = new TGRadioButton(bg1, " &X ", kMATRIX_DX);
379 fRotY = new TGRadioButton(bg1, " &Y ", kMATRIX_DY);
380 fRotZ = new TGRadioButton(bg1, " &Z ", kMATRIX_DZ);
382 bg1->Show();
383 compxyz->AddFrame(bg1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
384
385 compxyz->Resize(150, compxyz->GetDefaultHeight());
386 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
387
388 // Buttons
390 fApply = new TGTextButton(f23, "Apply");
391 f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
392 fApply->Associate(this);
393 fCancel = new TGTextButton(f23, "Cancel");
394 f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
395 fCancel->Associate(this);
396 fUndo = new TGTextButton(f23, " Undo ");
397 f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
398 fUndo->Associate(this);
399 AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
400 fUndo->SetSize(fCancel->GetSize());
401 fApply->SetSize(fCancel->GetSize());
402}
403
404////////////////////////////////////////////////////////////////////////////////
405/// Destructor
406
408{
409 TGFrameElement *el;
410 TIter next(GetList());
411 while ((el = (TGFrameElement *)next())) {
412 if (el->fFrame->IsComposite())
414 }
415 Cleanup();
416}
417
418////////////////////////////////////////////////////////////////////////////////
419/// Connect signals to slots.
420
422{
423 fApply->Connect("Clicked()", "TGeoRotationEditor", this, "DoApply()");
424 fCancel->Connect("Clicked()", "TGeoRotationEditor", this, "DoCancel()");
425 fUndo->Connect("Clicked()", "TGeoRotationEditor", this, "DoUndo()");
426 fRotName->Connect("TextChanged(const char *)", "TGeoRotationEditor", this, "DoModified()");
427 fRotPhi->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotPhi()");
428 fRotTheta->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotTheta()");
429 fRotPsi->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotPsi()");
430 fRotAxis->Connect("ValueSet(Long_t)", "TGeoRotationEditor", this, "DoRotAngle()");
431 fInit = kFALSE;
432}
433
434////////////////////////////////////////////////////////////////////////////////
435/// Connect to the selected rotation.
436
438{
439 if (obj == nullptr || (obj->IsA() != TGeoRotation::Class())) {
441 return;
442 }
443 fRotation = (TGeoRotation *)obj;
444 fRotation->GetAngles(fPhii, fThetai, fPsii);
445 const char *sname = fRotation->GetName();
446 if (!strcmp(sname, fRotation->ClassName()))
447 fRotName->SetText("no_name");
448 else {
449 fRotName->SetText(sname);
450 fNamei = sname;
451 }
452 fRotPhi->SetNumber(fPhii);
453 fRotTheta->SetNumber(fThetai);
454 fRotPsi->SetNumber(fPsii);
455 fRotAxis->SetNumber(0.0);
456
457 fApply->SetEnabled(kFALSE);
458 fUndo->SetEnabled(kFALSE);
459 fCancel->SetEnabled(kFALSE);
460
461 if (fInit)
463 SetActive();
464}
465
466////////////////////////////////////////////////////////////////////////////////
467/// Slot for name.
468
470{
471 const char *name = fRotName->GetText();
472 if (!strcmp(name, "no_name") || !strcmp(name, fRotation->GetName()))
473 return;
474 fRotation->SetName(name);
475}
476
477////////////////////////////////////////////////////////////////////////////////
478/// Slot for phi (Euler X convention)
479
481{
482 if (fRotPhi->GetNumber() < 0.)
483 fRotPhi->SetNumber(fRotPhi->GetNumber() + 360.);
484 if (fRotPhi->GetNumber() >= 360.)
485 fRotPhi->SetNumber(fRotPhi->GetNumber() - 360.);
486 DoModified();
487}
488
489////////////////////////////////////////////////////////////////////////////////
490/// Slot for theta (Euler X convention)
491
493{
494 if (fRotTheta->GetNumber() < 0.)
495 fRotTheta->SetNumber(fRotTheta->GetNumber() + 360.);
496 if (fRotTheta->GetNumber() >= 360.)
497 fRotTheta->SetNumber(fRotTheta->GetNumber() - 360.);
498 DoModified();
499}
500
501////////////////////////////////////////////////////////////////////////////////
502/// Slot for psi (Euler X convention)
503
505{
506 if (fRotPsi->GetNumber() < 0.)
507 fRotPsi->SetNumber(fRotPsi->GetNumber() + 360.);
508 if (fRotPsi->GetNumber() >= 360.)
509 fRotPsi->SetNumber(fRotPsi->GetNumber() - 360.);
510 DoModified();
511}
512
513////////////////////////////////////////////////////////////////////////////////
514/// Slot for additional rotation about one axis.
515
517{
518 if (fRotAxis->GetNumber() < 0.)
519 fRotAxis->SetNumber(fRotAxis->GetNumber() + 360.);
520 if (fRotAxis->GetNumber() >= 360.)
521 fRotAxis->SetNumber(fRotAxis->GetNumber() - 360.);
522 DoModified();
523}
524
525////////////////////////////////////////////////////////////////////////////////
526/// Slot for checking parameters.
527
529{
530 Double_t phi = fRotPhi->GetNumber();
531 Double_t theta = fRotTheta->GetNumber();
532 Double_t psi = fRotPsi->GetNumber();
533 Double_t angle = fRotAxis->GetNumber();
534 Double_t phi0 = 0., theta0 = 0., psi0 = 0.;
535 fRotation->GetAngles(phi0, theta0, psi0);
536 Bool_t changed = kFALSE;
537 if (phi != psi0 || theta != theta0 || psi != psi0)
538 changed = kTRUE;
539 if (changed)
540 fRotation->SetAngles(phi, theta, psi);
541 // Check if we have to rotate about one axis
542 if (angle != 0.0) {
543 if (fRotX->IsOn()) {
544 fRotation->RotateX(angle);
545 changed = kTRUE;
546 }
547 if (fRotY->IsOn()) {
548 fRotation->RotateY(angle);
549 changed = kTRUE;
550 }
551 if (fRotZ->IsOn()) {
552 fRotation->RotateZ(angle);
553 changed = kTRUE;
554 }
555 }
556 if (!changed)
557 return kFALSE;
558 fRotAxis->SetNumber(0.0);
559 fUndo->SetEnabled();
560 if (fPad) {
561 fPad->Modified();
562 fPad->Update();
563 }
564 return kTRUE;
565}
566
567////////////////////////////////////////////////////////////////////////////////
568/// Slot for applying modifications.
569
571{
572 DoName();
573 if (DoParameters()) {
574 fUndo->SetEnabled();
575 fCancel->SetEnabled(kFALSE);
576 fApply->SetEnabled(kFALSE);
577 }
578}
579
580////////////////////////////////////////////////////////////////////////////////
581/// Slot for cancelling last un-applied operations.
582
584{
585 if (!fNamei.Length())
586 fRotName->SetText("no_name");
587 else
588 fRotName->SetText(fNamei.Data());
589 fRotPhi->SetNumber(fPhii);
590 fRotTheta->SetNumber(fThetai);
591 fRotPsi->SetNumber(fPsii);
592 fRotAxis->SetNumber(0.0);
593 fApply->SetEnabled(kFALSE);
594 fUndo->SetEnabled(kFALSE);
595 fCancel->SetEnabled(kFALSE);
596}
597
598////////////////////////////////////////////////////////////////////////////////
599/// Slot for notifying changes.
600
602{
603 fApply->SetEnabled();
604 if (fUndo->GetState() == kButtonDisabled)
605 fCancel->SetEnabled();
606}
607
608////////////////////////////////////////////////////////////////////////////////
609/// Slot for undoing last changes.
610
612{
613 DoCancel();
614 DoParameters();
615 fCancel->SetEnabled(kFALSE);
616 fUndo->SetEnabled(kFALSE);
617 fApply->SetEnabled(kFALSE);
618}
619
620/** \class TGeoCombiTransEditor
621\ingroup Geometry_builder
622
623Editor for a TGeoCombiTrans.
624
625*/
626
627
628////////////////////////////////////////////////////////////////////////////////
629/// Constructor for combi matrix editor
630
632 : TGeoGedFrame(p, width, height, options | kVerticalFrame, back)
633{
634 fCombi = nullptr;
635 fPhii = fThetai = fPsii = 0.0;
636 fDxi = fDyi = fDzi = 0.0;
637 fAngleX = fAngleY = fAngleZ = 0.0;
638 fNamei = "";
641
642 // TextEntry for name
643 MakeTitle("Name");
644 fRotName = new TGTextEntry(this, new TGTextBuffer(50), kMATRIX_NAME);
645 fRotName->Resize(135, fRotName->GetDefaultHeight());
646 fRotName->SetToolTipText("Enter the rotation name");
647 fRotName->Associate(this);
648 AddFrame(fRotName, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
649
650 TGTextEntry *nef;
651 MakeTitle("Translations on axes");
653 // Number entry for dx
656 f1->AddFrame(new TGLabel(f1, "DX"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
657 fTransDx = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
658 nef = (TGTextEntry *)fTransDx->GetNumberEntry();
659 nef->SetToolTipText("Enter the translation on X");
660 fTransDx->Associate(this);
661 f1->AddFrame(fTransDx, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
662 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
663
664 // Number entry for dy
665 TGCompositeFrame *f2 =
667 f2->AddFrame(new TGLabel(f2, "DY"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
668 fTransDy = new TGNumberEntry(f2, 0., 5, kMATRIX_DY);
669 nef = (TGTextEntry *)fTransDy->GetNumberEntry();
670 nef->SetToolTipText("Enter the translation on Y");
671 fTransDy->Associate(this);
673 compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
674
675 // Number entry for dx
676 TGCompositeFrame *f3 =
678 f3->AddFrame(new TGLabel(f3, "DZ"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
679 fTransDz = new TGNumberEntry(f3, 0., 5, kMATRIX_DZ);
680 nef = (TGTextEntry *)fTransDz->GetNumberEntry();
681 nef->SetToolTipText("Enter the translation on Z");
682 fTransDz->Associate(this);
684 compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
685
686 compxyz->Resize(150, 30);
687 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
688
689 MakeTitle("Euler angles");
690 compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
691 // Number entry for phi angle
693 f1->AddFrame(new TGLabel(f1, " PHI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
694 fRotPhi = new TGNumberEntry(f1, 0., 5, kMATRIX_PHI);
695 nef = (TGTextEntry *)fRotPhi->GetNumberEntry();
696 nef->SetToolTipText("Modify the first rotation angle about Z");
697 fRotPhi->Associate(this);
698 fRotPhi->Resize(90, fRotPhi->GetDefaultHeight());
699 f1->AddFrame(fRotPhi, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
700 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
701
702 // Number entry for theta angle
703 f2 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame | kFitWidth | kFixedWidth | kOwnBackground);
704 f2->AddFrame(new TGLabel(f2, "THETA"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
705 fRotTheta = new TGNumberEntry(f2, 0., 5, kMATRIX_THETA);
706 nef = (TGTextEntry *)fRotTheta->GetNumberEntry();
707 nef->SetToolTipText("Modify the second rotation angle about the new X");
708 fRotTheta->Associate(this);
709 fRotTheta->Resize(90, fRotTheta->GetDefaultHeight());
710 f2->AddFrame(fRotTheta, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
711 compxyz->AddFrame(f2, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
712
713 // Number entry for psi angle
714 f3 = new TGCompositeFrame(compxyz, 118, 10, kHorizontalFrame | kFitWidth | kFixedWidth | kOwnBackground);
715 f3->AddFrame(new TGLabel(f3, " PSI "), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
716 fRotPsi = new TGNumberEntry(f3, 0., 5, kMATRIX_PSI);
717 nef = (TGTextEntry *)fRotPsi->GetNumberEntry();
718 nef->SetToolTipText("Modify the third rotation angle about Z");
719 fRotPsi->Associate(this);
720 fRotPsi->Resize(90, fRotPsi->GetDefaultHeight());
721 f3->AddFrame(fRotPsi, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
722 compxyz->AddFrame(f3, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
723
724 compxyz->Resize(150, compxyz->GetDefaultHeight());
725 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
726
727 MakeTitle("Rotate about axis");
728 compxyz = new TGCompositeFrame(this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
729 // Number entry for rotation angle about one axis
731 f1->AddFrame(new TGLabel(f1, "ANGLE"), new TGLayoutHints(kLHintsLeft, 1, 1, 6, 0));
732 fRotAxis = new TGNumberEntry(f1, 0., 5, kMATRIX_DX);
733 nef = (TGTextEntry *)fRotAxis->GetNumberEntry();
734 nef->SetToolTipText("Enter the new rotation angle about the selected axis");
735 fRotAxis->Associate(this);
736 fRotAxis->Resize(90, fRotAxis->GetDefaultHeight());
737 f1->AddFrame(fRotAxis, new TGLayoutHints(kLHintsRight, 2, 2, 2, 2));
738 compxyz->AddFrame(f1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
739
740 // Radio buttons group for axis selection
741 TGHButtonGroup *bg1 = new TGHButtonGroup(compxyz, " Axis ");
742 fRotX = new TGRadioButton(bg1, " &X ", kMATRIX_DX);
743 fRotY = new TGRadioButton(bg1, " &Y ", kMATRIX_DY);
744 fRotZ = new TGRadioButton(bg1, " &Z ", kMATRIX_DZ);
746 bg1->Show();
747 compxyz->AddFrame(bg1, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 2, 2, 2, 2));
748
749 compxyz->Resize(150, compxyz->GetDefaultHeight());
750 AddFrame(compxyz, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
751
752 // Buttons
754 fApply = new TGTextButton(f23, "&Apply");
755 f23->AddFrame(fApply, new TGLayoutHints(kLHintsLeft, 2, 2, 4, 4));
756 fApply->Associate(this);
757 fCancel = new TGTextButton(f23, "&Cancel");
758 f23->AddFrame(fCancel, new TGLayoutHints(kLHintsCenterX, 2, 2, 4, 4));
759 fCancel->Associate(this);
760 fUndo = new TGTextButton(f23, " &Undo ");
761 f23->AddFrame(fUndo, new TGLayoutHints(kLHintsRight, 2, 2, 4, 4));
762 fUndo->Associate(this);
763 AddFrame(f23, new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
764 fUndo->SetSize(fCancel->GetSize());
765 fApply->SetSize(fCancel->GetSize());
766}
767
768////////////////////////////////////////////////////////////////////////////////
769/// Destructor
770
772{
773 TGFrameElement *el;
774 TIter next(GetList());
775 while ((el = (TGFrameElement *)next())) {
776 if (el->fFrame->IsComposite())
778 }
779 Cleanup();
780}
781
782////////////////////////////////////////////////////////////////////////////////
783/// Connect signals to slots.
784
786{
787 fApply->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoApply()");
788 fCancel->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoCancel()");
789 fUndo->Connect("Clicked()", "TGeoCombiTransEditor", this, "DoUndo()");
790 fRotName->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoModified()");
791 fRotPhi->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotPhi()");
792 fRotTheta->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotTheta()");
793 fRotPsi->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotPsi()");
794 fRotAxis->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoRotAngle()");
795 fTransDx->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDx()");
796 fTransDy->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDy()");
797 fTransDz->Connect("ValueSet(Long_t)", "TGeoCombiTransEditor", this, "DoDz()");
798 fTransDx->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDx()");
799 fTransDy->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDy()");
800 fTransDz->GetNumberEntry()->Connect("TextChanged(const char *)", "TGeoCombiTransEditor", this, "DoDz()");
801 fInit = kFALSE;
802}
803
804////////////////////////////////////////////////////////////////////////////////
805/// Connect to the selected combi matrix.
806
808{
809 if (obj == nullptr || (obj->IsA() != TGeoCombiTrans::Class())) {
811 return;
812 }
813 fCombi = (TGeoCombiTrans *)obj;
814 TGeoRotation *rot = fCombi->GetRotation();
815 if (rot)
817 const char *sname = fCombi->GetName();
818 if (!strcmp(sname, fCombi->ClassName()))
819 fRotName->SetText("no_name");
820 else {
821 fRotName->SetText(sname);
822 fNamei = sname;
823 }
824
825 fDxi = fCombi->GetTranslation()[0];
826 fDyi = fCombi->GetTranslation()[1];
827 fDzi = fCombi->GetTranslation()[2];
828 fTransDx->SetNumber(fDxi);
829 fTransDy->SetNumber(fDyi);
830 fTransDz->SetNumber(fDzi);
831
832 fRotPhi->SetNumber(fPhii);
833 fRotTheta->SetNumber(fThetai);
834 fRotPsi->SetNumber(fPsii);
835 fRotAxis->SetNumber(0.0);
836
837 fApply->SetEnabled(kFALSE);
838 fUndo->SetEnabled(kFALSE);
839 fCancel->SetEnabled(kFALSE);
840
841 if (fInit)
843 SetActive();
844}
845
846////////////////////////////////////////////////////////////////////////////////
847/// Slot for name.
848
850{
851 const char *name = fRotName->GetText();
852 if (!strcmp(name, "no_name") || !strcmp(name, fCombi->GetName()))
853 return;
854 fCombi->SetName(name);
855}
856
857////////////////////////////////////////////////////////////////////////////////
858/// Slot for phi (Euler X convention)
859
861{
862 if (fRotPhi->GetNumber() < 0.)
863 fRotPhi->SetNumber(fRotPhi->GetNumber() + 360.);
864 if (fRotPhi->GetNumber() >= 360.)
865 fRotPhi->SetNumber(fRotPhi->GetNumber() - 360.);
866 DoModified();
867}
868
869////////////////////////////////////////////////////////////////////////////////
870/// Slot for theta (Euler X convention)
871
873{
874 if (fRotTheta->GetNumber() < 0.)
875 fRotTheta->SetNumber(fRotTheta->GetNumber() + 360.);
876 if (fRotTheta->GetNumber() >= 360.)
877 fRotTheta->SetNumber(fRotTheta->GetNumber() - 360.);
878 DoModified();
879}
880
881////////////////////////////////////////////////////////////////////////////////
882/// Slot for psi (Euler X convention)
883
885{
886 if (fRotPsi->GetNumber() < 0.)
887 fRotPsi->SetNumber(fRotPsi->GetNumber() + 360.);
888 if (fRotPsi->GetNumber() >= 360.)
889 fRotPsi->SetNumber(fRotPsi->GetNumber() - 360.);
890 DoModified();
891}
892
893////////////////////////////////////////////////////////////////////////////////
894/// Slot for additional rotation about one axis.
895
897{
898 if (fRotAxis->GetNumber() < 0.)
899 fRotAxis->SetNumber(fRotAxis->GetNumber() + 360.);
900 if (fRotAxis->GetNumber() >= 360.)
901 fRotAxis->SetNumber(fRotAxis->GetNumber() - 360.);
902 DoModified();
903}
904
905////////////////////////////////////////////////////////////////////////////////
906/// Slot for checking parameters.
907
909{
910 Double_t dx = fTransDx->GetNumber();
911 Double_t dy = fTransDy->GetNumber();
912 Double_t dz = fTransDz->GetNumber();
913 Bool_t changedtr = kFALSE;
914 if (dx != fCombi->GetTranslation()[0] || dy != fCombi->GetTranslation()[1] || dz != fCombi->GetTranslation()[2])
915 changedtr = kTRUE;
916 if (changedtr)
917 fCombi->SetTranslation(dx, dy, dz);
918 Double_t phi = fRotPhi->GetNumber();
919 Double_t theta = fRotTheta->GetNumber();
920 Double_t psi = fRotPsi->GetNumber();
921 Double_t angle = fRotAxis->GetNumber();
922 Double_t phi0 = 0., theta0 = 0., psi0 = 0.;
923 TGeoRotation *rot = fCombi->GetRotation();
924 if (rot)
925 rot->GetAngles(phi0, theta0, psi0);
926 else {
927 if (phi != fPhii || theta != fThetai || psi != fPsii) {
928 TGeoRotation r("rot", 10., 0., 0.);
929 fCombi->SetRotation(r);
930 rot = fCombi->GetRotation();
931 rot->SetAngles(0., 0., 0.);
932 }
933 }
934 Bool_t changed = kFALSE;
935 if (phi != psi0 || theta != theta0 || psi != psi0)
936 changed = kTRUE;
937 if (changed && rot)
938 rot->SetAngles(phi, theta, psi);
939 // Check if we have to rotate about one axis
940 if (angle != 0.0) {
941 if (fRotX->IsOn()) {
942 fCombi->RotateX(angle);
943 changed = kTRUE;
944 }
945 if (fRotY->IsOn()) {
946 fCombi->RotateY(angle);
947 changed = kTRUE;
948 }
949 if (fRotZ->IsOn()) {
950 fCombi->RotateZ(angle);
951 changed = kTRUE;
952 }
953 }
954 if (changedtr)
955 changed = kTRUE;
956 if (!changed)
957 return kFALSE;
958 fRotAxis->SetNumber(0.0);
959 fUndo->SetEnabled();
960 if (fPad) {
961 fPad->Modified();
962 fPad->Update();
963 }
964 return kTRUE;
965}
966
967////////////////////////////////////////////////////////////////////////////////
968/// Slot for applying modifications.
969
971{
972 DoName();
973 if (DoParameters()) {
974 fUndo->SetEnabled();
975 fCancel->SetEnabled(kFALSE);
976 fApply->SetEnabled(kFALSE);
977 }
978}
979
980////////////////////////////////////////////////////////////////////////////////
981/// Slot for cancelling last un-applied operations.
982
984{
985 if (!fNamei.Length())
986 fRotName->SetText("no_name");
987 else
988 fRotName->SetText(fNamei.Data());
989 fTransDx->SetNumber(fDxi);
990 fTransDy->SetNumber(fDyi);
991 fTransDz->SetNumber(fDzi);
992 fRotPhi->SetNumber(fPhii);
993 fRotTheta->SetNumber(fThetai);
994 fRotPsi->SetNumber(fPsii);
995 fRotAxis->SetNumber(0.0);
996 fApply->SetEnabled(kFALSE);
997 fUndo->SetEnabled(kFALSE);
998 fCancel->SetEnabled(kFALSE);
999}
1000
1001////////////////////////////////////////////////////////////////////////////////
1002/// Slot for notifying changes.
1003
1005{
1006 fApply->SetEnabled();
1007 if (fUndo->GetState() == kButtonDisabled)
1008 fCancel->SetEnabled();
1009}
1010
1011////////////////////////////////////////////////////////////////////////////////
1012/// Slot for undoing last changes.
1013
1015{
1016 DoCancel();
1017 DoParameters();
1018 fCancel->SetEnabled(kFALSE);
1019 fUndo->SetEnabled(kFALSE);
1020 fApply->SetEnabled(kFALSE);
1021}
1022
1023////////////////////////////////////////////////////////////////////////////////
1024/// Slot for X.
1025
1027{
1028 DoModified();
1029}
1030
1031////////////////////////////////////////////////////////////////////////////////
1032/// Slot for Y.
1033
1035{
1036 DoModified();
1037}
1038
1039////////////////////////////////////////////////////////////////////////////////
1040/// Slot for Z.
1041
1043{
1044 DoModified();
1045}
@ kRaisedFrame
Definition GuiTypes.h:385
@ kSunkenFrame
Definition GuiTypes.h:384
@ kVerticalFrame
Definition GuiTypes.h:382
@ kDoubleBorder
Definition GuiTypes.h:386
@ kFixedWidth
Definition GuiTypes.h:388
@ kFitWidth
Definition GuiTypes.h:387
@ kHorizontalFrame
Definition GuiTypes.h:383
@ kOwnBackground
Definition GuiTypes.h:392
ULong_t Pixel_t
Pixel value.
Definition GuiTypes.h:41
ROOT::R::TRInterface & r
Definition Object.C:4
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
Definition RtypesCore.h:60
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
@ kButtonDisabled
Definition TGButton.h:56
@ kLHintsRight
Definition TGLayout.h:26
@ kLHintsLeft
Definition TGLayout.h:24
@ kLHintsCenterX
Definition TGLayout.h:25
@ kLHintsExpandX
Definition TGLayout.h:30
char name[80]
Definition TGX11.cxx:148
@ kMATRIX_NAME
ETGeoMatrixWid
@ kMATRIX_DX
@ kMATRIX_PSI
@ kMATRIX_CANCEL
@ kMATRIX_DY
@ kMATRIX_PHI
@ kMATRIX_THETA
@ kMATRIX_APPLY
@ kMATRIX_UNDO
@ kMATRIX_DZ
virtual void SetRadioButtonExclusive(Bool_t flag=kTRUE)
If enable is kTRUE, this button group will treat radio buttons as mutually exclusive,...
virtual void Show()
Show group of buttons.
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=nullptr)
Add frame to the composite frame using the specified layout hints.
Definition TGFrame.cxx:1109
virtual TList * GetList() const
Definition TGFrame.h:312
virtual void Cleanup()
Cleanup and delete all objects contained in this composite frame.
Definition TGFrame.cxx:959
UInt_t GetDefaultHeight() const override
Definition TGFrame.h:316
TGCompositeFrame(const TGCompositeFrame &)=delete
TGFrame * fFrame
Definition TGLayout.h:112
void Resize(UInt_t w=0, UInt_t h=0) override
Resize the frame.
Definition TGFrame.cxx:597
virtual Bool_t IsComposite() const
Definition TGFrame.h:214
Organizes TGButton widgets in a group with one horizontal row.
This class handles GUI labels.
Definition TGLabel.h:24
This class describes layout hints used by the layout classes.
Definition TGLayout.h:50
TGNumberEntry is a number entry input widget with up/down buttons.
Selects different options.
Definition TGButton.h:321
A text buffer is used in several widgets, like TGTextEntry, TGFileDialog, etc.
Yield an action as soon as it is clicked.
Definition TGButton.h:142
A TGTextEntry is a one line text input widget.
Definition TGTextEntry.h:24
virtual void SetToolTipText(const char *text, Long_t delayms=500)
Set tool tip text associated with this text entry.
ROOT GUI Window base class.
Definition TGWindow.h:23
Bool_t fInit
init flag for setting signals/slots
Definition TGedFrame.h:47
virtual void MakeTitle(const char *title)
Create attribute frame title.
Definition TGedFrame.cxx:94
TGNumberEntry * fTransDy
TGNumberEntry * fRotPsi
TGeoCombiTransEditor(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for combi matrix editor.
TGNumberEntry * fRotAxis
void DoRotPsi()
Slot for psi (Euler X convention).
TGNumberEntry * fTransDz
void DoModified()
Slot for notifying changes.
void DoUndo()
Slot for undoing last changes.
Bool_t DoParameters()
Slot for checking parameters.
void DoName()
Slot for name.
void DoRotAngle()
Slot for additional rotation about one axis.
TGeoCombiTrans * fCombi
void DoRotPhi()
Slot for phi (Euler X convention).
TGNumberEntry * fRotPhi
void DoApply()
Slot for applying modifications.
TGNumberEntry * fRotTheta
virtual void ConnectSignals2Slots()
Connect signals to slots.
void SetModel(TObject *obj) override
Connect to the selected combi matrix.
void DoRotTheta()
Slot for theta (Euler X convention).
void DoCancel()
Slot for cancelling last un-applied operations.
TGNumberEntry * fTransDx
~TGeoCombiTransEditor() override
Destructor.
Class describing rotation + translation.
Definition TGeoMatrix.h:318
static TClass * Class()
TVirtualPad * fPad
TGeoGedFrame(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor.
virtual void SetActive(Bool_t active=kTRUE)
Set active GUI attribute frames related to the selected object.
void DoApply()
Slot for applying modifications.
void DoRotPhi()
Slot for phi (Euler X convention).
void DoRotAngle()
Slot for additional rotation about one axis.
TGRadioButton * fRotY
void DoCancel()
Slot for cancelling last un-applied operations.
TGNumberEntry * fRotTheta
void DoUndo()
Slot for undoing last changes.
void SetModel(TObject *obj) override
Connect to the selected rotation.
void DoName()
Slot for name.
TGeoRotation * fRotation
TGRadioButton * fRotZ
Bool_t DoParameters()
Slot for checking parameters.
TGTextButton * fCancel
void DoModified()
Slot for notifying changes.
TGTextButton * fApply
TGNumberEntry * fRotPhi
TGNumberEntry * fRotAxis
TGTextButton * fUndo
virtual void ConnectSignals2Slots()
Connect signals to slots.
TGTextEntry * fRotName
void DoRotPsi()
Slot for psi (Euler X convention).
TGRadioButton * fRotX
~TGeoRotationEditor() override
Destructor.
void DoRotTheta()
Slot for theta (Euler X convention).
TGeoRotationEditor(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for rotation editor.
TGNumberEntry * fRotPsi
Class describing rotations.
Definition TGeoMatrix.h:169
static TClass * Class()
void SetAngles(Double_t phi, Double_t theta, Double_t psi)
Set matrix elements according to Euler angles.
void GetAngles(Double_t &theta1, Double_t &phi1, Double_t &theta2, Double_t &phi2, Double_t &theta3, Double_t &phi3) const
Retrieve rotation angles.
static void Cleanup(TGCompositeFrame *frame)
Static method to cleanup hierarchically all daughters of a composite frame.
~TGeoTranslationEditor() override
Destructor.
TGeoTranslation * fTranslation
void SetModel(TObject *obj) override
Connect to the new matrix.
void DoModified()
Slot for notifying changes.
void DoName()
Slot for name.
TGeoTranslationEditor(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor for translation editor.
void DoUndo()
Slot for undoing last operation.
void DoDy()
Slot for dx.
TGNumberEntry * fTransDy
Bool_t DoParameters()
Slot for checking parameters.
void DoCancel()
Slot for cancelling last modifications non-applied.
TGNumberEntry * fTransDx
void DoDz()
Slot for dx.
TGNumberEntry * fTransDz
virtual void ConnectSignals2Slots()
Connect signals to slots.
void DoApply()
Slot for applying changes.
void DoDx()
Slot for dx.
Class describing translations.
Definition TGeoMatrix.h:117
static TClass * Class()
Mother of all ROOT objects.
Definition TObject.h:42
virtual TClass * IsA() const
Definition TObject.h:248
TF1 * f1
Definition legend1.C:11