ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4VRML2FileSceneHandler.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4VRML2FileSceneHandler.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 //
28 // G4VRML2FileSceneHandler.cc
29 // Satoshi Tanaka & Yasuhide Sawada
30 
31 
32 //#define DEBUG_FR_SCENE
33 
34 #include <fstream>
35 #include <stdio.h>
36 #include <string.h>
37 #include <stdlib.h>
38 #include <cmath>
39 #include <sstream>
40 #include <iomanip>
41 
42 #include "globals.hh"
43 #include "G4VPhysicalVolume.hh"
44 #include "G4LogicalVolume.hh"
45 #include "G4VisManager.hh"
46 #include "G4Point3D.hh"
47 #include "G4VisAttributes.hh"
48 #include "G4VModel.hh"
49 #include "G4Scene.hh"
50 #include "G4Polyhedron.hh"
51 #include "G4Box.hh"
52 #include "G4Cons.hh"
53 #include "G4Polyline.hh"
54 #include "G4Trd.hh"
55 #include "G4Tubs.hh"
56 #include "G4Text.hh"
57 #include "G4Circle.hh"
58 #include "G4Square.hh"
59 
61 #include "G4VRML2FileViewer.hh"
62 #include "G4VRML2File.hh"
63 
64 // CONST
65 
66 const char WRL_FILE_HEADER [] = "g4_";
67 const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl";
68 const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER";
69 const char NO_VRML_VIEWER [] = "NONE";
70 const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR";
71 const int DEFAULT_MAX_WRL_FILE_NUM = 100 ;
72 
73 
75  G4VSceneHandler(system, fSceneIdCount++, name),
76  fSystem(system),
77  fFlagDestOpen( false ),
78  fPVPickable ( false ),
79  fDest()
80 {
81  // output file name
82  strcpy(fVRMLFileName, "");
83 
84  // destination directory
85  if ( std::getenv( VRMLFILE_DEST_DIR ) == NULL ) {
86  strcpy( fVRMLFileDestDir, "" );
87  } else {
88  strcpy( fVRMLFileDestDir, std::getenv( VRMLFILE_DEST_DIR ) );
89  }
90 
91 
92  // maximum number of g4.prim files in the dest directory
93  fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; // initialization
94  if ( std::getenv( "G4VRMLFILE_MAX_FILE_NUM" ) != NULL ) {
95 
96  sscanf( std::getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ;
97 
98  } else {
100  }
101  if( fMaxFileNum < 1 ) { fMaxFileNum = 1; }
102 
103 
104  // PV name pickability
105  if( std::getenv( "G4VRML_PV_PICKABLE" ) != NULL ) {
106 
107  int is_pickable ;
108  sscanf( std::getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable ) ;
109 
110  if ( is_pickable ) { SetPVPickability ( true ) ; }
111  }
112 
113  // PV Transparency
115 
116 }
117 
118 
120 {
121 #if defined DEBUG_FR_SCENE
123  G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl;
124 #endif
125  VRMLEndModeling();
126 }
127 
128 
129 #define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler
130 #define IS_CONNECTED this->isConnected()
131 #include "G4VRML2SceneHandlerFunc.icc"
132 #undef IS_CONNECTED
133 #undef G4VRML2SCENEHANDLER
134 
135 
137 {
138  // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl
139  const int MAX_FILE_INDEX = fMaxFileNum - 1 ;
140 
141  // dest directory (null if no environmental variables is set)
142  strcpy ( fVRMLFileName, fVRMLFileDestDir) ;
143 
144  // create full path name (default)
146 
147  // Determine VRML file name
148  for( int i = 0 ; i < fMaxFileNum ; i++) {
149 
150  // Message in the final execution
151  if( i == MAX_FILE_INDEX )
152  {
154  G4cout << "===========================================" << G4endl;
155  G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl;
156  G4cout << " This file name is the final one in the " << G4endl;
157  G4cout << " automatic updation of the output file name." << G4endl;
158  G4cout << " You may overwrite existing files, i.e. " << G4endl;
159  G4cout << " g4_XX.wrl. " << G4endl;
160  G4cout << "===========================================" << G4endl;
161  }
162  }
163 
164  // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl
165  std::ostringstream filename;
166  filename
168  << std::setw(2) << std::setfill('0') << i << ".wrl";
169  strncpy(fVRMLFileName,filename.str().c_str(),sizeof(fVRMLFileName)-1);
170  fVRMLFileName[sizeof(fVRMLFileName)-1] = '\0';
171 
172  // check validity of the file name
173  std::ifstream fin ;
174  fin.open(fVRMLFileName) ;
175  if(!fin) {
176  // new file
177  fin.close();
178  break;
179  } else {
180  // already exists (try next)
181  fin.close();
182  }
183 
184  } // for
185 
186  // open a VRML 2.0 file with determined file name
188  G4cout << "===========================================" << G4endl;
189  G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl;
190  G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl;
191  G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl;
192  G4cout << "===========================================" << G4endl;
193  }
195 }
196 
197 
199 {
200  char command[256] ;
201  char viewer [256] ;
202  strcpy( viewer, NO_VRML_VIEWER ); // initialization
203  if( std::getenv( ENV_VRML_VIEWER ) ) {
204  strcpy( viewer, std::getenv( ENV_VRML_VIEWER ) ) ;
205  }
206 
207  // close VRML file
208  fDest.close(); fFlagDestOpen = false ;
210  G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated." << G4endl;
211 
212 
213  // Invoke viewer
214 
215  if ( !strcmp(viewer, NO_VRML_VIEWER )) {
217  G4cout << "MESSAGE from VRML2FILE driver:" << G4endl;
218  G4cout << " Set an environmental variable " ;
220  G4cout << " if you want to visualize the generated VRML file" << G4endl;
221  G4cout << " automatically. For example, " << G4endl;
222  G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl;
223  }
224  } else {
225  std::ostringstream ossCommand;
226  ossCommand << viewer << ' ' << fVRMLFileName;
227  strncpy(command,ossCommand.str().c_str(),sizeof(command)-1);
228  command[sizeof(command)-1] = '\0';
229  (void) system( command );
230  }
231 }
232