Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id$ 27 // 28 // 28 // G4VRML2FileSceneHandler.cc 29 // G4VRML2FileSceneHandler.cc 29 // Satoshi Tanaka & Yasuhide Sawada 30 // Satoshi Tanaka & Yasuhide Sawada 30 31 >> 32 31 //#define DEBUG_FR_SCENE 33 //#define DEBUG_FR_SCENE 32 34 33 #include <fstream> 35 #include <fstream> 34 #include <stdio.h> 36 #include <stdio.h> 35 #include <string.h> 37 #include <string.h> 36 #include <stdlib.h> 38 #include <stdlib.h> 37 #include <cmath> 39 #include <cmath> 38 #include <sstream> << 39 #include <iomanip> << 40 40 41 #include "globals.hh" 41 #include "globals.hh" 42 #include "G4VPhysicalVolume.hh" 42 #include "G4VPhysicalVolume.hh" 43 #include "G4LogicalVolume.hh" 43 #include "G4LogicalVolume.hh" 44 #include "G4VisManager.hh" 44 #include "G4VisManager.hh" >> 45 #include "G4Point3D.hh" 45 #include "G4VisAttributes.hh" 46 #include "G4VisAttributes.hh" 46 #include "G4VModel.hh" 47 #include "G4VModel.hh" 47 #include "G4Scene.hh" 48 #include "G4Scene.hh" 48 #include "G4Polyhedron.hh" 49 #include "G4Polyhedron.hh" 49 #include "G4Box.hh" 50 #include "G4Box.hh" 50 #include "G4Cons.hh" 51 #include "G4Cons.hh" 51 #include "G4Polyline.hh" 52 #include "G4Polyline.hh" 52 #include "G4Trd.hh" 53 #include "G4Trd.hh" 53 #include "G4Tubs.hh" 54 #include "G4Tubs.hh" 54 #include "G4Text.hh" 55 #include "G4Text.hh" 55 #include "G4Circle.hh" 56 #include "G4Circle.hh" 56 #include "G4Square.hh" 57 #include "G4Square.hh" 57 58 58 #include "G4VRML2FileSceneHandler.hh" 59 #include "G4VRML2FileSceneHandler.hh" 59 #include "G4VRML2FileViewer.hh" 60 #include "G4VRML2FileViewer.hh" 60 #include "G4VRML2File.hh" 61 #include "G4VRML2File.hh" 61 62 62 // CONST 63 // CONST 63 64 64 const char WRL_FILE_HEADER[] = "g4_"; << 65 const char WRL_FILE_HEADER [] = "g4_"; 65 const char ENV_WRL_FILE_HEADER[] = "G4VRMLFI << 66 const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl"; 66 const char ENV_WRL_FILE_NAME[] = "G4VRMLFI << 67 const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER"; 67 const char ENV_VRML_VIEWER[] = "G4VRMLFI << 68 const char NO_VRML_VIEWER [] = "NONE"; 68 const char NO_VRML_VIEWER[] = "NONE"; << 69 const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR"; 69 const char VRMLFILE_DEST_DIR[] = "G4VRMLFI << 70 const int DEFAULT_MAX_WRL_FILE_NUM = 100 ; 70 const int DEFAULT_MAX_WRL_FILE_NUM = 100; << 71 71 << 72 72 G4VRML2FileSceneHandler::G4VRML2FileSceneHandl << 73 G4VRML2FileSceneHandler::G4VRML2FileSceneHandler(G4VRML2File& system, const G4String& name) : 73 << 74 G4VSceneHandler(system, fSceneIdCount++, name), 74 : G4VSceneHandler(system, fSceneIdCount++, n << 75 fSystem(system), 75 , fSystem(system) << 76 fFlagDestOpen( false ), 76 , fFlagDestOpen(false) << 77 fPVPickable ( false ), 77 , fPVPickable(false) << 78 fDest() 78 , fDest() << 79 { 79 { 80 // output file name << 80 // output file name 81 strcpy(fVRMLFileName, ""); << 81 strcpy(fVRMLFileName, ""); >> 82 >> 83 // destination directory >> 84 if ( getenv( VRMLFILE_DEST_DIR ) == NULL ) { >> 85 strcpy( fVRMLFileDestDir, "" ); >> 86 } else { >> 87 strcpy( fVRMLFileDestDir, getenv( VRMLFILE_DEST_DIR ) ); >> 88 } >> 89 >> 90 >> 91 // maximum number of g4.prim files in the dest directory >> 92 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; // initialization >> 93 if ( getenv( "G4VRMLFILE_MAX_FILE_NUM" ) != NULL ) { >> 94 >> 95 sscanf( getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ; >> 96 >> 97 } else { >> 98 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; >> 99 } >> 100 if( fMaxFileNum < 1 ) { fMaxFileNum = 1; } >> 101 >> 102 >> 103 // PV name pickability >> 104 if( getenv( "G4VRML_PV_PICKABLE" ) != NULL ) { 82 105 83 // destination directory << 106 int is_pickable ; 84 if(std::getenv(VRMLFILE_DEST_DIR) == NULL) << 107 sscanf( getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable ) ; 85 { << 108 86 strcpy(fVRMLFileDestDir, ""); << 109 if ( is_pickable ) { SetPVPickability ( true ) ; } 87 } << 110 } 88 else << 111 89 { << 112 // PV Transparency 90 strcpy(fVRMLFileDestDir, std::getenv(VRMLF << 113 SetPVTransparency (); 91 } << 92 << 93 // maximum number of g4.prim files in the de << 94 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM; // << 95 if(std::getenv("G4VRMLFILE_MAX_FILE_NUM") != << 96 { << 97 sscanf(std::getenv("G4VRMLFILE_MAX_FILE_NU << 98 } << 99 else << 100 { << 101 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM; << 102 } << 103 if(fMaxFileNum < 1) << 104 { << 105 fMaxFileNum = 1; << 106 } << 107 << 108 // PV name pickability << 109 if(std::getenv("G4VRML_PV_PICKABLE") != NULL << 110 { << 111 int is_pickable; << 112 sscanf(std::getenv("G4VRML_PV_PICKABLE"), << 113 << 114 if(is_pickable) << 115 { << 116 SetPVPickability(true); << 117 } << 118 } << 119 114 120 // PV Transparency << 121 SetPVTransparency(); << 122 } 115 } 123 116 >> 117 124 G4VRML2FileSceneHandler::~G4VRML2FileSceneHand 118 G4VRML2FileSceneHandler::~G4VRML2FileSceneHandler() 125 { 119 { 126 #if defined DEBUG_FR_SCENE 120 #if defined DEBUG_FR_SCENE 127 if(G4VisManager::GetVerbosity() >= G4VisMana << 121 if (G4VisManager::GetVerbosity() >= G4VisManager::errors) 128 G4cout << "***** ~G4VRML2FileSceneHandler" << 122 G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl; 129 #endif << 123 #endif 130 VRMLEndModeling(); << 124 VRMLEndModeling(); 131 } 125 } 132 126 133 #define G4VRML2SCENEHANDLER G4VRML2FileSceneHa << 127 134 #define IS_CONNECTED this->isConnected() << 128 #define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler >> 129 #define IS_CONNECTED this->isConnected() 135 #include "G4VRML2SceneHandlerFunc.icc" 130 #include "G4VRML2SceneHandlerFunc.icc" 136 #undef IS_CONNECTED << 131 #undef IS_CONNECTED 137 #undef G4VRML2SCENEHANDLER << 132 #undef G4VRML2SCENEHANDLER >> 133 138 134 139 void G4VRML2FileSceneHandler::connectPort() 135 void G4VRML2FileSceneHandler::connectPort() 140 { 136 { 141 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_IN << 137 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl 142 const int MAX_FILE_INDEX = fMaxFileNum - 1; << 138 const int MAX_FILE_INDEX = fMaxFileNum - 1 ; >> 139 >> 140 // dest directory (null if no environmental variables is set) >> 141 strcpy ( fVRMLFileName, fVRMLFileDestDir) ; 143 142 144 // dest directory (null if no environmental << 143 // create full path name (default) 145 strcpy(fVRMLFileName, fVRMLFileDestDir); << 144 strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME ); 146 // add filename if environment variable supp << 145 147 if(std::getenv(ENV_WRL_FILE_NAME)) << 146 // Determine VRML file name 148 { << 147 for( int i = 0 ; i < fMaxFileNum ; i++) { 149 strcat(fVRMLFileName, std::getenv(ENV_WRL_ << 148 150 } << 149 // Message in the final execution 151 else << 150 if( i == MAX_FILE_INDEX ) 152 { << 151 { 153 // Determine VRML file name << 152 if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { 154 for(int i = 0; i < fMaxFileNum; i++) << 153 G4cout << "===========================================" << G4endl; 155 { << 154 G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl; 156 // Message in the final execution << 155 G4cout << " This file name is the final one in the " << G4endl; 157 if(i == MAX_FILE_INDEX) << 156 G4cout << " automatic updation of the output file name." << G4endl; 158 { << 157 G4cout << " You may overwrite existing files, i.e. " << G4endl; 159 if(G4VisManager::GetVerbosity() >= G4V << 158 G4cout << " g4_XX.wrl. " << G4endl; 160 { << 159 G4cout << "===========================================" << G4endl; 161 G4cout << "========================= << 160 } 162 G4cout << "WARNING MESSAGE from VRML << 161 } 163 G4cout << " This file name is the f << 162 164 G4cout << " automatic updation of t << 163 // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl 165 G4cout << " You may overwrite exist << 164 if( i >= 0 && i <= 9 ) { 166 G4cout << " g4_XX.wrl. << 165 sprintf( fVRMLFileName, "%s%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, "0", i ); 167 G4cout << "========================= << 166 } else { 168 } << 167 sprintf( fVRMLFileName, "%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, i ); 169 } << 168 } 170 << 169 171 // re-determine file name as G4VRMLFILE_ << 170 // check validity of the file name 172 std::ostringstream filename; << 171 std::ifstream fin ; 173 filename << fVRMLFileDestDir; << 172 fin.open(fVRMLFileName) ; 174 if(std::getenv(ENV_WRL_FILE_HEADER) == N << 173 if(!fin) { 175 { << 174 // new file 176 filename << WRL_FILE_HEADER; << 175 fin.close(); 177 } << 176 break; 178 else << 177 } else { 179 { << 178 // already exists (try next) 180 filename << std::getenv(ENV_WRL_FILE_H << 179 fin.close(); 181 } << 180 } 182 filename << std::setw(2) << std::setfill << 181 183 strncpy(fVRMLFileName, filename.str().c_ << 182 } // for 184 fVRMLFileName[sizeof(fVRMLFileName) - 1] << 183 185 << 184 // open a VRML 2.0 file with determined file name 186 // check validity of the file name << 185 if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { 187 std::ifstream fin; << 186 G4cout << "===========================================" << G4endl; 188 fin.open(fVRMLFileName); << 187 G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl; 189 if(!fin) << 188 G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; 190 { << 189 G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; 191 // new file << 190 G4cout << "===========================================" << G4endl; 192 fin.close(); << 191 } 193 break; << 192 fDest.open(fVRMLFileName) ; fFlagDestOpen = true ; 194 } << 195 else << 196 { << 197 // already exists (try next) << 198 fin.close(); << 199 } << 200 << 201 } // for << 202 } << 203 << 204 // open a VRML 2.0 file with determined file << 205 if(G4VisManager::GetVerbosity() >= G4VisMana << 206 { << 207 G4cout << "=============================== << 208 G4cout << "Output VRML 2.0 file: " << fVRM << 209 G4cout << "Maximum number of files in the << 210 << fMaxFileNum << G4endl; << 211 G4cout << " (Customizable with the enviro << 212 "G4VRMLFILE_MAX_FILE_NUM) " << 213 << G4endl; << 214 G4cout << "=============================== << 215 } << 216 fDest.open(fVRMLFileName); << 217 fFlagDestOpen = true; << 218 } 193 } 219 194 >> 195 220 void G4VRML2FileSceneHandler::closePort() 196 void G4VRML2FileSceneHandler::closePort() 221 { 197 { 222 char command[256]; << 198 char command[256] ; 223 char viewer[256]; << 199 char viewer [256] ; 224 strcpy(viewer, NO_VRML_VIEWER); // initiali << 200 strcpy( viewer, NO_VRML_VIEWER ); // initialization 225 if(std::getenv(ENV_VRML_VIEWER)) << 201 if( getenv( ENV_VRML_VIEWER ) ) { 226 { << 202 strcpy( viewer, getenv( ENV_VRML_VIEWER ) ) ; 227 strcpy(viewer, std::getenv(ENV_VRML_VIEWER << 203 } 228 } << 204 229 << 205 // close VRML file 230 // close VRML file << 206 fDest.close(); fFlagDestOpen = false ; 231 fDest.close(); << 207 if (G4VisManager::GetVerbosity() >= G4VisManager::errors) 232 fFlagDestOpen = false; << 208 G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated." << G4endl; 233 if(G4VisManager::GetVerbosity() >= G4VisMana << 209 234 G4cout << "*** VRML 2.0 File " << fVRMLFi << 210 235 << G4endl; << 211 // Invoke viewer 236 << 212 237 // Invoke viewer << 213 if ( !strcmp(viewer, NO_VRML_VIEWER )) { 238 << 214 if (G4VisManager::GetVerbosity() >= G4VisManager::errors) { 239 if(!strcmp(viewer, NO_VRML_VIEWER)) << 215 G4cout << "MESSAGE from VRML2FILE driver:" << G4endl; 240 { << 216 G4cout << " Set an environmental variable " ; 241 if(G4VisManager::GetVerbosity() >= G4VisMa << 217 G4cout << ENV_VRML_VIEWER << G4endl; 242 { << 218 G4cout << " if you want to visualize the generated VRML file" << G4endl; 243 G4cout << "MESSAGE from VRML2FILE driver << 219 G4cout << " automatically. For example, " << G4endl; 244 G4cout << " Set an environmental vari << 220 G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl; 245 G4cout << ENV_VRML_VIEWER << G4endl; << 221 } 246 G4cout << " if you want to visualize << 222 } else { 247 << G4endl; << 223 sprintf( command, "%s %s", viewer, fVRMLFileName ); 248 G4cout << " automatically. For examp << 224 (void) system( command ); 249 G4cout << " setenv " << ENV_VRML_VIE << 225 } 250 G4cout << "ALSO you may change the file << 251 << ENV_WRL_FILE_HEADER << G4endl; << 252 G4cout << " or the whole filename wit << 253 << G4endl; << 254 } << 255 } << 256 else << 257 { << 258 std::ostringstream ossCommand; << 259 ossCommand << viewer << ' ' << fVRMLFileNa << 260 strncpy(command, ossCommand.str().c_str(), << 261 command[sizeof(command) - 1] = '\0'; << 262 int iErr = system(comm << 263 if(iErr != 0) << 264 { << 265 G4ExceptionDescription ed; << 266 ed << "Error " << iErr << " when calling << 267 << "\"."; << 268 G4Exception("G4VRML2FileSceneHandler::cl << 269 JustWarning, ed); << 270 } << 271 } << 272 } 226 } 273 227 274 G4int G4VRML2FileSceneHandler::fSceneIdCount = 228 G4int G4VRML2FileSceneHandler::fSceneIdCount = 0; 275 229