31 ClassImp(TGeoTranslationEditor);
34 kMATRIX_NAME, kMATRIX_DX, kMATRIX_DY, kMATRIX_DZ,
35 kMATRIX_PHI, kMATRIX_THETA, kMATRIX_PSI,
36 kMATRIX_APPLY, kMATRIX_CANCEL, kMATRIX_UNDO
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)
47 fDxi = fDyi = fDzi = 0.0;
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));
61 MakeTitle(
"Translations on axes");
62 TGCompositeFrame *compxyz =
new TGCompositeFrame(
this, 118, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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));
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));
96 compxyz->Resize(150,30);
97 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
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());
118 TGeoTranslationEditor::~TGeoTranslationEditor()
121 TIter next(GetList());
122 while ((el = (TGFrameElement *)next())) {
123 if (el->fFrame->IsComposite())
124 TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
132 void TGeoTranslationEditor::ConnectSignals2Slots()
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()");
151 void TGeoTranslationEditor::SetModel(TObject* obj)
153 if (obj == 0 || (obj->IsA()!=TGeoTranslation::Class())) {
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");
164 fTransName->SetText(sname);
167 fTransDx->SetNumber(fDxi);
168 fTransDy->SetNumber(fDyi);
169 fTransDz->SetNumber(fDzi);
170 fApply->SetEnabled(kFALSE);
171 fUndo->SetEnabled(kFALSE);
172 fCancel->SetEnabled(kFALSE);
174 if (fInit) ConnectSignals2Slots();
181 void TGeoTranslationEditor::DoName()
183 const char *name = fTransName->GetText();
184 if (!strcmp(name,
"no_name") || !strcmp(name, fTranslation->GetName()))
return;
185 fTranslation->SetName(name);
191 Bool_t TGeoTranslationEditor::DoParameters()
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;
202 fTranslation->SetTranslation(dx, dy, dz);
213 void TGeoTranslationEditor::DoApply()
216 if (DoParameters()) {
218 fCancel->SetEnabled(kFALSE);
219 fApply->SetEnabled(kFALSE);
226 void TGeoTranslationEditor::DoCancel()
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);
241 void TGeoTranslationEditor::DoModified()
243 fApply->SetEnabled();
244 if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
250 void TGeoTranslationEditor::DoUndo()
254 fCancel->SetEnabled(kFALSE);
255 fUndo->SetEnabled(kFALSE);
256 fApply->SetEnabled(kFALSE);
262 void TGeoTranslationEditor::DoDx()
270 void TGeoTranslationEditor::DoDy()
278 void TGeoTranslationEditor::DoDz()
290 ClassImp(TGeoRotationEditor);
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)
300 fPhii = fThetai = fPsii = 0.0;
301 fAngleX = fAngleY = fAngleZ = 0.0;
303 fIsModified = kFALSE;
304 fIsEditable = kFALSE;
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));
315 MakeTitle(
"Euler angles");
316 TGCompositeFrame *compxyz =
new TGCompositeFrame(
this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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));
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));
353 compxyz->Resize(150,compxyz->GetDefaultHeight());
354 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
356 MakeTitle(
"Rotate about axis");
357 compxyz =
new TGCompositeFrame(
this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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();
377 compxyz->AddFrame(bg1,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
379 compxyz->Resize(150,compxyz->GetDefaultHeight());
380 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
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());
402 TGeoRotationEditor::~TGeoRotationEditor()
405 TIter next(GetList());
406 while ((el = (TGFrameElement *)next())) {
407 if (el->fFrame->IsComposite())
408 TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
416 void TGeoRotationEditor::ConnectSignals2Slots()
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()");
433 void TGeoRotationEditor::SetModel(TObject* obj)
435 if (obj == 0 || (obj->IsA()!=TGeoRotation::Class())) {
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");
444 fRotName->SetText(sname);
447 fRotPhi->SetNumber(fPhii);
448 fRotTheta->SetNumber(fThetai);
449 fRotPsi->SetNumber(fPsii);
450 fRotAxis->SetNumber(0.0);
452 fApply->SetEnabled(kFALSE);
453 fUndo->SetEnabled(kFALSE);
454 fCancel->SetEnabled(kFALSE);
456 if (fInit) ConnectSignals2Slots();
463 void TGeoRotationEditor::DoName()
465 const char *name = fRotName->GetText();
466 if (!strcmp(name,
"no_name") || !strcmp(name, fRotation->GetName()))
return;
467 fRotation->SetName(name);
473 void TGeoRotationEditor::DoRotPhi()
475 if (fRotPhi->GetNumber() < 0.) fRotPhi->SetNumber(fRotPhi->GetNumber()+360.);
476 if (fRotPhi->GetNumber() >= 360.) fRotPhi->SetNumber(fRotPhi->GetNumber()-360.);
483 void TGeoRotationEditor::DoRotTheta()
485 if (fRotTheta->GetNumber() < 0.) fRotTheta->SetNumber(fRotTheta->GetNumber()+360.);
486 if (fRotTheta->GetNumber() >= 360.) fRotTheta->SetNumber(fRotTheta->GetNumber()-360.);
493 void TGeoRotationEditor::DoRotPsi()
495 if (fRotPsi->GetNumber() < 0.) fRotPsi->SetNumber(fRotPsi->GetNumber()+360.);
496 if (fRotPsi->GetNumber() >= 360.) fRotPsi->SetNumber(fRotPsi->GetNumber()-360.);
503 void TGeoRotationEditor::DoRotAngle()
505 if (fRotAxis->GetNumber() < 0.) fRotAxis->SetNumber(fRotAxis->GetNumber()+360.);
506 if (fRotAxis->GetNumber() >= 360.) fRotAxis->SetNumber(fRotAxis->GetNumber()-360.);
513 Bool_t TGeoRotationEditor::DoParameters()
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);
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;}
530 if (!changed)
return kFALSE;
531 fRotAxis->SetNumber(0.0);
543 void TGeoRotationEditor::DoApply()
546 if (DoParameters()) {
548 fCancel->SetEnabled(kFALSE);
549 fApply->SetEnabled(kFALSE);
556 void TGeoRotationEditor::DoCancel()
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);
572 void TGeoRotationEditor::DoModified()
574 fApply->SetEnabled();
575 if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
581 void TGeoRotationEditor::DoUndo()
585 fCancel->SetEnabled(kFALSE);
586 fUndo->SetEnabled(kFALSE);
587 fApply->SetEnabled(kFALSE);
597 ClassImp(TGeoCombiTransEditor);
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)
607 fPhii = fThetai = fPsii = 0.0;
608 fDxi = fDyi = fDzi = 0.0;
609 fAngleX = fAngleY = fAngleZ = 0.0;
611 fIsModified = kFALSE;
612 fIsEditable = kFALSE;
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));
623 MakeTitle(
"Translations on axes");
624 TGCompositeFrame *compxyz =
new TGCompositeFrame(
this, 118, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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));
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));
658 compxyz->Resize(150,30);
659 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
662 MakeTitle(
"Euler angles");
663 compxyz =
new TGCompositeFrame(
this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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));
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));
700 compxyz->Resize(150,compxyz->GetDefaultHeight());
701 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
703 MakeTitle(
"Rotate about axis");
704 compxyz =
new TGCompositeFrame(
this, 140, 30, kVerticalFrame | kRaisedFrame | kDoubleBorder);
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));
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();
724 compxyz->AddFrame(bg1,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX , 2, 2, 2, 2));
726 compxyz->Resize(150,compxyz->GetDefaultHeight());
727 AddFrame(compxyz,
new TGLayoutHints(kLHintsLeft, 6, 6, 2, 2));
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());
749 TGeoCombiTransEditor::~TGeoCombiTransEditor()
752 TIter next(GetList());
753 while ((el = (TGFrameElement *)next())) {
754 if (el->fFrame->IsComposite())
755 TGeoTabManager::Cleanup((TGCompositeFrame*)el->fFrame);
763 void TGeoCombiTransEditor::ConnectSignals2Slots()
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()");
786 void TGeoCombiTransEditor::SetModel(TObject* obj)
788 if (obj == 0 || (obj->IsA()!=TGeoCombiTrans::Class())) {
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");
798 fRotName->SetText(sname);
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);
809 fRotPhi->SetNumber(fPhii);
810 fRotTheta->SetNumber(fThetai);
811 fRotPsi->SetNumber(fPsii);
812 fRotAxis->SetNumber(0.0);
814 fApply->SetEnabled(kFALSE);
815 fUndo->SetEnabled(kFALSE);
816 fCancel->SetEnabled(kFALSE);
818 if (fInit) ConnectSignals2Slots();
825 void TGeoCombiTransEditor::DoName()
827 const char *name = fRotName->GetText();
828 if (!strcmp(name,
"no_name") || !strcmp(name, fCombi->GetName()))
return;
829 fCombi->SetName(name);
835 void TGeoCombiTransEditor::DoRotPhi()
837 if (fRotPhi->GetNumber() < 0.) fRotPhi->SetNumber(fRotPhi->GetNumber()+360.);
838 if (fRotPhi->GetNumber() >= 360.) fRotPhi->SetNumber(fRotPhi->GetNumber()-360.);
845 void TGeoCombiTransEditor::DoRotTheta()
847 if (fRotTheta->GetNumber() < 0.) fRotTheta->SetNumber(fRotTheta->GetNumber()+360.);
848 if (fRotTheta->GetNumber() >= 360.) fRotTheta->SetNumber(fRotTheta->GetNumber()-360.);
855 void TGeoCombiTransEditor::DoRotPsi()
857 if (fRotPsi->GetNumber() < 0.) fRotPsi->SetNumber(fRotPsi->GetNumber()+360.);
858 if (fRotPsi->GetNumber() >= 360.) fRotPsi->SetNumber(fRotPsi->GetNumber()-360.);
865 void TGeoCombiTransEditor::DoRotAngle()
867 if (fRotAxis->GetNumber() < 0.) fRotAxis->SetNumber(fRotAxis->GetNumber()+360.);
868 if (fRotAxis->GetNumber() >= 360.) fRotAxis->SetNumber(fRotAxis->GetNumber()-360.);
875 Bool_t TGeoCombiTransEditor::DoParameters()
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);
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.);
900 Bool_t changed = kFALSE;
901 if (phi != psi0 || theta != theta0 || psi != psi0) changed = kTRUE;
902 if (changed && rot) rot->SetAngles(phi, theta, psi);
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;}
909 if (changedtr) changed = kTRUE;
910 if (!changed)
return kFALSE;
911 fRotAxis->SetNumber(0.0);
923 void TGeoCombiTransEditor::DoApply()
926 if (DoParameters()) {
928 fCancel->SetEnabled(kFALSE);
929 fApply->SetEnabled(kFALSE);
936 void TGeoCombiTransEditor::DoCancel()
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);
955 void TGeoCombiTransEditor::DoModified()
957 fApply->SetEnabled();
958 if (fUndo->GetState()==kButtonDisabled) fCancel->SetEnabled();
964 void TGeoCombiTransEditor::DoUndo()
968 fCancel->SetEnabled(kFALSE);
969 fUndo->SetEnabled(kFALSE);
970 fApply->SetEnabled(kFALSE);
976 void TGeoCombiTransEditor::DoDx()
984 void TGeoCombiTransEditor::DoDy()
992 void TGeoCombiTransEditor::DoDz()