36 #ifdef G4VIS_BUILD_OPENGLQT_DRIVER
64 #include <qpushbutton.h>
66 #include <qdesktopwidget.h>
69 #include <qimagewriter.h>
71 #include <qtextedit.h>
72 #include <qtreewidget.h>
73 #include <qapplication.h>
74 #include <qmessagebox.h>
75 #include <qfiledialog.h>
77 #include <qdatetime.h>
81 #include <qcolordialog.h>
84 #include <qgroupbox.h>
85 #include <qcombobox.h>
86 #include <qlineedit.h>
87 #include <qsignalmapper.h>
88 #include <qmainwindow.h>
89 #include <qtablewidget.h>
90 #include <qheaderview.h>
91 #include <qscrollarea.h>
92 #include <qsplitter.h>
93 #include <qcheckbox.h>
97 #ifdef G4MULTITHREADED
103 #ifdef G4MULTITHREADED
112 void G4OpenGLQtViewer::CreateMainWindow (
120 if(fGLWidget)
return;
122 fGLWidget = glWidget ;
125 G4Qt* interactorManager = G4Qt::getInstance ();
127 ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
139 if (UI == NULL)
return;
141 if (! static_cast<G4UIQt*> (UI->GetG4UIWindow())) {
146 fUiQt =
static_cast<G4UIQt*
> (UI->GetG4UIWindow());
148 bool isTabbedView =
false;
151 if (!interactorManager->IsExternalApp()) {
153 fWinSize_x = fVP.GetWindowSizeHintX();
154 fWinSize_y = fVP.GetWindowSizeHintY();
156 isTabbedView = fUiQt->AddTabWidget((QWidget*)fGLWidget,name);
157 QObject::connect(fUiQt->GetViewerTabWidget(),
158 SIGNAL(currentChanged(
int)),
160 SLOT(currentTabActivated(
int)));
164 createSceneTreeWidget();
171 QWidget *glDialogWidget = getParentWidget();
172 if (glDialogWidget == NULL) {
175 glWidget->setParent(glDialogWidget);
176 QHBoxLayout *mainLayout =
new QHBoxLayout();
178 mainLayout->setMargin(0);
179 mainLayout->setSpacing(0);
180 mainLayout->addWidget(fGLWidget);
181 if (fGLWidget->inherits(
"QMainWindow")) {
182 fGLWidget->setWindowTitle( name);
184 glDialogWidget->setLayout(mainLayout);
188 int offset = QApplication::desktop()->height()
189 - QApplication::desktop()->availableGeometry().height();
191 G4int YPos= fVP.GetWindowAbsoluteLocationHintY(QApplication::desktop()->height());
192 if (fVP.GetWindowAbsoluteLocationHintY(QApplication::desktop()->height())< offset) {
195 glDialogWidget->resize(getWinWidth(), getWinHeight());
196 glDialogWidget->move(fVP.GetWindowAbsoluteLocationHintX(QApplication::desktop()->width()),YPos);
197 glDialogWidget->show();
200 if(!fGLWidget)
return;
209 G4OpenGLQtViewer::G4OpenGLQtViewer (
210 G4OpenGLSceneHandler& scene
213 ,G4OpenGLViewer (scene)
215 ,fRecordFrameNumber(0)
216 ,fMouseOnSceneTree(false)
218 ,fLastPickPoint(-1,-1)
221 ,fHoldKeyEvent(false)
222 ,fHoldMoveEvent(false)
223 ,fHoldRotateEvent(false)
227 ,fMovieTempFolderPath(
"")
229 ,fParameterFileName(
"ppmtompeg_encode_parameter_file.par")
230 ,fMovieParametersDialog(NULL)
231 ,fRecordingStep(WAIT)
233 ,fNbMaxFramesPerSec(100)
234 ,fNbMaxAnglePerSec(360)
235 ,fLaunchSpinDelay(100)
236 ,fUISceneTreeWidget(NULL)
237 ,fUIViewerPropertiesWidget(NULL)
238 ,fUIPickInfosWidget(NULL)
241 ,fControlKeyPress(false)
242 ,fShiftKeyPress(false)
244 ,fCheckSceneTreeComponentSignalLock(false)
245 ,fViewerPropertiesTableWidgetIsInit(false)
246 ,fSceneTreeComponentTreeWidget(NULL)
247 ,fSceneTreeWidget(NULL)
248 ,fPVRootNodeCreate(false)
252 ,fTouchableVolumes(
"Touchables")
253 ,fShortcutsDialog(NULL)
254 ,fViewerPropertiesTableWidget(NULL)
255 ,fPickInfosWidget(NULL)
256 ,fPickInfosScrollArea(NULL)
257 ,fTreeWidgetInfosIgnoredCommands(0)
258 ,fSceneTreeDepthSlider(NULL)
260 ,fModelShortNameItem(NULL)
261 ,fMaxPOindexInserted(-1)
263 ,fSignalMapperMouse(NULL)
264 ,fSignalMapperSurface(NULL)
265 ,fSignalMapperPicking(NULL)
267 ,fTreeIconClosed(NULL)
268 ,fLastExportSliderValue(80)
269 ,fLastHighlightColor(
G4Color(0,0,0,0))
270 ,fLastHighlightName(0)
275 if (QCoreApplication::instance () == NULL) {
278 G4Qt::getInstance ();
280 fLastPos3 = QPoint(-1,-1);
281 fLastPos2 = QPoint(-1,-1);
282 fLastPos1 = QPoint(-1,-1);
284 initMovieParameters();
286 fLastEventTime =
new QTime();
287 fSignalMapperMouse =
new QSignalMapper(
this);
288 fSignalMapperSurface =
new QSignalMapper(
this);
291 fFileSavePath = QDir::currentPath();
294 QList<QByteArray> formats = QImageWriter::supportedImageFormats ();
295 for (
int i = 0; i < formats.size(); ++i) {
296 addExportImageFormat(formats.at(i).data());
299 const char *
const icon1[]={
357 const char *
const icon2[]={
450 const char *
const search[] = {
462 "OOOOOOOOOOOOOOOOOOO",
463 "OOOOOOOOOOOOOOOOOOO",
464 "OOOOOOOo. .oOOOOOO",
467 "OOOOO. XOOOOX .OOOO",
470 "OOOOO. XOOOOo .OOOO",
474 "OOOOOOOOOOOOO. XOO",
475 "OOOOOOOOOOOOOO. XOO",
476 "OOOOOOOOOOOOOOOoOOO",
477 "OOOOOOOOOOOOOOOOOOO",
478 "OOOOOOOOOOOOOOOOOOO",
479 "OOOOOOOOOOOOOOOOOOO",
480 "OOOOOOOOOOOOOOOOOOO"
483 fSearchIcon =
new QPixmap(search);
484 fTreeIconOpen =
new QPixmap(icon1);
485 fTreeIconClosed =
new QPixmap(icon2);
490 G4OpenGLQtViewer::~G4OpenGLQtViewer (
500 if (fSceneTreeWidget != NULL) {
501 if (fSceneTreeWidget->layout() != NULL) {
502 while ((wItem = fSceneTreeWidget->layout()->takeAt(0)) != 0) {
503 delete wItem->widget();
510 delete fTreeIconOpen;
511 delete fTreeIconClosed;
513 G4cout <<removeTempFolder().toStdString().c_str() <<
G4endl;
520 void G4OpenGLQtViewer::createPopupMenu() {
522 fContextMenu =
new QMenu(
"All");
524 QMenu *mMouseAction = fContextMenu->addMenu(
"&Mouse actions");
526 fMouseRotateAction = mMouseAction->addAction(
"Rotate", fSignalMapperMouse, SLOT(map()));
527 fMouseMoveAction = mMouseAction->addAction(
"Move", fSignalMapperMouse, SLOT(map()));
528 fMousePickAction = mMouseAction->addAction(
"Pick", fSignalMapperMouse, SLOT(map()));
529 fMouseZoomOutAction = mMouseAction->addAction(
"Zoom out", fSignalMapperMouse, SLOT(map()));
530 fMouseZoomInAction = mMouseAction->addAction(
"Zoom in", fSignalMapperMouse, SLOT(map()));
531 QAction *shortcutsAction = mMouseAction->addAction(
"Show shortcuts");
533 fMouseRotateAction->setCheckable(
true);
534 fMouseMoveAction->setCheckable(
true);
535 fMousePickAction->setCheckable(
true);
536 fMouseZoomOutAction->setCheckable(
true);
537 fMouseZoomInAction->setCheckable(
true);
538 shortcutsAction->setCheckable(
false);
540 connect(fSignalMapperMouse, SIGNAL(mapped(
int)),
this, SLOT(toggleMouseAction(
int)));
541 fSignalMapperMouse->setMapping(fMouseRotateAction,1);
542 fSignalMapperMouse->setMapping(fMouseMoveAction,2);
543 fSignalMapperMouse->setMapping(fMousePickAction,3);
544 fSignalMapperMouse->setMapping(fMouseZoomOutAction,4);
545 fSignalMapperMouse->setMapping(fMouseZoomInAction,5);
547 QObject::connect(shortcutsAction,
548 SIGNAL(triggered(
bool)),
550 SLOT(showShortcuts()));
553 QMenu *mStyle = fContextMenu->addMenu(
"&Style");
555 QMenu *mProjection = mStyle->addMenu(
"&Projection");
557 fProjectionOrtho = mProjection->addAction(
"Orthographic", fSignalMapperSurface, SLOT(map()));
558 fProjectionPerspective = mProjection->addAction(
"Persepective", fSignalMapperSurface, SLOT(map()));
561 if (fVP.GetFieldHalfAngle() == 0) {
562 createRadioAction(fProjectionOrtho, fProjectionPerspective,SLOT(toggleProjection(
bool)),1);
564 createRadioAction(fProjectionOrtho, fProjectionPerspective,SLOT(toggleProjection(
bool)),2);
568 QMenu *mDrawing = mStyle->addMenu(
"&Drawing");
570 fDrawingWireframe = mDrawing->addAction(
"Wireframe", fSignalMapperSurface, SLOT(map()));
572 fDrawingLineRemoval = mDrawing->addAction(
"Hidden line removal", fSignalMapperSurface, SLOT(map()));
574 fDrawingSurfaceRemoval = mDrawing->addAction(
"Hidden Surface removal", fSignalMapperSurface, SLOT(map()));
576 fDrawingLineSurfaceRemoval = mDrawing->addAction(
"Hidden line and surface removal", fSignalMapperSurface, SLOT(map()));
578 fDrawingWireframe->setCheckable(
true);
579 fDrawingLineRemoval->setCheckable(
true);
580 fDrawingSurfaceRemoval->setCheckable(
true);
581 fDrawingLineSurfaceRemoval->setCheckable(
true);
583 connect(fSignalMapperSurface, SIGNAL(mapped(
int)),
this, SLOT(toggleSurfaceAction(
int)));
584 fSignalMapperSurface->setMapping(fDrawingWireframe,1);
585 fSignalMapperSurface->setMapping(fDrawingLineRemoval,2);
586 fSignalMapperSurface->setMapping(fDrawingSurfaceRemoval,3);
587 fSignalMapperSurface->setMapping(fDrawingLineSurfaceRemoval,4);
592 QAction *backgroundColorChooser ;
594 backgroundColorChooser = mStyle->addAction(
"Background color");
595 QObject ::connect(backgroundColorChooser,
598 SLOT(actionChangeBackgroundColor()));
602 QAction *textColorChooser ;
604 textColorChooser = mStyle->addAction(
"Text color");
605 QObject ::connect(textColorChooser,
608 SLOT(actionChangeTextColor()));
612 QAction *defaultColorChooser ;
614 defaultColorChooser = mStyle->addAction(
"Default color");
615 QObject ::connect(defaultColorChooser,
618 SLOT(actionChangeDefaultColor()));
622 QMenu *mActions = fContextMenu->addMenu(
"&Actions");
623 QAction *createEPS = mActions->addAction(
"Save as ...");
624 QObject ::connect(createEPS,
627 SLOT(actionSaveImage()));
630 QAction *movieParameters = mActions->addAction(
"Save as movie...");
631 QObject ::connect(movieParameters,
634 SLOT(actionMovieParameters()));
640 QMenu *mSpecial = fContextMenu->addMenu(
"S&pecial");
641 QMenu *mTransparency = mSpecial->addMenu(
"Transparency");
642 QAction *transparencyOn = mTransparency->addAction(
"On");
643 QAction *transparencyOff = mTransparency->addAction(
"Off");
645 if (transparency_enabled ==
false) {
646 createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),2);
647 }
else if (transparency_enabled ==
true) {
648 createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),1);
654 QMenu *mAntialiasing = mSpecial->addMenu(
"Antialiasing");
655 QAction *antialiasingOn = mAntialiasing->addAction(
"On");
656 QAction *antialiasingOff = mAntialiasing->addAction(
"Off");
658 if (antialiasing_enabled ==
false) {
659 createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),2);
660 }
else if (antialiasing_enabled ==
true) {
661 createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),1);
663 mAntialiasing->clear();
666 QMenu *mHaloing = mSpecial->addMenu(
"Haloing");
667 QAction *haloingOn = mHaloing->addAction(
"On");
668 QAction *haloingOff = mHaloing->addAction(
"Off");
669 if (haloing_enabled ==
false) {
670 createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),2);
671 }
else if (haloing_enabled ==
true) {
672 createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),1);
677 QMenu *mAux = mSpecial->addMenu(
"Auxiliary edges");
678 QAction *auxOn = mAux->addAction(
"On");
679 QAction *auxOff = mAux->addAction(
"Off");
680 if (!fVP.IsAuxEdgeVisible()) {
681 createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),2);
683 createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),1);
687 QMenu *mHiddenMarkers = mSpecial->addMenu(
"Hidden markers");
688 QAction *hiddenMarkersOn = mHiddenMarkers->addAction(
"On");
689 QAction *hiddenMarkersOff = mHiddenMarkers->addAction(
"Off");
690 if (fVP.IsMarkerNotHidden()) {
691 createRadioAction(hiddenMarkersOn,hiddenMarkersOff,SLOT(toggleHiddenMarkers(
bool)),2);
693 createRadioAction(hiddenMarkersOn,hiddenMarkersOff,SLOT(toggleHiddenMarkers(
bool)),1);
698 QMenu *mFullScreen = mSpecial->addMenu(
"&Full screen");
699 fFullScreenOn = mFullScreen->addAction(
"On");
700 fFullScreenOff = mFullScreen->addAction(
"Off");
701 createRadioAction(fFullScreenOn,fFullScreenOff,SLOT(toggleFullScreen(
bool)),2);
704 updateToolbarAndMouseContextMenu();
707 void G4OpenGLQtViewer::G4manageContextMenuEvent(QContextMenuEvent *e)
710 G4cerr <<
"Visualization window not defined, please choose one before" <<
G4endl;
717 if ( fContextMenu ) {
718 fContextMenu->exec( e->globalPos() );
734 void G4OpenGLQtViewer::createRadioAction(QAction *action1,QAction *action2,
const std::string& method,
unsigned int nCheck) {
736 action1->setCheckable(
true);
737 action2->setCheckable(
true);
740 action1->setChecked (
true);
742 action2->setChecked (
true);
744 QObject ::connect(action1, SIGNAL(triggered(
bool)),action2, SLOT(toggle()));
745 QObject ::connect(action2, SIGNAL(triggered(
bool)),action1, SLOT(toggle()));
747 QObject ::connect(action1, SIGNAL(toggled(
bool)),
this, method.c_str());
756 void G4OpenGLQtViewer::showShortcuts() {
759 text =
"========= Mouse Shortcuts =========\n";
761 if (fUiQt->IsIconRotateSelected()) {
762 text +=
"Click and move mouse to rotate volume \n";
763 text +=
"ALT + Click and move mouse to rotate volume (Toggle View/Theta-Phi Direction) \n";
764 text +=
"CTRL + Click and move mouse to zoom in/out \n";
765 text +=
"SHIFT + Click and move mouse to change camera point of view \n";
766 }
else if (fUiQt->IsIconMoveSelected()) {
767 text +=
"Move camera point of view with mouse \n";
768 }
else if (fUiQt->IsIconPickSelected()) {
769 text +=
"Click and pick \n";
772 text +=
"Click and move mouse to rotate volume \n";
773 text +=
"ALT + Click and move mouse to rotate volume (Toggle View/Theta-Phi Direction) \n";
774 text +=
"CTRL + Click and zoom mouse to zoom in/out \n";
775 text +=
"SHIFT + Click and zoommove camera point of view \n";
777 text +=
"========= Move Shortcuts ========= \n";
778 text +=
"Press left/right arrows to move volume left/right \n";
779 text +=
"Press up/down arrows to move volume up/down \n";
780 text +=
"Press '+'/'-' to move volume toward/forward \n";
782 text +=
"========= Rotation (Theta/Phi) Shortcuts ========= \n";
783 text +=
"Press SHIFT + left/right arrows to rotate volume left/right \n";
784 text +=
"Press SHIFT + up/down arrows to rotate volume up/down \n";
786 text +=
"========= Rotation (View Direction) Shortcuts ========= \n";
787 text +=
"Press ALT + left/right to rotate volume around vertical direction \n";
788 text +=
"Press ALT + up/down to rotate volume around horizontal direction \n";
790 text +=
"========= Zoom View ========= \n";
791 text +=
"Press CTRL + '+'/'-' to zoom into volume \n";
793 text +=
"========= Misc ========= \n";
794 text +=
"Press ALT +/- to slow/speed rotation/move \n";
795 text +=
"Press H to reset view \n";
796 text +=
"Press Esc to exit FullScreen \n";
798 text +=
"========= Video ========= \n";
799 text +=
"In video mode : \n";
800 text +=
" Press SPACE to Start/Pause video recording \n";
801 text +=
" Press RETURN to Stop video recording \n";
806 if ( fShortcutsDialog == NULL) {
807 fShortcutsDialog =
new QDialog();
808 fShortcutsDialogInfos =
new QTextEdit() ;
809 QVBoxLayout *mainLayout =
new QVBoxLayout;
810 mainLayout->addWidget(fShortcutsDialogInfos);
811 fShortcutsDialog->setLayout(mainLayout);
812 fShortcutsDialog->setWindowTitle(tr(
"Shortcuts"));
815 fShortcutsDialogInfos->setPlainText(text.data());
816 fShortcutsDialog->show();
827 void G4OpenGLQtViewer::toggleMouseAction(
int aAction) {
830 fUiQt->SetIconRotateSelected();
831 }
else if (aAction == 2) {
832 fUiQt->SetIconMoveSelected();
833 }
else if (aAction == 3) {
835 }
else if (aAction == 4) {
836 fUiQt->SetIconZoomOutSelected();
837 }
else if (aAction == 5) {
838 fUiQt->SetIconZoomInSelected();
842 updateToolbarAndMouseContextMenu();
856 void G4OpenGLQtViewer::toggleSurfaceAction(
int aAction) {
863 }
else if (aAction ==2) {
866 }
else if (aAction ==3) {
869 }
else if (aAction ==4) {
872 fVP.SetDrawingStyle(d_style);
874 updateToolbarAndMouseContextMenu();
889 void G4OpenGLQtViewer::toggleProjection(
bool check) {
892 fVP.SetOrthogonalProjection ();
894 fVP.SetPerspectiveProjection();
896 updateToolbarAndMouseContextMenu();
905 void G4OpenGLQtViewer::toggleTransparency(
bool check) {
908 transparency_enabled =
true;
910 transparency_enabled =
false;
912 SetNeedKernelVisit (
true);
913 updateToolbarAndMouseContextMenu();
921 void G4OpenGLQtViewer::toggleAntialiasing(
bool check) {
924 antialiasing_enabled =
false;
925 glDisable (GL_LINE_SMOOTH);
926 glDisable (GL_POLYGON_SMOOTH);
928 antialiasing_enabled =
true;
929 glEnable (GL_LINE_SMOOTH);
930 glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
931 glEnable (GL_POLYGON_SMOOTH);
932 glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
935 updateToolbarAndMouseContextMenu();
944 void G4OpenGLQtViewer::toggleHaloing(
bool check) {
946 haloing_enabled =
false;
948 haloing_enabled =
true;
951 updateToolbarAndMouseContextMenu();
960 void G4OpenGLQtViewer::toggleAux(
bool check) {
962 fVP.SetAuxEdgeVisible(
true);
964 fVP.SetAuxEdgeVisible(
false);
966 SetNeedKernelVisit (
true);
967 updateToolbarAndMouseContextMenu();
972 void G4OpenGLQtViewer::togglePicking() {
975 if (!fVP.IsPicking()) {
976 fUiQt->SetIconPickSelected();
978 fUiQt->SetIconRotateSelected();
984 if (!fVP.IsPicking()) {
985 UI->
ApplyCommand(std::string(
"/vis/viewer/set/picking true"));
987 UI->
ApplyCommand(std::string(
"/vis/viewer/set/picking false"));
998 void G4OpenGLQtViewer::toggleHiddenMarkers(
bool check) {
1000 fVP.SetMarkerHidden();
1002 fVP.SetMarkerNotHidden();
1005 updateToolbarAndMouseContextMenu();
1012 void G4OpenGLQtViewer::toggleFullScreen(
bool check) {
1013 if (check != fGLWidget->isFullScreen()) {
1014 fGLWidget->setWindowState(fGLWidget->windowState() ^ Qt::WindowFullScreen);
1019 void G4OpenGLQtViewer::savePPMToTemp() {
1020 if (fMovieTempFolderPath ==
"") {
1023 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
1027 QString fileName =
"Test"+QString::number(fRecordFrameNumber)+
".ppm";
1028 QString filePath =fMovieTempFolderPath+fileName;
1031 image = qGLW->grabFrameBuffer();
1034 res = image.save(filePath,0);
1037 setRecordingInfos(
"Can't save tmp file "+filePath);
1041 setRecordingInfos(
"File "+fileName+
" saved");
1042 fRecordFrameNumber++;
1047 void G4OpenGLQtViewer::actionSaveImage() {
1049 for (
unsigned int i = 0; i < fExportImageFormatVector.size(); ++i) {
1050 filters += QString(
"*.") + fExportImageFormatVector.at(i).c_str() +
";;";
1053 QString* selectedFormat =
new QString(fDefaultExportImageFormat.c_str());
1055 qFilename = QFileDialog::getSaveFileName ( fGLWidget,
1062 std::string name = qFilename.toStdString().c_str();
1069 fFileSavePath = QFileInfo(qFilename).path();
1071 std::string format = selectedFormat->toLower().toStdString().c_str();
1074 fExportImageFormat = format.substr(format.find_last_of(
".") + 1);
1076 std::string filename =
name;
1077 std::string extension =
"";
1078 if (name.find_last_of(
".") != std::string::npos) {
1079 filename = name.substr(0,name.find_last_of(
".") + 1);
1080 extension = name.substr(name.find_last_of(
".") + 1);
1082 extension = fExportImageFormat;
1085 filename+=
"."+ extension;
1087 if (!setExportFilename(filename.c_str(),0)) {
1091 G4OpenGLQtExportDialog* exportDialog=
new G4OpenGLQtExportDialog(fGLWidget,format.c_str(),fGLWidget->height(),fGLWidget->width());
1092 if( exportDialog->exec()) {
1094 if ((exportDialog->getWidth() !=fGLWidget->width()) ||
1095 (exportDialog->getHeight() !=fGLWidget->height())) {
1096 setExportSize(exportDialog->getWidth(),exportDialog->getHeight());
1099 if (fExportImageFormat ==
"eps") {
1100 fVectoredPs = exportDialog->getVectorEPS();
1101 }
else if (fExportImageFormat ==
"ps") {
1104 fLastExportSliderValue = exportDialog->getSliderValue();
1106 if (exportImage(filename)) {
1108 fDefaultExportImageFormat = format;
1117 void G4OpenGLQtViewer::actionChangeBackgroundColor() {
1125 #if QT_VERSION < 0x040500
1127 const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::black).rgba(),&a,fGLWidget));
1129 const QColor color =
1130 QColorDialog::getColor(Qt::black,
1132 " Get background color and transparency",
1133 QColorDialog::ShowAlphaChannel);
1135 if (color.isValid()) {
1140 fVP.SetBackgroundColour(colour);
1142 updateToolbarAndMouseContextMenu();
1147 void G4OpenGLQtViewer::actionChangeTextColor() {
1149 #if QT_VERSION < 0x040500
1151 const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::yellow).rgba(),&a,fGLWidget));
1153 const QColor& color =
1154 QColorDialog::getColor(Qt::yellow,
1156 " Get text color and transparency",
1157 QColorDialog::ShowAlphaChannel);
1159 if (color.isValid()) {
1165 fVP.SetDefaultTextColour(colour);
1167 updateToolbarAndMouseContextMenu();
1172 void G4OpenGLQtViewer::actionChangeDefaultColor() {
1174 #if QT_VERSION < 0x040500
1176 const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::white).rgba(),&a,fGLWidget));
1178 const QColor& color =
1179 QColorDialog::getColor(Qt::white,
1181 " Get default color and transparency",
1182 QColorDialog::ShowAlphaChannel);
1184 if (color.isValid()) {
1190 fVP.SetDefaultColour(colour);
1192 updateToolbarAndMouseContextMenu();
1198 void G4OpenGLQtViewer::actionMovieParameters() {
1199 showMovieParametersDialog();
1203 void G4OpenGLQtViewer::showMovieParametersDialog() {
1204 if (!fMovieParametersDialog) {
1205 fMovieParametersDialog=
new G4OpenGLQtMovieDialog(
this,fGLWidget);
1206 displayRecordingStatus();
1207 fMovieParametersDialog->checkEncoderSwParameters();
1208 fMovieParametersDialog->checkSaveFileNameParameters();
1209 fMovieParametersDialog->checkTempFolderParameters();
1210 if (getEncoderPath() ==
"") {
1211 setRecordingInfos(
"ppmtompeg is needed to encode in video format. It is available here: http://netpbm.sourceforge.net ");
1214 fMovieParametersDialog->show();
1219 void G4OpenGLQtViewer::FinishView()
1235 void G4OpenGLQtViewer::G4MousePressEvent(QMouseEvent *evnt)
1237 if (evnt->button() == Qt::RightButton) {
1240 if ((evnt->button() & Qt::LeftButton) && (! (evnt->modifiers() & Qt::ControlModifier ))){
1241 fGLWidget->setMouseTracking(
true);
1243 fLastPos1 = evnt->pos();
1244 fLastPos2 = fLastPos1;
1245 fLastPos3 = fLastPos2;
1246 fLastEventTime->start();
1247 if (fUiQt != NULL) {
1249 if (fUiQt->IsIconZoomInSelected()) {
1252 float deltaX = ((float)getWinWidth()/2-evnt->pos().x());
1253 float deltaY = ((float)getWinHeight()/2-evnt->pos().y());
1257 if (getWinHeight() <getWinWidth()) {
1260 fVP.IncrementPan(-deltaX*coefTrans,deltaY*coefTrans,0);
1261 fVP.SetZoomFactor(1.5 * fVP.GetZoomFactor());
1265 }
else if (fUiQt->IsIconZoomOutSelected()) {
1267 moveScene(((
float)getWinWidth()/2-evnt->pos().x()),((
float)getWinHeight()/2-evnt->
pos().y()),0,true);
1269 fVP.SetZoomFactor(0.75 * fVP.GetZoomFactor());
1272 }
else if (fUiQt->IsIconRotateSelected() ) {
1274 if (fShiftKeyPress) {
1275 fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1278 fGLWidget->setCursor(QCursor(Qt::ClosedHandCursor));
1280 }
else if (fUiQt->IsIconMoveSelected()) {
1281 fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1282 }
else if (fUiQt->IsIconPickSelected()) {
1283 fGLWidget->setCursor(QCursor(Qt::PointingHandCursor));
1291 void G4OpenGLQtViewer::G4MouseReleaseEvent(QMouseEvent *evnt)
1293 fSpinningDelay = fLastEventTime->elapsed();
1294 QPoint delta = (fLastPos3-fLastPos1);
1297 fGLWidget->setCursor(QCursor(Qt::ArrowCursor));
1299 if (fVP.IsPicking()){
1300 if ((delta.x() != 0) || (delta.y() != 0)) {
1303 updatePickInfosWidget(evnt->pos().x(),evnt->pos().y());
1305 }
else if (fSpinningDelay < fLaunchSpinDelay ) {
1306 if ((delta.x() == 0) && (delta.y() == 0)) {
1312 lastMoveTime.start();
1314 float correctionFactor = 5;
1316 if ( lastMoveTime.elapsed() >= (
int)(1000/fNbMaxFramesPerSec)) {
1317 float lTime = 1000/lastMoveTime.elapsed();
1318 if (((((
float)delta.x())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1319 ((((
float)delta.x())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1320 correctionFactor = (float)delta.x()*(lTime/fNbMaxAnglePerSec);
1321 if (delta.x() <0 ) {
1322 correctionFactor = -correctionFactor;
1325 if (((((
float)delta.y())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1326 ((((
float)delta.y())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1327 correctionFactor = (float)delta.y()*(lTime/fNbMaxAnglePerSec);
1328 if (delta.y() <0 ) {
1329 correctionFactor = -correctionFactor;
1340 lastMoveTime.start();
1342 bool rotate =
false;
1345 if (fUiQt != NULL) {
1346 if (fUiQt->IsIconRotateSelected()) {
1348 }
else if (fUiQt->IsIconMoveSelected()) {
1361 rotateQtScene(((
float)delta.x())/correctionFactor,((
float)delta.y())/correctionFactor);
1362 }
else if (fAltKeyPress) {
1363 rotateQtSceneToggle(((
float)delta.x())/correctionFactor,((
float)delta.y())/correctionFactor);
1367 moveScene(-((
float)delta.x())/correctionFactor,-((
float)delta.y())/correctionFactor,0,true);
1370 ((QApplication*)G4Qt::getInstance ())->processEvents();
1373 fGLWidget->setMouseTracking(false);
1378 void G4OpenGLQtViewer::G4MouseDoubleClickEvent()
1380 fGLWidget->setMouseTracking(
true);
1391 void G4OpenGLQtViewer::G4MouseMoveEvent(QMouseEvent *evnt)
1394 Qt::MouseButtons mButtons = evnt->buttons();
1396 updateKeyModifierState(evnt->modifiers());
1402 fLastPos3 = fLastPos2;
1403 fLastPos2 = fLastPos1;
1404 fLastPos1 = QPoint(evnt->x(), evnt->y());
1406 int deltaX = fLastPos2.x()-fLastPos1.x();
1407 int deltaY = fLastPos2.y()-fLastPos1.y();
1410 if (fUiQt != NULL) {
1411 if (fUiQt->IsIconMoveSelected()) {
1416 if (mButtons & Qt::LeftButton) {
1418 rotateQtScene(((
float)deltaX),((
float)deltaY));
1419 }
else if (fAltKeyPress) {
1420 rotateQtSceneToggle(((
float)deltaX),((
float)deltaY));
1421 }
else if (fShiftKeyPress) {
1422 unsigned int sizeWin;
1423 sizeWin = getWinWidth();
1424 if (getWinHeight() < getWinWidth()) {
1425 sizeWin = getWinHeight();
1429 float factor = ((float)100/(
float)sizeWin) ;
1430 moveScene(-(
float)deltaX*factor,-(
float)deltaY*factor,0,
false);
1431 }
else if (fControlKeyPress) {
1432 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+((float)deltaY)));
1436 if (mButtons & Qt::LeftButton) {
1437 moveScene(-(
float)deltaX,-(
float)deltaY,0,
true);
1441 fLastEventTime->start();
1452 void G4OpenGLQtViewer::moveScene(
float dx,
float dy,
float dz,
bool mouseMove)
1456 fHoldMoveEvent =
true;
1459 GLdouble coefDepth = 0;
1462 if (getWinHeight() <getWinWidth()) {
1466 coefTrans = getSceneNearWidth()*fPan_sens;
1467 coefDepth = getSceneDepth()*fDeltaDepth;
1469 fVP.IncrementPan(-dx*coefTrans,dy*coefTrans,dz*coefDepth);
1473 ((QApplication*)G4Qt::getInstance ())->processEvents();
1475 fHoldMoveEvent =
false;
1484 void G4OpenGLQtViewer::rotateQtScene(
float dx,
float dy)
1486 if (fHoldRotateEvent)
1488 fHoldRotateEvent =
true;
1494 fHoldRotateEvent =
false;
1502 void G4OpenGLQtViewer::rotateQtSceneToggle(
float dx,
float dy)
1504 if (fHoldRotateEvent)
1506 fHoldRotateEvent =
true;
1508 rotateSceneToggle(dx,dy);
1512 fHoldRotateEvent =
false;
1523 void G4OpenGLQtViewer::rescaleImage(
1543 void G4OpenGLQtViewer::G4wheelEvent (QWheelEvent * evnt)
1545 fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP.GetZoomFactor()*(evnt->delta())/1200));
1550 void G4OpenGLQtViewer::G4keyPressEvent (QKeyEvent * evnt)
1555 fHoldKeyEvent =
true;
1559 updateKeyModifierState(evnt->modifiers());
1560 if ((fNoKeyPress) || (evnt->modifiers() == Qt::KeypadModifier )) {
1561 if (evnt->key() == Qt::Key_Down) {
1562 moveScene(0,1,0,
false);
1564 else if (evnt->key() == Qt::Key_Up) {
1565 moveScene(0,-1,0,
false);
1567 if (evnt->key() == Qt::Key_Left) {
1568 moveScene(-1,0,0,
false);
1570 else if (evnt->key() == Qt::Key_Right) {
1571 moveScene(1,0,0,
false);
1573 if (evnt->key() == Qt::Key_Minus) {
1574 moveScene(0,0,1,
false);
1576 else if (evnt->key() == Qt::Key_Plus) {
1577 moveScene(0,0,-1,
false);
1580 if (evnt->key() == Qt::Key_Escape) {
1581 toggleFullScreen(
false);
1590 if ((evnt->key() == Qt::Key_Return) || (evnt->key() == Qt::Key_Enter)){
1593 if (evnt->key() == Qt::Key_Space){
1598 if (evnt->key() == Qt::Key_H){
1605 if (fShiftKeyPress) {
1606 fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1608 if (evnt->key() == Qt::Key_Down) {
1609 rotateQtScene(0,-fRot_sens);
1611 else if (evnt->key() == Qt::Key_Up) {
1612 rotateQtScene(0,fRot_sens);
1614 if (evnt->key() == Qt::Key_Left) {
1615 rotateQtScene(fRot_sens,0);
1617 else if (evnt->key() == Qt::Key_Right) {
1618 rotateQtScene(-fRot_sens,0);
1620 if (evnt->key() == Qt::Key_Plus) {
1622 moveScene(0,0,-1,
false);
1627 if ((fAltKeyPress)) {
1628 fGLWidget->setCursor(QCursor(Qt::ClosedHandCursor));
1630 if (evnt->key() == Qt::Key_Down) {
1631 rotateQtSceneToggle(0,-fRot_sens);
1633 else if (evnt->key() == Qt::Key_Up) {
1634 rotateQtSceneToggle(0,fRot_sens);
1636 if (evnt->key() == Qt::Key_Left) {
1637 rotateQtSceneToggle(fRot_sens,0);
1639 else if (evnt->key() == Qt::Key_Right) {
1640 rotateQtSceneToggle(-fRot_sens,0);
1644 if (evnt->key() == Qt::Key_Plus) {
1645 fRot_sens = fRot_sens/0.7;
1646 G4cout <<
"Auto-rotation set to : " << fRot_sens <<
G4endl;
1648 else if (evnt->key() == Qt::Key_Minus) {
1649 fRot_sens = fRot_sens*0.7;
1650 G4cout <<
"Auto-rotation set to : " << fRot_sens <<
G4endl;
1655 if ((fControlKeyPress)) {
1656 if (evnt->key() == Qt::Key_Plus) {
1657 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+fDeltaZoom));
1660 else if (evnt->key() == Qt::Key_Minus) {
1661 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1-fDeltaZoom));
1666 fHoldKeyEvent =
false;
1670 void G4OpenGLQtViewer::G4keyReleaseEvent (QKeyEvent *)
1672 fGLWidget->setCursor(QCursor(Qt::ArrowCursor));
1676 void G4OpenGLQtViewer::updateKeyModifierState(
const Qt::KeyboardModifiers& modifier) {
1680 fAltKeyPress =
false;
1681 fShiftKeyPress =
false;
1682 fControlKeyPress =
false;
1684 if (modifier & Qt::AltModifier ) {
1685 fAltKeyPress =
true;
1686 fNoKeyPress =
false;
1688 if (modifier & Qt::ShiftModifier ) {
1689 fShiftKeyPress =
true;
1690 fNoKeyPress =
false;
1692 if (modifier & Qt::ControlModifier ) {
1693 fControlKeyPress =
true;
1694 fNoKeyPress =
false;
1701 void G4OpenGLQtViewer::stopVideo() {
1704 if (!fMovieParametersDialog) {
1705 showMovieParametersDialog();
1707 setRecordingStatus(STOP);
1709 if (fRecordFrameNumber >0) {
1711 if (!(fMovieParametersDialog->checkEncoderSwParameters())) {
1712 setRecordingStatus(BAD_ENCODER);
1713 }
else if (!(fMovieParametersDialog->checkSaveFileNameParameters())) {
1714 setRecordingStatus(BAD_OUTPUT);
1718 setRecordingInfos(
"No frame to encode.");
1724 void G4OpenGLQtViewer::saveVideo() {
1727 if (!fMovieParametersDialog) {
1728 showMovieParametersDialog();
1731 fMovieParametersDialog->checkEncoderSwParameters();
1732 fMovieParametersDialog->checkSaveFileNameParameters();
1734 if (fRecordingStep == STOP) {
1735 setRecordingStatus(SAVE);
1736 generateMpegEncoderParameters();
1744 void G4OpenGLQtViewer::startPauseVideo() {
1748 if ( fRecordingStep == WAIT) {
1749 if ( fRecordFrameNumber == 0) {
1750 if (getTempFolderPath() ==
"") {
1751 showMovieParametersDialog();
1752 setRecordingInfos(
"You should specified the temp folder in order to make movie");
1756 QString tmp = removeTempFolder();
1758 setRecordingInfos(tmp);
1761 tmp = createTempFolder();
1763 setRecordingInfos(
"Can't create temp folder."+tmp);
1769 if (fRecordingStep == WAIT) {
1770 setRecordingStatus(
START);
1771 }
else if (fRecordingStep ==
START) {
1772 setRecordingStatus(PAUSE);
1773 }
else if (fRecordingStep == PAUSE) {
1774 setRecordingStatus(CONTINUE);
1775 }
else if (fRecordingStep == CONTINUE) {
1776 setRecordingStatus(PAUSE);
1780 void G4OpenGLQtViewer::setRecordingStatus(RECORDING_STEP step) {
1782 fRecordingStep = step;
1783 displayRecordingStatus();
1787 void G4OpenGLQtViewer::displayRecordingStatus() {
1789 QString txtStatus =
"";
1790 if (fRecordingStep == WAIT) {
1791 txtStatus =
"Waiting to start...";
1792 fRecordFrameNumber = 0;
1793 }
else if (fRecordingStep ==
START) {
1794 txtStatus =
"Start Recording...";
1795 }
else if (fRecordingStep == PAUSE) {
1796 txtStatus =
"Pause Recording...";
1797 }
else if (fRecordingStep == CONTINUE) {
1798 txtStatus =
"Continue Recording...";
1799 }
else if (fRecordingStep == STOP) {
1800 txtStatus =
"Stop Recording...";
1801 }
else if (fRecordingStep == READY_TO_ENCODE) {
1802 txtStatus =
"Ready to Encode...";
1803 }
else if (fRecordingStep ==
ENCODING) {
1804 txtStatus =
"Encoding...";
1805 }
else if (fRecordingStep == FAILED) {
1806 txtStatus =
"Failed to encode...";
1807 }
else if ((fRecordingStep == BAD_ENCODER)
1808 || (fRecordingStep == BAD_OUTPUT)
1809 || (fRecordingStep == BAD_TMP)) {
1810 txtStatus =
"Correct above errors first";
1811 }
else if (fRecordingStep == SUCCESS) {
1812 txtStatus =
"File encoded successfully";
1816 if (fMovieParametersDialog) {
1817 fMovieParametersDialog->setRecordingStatus(txtStatus);
1821 setRecordingInfos(
"");
1825 void G4OpenGLQtViewer::setRecordingInfos(
const QString& txt) {
1826 if (fMovieParametersDialog) {
1827 fMovieParametersDialog->setRecordingInfos(txt);
1835 void G4OpenGLQtViewer::initMovieParameters() {
1839 fProcess =
new QProcess();
1841 QObject ::connect(fProcess,SIGNAL(finished (
int)),
1842 this,SLOT(processLookForFinished()));
1843 fProcess->setReadChannelMode(QProcess::MergedChannels);
1844 fProcess->start (
"which ppmtompeg");
1850 QString G4OpenGLQtViewer::getEncoderPath() {
1851 return fEncoderPath;
1859 QString G4OpenGLQtViewer::setEncoderPath(QString path) {
1861 return "ppmtompeg is needed to encode in video format. It is available here: http://netpbm.sourceforge.net ";
1864 path = QDir::cleanPath(path);
1865 QFileInfo *f =
new QFileInfo(path);
1867 return "File does not exist";
1868 }
else if (f->isDir()) {
1869 return "This is a directory";
1870 }
else if (!f->isExecutable()) {
1871 return "File exist but is not executable";
1872 }
else if (!f->isFile()) {
1873 return "This is not a file";
1875 fEncoderPath = path;
1877 if (fRecordingStep == BAD_ENCODER) {
1878 setRecordingStatus(STOP);
1884 bool G4OpenGLQtViewer::isRecording(){
1885 if ((fRecordingStep ==
START) || (fRecordingStep == CONTINUE)) {
1891 bool G4OpenGLQtViewer::isPaused(){
1892 if (fRecordingStep == PAUSE) {
1898 bool G4OpenGLQtViewer::isEncoding(){
1905 bool G4OpenGLQtViewer::isWaiting(){
1906 if (fRecordingStep == WAIT) {
1912 bool G4OpenGLQtViewer::isStopped(){
1913 if (fRecordingStep == STOP) {
1919 bool G4OpenGLQtViewer::isFailed(){
1920 if (fRecordingStep == FAILED) {
1926 bool G4OpenGLQtViewer::isSuccess(){
1927 if (fRecordingStep == SUCCESS) {
1933 bool G4OpenGLQtViewer::isBadEncoder(){
1934 if (fRecordingStep == BAD_ENCODER) {
1939 bool G4OpenGLQtViewer::isBadTmp(){
1940 if (fRecordingStep == BAD_TMP) {
1945 bool G4OpenGLQtViewer::isBadOutput(){
1946 if (fRecordingStep == BAD_OUTPUT) {
1952 void G4OpenGLQtViewer::setBadEncoder(){
1953 fRecordingStep = BAD_ENCODER;
1954 displayRecordingStatus();
1956 void G4OpenGLQtViewer::setBadTmp(){
1957 fRecordingStep = BAD_TMP;
1958 displayRecordingStatus();
1960 void G4OpenGLQtViewer::setBadOutput(){
1961 fRecordingStep = BAD_OUTPUT;
1962 displayRecordingStatus();
1965 void G4OpenGLQtViewer::setWaiting(){
1966 fRecordingStep = WAIT;
1967 displayRecordingStatus();
1971 bool G4OpenGLQtViewer::isReadyToEncode(){
1972 if (fRecordingStep == READY_TO_ENCODE) {
1978 void G4OpenGLQtViewer::resetRecording() {
1979 setRecordingStatus(WAIT);
1986 QString G4OpenGLQtViewer::setTempFolderPath(QString path) {
1989 return "Path does not exist";
1991 path = QDir::cleanPath(path);
1992 QFileInfo *d =
new QFileInfo(path);
1994 return "Path does not exist";
1995 }
else if (!d->isDir()) {
1996 return "This is not a directory";
1997 }
else if (!d->isReadable()) {
1998 return path +
" is read protected";
1999 }
else if (!d->isWritable()) {
2000 return path +
" is write protected";
2003 if (fRecordingStep == BAD_TMP) {
2004 setRecordingStatus(WAIT);
2006 fTempFolderPath = path;
2012 QString G4OpenGLQtViewer::getTempFolderPath() {
2013 return fTempFolderPath;
2020 QString G4OpenGLQtViewer::setSaveFileName(QString path) {
2023 return "Path does not exist";
2026 QFileInfo *file =
new QFileInfo(path);
2027 QDir dir = file->dir();
2028 path = QDir::cleanPath(path);
2029 if (file->exists()) {
2030 return "File already exist, please choose a new one";
2031 }
else if (!dir.exists()) {
2032 return "Dir does not exist";
2033 }
else if (!dir.isReadable()) {
2034 return path +
" is read protected";
2037 if (fRecordingStep == BAD_OUTPUT) {
2038 setRecordingStatus(STOP);
2040 fSaveFileName = path;
2046 QString G4OpenGLQtViewer::getSaveFileName() {
2047 return fSaveFileName ;
2054 QString G4OpenGLQtViewer::createTempFolder() {
2055 fMovieTempFolderPath =
"";
2057 QString tmp = setTempFolderPath(fTempFolderPath);
2061 QString sep = QString(QDir::separator());
2062 QString path = sep+
"QtMovie_"+QDateTime::currentDateTime ().toString(
"dd-MM-yyyy_hh-mm-ss")+sep;
2063 QDir *d =
new QDir(QDir::cleanPath(fTempFolderPath));
2065 if (d->exists(path)) {
2066 return "Folder "+path+
" already exists.Please remove it first";
2068 if (d->mkdir(fTempFolderPath+path)) {
2069 fMovieTempFolderPath = fTempFolderPath+path;
2072 return "Can't create "+fTempFolderPath+path;
2077 QString G4OpenGLQtViewer::removeTempFolder() {
2079 if (fMovieTempFolderPath ==
"") {
2082 QDir *d =
new QDir(QDir::cleanPath(fMovieTempFolderPath));
2087 d->setFilter( QDir::Files );
2088 QStringList subDirList = d->entryList();
2091 for (QStringList::ConstIterator it = subDirList.begin() ;(it != subDirList.end()) ; it++) {
2092 const QString currentFile = *it;
2093 if (!d->remove(currentFile)) {
2095 QString file = fMovieTempFolderPath+currentFile;
2096 error +=
"Removing file failed : "+file;
2101 if (d->rmdir(fMovieTempFolderPath)) {
2102 fMovieTempFolderPath =
"";
2105 return "Dir "+fMovieTempFolderPath+
" should be empty, but could not remove it";
2109 return "Could not remove "+fMovieTempFolderPath+
" because of the following errors :"+
error;
2119 bool G4OpenGLQtViewer::exportImage(std::string name,
int width,
int height) {
2121 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
2126 bool increaseFileNumber =
true;
2128 if (name.size() != name.substr(name.find_last_of(
".") + 1).size()) {
2129 increaseFileNumber =
false;
2131 if (! setExportFilename(name,increaseFileNumber)) {
2134 if ((width !=-1) && (height != -1)) {
2135 setExportSize(width, height);
2138 if (G4OpenGLViewer::exportImage()) {
2144 image = qGLW->grabFrameBuffer();
2146 bool res = image.save(QString(getRealPrintFilename().c_str()),0,fLastExportSliderValue);
2149 G4cerr <<
"Error saving file... " << getRealPrintFilename().c_str() <<
G4endl;
2152 G4cout <<
"File " << getRealPrintFilename().c_str() <<
" size: " << fGLWidget->width() <<
"x" << fGLWidget->height() <<
" has been saved " <<
G4endl;
2153 fExportFilenameIndex++;
2161 bool G4OpenGLQtViewer::hasPendingEvents () {
2162 return ((QApplication*)G4Qt::getInstance ())->hasPendingEvents ();
2165 bool G4OpenGLQtViewer::generateMpegEncoderParameters () {
2169 fp = fopen (QString(fMovieTempFolderPath+fParameterFileName).toStdString().c_str(),
"w");
2172 setRecordingInfos(
"Generation of parameter file failed");
2176 fprintf (fp,
"# Pattern affects speed, quality and compression. See the User's Guide\n");
2177 fprintf (fp,
"# for more info.\n");
2179 fprintf (fp,
"PATTERN I\n");
2180 fprintf (fp,
"OUTPUT %s\n",getSaveFileName().toStdString().c_str());
2182 fprintf (fp,
"# You must specify the type of the input files. The choices are:\n");
2183 fprintf (fp,
"# YUV, PPM, JMOVIE, Y, JPEG, PNM\n");
2184 fprintf (fp,
"# (must be upper case)\n");
2186 fprintf (fp,
"BASE_FILE_FORMAT PPM\n");
2189 fprintf (fp,
"# If you are using YUV, there are different supported file formats.\n");
2190 fprintf (fp,
"# EYUV or UCB are the same as previous versions of this encoder.\n");
2191 fprintf (fp,
"# (All the Y's, then U's then V's, in 4:2:0 subsampling.)\n");
2192 fprintf (fp,
"# Other formats, such as Abekas, Phillips, or a general format are\n");
2193 fprintf (fp,
"# permissible, the general format is a string of Y's, U's, and V's\n");
2194 fprintf (fp,
"# to specify the file order.\n");
2196 fprintf (fp,
"INPUT_FORMAT UCB\n");
2198 fprintf (fp,
"# the conversion statement\n");
2200 fprintf (fp,
"# Each occurrence of '*' will be replaced by the input file\n");
2202 fprintf (fp,
"# e.g., if you have a bunch of GIF files, then this might be:\n");
2203 fprintf (fp,
"# INPUT_CONVERT giftoppm *\n");
2205 fprintf (fp,
"# e.g., if you have a bunch of files like a.Y a.U a.V, etc., then:\n");
2206 fprintf (fp,
"# INPUT_CONVERT cat *.Y *.U *.V\n");
2208 fprintf (fp,
"# e.g., if you are grabbing from laser disc you might have something like\n");
2209 fprintf (fp,
"# INPUT_CONVERT goto frame *; grabppm\n");
2210 fprintf (fp,
"# 'INPUT_CONVERT *' means the files are already in the base file format\n");
2212 fprintf (fp,
"INPUT_CONVERT * \n");
2214 fprintf (fp,
"# number of frames in a GOP.\n");
2216 fprintf (fp,
"# since each GOP must have at least one I-frame, the encoder will find the\n");
2217 fprintf (fp,
"# the first I-frame after GOP_SIZE frames to start the next GOP\n");
2219 fprintf (fp,
"# later, will add more flexible GOP signalling\n");
2221 fprintf (fp,
"GOP_SIZE 1\n");
2223 fprintf (fp,
"# number of slices in a frame\n");
2225 fprintf (fp,
"# 1 is a good number. another possibility is the number of macroblock rows\n");
2226 fprintf (fp,
"# (which is the height divided by 16)\n");
2228 fprintf (fp,
"SLICES_PER_FRAME 1\n");
2229 fprintf (fp,
"PIXEL HALF");
2231 fprintf (fp,
"# directory to get all input files from (makes this file easier to read)\n");
2232 fprintf (fp,
"INPUT_DIR %s\n",fMovieTempFolderPath.toStdString().c_str());
2234 fprintf (fp,
"# There are a bunch of ways to specify the input files.\n");
2235 fprintf (fp,
"# from a simple one-per-line listing, to the following \n");
2236 fprintf (fp,
"# way of numbering them. See the manual for more information.\n");
2237 fprintf (fp,
"INPUT\n");
2238 fprintf (fp,
"# '*' is replaced by the numbers 01, 02, 03, 04\n");
2239 fprintf (fp,
"# if I instead do [01-11], it would be 01, 02, ..., 09, 10, 11\n");
2240 fprintf (fp,
"# if I instead do [1-11], it would be 1, 2, 3, ..., 9, 10, 11\n");
2241 fprintf (fp,
"# if I instead do [1-11+3], it would be 1, 4, 7, 10\n");
2242 fprintf (fp,
"# the program assumes none of your input files has a name ending in ']'\n");
2243 fprintf (fp,
"# if you do, too bad!!!\n");
2246 fprintf (fp,
"Test*.ppm [0-%d]\n",fRecordFrameNumber-1);
2247 fprintf (fp,
"# can have more files here if you want...there is no limit on the number\n");
2248 fprintf (fp,
"# of files\n");
2249 fprintf (fp,
"END_INPUT\n");
2253 fprintf (fp,
"# Many of the remaining options have to do with the motion search and qscale\n");
2255 fprintf (fp,
"# FULL or HALF -- must be upper case\n");
2256 fprintf (fp,
"# Should be FULL for computer generated images\n");
2257 fprintf (fp,
"PIXEL FULL\n");
2259 fprintf (fp,
"# means +/- this many pixels for both P and B frame searches\n");
2260 fprintf (fp,
"# specify two numbers if you wish to serc different ranges in the two.\n");
2261 fprintf (fp,
"RANGE 10\n");
2263 fprintf (fp,
"# The two search algorithm parameters below mostly affect speed,\n");
2264 fprintf (fp,
"# with some affect on compression and almost none on quality.\n");
2266 fprintf (fp,
"# this must be one of {EXHAUSTIVE, SUBSAMPLE, LOGARITHMIC}\n");
2267 fprintf (fp,
"PSEARCH_ALG LOGARITHMIC\n");
2269 fprintf (fp,
"# this must be one of {SIMPLE, CROSS2, EXHAUSTIVE}\n");
2271 fprintf (fp,
"# note that EXHAUSTIVE is really, really, really slow\n");
2273 fprintf (fp,
"BSEARCH_ALG SIMPLE\n");
2276 fprintf (fp,
"# these specify the q-scale for I, P, and B frames\n");
2277 fprintf (fp,
"# (values must be between 1 and 31)\n");
2278 fprintf (fp,
"# These are the Qscale values for the entire frame in variable bit-rate\n");
2279 fprintf (fp,
"# mode, and starting points (but not important) for constant bit rate\n");
2282 fprintf (fp,
"# Qscale (Quantization scale) affects quality and compression,\n");
2283 fprintf (fp,
"# but has very little effect on speed.\n");
2285 fprintf (fp,
"IQSCALE 4\n");
2286 fprintf (fp,
"PQSCALE 5\n");
2287 fprintf (fp,
"BQSCALE 12\n");
2289 fprintf (fp,
"# this must be ORIGINAL or DECODED\n");
2290 fprintf (fp,
"REFERENCE_FRAME ORIGINAL\n");
2292 fprintf (fp,
"# for parallel parameters see parallel.param in the exmaples subdirectory\n");
2294 fprintf (fp,
"# if you want constant bit-rate mode, specify it as follows (number is bits/sec):\n");
2295 fprintf (fp,
"#BIT_RATE 1000000\n");
2297 fprintf (fp,
"# To specify the buffer size (327680 is default, measused in bits, for 16bit words)\n");
2298 fprintf (fp,
"BUFFER_SIZE 327680\n");
2300 fprintf (fp,
"# The frame rate is the number of frames/second (legal values:\n");
2301 fprintf (fp,
"# 23.976, 24, 25, 29.97, 30, 50 ,59.94, 60\n");
2302 fprintf (fp,
"FRAME_RATE 30\n");
2304 fprintf (fp,
"# There are many more options, see the users manual for examples....\n");
2305 fprintf (fp,
"# ASPECT_RATIO, USER_DATA, GAMMA, IQTABLE, etc.\n");
2310 setRecordingInfos(
"Parameter file "+fParameterFileName+
" generated in "+fMovieTempFolderPath);
2311 setRecordingStatus(READY_TO_ENCODE);
2315 void G4OpenGLQtViewer::encodeVideo()
2317 if ((getEncoderPath() !=
"") && (getSaveFileName() !=
"")) {
2320 fProcess =
new QProcess();
2321 #if QT_VERSION > 0x040100
2322 QObject ::connect(fProcess,SIGNAL(finished (
int,QProcess::ExitStatus)),
2323 this,SLOT(processEncodeFinished()));
2324 QObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
2325 this,SLOT(processEncodeStdout()));
2327 QObject ::connect(fProcess,SIGNAL(finished (
int)),
2328 this,SLOT(processEncodeFinished()));
2329 QObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
2330 this,SLOT(processEncodeStdout()));
2332 fProcess->setReadChannelMode(QProcess::MergedChannels);
2333 fProcess->start (fEncoderPath, QStringList(fMovieTempFolderPath+fParameterFileName));
2339 void G4OpenGLQtViewer::processEncodeStdout()
2341 QString tmp = fProcess->readAllStandardOutput ().data();
2342 int start = tmp.lastIndexOf(
"ESTIMATED TIME");
2343 tmp = tmp.mid(start,tmp.indexOf(
"\n",start)-start);
2344 setRecordingInfos(tmp);
2348 void G4OpenGLQtViewer::processEncodeFinished()
2352 txt = getProcessErrorMsg();
2354 setRecordingStatus(SUCCESS);
2356 setRecordingStatus(FAILED);
2362 void G4OpenGLQtViewer::processLookForFinished()
2365 QString txt = getProcessErrorMsg();
2369 fEncoderPath = QString(fProcess->readAllStandardOutput ().data()).trimmed();
2371 if (fEncoderPath.contains(
" ")) {
2373 }
else if (!fEncoderPath.contains(
"ppmtompeg")) {
2376 setEncoderPath(fEncoderPath);
2379 setTempFolderPath(QDir::temp ().absolutePath ());
2383 QString G4OpenGLQtViewer::getProcessErrorMsg()
2386 if (fProcess->exitCode() != 0) {
2387 switch (fProcess->error()) {
2388 case QProcess::FailedToStart:
2389 txt =
"The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.\n";
2391 case QProcess::Crashed:
2392 txt =
"The process crashed some time after starting successfully.\n";
2394 case QProcess::Timedout:
2395 txt =
"The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.\n";
2397 case QProcess::WriteError:
2398 txt =
"An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.\n";
2400 case QProcess::ReadError:
2401 txt =
"An error occurred when attempting to read from the process. For example, the process may not be running.\n";
2403 case QProcess::UnknownError:
2404 txt =
"An unknown error occurred. This is the default return value of error().\n";
2414 QWidget *G4OpenGLQtViewer::getParentWidget()
2417 G4Qt* interactorManager = G4Qt::getInstance ();
2422 QDialog* dialog = NULL;
2424 if (((QApplication*)interactorManager->GetMainInteractor())) {
2426 QWidgetList wl = QApplication::allWidgets();
2427 QWidget *widget = NULL;
2428 for (
int i=0; i < wl.size(); i++) {
2430 if ((found==
false) && (widget->inherits(
"QMainWindow"))) {
2431 dialog =
new QDialog(widget,Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
2437 dialog =
new QDialog();
2440 dialog=
new QDialog();
2450 void G4OpenGLQtViewer::createSceneTreeWidget() {
2451 fUISceneTreeWidget = fUiQt->GetSceneTreeWidget();
2453 if (!fUISceneTreeWidget) {
2458 QLayoutItem * wItem;
2460 if (fUISceneTreeWidget->layout()->count() ) {
2461 for(
int idx = 0; idx < fUISceneTreeWidget->layout()->count(); idx++){
2462 wItem = fUISceneTreeWidget->layout()->itemAt(idx);
2463 if (fSceneTreeWidget) {
2464 if(dynamic_cast<QWidget *>(wItem->widget())) {
2465 if (wItem->widget()->windowTitle() == fSceneTreeWidget->windowTitle()) {
2466 wItem->widget()->show();
2469 wItem->widget()->hide();
2473 wItem->widget()->hide();
2480 fSceneTreeWidget =
new QWidget();
2481 QVBoxLayout* layoutSceneTree =
new QVBoxLayout();
2482 fSceneTreeWidget->setStyleSheet (
"padding: 0px ");
2484 fSceneTreeWidget->setLayout(layoutSceneTree);
2485 fSceneTreeWidget->layout()->setContentsMargins(5,5,5,5);
2486 fSceneTreeWidget->setWindowTitle(QString(GetName().
data()));
2488 if (fUISceneTreeWidget != NULL) {
2489 fUISceneTreeWidget->layout()->addWidget(fSceneTreeWidget);
2493 if (dynamic_cast<G4OpenGLStoredQtViewer*> (
this)) {
2494 createSceneTreeComponent();
2500 void G4OpenGLQtViewer::createSceneTreeComponent(){
2502 QLayout* vLayout = fSceneTreeWidget->layout();
2505 QWidget* coutButtonWidget =
new QWidget();
2506 QHBoxLayout* layoutCoutTBButtons =
new QHBoxLayout();
2508 fFilterOutput =
new QLineEdit();
2509 fFilterOutput->setToolTip(
"Filter output by...");
2510 fFilterOutput->setStyleSheet (
"padding: 0px ");
2512 QPixmap* searchIcon = fUiQt->getSearchIcon();
2513 #if QT_VERSION > 0x050100
2514 fFilterOutput->addAction(*searchIcon,QLineEdit::TrailingPosition);
2515 fFilterOutput->setStyleSheet (
"border-radius:7px;");
2517 QPushButton *coutTBFilterButton =
new QPushButton();
2518 coutTBFilterButton->setIcon(*searchIcon);
2519 coutTBFilterButton->setStyleSheet (
"padding-left: 0px; border:0px;");
2520 fFilterOutput->setStyleSheet (
"padding-right: 0px;");
2522 layoutCoutTBButtons->addWidget(fFilterOutput);
2524 #if QT_VERSION <= 0x050100
2525 layoutCoutTBButtons->addWidget(coutTBFilterButton);
2528 coutButtonWidget->setLayout(layoutCoutTBButtons);
2529 vLayout->addWidget(coutButtonWidget);
2532 vLayout->setContentsMargins(0,0,0,0);
2535 fSceneTreeComponentTreeWidget =
new QTreeWidget();
2536 fSceneTreeComponentTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
2537 fSceneTreeComponentTreeWidget->setHeaderLabel (
"Scene tree : "+QString(GetName().
data()));
2538 fSceneTreeComponentTreeWidget->setColumnHidden (1,
true);
2539 fSceneTreeComponentTreeWidget->setColumnHidden (2,
true);
2540 fSceneTreeComponentTreeWidget->setColumnHidden (3,
true);
2545 vLayout->addWidget(fSceneTreeComponentTreeWidget);
2547 connect(fSceneTreeComponentTreeWidget,SIGNAL(itemChanged(QTreeWidgetItem*,
int)),SLOT(sceneTreeComponentItemChanged(QTreeWidgetItem*,
int)));
2548 connect(fSceneTreeComponentTreeWidget,SIGNAL(itemSelectionChanged ()),SLOT(sceneTreeComponentSelected()));
2549 connect(fSceneTreeComponentTreeWidget,SIGNAL(itemDoubleClicked ( QTreeWidgetItem*,
int)),SLOT(changeColorAndTransparency( QTreeWidgetItem*,
int)));
2553 QWidget *helpWidget =
new QWidget();
2554 QHBoxLayout *helpLayout =
new QHBoxLayout();
2556 QWidget* depthWidget =
new QWidget();
2557 QWidget *showBox =
new QWidget(depthWidget);
2558 QHBoxLayout *showBoxLayout =
new QHBoxLayout();
2561 showBoxLayout->setContentsMargins(5,5,5,5);
2563 QLabel *zero =
new QLabel();
2564 zero->setText(
"Show all");
2565 QLabel *one =
new QLabel();
2566 one->setText(
"Hide all");
2567 fSceneTreeDepthSlider =
new QSlider ( Qt::Horizontal);
2568 fSceneTreeDepthSlider->setMaximum (1000);
2569 fSceneTreeDepthSlider->setMinimum (0);
2570 fSceneTreeDepthSlider->setTickPosition(QSlider::TicksAbove);
2572 fSceneTreeDepthSlider->setMinimumWidth (40);
2574 showBoxLayout->addWidget(zero);
2575 showBoxLayout->addWidget(fSceneTreeDepthSlider);
2576 showBoxLayout->addWidget(one);
2578 showBox->setLayout(showBoxLayout);
2580 helpLayout->addWidget(showBox);
2581 helpWidget->setLayout(helpLayout);
2582 helpLayout->setContentsMargins(0,0,0,0);
2584 vLayout->addWidget(helpWidget);
2586 connect( fSceneTreeDepthSlider, SIGNAL( valueChanged(
int) ),
this, SLOT( changeDepthInSceneTree(
int) ) );
2587 connect( fFilterOutput, SIGNAL( textEdited (
const QString &) ),
this, SLOT(changeSearchSelection()));
2588 fTreeItemModels.clear();
2590 fPVRootNodeCreate =
false;
2592 fMaxPOindexInserted = -1;
2598 void G4OpenGLQtViewer::createViewerPropertiesWidget() {
2601 fUIViewerPropertiesWidget = fUiQt->GetViewerPropertiesWidget();
2603 if (!fUIViewerPropertiesWidget) {
2608 QLayoutItem * wItem;
2609 if (fUIViewerPropertiesWidget->layout()->count()) {
2610 while ((wItem = fUIViewerPropertiesWidget->layout()->takeAt(0)) != 0) {
2611 delete wItem->widget();
2617 QGroupBox *groupBox =
new QGroupBox();
2618 groupBox->setTitle(GetName().
data());
2619 QVBoxLayout *vbox =
new QVBoxLayout;
2622 fViewerPropertiesTableWidget =
new QTableWidget();
2624 QSizePolicy vPolicy = fViewerPropertiesTableWidget->sizePolicy();
2625 vPolicy.setVerticalStretch(4);
2627 vbox->addWidget(fViewerPropertiesTableWidget);
2628 groupBox->setLayout(vbox);
2629 fUIViewerPropertiesWidget->layout()->addWidget(groupBox);
2631 connect(fViewerPropertiesTableWidget, SIGNAL(itemChanged(QTableWidgetItem*)),
this, SLOT(tableWidgetViewerSetItemChanged(QTableWidgetItem *)));
2633 updateViewerPropertiesTableWidget();
2635 QDialog* dial =
static_cast<QDialog*
> (fUIViewerPropertiesWidget->parent());
2638 dial->setWindowTitle(QString(
"Viewer properties - ")+GetName());
2643 void G4OpenGLQtViewer::createPickInfosWidget(){
2646 fUIPickInfosWidget = fUiQt->GetPickInfosWidget();
2648 if (!fUIPickInfosWidget) {
2653 QLayoutItem * wItem;
2654 if (fUIPickInfosWidget->layout()->count()) {
2655 while ((wItem = fUIPickInfosWidget->layout()->takeAt(0)) != 0) {
2656 delete wItem->widget();
2661 QGroupBox *groupBox =
new QGroupBox(
"");
2662 QVBoxLayout *vbox =
new QVBoxLayout;
2665 QWidget *pickingInfoWidget =
new QWidget();
2666 QHBoxLayout *pickingInfoLayout =
new QHBoxLayout();
2668 pickingInfoWidget->setStyleSheet (
"padding-left: 0px; border:0px;");
2669 pickingInfoWidget->setLayout(pickingInfoLayout);
2671 vbox->addWidget(pickingInfoWidget);
2674 fPickInfosScrollArea =
new QScrollArea();
2675 fPickInfosScrollArea->setWidgetResizable(
true);
2678 fPickInfosWidget =
new QWidget();
2679 fPickInfosWidget->setStyleSheet (
"padding: 0px ");
2681 QVBoxLayout* vLayout =
new QVBoxLayout();
2682 fPickInfosWidget->setLayout (vLayout);
2683 fPickInfosScrollArea->setWidget(fPickInfosWidget);
2685 QSizePolicy vPolicy = fPickInfosWidget->sizePolicy();
2686 vPolicy.setVerticalStretch(4);
2687 vbox->addWidget(fPickInfosScrollArea);
2688 pickingInfoLayout->setContentsMargins(0,0,0,0);
2689 vLayout->setContentsMargins(0,0,0,0);
2690 vbox->setContentsMargins(1,1,1,1);
2692 groupBox->setLayout(vbox);
2693 fUIPickInfosWidget->layout()->addWidget(groupBox);
2695 updatePickInfosWidget(fLastPickPoint.x(),fLastPickPoint.y());
2701 void G4OpenGLQtViewer::setCheckComponent(QTreeWidgetItem* item,
bool check)
2705 const PVPath& fullPath = fTreeItemModels[item->data(0,Qt::UserRole).toInt()];
2707 if (fullPath.size() > 0) {
2708 SetTouchable(fullPath);
2709 TouchableSetVisibility(fullPath, check);
2710 fMouseOnSceneTree =
true;
2716 item->setCheckState(0,Qt::Checked);
2718 item->setCheckState(0,Qt::Unchecked);
2720 updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
2721 int nChildCount = item->childCount();
2722 for (
int i = 0; i < nChildCount; i++) {
2723 setCheckComponent(item->child(i),check);
2729 void G4OpenGLQtViewer::DrawText(
const G4Text& g4text)
2731 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
2735 if (isGl2psWriting()) {
2737 G4OpenGLViewer::DrawText(g4text);
2741 if (!fGLWidget)
return;
2743 #ifdef G4MULTITHREADED
2748 G4double size = fSceneHandler.GetMarkerSize(g4text,sizeType);
2750 QFont font = QFont();
2751 font.setPointSizeF(size);
2753 const G4Colour& c = fSceneHandler.GetTextColour(g4text);
2759 const char* textCString = textString.c_str();
2761 glRasterPos3d(position.x(),position.y(),position.z());
2764 QFontMetrics* f =
new QFontMetrics (font);
2765 G4double span = f->width(textCString);
2778 ((position.x()+(2*xmove)/getWinWidth()),
2779 (position.y()+(2*ymove)/getWinHeight()),
2788 void G4OpenGLQtViewer::ResetView () {
2789 G4OpenGLViewer::ResetView();
2799 const QString& modelShortName = getModelShortName(model);
2801 if (modelShortName ==
"") {
2805 if (fSceneTreeComponentTreeWidget == NULL) {
2806 createSceneTreeComponent();
2810 if (fSceneTreeComponentTreeWidget == NULL) {
2814 fSceneTreeComponentTreeWidget->blockSignals(
true);
2818 if (!fPVRootNodeCreate) {
2821 fModelShortNameItem = createTreeWidgetItem(pPVModel->
GetFullPVPath(),
2829 fPVRootNodeCreate =
true;
2832 bool added = parseAndInsertInSceneTree(fModelShortNameItem,pPVModel,0,modelShortName,0,currentPOIndex);
2836 fSceneTreeComponentTreeWidget->blockSignals(
false);
2845 QTreeWidgetItem* G4OpenGLQtViewer::createTreeWidgetItem(
2847 ,
const QString& name
2850 ,
const QString& logicalName
2851 ,Qt::CheckState state
2852 ,QTreeWidgetItem * parentTreeNode
2857 if (fullPath.size() > fSceneTreeDepth) {
2858 fSceneTreeDepth = fullPath.size();
2860 if (fSceneTreeDepthSlider) {
2861 fSceneTreeDepthSlider->setTickInterval(1000/(fSceneTreeDepth+1));
2864 QTreeWidgetItem * newItem = NULL;
2865 if (parentTreeNode == NULL) {
2866 newItem =
new QTreeWidgetItem();
2867 fSceneTreeComponentTreeWidget->addTopLevelItem(newItem);
2869 newItem =
new QTreeWidgetItem(parentTreeNode);
2870 fSceneTreeComponentTreeWidget->addTopLevelItem(parentTreeNode);
2874 newItem->setText(0,name);
2875 newItem->setData(1,Qt::UserRole,copyNb);
2876 newItem->setText(2,QString::number(POIndex));
2877 newItem->setData(0, Qt::UserRole, POIndex);
2878 newItem->setText(3,logicalName);
2879 newItem->setFlags(newItem->flags()|Qt::ItemIsUserCheckable);
2880 newItem->setCheckState(0,state);
2881 newItem->setExpanded(
true);
2882 updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,newItem);
2884 changeQColorForTreeWidgetItem(newItem,QColor((
int)(color.
GetRed()*255),
2890 if ((state == Qt::Unchecked) && (POIndex == -1)) {
2891 newItem->setForeground (0, QBrush(
Qt::gray) );
2894 newItem->setToolTip (0,QString(
2895 "This node exists in the geometry but has not been\n")+
2896 "drawn, perhaps because it has been set invisible. It \n"+
2897 "cannot be made visible with a click on the button.\n"+
2898 "To see it, change the visibility, for example, with \n"+
2899 "/vis/geometry/set/visibility " + logicalName +
" 0 true\n"+
2900 "and rebuild the view with /vis/viewer/rebuild.\n"+
2901 "Click here will only show/hide all child components");
2904 newItem->setToolTip (0,QString(
"double-click to change the color"));
2910 state = Qt::Unchecked;
2911 newItem->setCheckState(0,state);
2912 updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,newItem);
2915 fTreeItemModels.insert(std::pair <int, PVPath > (POIndex,fullPath) );
2919 changeOpenCloseVisibleHiddenSelectedColorSceneTreeElement(newItem);
2936 bool G4OpenGLQtViewer::parseAndInsertInSceneTree(
2937 QTreeWidgetItem * parentItem
2939 ,
unsigned int fullPathIndex
2940 ,
const QString& parentRoot
2941 ,
unsigned int currentIndexInTreeSceneHandler
2942 ,
int currentPVPOIndex
2945 if (parentItem == NULL) {
2951 std::ostringstream oss;
2952 oss << fullPath.at(fullPathIndex).GetCopyNo();
2953 std::string currentPVName =
G4String(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetName()+
" ["+oss.str()+
"]").
data();
2955 int currentPVCopyNb = fullPath.at(fullPathIndex).GetCopyNo();
2965 QTreeWidgetItem* subItem = NULL;
2966 QList<QTreeWidgetItem *> parentItemList;
2974 if ((currentIndexInTreeSceneHandler == (fullPath.size()-1)) && ((color.
GetAlpha() == 1.))) {
2976 QString lookForString = QString(currentPVName.c_str());
2977 for (
int i = 0;i < parentItem->childCount(); i++ ) {
2978 if (parentItem->child(i)->text(0) == lookForString) {
2979 parentItemList.push_back(parentItem->child(i));
2984 for (
int i = 0; i < parentItemList.size(); ++i) {
2985 const std::string& parentItemName = parentItemList.at(i)->text(0).toStdString();
2986 int parentItemCopyNb = parentItemList.at(i)->data(1,Qt::UserRole).toInt();
2987 int parentItemPOIndex = parentItemList.at(i)->data(0,Qt::UserRole).toInt();
2995 if (((parentRoot == fTouchableVolumes) && (currentPVCopyNb == parentItemCopyNb)
2996 && (currentPVName == parentItemName)) ||
2998 ((parentRoot != fTouchableVolumes) && (currentPVCopyNb == parentItemCopyNb)
3000 && (currentPVName == parentItemName) && (currentPVPOIndex == parentItemPOIndex) )) {
3003 bool sameTransform =
true;
3004 if (parentItemPOIndex >= 0) {
3005 const PVPath& fullPathTmp = fTreeItemModels[parentItemPOIndex];
3006 if (fullPathTmp.size() > 0) {
3007 if (fullPathTmp.at(fullPathTmp.size()-1).GetTransform () == pPVModel->
GetTransformation ()) {
3008 sameTransform =
true;
3010 sameTransform =
false;
3016 if (sameTransform ==
true) {
3023 if (currentIndexInTreeSceneHandler == (fullPath.size()-1)) {
3025 parentItemList.at(i)->setText(2,QString::number(currentPVPOIndex));
3026 parentItemList.at(i)->setData(0, Qt::UserRole,currentPVPOIndex);
3028 fTreeItemModels.insert(std::pair <int, PVPath >(currentPVPOIndex,fullPath) );
3032 parentItemList.at(i)->setFont (0,f);
3035 parentItemList.at(i)->setForeground (0,QBrush());
3038 parentItemList.at(i)->setToolTip (0,
"");
3040 changeQColorForTreeWidgetItem(parentItemList.at(i),QColor((
int)(color.
GetRed()*255),
3047 parentItemList.at(i)->setCheckState(0,Qt::Checked);
3048 updatePositivePoIndexSceneTreeWidgetQuickMap(currentPVPOIndex,parentItemList.at(i));
3052 subItem = parentItemList.at(i);
3056 }
else if (currentIndexInTreeSceneHandler < (fullPath.size()-1)) {
3057 subItem = parentItemList.at(i);
3064 if (currentIndexInTreeSceneHandler == (fullPath.size()-1)) {
3065 createTreeWidgetItem(fullPath,
3066 QString(currentPVName.c_str()),
3069 QString(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetLogicalVolume()->GetName().data()),
3074 if (currentPVPOIndex > fMaxPOindexInserted) {
3075 fMaxPOindexInserted = currentPVPOIndex;
3081 if (subItem == NULL) {
3083 if (currentIndexInTreeSceneHandler < (fullPath.size()-1)) {
3084 subItem = createTreeWidgetItem(fullPath,
3085 QString(currentPVName.c_str()),
3088 QString(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetLogicalVolume()->GetName().data()),
3095 return parseAndInsertInSceneTree(subItem,pPVModel,fullPathIndex+1,parentRoot,currentIndexInTreeSceneHandler+1,currentPVPOIndex);
3101 void G4OpenGLQtViewer::changeOpenCloseVisibleHiddenSelectedColorSceneTreeElement(
3102 QTreeWidgetItem* subItem
3106 QTreeWidgetItem* oldItem = NULL;
3108 QTreeWidgetItem* foundItem = getOldTreeWidgetItem(subItem->data(0,Qt::UserRole).toInt());
3110 if (foundItem != NULL) {
3111 if (isSameSceneTreeElement(foundItem,subItem)) {
3112 oldItem = foundItem;
3115 if (foundItem == NULL) {
3118 std::map <int, QTreeWidgetItem*>::const_iterator i;
3119 i = fOldPositivePoIndexSceneTreeWidgetQuickMap.begin();
3120 while (i != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3121 if (isSameSceneTreeElement(i->second,subItem)) {
3122 oldItem = i->second;
3123 i = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
3129 if (oldItem == NULL) {
3131 while (a < fOldNullPoIndexSceneTreeWidgetQuickVector.size()) {
3132 if (isSameSceneTreeElement(fOldNullPoIndexSceneTreeWidgetQuickVector[a],subItem)) {
3133 oldItem = fOldNullPoIndexSceneTreeWidgetQuickVector[a];
3134 a = fOldNullPoIndexSceneTreeWidgetQuickVector.size();
3143 if (oldItem != NULL) {
3144 subItem->setFlags(oldItem->flags());
3145 subItem->setCheckState(0,oldItem->checkState(0));
3146 subItem->setSelected(oldItem->isSelected());
3147 subItem->setExpanded(oldItem->isExpanded ());
3152 std::map <int, QTreeWidgetItem* >::iterator it;
3155 int oldPOIndex = oldItem->data(0,Qt::UserRole).toInt();
3156 it = fOldPositivePoIndexSceneTreeWidgetQuickMap.find(oldPOIndex);
3160 std::map <int, QColor >::iterator itVis;
3161 itVis = fOldVisAttrColorMap.find(oldPOIndex);
3163 QColor oldVisAttrColor;
3164 const QColor& newVisAttrColor = subItem->data(2,Qt::UserRole).value<QColor>();
3166 bool visAttrChange =
false;
3168 if (itVis != fOldVisAttrColorMap.end()) {
3169 oldVisAttrColor = itVis->second;
3170 if (oldVisAttrColor != newVisAttrColor) {
3171 visAttrChange =
true;
3174 visAttrChange =
true;
3177 if (visAttrChange) {
3178 fOldVisAttrColorMap.insert(std::pair <int, QColor > (subItem->data(0,Qt::UserRole).toInt(),newVisAttrColor) );
3182 if (it != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3183 color = (it->second)->
data(2,Qt::UserRole).value<QColor>();
3185 color = oldItem->data(2,Qt::UserRole).value<QColor>();
3187 changeQColorForTreeWidgetItem(subItem,color);
3199 bool G4OpenGLQtViewer::isSameSceneTreeElement(
3200 QTreeWidgetItem* parentOldItem
3201 ,QTreeWidgetItem* parentNewItem
3207 int newCpNumber = -1;
3208 int oldCpNumber = -1;
3210 bool firstWhile =
true;
3212 while ((parentOldItem != NULL) && (parentNewItem != NULL)) {
3216 oldPO = parentOldItem->data(0,Qt::UserRole).toInt();
3217 newPO = parentNewItem->data(0,Qt::UserRole).toInt();
3223 const PVPath& oldFullPath = fOldTreeItemModels[oldPO];
3224 const PVPath& newFullPath = fTreeItemModels[newPO];
3225 if ((oldFullPath.size() > 0) &&
3226 (newFullPath.size() > 0)) {
3227 if (oldFullPath.size() != newFullPath.size()) {
3230 if (oldFullPath.at(oldFullPath.size()-1).GetTransform () == newFullPath.at(newFullPath.size()-1).GetTransform ()) {
3231 newCpNumber = newFullPath.at(newFullPath.size()-1).GetCopyNo();
3232 oldCpNumber = oldFullPath.at(oldFullPath.size()-1).GetCopyNo();
3241 if (oldCpNumber == -1) {
3242 oldCpNumber = parentOldItem->data(1,Qt::UserRole).toInt();
3244 if (newCpNumber == -1) {
3245 newCpNumber = parentNewItem->data(1,Qt::UserRole).toInt();
3247 if ((oldCpNumber != newCpNumber) ||
3249 (parentOldItem->text(0) != parentNewItem->text(0)) ) {
3252 }
else if ((parentOldItem->text(0) != parentNewItem->text(0)) ||
3253 (parentOldItem->text(3) != parentNewItem->text(3))) {
3256 parentOldItem = parentOldItem->parent();
3257 parentNewItem = parentNewItem->parent();
3265 void G4OpenGLQtViewer::addNonPVSceneTreeElement(
3268 ,
const std::string& modelDescription
3272 QString modelShortName = getModelShortName(model);
3277 const G4Text& g4Text =
dynamic_cast<const G4Text&
>(visible);
3278 color = fSceneHandler.GetTextColour(g4Text);
3280 catch (std::bad_cast) {
3283 if (modelShortName ==
"") {
3287 if (fSceneTreeComponentTreeWidget == NULL) {
3288 createSceneTreeComponent();
3292 if (fSceneTreeComponentTreeWidget == NULL) {
3296 fSceneTreeComponentTreeWidget->blockSignals(
true);
3300 QList<QTreeWidgetItem *> resItem;
3301 resItem = fSceneTreeComponentTreeWidget->findItems (modelShortName, Qt::MatchExactly, 0 );
3302 QTreeWidgetItem * currentItem = NULL;
3303 const PVPath tmpFullPath;
3305 if (resItem.empty()) {
3306 currentItem = createTreeWidgetItem(tmpFullPath,
3315 currentItem = resItem.first();
3319 const QList<QTreeWidgetItem *>&
3320 resItems = fSceneTreeComponentTreeWidget->findItems (QString(modelDescription.c_str()), Qt::MatchFixedString| Qt::MatchCaseSensitive|Qt::MatchRecursive, 0 );
3322 bool alreadyPresent =
false;
3323 for (
int i = 0; i < resItems.size(); ++i) {
3324 if (currentPOIndex == resItems.at(i)->data(0,Qt::UserRole).toInt()) {
3325 alreadyPresent =
true;
3328 if (!alreadyPresent) {
3329 createTreeWidgetItem(tmpFullPath,
3330 QString(modelDescription.c_str()),
3338 fSceneTreeComponentTreeWidget->blockSignals(
false);
3346 QString G4OpenGLQtViewer::getModelShortName(
const G4String& model) {
3348 QString modelShortName = model.
data();
3349 if (modelShortName.mid(0,modelShortName.indexOf(
" ")) ==
"G4PhysicalVolumeModel") {
3350 modelShortName = fTouchableVolumes;
3352 if (modelShortName.mid(0,2) ==
"G4") {
3353 modelShortName = modelShortName.mid(2);
3355 if (modelShortName.indexOf(
"Model") != -1) {
3356 modelShortName = modelShortName.mid(0,modelShortName.indexOf(
"Model"));
3359 return modelShortName;
3364 bool G4OpenGLQtViewer::isTouchableVisible(
int POindex){
3367 if (fSceneTreeComponentTreeWidget == NULL) {
3373 if (fLastSceneTreeWidgetAskForIterator != fLastSceneTreeWidgetAskForIteratorEnd) {
3374 fLastSceneTreeWidgetAskForIterator++;
3376 QTreeWidgetItem* item = getTreeWidgetItem(POindex);
3379 if ( item->checkState(0) == Qt::Checked) {
3387 bool G4OpenGLQtViewer::parseAndCheckVisibility(QTreeWidgetItem * treeNode,
int POindex){
3388 bool isFound =
false;
3389 for (
int i = 0; i < treeNode->childCount() ; ++i) {
3391 if (treeNode->child(i)->data(0,Qt::UserRole).toInt() == POindex) {
3392 if (treeNode->child(i)->checkState(0) == Qt::Checked) {
3396 isFound = parseAndCheckVisibility(treeNode->child(i),POindex);
3405 std::string G4OpenGLQtViewer::parseSceneTreeAndSaveState(){
3406 std::string commandLine =
"";
3407 for (
int b=0;b<fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3408 commandLine += parseSceneTreeElementAndSaveState(fSceneTreeComponentTreeWidget->topLevelItem(b),1)+
"\n";
3410 if (commandLine !=
"") {
3411 commandLine = std::string(
"# Disable auto refresh and quieten vis messages whilst scene and\n") +
3412 "# trajectories are established:\n" +
3413 "/vis/viewer/set/autoRefresh false\n" +
3414 "/vis/verbose errors" +
3416 "# Re-establish auto refreshing and verbosity:\n" +
3417 "/vis/viewer/set/autoRefresh true\n" +
3418 "/vis/verbose confirmations\n";
3424 std::string G4OpenGLQtViewer::parseSceneTreeElementAndSaveState(QTreeWidgetItem* item,
unsigned int level){
3426 std::string str( level,
' ' );
3427 std::string commandLine =
"\n#"+ str +
"PV Name: " + item->text(0).toStdString();
3429 if (item->text(3) !=
"") {
3430 commandLine +=
" LV Name: "+item->text(3).toStdString()+
"\n";
3432 commandLine +=
"/vis/geometry/set/visibility " + item->text(3).toStdString() +
" ! ";
3433 if (item->checkState(0) == Qt::Checked) {
3436 if (item->checkState(0) == Qt::Unchecked) {
3442 const QColor& c = item->data(2,Qt::UserRole).value<QColor>();
3443 std::stringstream red;
3444 red << ((double)c.red())/255;
3445 std::stringstream green;
3446 green << (double)c.green()/255;
3447 std::stringstream blue;
3448 blue << ((double)c.blue())/255;
3449 std::stringstream
alpha;
3450 alpha << ((double)c.alpha())/255;
3452 commandLine +=
"/vis/geometry/set/colour " + item->text(3).toStdString() +
" ! " + red.str() +
" " + green.str() +
" " + blue.str() +
" " + alpha.str()+
"\n";
3455 commandLine +=
"\n";
3459 for (
int b=0;b< item->childCount();b++) {
3460 commandLine += parseSceneTreeElementAndSaveState(item->child(b),level+1);
3467 void G4OpenGLQtViewer::sceneTreeComponentItemChanged(QTreeWidgetItem* item,
int) {
3469 if (fCheckSceneTreeComponentSignalLock ==
false) {
3470 fCheckSceneTreeComponentSignalLock =
true;
3472 if (item->checkState(0) == Qt::Checked) {
3475 setCheckComponent(item,checked);
3478 fCheckSceneTreeComponentSignalLock =
false;
3483 void G4OpenGLQtViewer::sceneTreeComponentSelected() {
3486 void G4OpenGLQtViewer::changeDepthInSceneTree (
int val){
3489 if (fSceneTreeComponentTreeWidget == NULL) {
3500 double depth = 1 + ((double)val)/1000 * ((double)fSceneTreeDepth+1);
3503 fCheckSceneTreeComponentSignalLock =
true;
3506 G4bool currentAutoRefresh = fVP.IsAutoRefresh();
3507 fVP.SetAutoRefresh(
false);
3509 for (
int b=0;b<fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3510 changeDepthOnSceneTreeItem(depth,1.,fSceneTreeComponentTreeWidget->topLevelItem(b));
3514 fVP.SetAutoRefresh(currentAutoRefresh);
3518 fCheckSceneTreeComponentSignalLock =
false;
3523 void G4OpenGLQtViewer::changeColorAndTransparency(QTreeWidgetItem* item,
int) {
3528 const QColor& old = QColor(item->data(2,Qt::UserRole).value<QColor>());
3530 #if QT_VERSION < 0x040500
3532 const QColor& color = QColor(QColorDialog::getRgba (old.rgba(),&a,fSceneTreeComponentTreeWidget));
3534 const QColor& color = QColorDialog::getColor(old,
3535 fSceneTreeComponentTreeWidget,
3536 " Get color and transparency",
3537 QColorDialog::ShowAlphaChannel);
3540 if (color.isValid()) {
3542 changeColorAndTransparency(item->data(0,Qt::UserRole).toInt(),
3549 changeQColorForTreeWidgetItem(item,color);
3554 void G4OpenGLQtViewer::changeColorAndTransparency(GLuint index,
G4Color color) {
3558 if (iPO >= 0 && fTreeItemModels.find(iPO) != fTreeItemModels.end()) {
3559 const PVPath& fullPath = fTreeItemModels[iPO];
3561 if (fullPath.size()) {
3562 SetTouchable(fullPath);
3563 TouchableSetColour(fullPath, color);
3564 fMouseOnSceneTree =
true;
3570 G4Colour G4OpenGLQtViewer::getColorForPoIndex(
int poIndex) {
3572 QTreeWidgetItem* item = getTreeWidgetItem(poIndex);
3576 const QColor& color = item->data(2,Qt::UserRole).value<QColor>();
3589 G4OpenGLQtViewer::GetPrivateVisAttributesModifiers()
const
3591 static std::vector<G4ModelingParameters::VisAttributesModifier>
3592 privateVisAttributesModifiers;
3594 privateVisAttributesModifiers.clear();
3647 return &privateVisAttributesModifiers;
3651 void G4OpenGLQtViewer::changeSearchSelection()
3653 const QString& searchText = fFilterOutput->text();
3654 if (fSceneTreeComponentTreeWidget == NULL) {
3659 for (
int a=0; a<fSceneTreeComponentTreeWidget->topLevelItemCount(); a++) {
3660 fSceneTreeComponentTreeWidget->topLevelItem(a)->setExpanded(
false);
3661 fSceneTreeComponentTreeWidget->topLevelItem(a)->setSelected(
false);
3662 clearSceneTreeSelection(fSceneTreeComponentTreeWidget->topLevelItem(a));
3665 QList<QTreeWidgetItem *> itemList = fSceneTreeComponentTreeWidget->findItems (searchText,Qt::MatchContains | Qt::MatchRecursive,0);
3667 for (
int i = 0; i < itemList.size(); ++i) {
3668 QTreeWidgetItem* expandParentItem = itemList.at(i);
3669 while (expandParentItem->parent() != NULL) {
3670 expandParentItem->parent()->setExpanded(
true);
3671 expandParentItem = expandParentItem->parent();
3673 itemList.at(i)->setSelected(
true);
3679 void G4OpenGLQtViewer::clearSceneTreeSelection(QTreeWidgetItem* item) {
3680 for (
int a=0; a<item->childCount(); a++) {
3681 item->child(a)->setSelected(
false);
3682 item->child(a)->setExpanded(
false);
3683 clearSceneTreeSelection(item->child(a));
3689 bool G4OpenGLQtViewer::isPVVolume(QTreeWidgetItem* item) {
3690 QTreeWidgetItem* sParent = item;
3691 while (sParent->parent() != NULL) {
3692 sParent = sParent->parent();
3694 if (sParent->text(0) != fTouchableVolumes) {
3698 if (item->text(0) == fTouchableVolumes) {
3705 void G4OpenGLQtViewer::changeDepthOnSceneTreeItem(
3707 ,
double currentDepth
3708 ,QTreeWidgetItem* item
3710 double transparencyLevel = 0.;
3715 if (isPVVolume(item)) {
3716 if ((lookForDepth-currentDepth) < 0) {
3717 item->setCheckState(0,Qt::Checked);
3718 updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3719 transparencyLevel = 1;
3720 }
else if ((lookForDepth-currentDepth) > 1 ){
3721 item->setCheckState(0,Qt::Unchecked);
3722 updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3723 transparencyLevel = 0;
3725 item->setCheckState(0,Qt::Checked);
3726 updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3727 transparencyLevel = 1-(lookForDepth-currentDepth);
3731 if (item->data(0,Qt::UserRole).toInt() >= 0) {
3732 const G4Colour& color = getColorForPoIndex(item->data(0,Qt::UserRole).toInt());
3744 if (((color.
GetAlpha()-transparencyLevel) > 0.000001) ||
3745 ((color.
GetAlpha()-transparencyLevel) < -0.000001)) {
3746 if ((item->text(3) !=
"")) {
3752 changeQColorForTreeWidgetItem(item,QColor((
int)(color.
GetRed()*255),
3755 (
int)(transparencyLevel*255)));
3760 for (
int b=0;b< item->childCount();b++) {
3761 changeDepthOnSceneTreeItem(lookForDepth,currentDepth+1,item->child(b));
3766 void G4OpenGLQtViewer::clearTreeWidget(){
3769 if (fSceneTreeComponentTreeWidget) {
3771 if (fSceneTreeComponentTreeWidget->topLevelItemCount () > 0) {
3773 fPVRootNodeCreate =
false;
3776 fOldPositivePoIndexSceneTreeWidgetQuickMap.clear();
3777 fOldNullPoIndexSceneTreeWidgetQuickVector.clear();
3778 fOldTreeItemModels.clear();
3781 for (
int b =0; b <fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3790 int poIndex = fSceneTreeComponentTreeWidget->topLevelItem(b)->data(0,Qt::UserRole).toInt();
3791 if (poIndex != -1) {
3792 fOldPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (poIndex,cloneWidgetItem(fSceneTreeComponentTreeWidget->topLevelItem(b))));
3794 fOldNullPoIndexSceneTreeWidgetQuickVector.push_back(cloneWidgetItem(fSceneTreeComponentTreeWidget->topLevelItem(b)));
3798 cloneSceneTree(fSceneTreeComponentTreeWidget->topLevelItem(b));
3802 fOldTreeItemModels.insert(fTreeItemModels.begin(), fTreeItemModels.end());
3805 int tmp2 = fSceneTreeComponentTreeWidget->topLevelItemCount();
3807 delete fSceneTreeComponentTreeWidget->takeTopLevelItem (0);
3808 tmp2 = fSceneTreeComponentTreeWidget->topLevelItemCount();
3810 fPositivePoIndexSceneTreeWidgetQuickMap.clear();
3813 fOldLastSceneTreeWidgetAskForIterator = fOldPositivePoIndexSceneTreeWidgetQuickMap.begin();
3814 fOldLastSceneTreeWidgetAskForIteratorEnd = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
3815 fSceneTreeDepth = 1;
3816 fModelShortNameItem = NULL;
3817 fMaxPOindexInserted = -1;
3830 QTreeWidgetItem * G4OpenGLQtViewer::cloneWidgetItem(QTreeWidgetItem* item) {
3832 QTreeWidgetItem* cloneItem =
new QTreeWidgetItem();
3836 cloneItem->setText(0,item->text(0));
3837 cloneItem->setData(1,Qt::UserRole,item->data(1,Qt::UserRole).toInt());
3838 cloneItem->setText(2,item->text(2));
3839 cloneItem->setData(0, Qt::UserRole,item->data(0,Qt::UserRole).toInt());
3840 cloneItem->setText(3,item->text(3));
3841 cloneItem->setFlags(item->flags());
3842 cloneItem->setToolTip(0,item->toolTip(0));
3843 cloneItem->setCheckState(0,item->checkState(0));
3844 cloneItem->setSelected(item->isSelected());
3845 cloneItem->setExpanded(item->isExpanded ());
3847 cloneItem->setData(2,Qt::UserRole,item->data(2,Qt::UserRole).value<QColor>());
3856 void G4OpenGLQtViewer::cloneSceneTree(
3857 QTreeWidgetItem* rootItem
3860 for (
int b=0;b< rootItem->childCount();b++) {
3862 QTreeWidgetItem *child = rootItem->child(b);
3865 int poIndex = child->data(0,Qt::UserRole).toInt();
3866 if (poIndex != -1) {
3867 fOldPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (poIndex,cloneWidgetItem(child)));
3869 fOldNullPoIndexSceneTreeWidgetQuickVector.push_back(cloneWidgetItem(child));
3871 cloneSceneTree(child);
3879 void G4OpenGLQtViewer::updatePositivePoIndexSceneTreeWidgetQuickMap(
int POindex,QTreeWidgetItem* item) {
3882 std::map <int, QTreeWidgetItem*>::iterator i;
3883 i = fPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
3885 if (i == fPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3886 fPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (POindex,item) );
3887 fLastSceneTreeWidgetAskForIterator = fPositivePoIndexSceneTreeWidgetQuickMap.end();
3888 fLastSceneTreeWidgetAskForIteratorEnd = fPositivePoIndexSceneTreeWidgetQuickMap.end();
3896 void G4OpenGLQtViewer::changeQColorForTreeWidgetItem(QTreeWidgetItem* item,
const QColor& qc) {
3898 int POIndex = item->data(0,Qt::UserRole).toInt();
3899 updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,item );
3901 QPixmap pixmap = QPixmap(QSize(16, 16));
3902 if (item->data(0,Qt::UserRole).toInt() != -1) {
3905 pixmap.fill (QColor(255,255,255,255));
3907 QPainter painter(&pixmap);
3908 painter.setPen(Qt::black);
3909 painter.drawRect(0,0,15,15);
3911 item->setIcon(0,pixmap);
3912 item->setData(2,Qt::UserRole,qc);
3921 QTreeWidgetItem* G4OpenGLQtViewer::getTreeWidgetItem(
int POindex){
3924 if (POindex == -1) {
3928 if (fPositivePoIndexSceneTreeWidgetQuickMap.size() == 0){
3932 if (fLastSceneTreeWidgetAskForIterator != fLastSceneTreeWidgetAskForIteratorEnd) {
3933 if (POindex == fLastSceneTreeWidgetAskForIterator->first) {
3934 if (fLastSceneTreeWidgetAskForIterator->second != NULL) {
3935 return fLastSceneTreeWidgetAskForIterator->second;
3941 fLastSceneTreeWidgetAskForIterator = fPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
3942 fLastSceneTreeWidgetAskForIteratorEnd = fPositivePoIndexSceneTreeWidgetQuickMap.end();
3944 if (fLastSceneTreeWidgetAskForIterator != fPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3945 return fLastSceneTreeWidgetAskForIterator->second;
3954 QTreeWidgetItem* G4OpenGLQtViewer::getOldTreeWidgetItem(
int POindex){
3958 if (POindex == -1) {
3962 if (fOldPositivePoIndexSceneTreeWidgetQuickMap.size() == 0){
3968 if (fOldLastSceneTreeWidgetAskForIterator != fOldLastSceneTreeWidgetAskForIteratorEnd) {
3969 fOldLastSceneTreeWidgetAskForIterator++;
3972 if (fOldLastSceneTreeWidgetAskForIterator != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3973 if (POindex == fOldLastSceneTreeWidgetAskForIterator->first) {
3974 if (fOldLastSceneTreeWidgetAskForIterator->second != NULL) {
3975 return fOldLastSceneTreeWidgetAskForIterator->second;
3981 fOldLastSceneTreeWidgetAskForIterator = fOldPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
3982 fOldLastSceneTreeWidgetAskForIteratorEnd = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
3984 if (fOldLastSceneTreeWidgetAskForIterator != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3985 return fOldLastSceneTreeWidgetAskForIterator->second;
3996 void G4OpenGLQtViewer::displaySceneTreeComponent() {
3998 if (fUISceneTreeWidget == NULL) {
4001 if (fSceneTreeComponentTreeWidget == NULL) {
4006 fSceneTreeComponentTreeWidget->sortItems (0, Qt::AscendingOrder );
4018 void G4OpenGLQtViewer::updateToolbarAndMouseContextMenu(){
4024 d_style = fVP.GetDrawingStyle();
4028 if (fUiQt) fUiQt->SetIconWireframeSelected();
4030 fDrawingWireframe->setChecked(
true);
4031 fDrawingLineRemoval->setChecked(
false);
4032 fDrawingSurfaceRemoval->setChecked(
false);
4033 fDrawingLineSurfaceRemoval->setChecked(
false);
4036 if (fUiQt) fUiQt->SetIconHLRSelected();
4038 fDrawingLineRemoval->setChecked(
true);
4039 fDrawingWireframe->setChecked(
false);
4040 fDrawingSurfaceRemoval->setChecked(
false);
4041 fDrawingLineSurfaceRemoval->setChecked(
false);
4044 if (fUiQt) fUiQt->SetIconSolidSelected();
4046 fDrawingSurfaceRemoval->setChecked(
true);
4047 fDrawingWireframe->setChecked(
false);
4048 fDrawingLineRemoval->setChecked(
false);
4049 fDrawingLineSurfaceRemoval->setChecked(
false);
4052 if (fUiQt) fUiQt->SetIconHLHSRSelected();
4054 fDrawingLineSurfaceRemoval->setChecked(
true);
4055 fDrawingWireframe->setChecked(
false);
4056 fDrawingLineRemoval->setChecked(
false);
4057 fDrawingSurfaceRemoval->setChecked(
false);
4058 fDrawingLineSurfaceRemoval->setChecked(
false);
4064 G4double d_proj = fVP.GetFieldHalfAngle () ;
4066 if (fUiQt) fUiQt->SetIconOrthoSelected();
4068 fProjectionOrtho->setChecked(
true);
4069 fProjectionPerspective->setChecked(
false);
4072 if (fUiQt) fUiQt->SetIconPerspectiveSelected();
4074 fProjectionPerspective->setChecked(
true);
4075 fProjectionOrtho->setChecked(
false);
4081 if (fUiQt && fContextMenu) {
4082 if (fUiQt->IsIconPickSelected()) {
4083 fMousePickAction->setChecked(
true);
4084 fMouseZoomOutAction->setChecked(
false);
4085 fMouseZoomInAction->setChecked(
false);
4086 fMouseRotateAction->setChecked(
false);
4087 fMouseMoveAction->setChecked(
false);
4088 }
else if (fUiQt->IsIconZoomOutSelected()) {
4089 fMouseZoomOutAction->setChecked(
true);
4090 fMousePickAction->setChecked(
false);
4091 fMouseZoomInAction->setChecked(
false);
4092 fMouseRotateAction->setChecked(
false);
4093 fMouseMoveAction->setChecked(
false);
4094 }
else if (fUiQt->IsIconZoomInSelected()) {
4095 fMouseZoomInAction->setChecked(
true);
4096 fMousePickAction->setChecked(
false);
4097 fMouseZoomOutAction->setChecked(
false);
4098 fMouseRotateAction->setChecked(
false);
4099 fMouseMoveAction->setChecked(
false);
4100 }
else if (fUiQt->IsIconRotateSelected()) {
4101 fMouseRotateAction->setChecked(
true);
4102 fMousePickAction->setChecked(
false);
4103 fMouseZoomOutAction->setChecked(
false);
4104 fMouseZoomInAction->setChecked(
false);
4105 fMouseMoveAction->setChecked(
false);
4106 }
else if (fUiQt->IsIconMoveSelected()) {
4107 fMouseMoveAction->setChecked(
true);
4108 fMousePickAction->setChecked(
false);
4109 fMouseZoomOutAction->setChecked(
false);
4110 fMouseZoomInAction->setChecked(
false);
4111 fMouseRotateAction->setChecked(
false);
4119 void G4OpenGLQtViewer::updateSceneTreeWidget() {
4121 if (!fSceneTreeWidget) {
4122 createSceneTreeWidget();
4131 void G4OpenGLQtViewer::updateViewerPropertiesTableWidget() {
4133 if (!isCurrentWidget()) {
4138 if (!fViewerPropertiesTableWidget) {
4139 createViewerPropertiesWidget();
4141 int treeWidgetInfosIgnoredCommands = 0;
4151 if ((path->
GetCommandEntry()-fTreeWidgetInfosIgnoredCommands) != fViewerPropertiesTableWidget->rowCount()) {
4152 fViewerPropertiesTableWidget->clear();
4155 fViewerPropertiesTableWidget->blockSignals(
true);
4158 fViewerPropertiesTableWidget->setColumnCount (2);
4159 fViewerPropertiesTableWidget->setRowCount (path->
GetCommandEntry()-fTreeWidgetInfosIgnoredCommands);
4160 fViewerPropertiesTableWidget->setHorizontalHeaderLabels(QStringList() << tr(
"Property")
4162 fViewerPropertiesTableWidget->verticalHeader()->setVisible(
false);
4163 fViewerPropertiesTableWidget->setAlternatingRowColors (
true);
4171 QString params =
"";
4174 if (fVP.IsAutoRefresh()) {
4180 if (fVP.IsAuxEdgeVisible()) {
4186 params = QString().number(fVP.GetBackgroundColour().GetRed()) +
" "+
4187 QString().number(fVP.GetBackgroundColour().GetGreen()) +
" "+
4188 QString().number(fVP.GetBackgroundColour().GetBlue()) +
" "+
4189 QString().number(fVP.GetBackgroundColour().GetAlpha());
4192 params = QString().number(fVP. IsCulling ());
4197 params =
"intersection";
4201 params = QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetRed()) +
" "+
4202 QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetGreen()) +
" "+
4203 QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetBlue()) +
" "+
4204 QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetAlpha());
4207 params = QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetRed()) +
" "+
4208 QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetGreen()) +
" "+
4209 QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetBlue()) +
" "+
4210 QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetAlpha());
4220 params = QString().number(fVP.GetExplodeFactor()) +
" " + QString(
G4String(
G4BestUnit(fVP.GetExplodeFactor(),
"Length")).
data());
4222 }
else if(commandTmp->
GetCommandName() ==
"globalLineWidthScale") {
4223 params = QString().number(fVP.GetGlobalLineWidthScale());
4226 params = QString().number(fVP.GetGlobalMarkerScale());
4238 if (fVP.IsMarkerNotHidden()) {
4245 if (fVP.GetLightsMoveWithCamera()) {
4251 G4Vector3D direction = fVP.GetLightpointDirection();
4260 params = QString().number(fVP.GetLightpointDirection().x()) +
" "+
4261 QString().number(fVP.GetLightpointDirection().y()) +
" "+
4262 QString().number(fVP.GetLightpointDirection().z());
4264 }
else if(commandTmp->
GetCommandName() ==
"lineSegmentsPerCircle") {
4265 params = QString().number(fVP.GetNoOfSides());
4268 if (fVP.IsPicking()) {
4275 if (fVP.GetFieldHalfAngle() == 0.) {
4276 params =
"orthogonal";
4278 params = QString(
"perspective ") + QString().number(fVP.GetFieldHalfAngle()/
CLHEP::degree) +
" deg";
4283 params =
"constrainUpDirection";
4285 params =
"freeRotation";
4289 if (fVP.IsSection()) {
4290 params = QString(
"on ") +
4292 QString().number(fVP.GetSectionPlane().normal().x())
4293 +
" " + QString().number(fVP.GetSectionPlane().normal().y())
4294 +
" " + QString().number(fVP.GetSectionPlane().normal().z());
4301 params =
"wireframe";
4308 G4Point3D point = fVP.GetCurrentTargetPoint();
4309 if (fSceneHandler.GetScene()) {
4310 G4String b =
G4BestUnit(fSceneHandler.GetScene()->GetStandardTargetPoint() + fVP.GetCurrentTargetPoint(),
"Length");
4324 params = QString().number(up.
x())+
" "+ QString().number(up.
y())+
" "+QString().number(up.
z())+
" ";
4327 G4Vector3D direction = fVP.GetViewpointDirection();
4336 G4Vector3D direction = fVP.GetViewpointDirection();
4337 params = QString().number(direction.
x())+
" "+ QString().number(direction.
y())+
" "+QString().number(direction.
z());
4367 QTableWidgetItem *nameItem;
4368 QTableWidgetItem *paramItem;
4371 QList<QTableWidgetItem *> list = fViewerPropertiesTableWidget->findItems (commandTmp->
GetCommandName().
data(),Qt::MatchExactly);
4372 if (list.size() == 1) {
4373 nameItem = list.first();
4374 paramItem = fViewerPropertiesTableWidget->item(nameItem->row(),1);
4377 nameItem =
new QTableWidgetItem();
4378 paramItem =
new QTableWidgetItem();
4379 fViewerPropertiesTableWidget->setItem(a-treeWidgetInfosIgnoredCommands, 0, nameItem);
4380 fViewerPropertiesTableWidget->setItem(a-treeWidgetInfosIgnoredCommands, 1, paramItem);
4385 for(
G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
4389 nameItem->setToolTip(guidance);
4390 paramItem->setToolTip(GetCommandParameterList(commandTmp));
4392 fViewerPropertiesTableWidget->setRowHeight(a-treeWidgetInfosIgnoredCommands,15);
4397 paramItem->setText(params);
4399 nameItem->setFlags(Qt::NoItemFlags);
4400 nameItem->setForeground(QBrush());
4403 treeWidgetInfosIgnoredCommands++;
4407 for (
int i=0; i<treeWidgetInfosIgnoredCommands; i++) {
4408 fViewerPropertiesTableWidget->removeRow (fViewerPropertiesTableWidget->rowCount() - 1);
4412 if (!fViewerPropertiesTableWidgetIsInit) {
4413 fViewerPropertiesTableWidgetIsInit =
true;
4415 fViewerPropertiesTableWidget->resizeColumnsToContents();
4417 int x = fViewerPropertiesTableWidget->horizontalHeader()->length();
4418 int y = fViewerPropertiesTableWidget->verticalHeader()->length()+ fViewerPropertiesTableWidget->horizontalHeader()->sizeHint().height() + 2;
4424 QDialog* dial =
static_cast<QDialog*
> (fUIViewerPropertiesWidget->parent());
4426 dial->resize(x+56,y+46);
4429 fViewerPropertiesTableWidget->blockSignals(
false);
4431 fTreeWidgetInfosIgnoredCommands = treeWidgetInfosIgnoredCommands;
4438 void G4OpenGLQtViewer::updatePickInfosWidget(
int aX,
int aY) {
4439 fLastPickPoint = QPoint(aX,aY);
4441 if (!isCurrentWidget()) {
4445 if (!fPickInfosWidget) {
4446 createPickInfosWidget();
4449 std::vector < G4OpenGLViewerPickMap* > pickMap = GetPickDetails(aX,aY);
4452 if (fPickInfosWidget) {
4453 QLayoutItem * wItem;
4454 if (fPickInfosWidget->layout()->count()) {
4455 while ((wItem = fPickInfosWidget->layout()->takeAt(0)) != 0) {
4456 delete wItem->widget();
4462 if (!fPickInfosWidget) {
4463 createPickInfosWidget();
4468 delete fSignalMapperPicking;
4469 fSignalMapperPicking =
new QSignalMapper(
this);
4472 for (
unsigned int a=0; a< pickMap.size(); a++) {
4474 std::ostringstream label;
4475 label <<
"Hit number:" << a <<
", PickName: " << pickMap[a]->getPickName();
4477 QPushButton* pickCoutButton =
new QPushButton(label.str().c_str());
4478 pickCoutButton->setStyleSheet (
"text-align: left; padding: 1px; border: 0px;");
4479 pickCoutButton->setIcon(*fTreeIconClosed);
4480 fPickInfosWidget->layout()->addWidget(pickCoutButton);
4485 newStr = QStringList(QString(pickMap[a]->
print().
data()).trimmed());
4487 QTextEdit* ed =
new QTextEdit();
4488 ed->setFontFamily(
"Courier");
4489 ed->setFontPointSize(12);
4490 ed->setReadOnly(
true);
4491 fPickInfosWidget->layout()->addWidget(ed);
4492 ed->setVisible((
false));
4493 ed->append(newStr.join(
""));
4495 connect(pickCoutButton, SIGNAL(clicked()), fSignalMapperPicking, SLOT(map()));
4496 fSignalMapperPicking->setMapping(pickCoutButton,fPickInfosWidget->layout()->count()-1);
4499 connect(fSignalMapperPicking, SIGNAL(mapped(
int)),
this, SLOT(toggleSceneTreeComponentPickingCout(
int)));
4502 QLabel * pushUp =
new QLabel(
"");
4503 QSizePolicy vPolicy = QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
4504 vPolicy.setVerticalStretch(10);
4505 pushUp->setSizePolicy(vPolicy);
4506 fPickInfosWidget->layout()->addWidget(pushUp);
4511 changeColorAndTransparency(fLastHighlightName,fLastHighlightColor);
4513 if (pickMap.size() > 0 ) {
4515 fLastHighlightName = pickMap[0]->getPickName();
4516 fLastHighlightColor = getColorForPoIndex(fLastHighlightName);
4518 changeColorAndTransparency(fLastHighlightName,
G4Color(1,1,1,1));
4522 QDialog* dial =
static_cast<QDialog*
> (fUIPickInfosWidget->parent());
4525 if (pickMap.size() == 0) {
4526 dial->setWindowTitle(QString(
"No object selected - ")+GetName());
4527 }
else if (pickMap.size() == 1) {
4528 dial->setWindowTitle(QString(
"1 object selected - ")+GetName());
4530 dial->setWindowTitle(QString::number(pickMap.size())+
" objects selected - "+GetName());
4534 fPickInfosScrollArea->setVisible(
true);
4538 void G4OpenGLQtViewer::toggleSceneTreeComponentPickingCout(
int pickItem) {
4543 for (
int a=0; a<fPickInfosWidget->layout()->count(); a++) {
4544 w = fPickInfosWidget->layout()->itemAt(a)->widget();
4545 QTextEdit* ed =
dynamic_cast<QTextEdit*
>(w);
4546 QPushButton* button;
4548 if (a == pickItem) {
4549 w->setVisible(!w->isVisible());
4551 w->setVisible(
false);
4554 button =
dynamic_cast<QPushButton*
>(fPickInfosWidget->layout()->itemAt(a-1)->widget());
4556 if (button->isVisible()) {
4557 button->setIcon(*fTreeIconOpen);
4559 button->setIcon(*fTreeIconClosed);
4568 void G4OpenGLQtViewer::currentTabActivated(
int currentTab) {
4569 if (fUiQt->GetViewerTabWidget()->tabText(currentTab) == GetName()) {
4570 createViewerPropertiesWidget();
4571 createPickInfosWidget();
4572 createSceneTreeWidget();
4577 void G4OpenGLQtViewer::tableWidgetViewerSetItemChanged(QTableWidgetItem * item) {
4580 QTableWidgetItem* previous = fViewerPropertiesTableWidget->item(fViewerPropertiesTableWidget->row(item),0);
4582 fViewerPropertiesTableWidget->blockSignals(
true);
4584 + previous->text().toStdString()
4586 + item->text().toStdString()).c_str());
4587 fViewerPropertiesTableWidget->blockSignals(
false);
4592 bool G4OpenGLQtViewer::isCurrentWidget(){
4594 if ( GetName() != fUiQt->GetViewerTabWidget()->tabText(fUiQt->GetViewerTabWidget()->currentIndex()).toStdString().c_str()) {
4607 QString G4OpenGLQtViewer::GetCommandParameterList (
4614 if( n_parameterEntry > 0 ) {
4619 for(
G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
4624 txt +=
" Parameter type : " + QString(QChar(param->
GetParameterType())) +
"\n";
4626 txt +=
" Omittable : True\n";
4628 txt +=
" Omittable : False\n";
4631 txt +=
" Default value : taken from the current value\n";
4646 #ifdef G4MULTITHREADED
4648 void G4OpenGLQtViewer::DoneWithMasterThread()
4653 G4MUTEXLOCK(&mWaitForVisSubThreadQtOpenGLContextInitialized);
4656 void G4OpenGLQtViewer::SwitchToVisSubThread()
4660 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
4666 SetQGLContextVisSubThread(QThread::currentThread());
4672 G4CONDITIONWAIT(&c2_VisSubThreadQtOpenGLContextMoved, &mWaitForVisSubThreadQtOpenGLContextMoved);
4675 qGLW->makeCurrent();
4678 void G4OpenGLQtViewer::DoneWithVisSubThread()
4681 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
4687 qGLW->doneCurrent();
4689 #if QT_VERSION > 0x050000
4691 qGLW->context()->moveToThread(fQGLContextMainThread);
4695 void G4OpenGLQtViewer::SwitchToMasterThread()
4699 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
4705 G4MUTEXUNLOCK(&mWaitForVisSubThreadQtOpenGLContextInitialized);
4706 qGLW->makeCurrent();
4710 void G4OpenGLQtViewer::MovingToVisSubThread(){
4713 QGLWidget* qGLW =
dynamic_cast<QGLWidget*
> (fGLWidget) ;
4719 G4CONDITIONWAIT( &c1_VisSubThreadQtOpenGLContextInitialized, &mWaitForVisSubThreadQtOpenGLContextInitialized);
4723 SetQGLContextMainThread(QThread::currentThread());
4726 qGLW->doneCurrent();
4727 #if QT_VERSION > 0x050000
4728 qGLW->context()->moveToThread(fQGLContextVisSubThread);
G4UIcommandTree * FindCommandTree(const char *commandPath)
G4String GetParameterCandidates() const
G4double GetAlpha() const
G4int GetCommandEntry() const
G4String GetParameterName() const
G4UIcommand * GetCommand(G4int i)
const G4Transform3D & GetTransformation() const
static G4bool GetColour(const G4String &key, G4Colour &result)
static constexpr double degree
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
G4Point3D GetPosition() const
#define G4CONDITIONWAIT(cond, mutex)
const G4String & GetGuidanceLine(G4int i) const
#define G4MUTEX_INITIALIZER
const XML_Char const XML_Char * data
static G4UImanager * GetUIpointer()
G4bool IsOmittable() const
G4double GetYOffset() const
G4GLOB_DLL std::ostream G4cout
G4double GetGreen() const
static constexpr double gray
G4UIparameter * GetParameter(G4int i) const
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
std::vector< PVNodeID > PVPath
void print(G4double elem)
const std::vector< G4PhysicalVolumeNodeID > & GetFullPVPath() const
const G4String & GetCommandName() const
const char * data() const
G4double GetXOffset() const
G4UIcommandTree * GetTree() const
G4String GetDefaultValue() const
char GetParameterType() const
static PROLOG_HANDLER error
const G4String GetParameterGuidance() const
G4String GetParameterRange() const
static const G4double alpha
G4int GetGuidanceEntries() const
const XML_Char XML_Content * model
G4int GetParameterEntries() const
G4bool GetCurrentAsDefault() const
static const G4double pos
G4int ApplyCommand(const char *aCommand)
G4GLOB_DLL std::ostream G4cerr
#define G4CONDITIONBROADCAST(cond)
#define G4CONDITION_INITIALIZER