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: G4VRML2FileSceneHandler.cc,v 1.14 2006/06/29 21:26:11 gunter Exp $ >> 28 // GEANT4 tag $Name: geant4-08-03-patch-02 $ 27 // 29 // 28 // G4VRML2FileSceneHandler.cc 30 // G4VRML2FileSceneHandler.cc 29 // Satoshi Tanaka & Yasuhide Sawada 31 // Satoshi Tanaka & Yasuhide Sawada 30 32 >> 33 31 //#define DEBUG_FR_SCENE 34 //#define DEBUG_FR_SCENE 32 35 33 #include <fstream> 36 #include <fstream> 34 #include <stdio.h> 37 #include <stdio.h> 35 #include <string.h> 38 #include <string.h> 36 #include <stdlib.h> 39 #include <stdlib.h> 37 #include <cmath> 40 #include <cmath> 38 #include <sstream> << 39 #include <iomanip> << 40 41 41 #include "globals.hh" 42 #include "globals.hh" 42 #include "G4VPhysicalVolume.hh" 43 #include "G4VPhysicalVolume.hh" 43 #include "G4LogicalVolume.hh" 44 #include "G4LogicalVolume.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 G4cerr << "***** ~G4VRML2FileSceneHandler" << G4endl; 128 G4cout << "***** ~G4VRML2FileSceneHandler" << 122 #endif 129 #endif << 123 VRMLEndModeling(); 130 VRMLEndModeling(); << 131 } 124 } 132 125 133 #define G4VRML2SCENEHANDLER G4VRML2FileSceneHa << 126 134 #define IS_CONNECTED this->isConnected() << 127 #define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler >> 128 #define IS_CONNECTED this->isConnected() 135 #include "G4VRML2SceneHandlerFunc.icc" 129 #include "G4VRML2SceneHandlerFunc.icc" 136 #undef IS_CONNECTED << 130 #undef IS_CONNECTED 137 #undef G4VRML2SCENEHANDLER << 131 #undef G4VRML2SCENEHANDLER >> 132 138 133 139 void G4VRML2FileSceneHandler::connectPort() 134 void G4VRML2FileSceneHandler::connectPort() 140 { 135 { 141 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_IN << 136 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl 142 const int MAX_FILE_INDEX = fMaxFileNum - 1; << 137 const int MAX_FILE_INDEX = fMaxFileNum - 1 ; 143 138 144 // dest directory (null if no environmental << 139 // dest directory (null if no environmental variables is set) 145 strcpy(fVRMLFileName, fVRMLFileDestDir); << 140 strcpy ( fVRMLFileName, fVRMLFileDestDir) ; 146 // add filename if environment variable supp << 141 147 if(std::getenv(ENV_WRL_FILE_NAME)) << 142 // create full path name (default) 148 { << 143 strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME ); 149 strcat(fVRMLFileName, std::getenv(ENV_WRL_ << 144 150 } << 145 // Determine VRML file name 151 else << 146 for( int i = 0 ; i < fMaxFileNum ; i++) { 152 { << 147 153 // Determine VRML file name << 148 // Message in the final execution 154 for(int i = 0; i < fMaxFileNum; i++) << 149 if( i == MAX_FILE_INDEX ) 155 { << 150 { 156 // Message in the final execution << 151 G4cerr << "===========================================" << G4endl; 157 if(i == MAX_FILE_INDEX) << 152 G4cerr << "WARNING MESSAGE from VRML2FILE driver: " << G4endl; 158 { << 153 G4cerr << " This file name is the final one in the " << G4endl; 159 if(G4VisManager::GetVerbosity() >= G4V << 154 G4cerr << " automatic updation of the output file name." << G4endl; 160 { << 155 G4cerr << " You may overwrite existing files, i.e. " << G4endl; 161 G4cout << "========================= << 156 G4cerr << " g4_XX.wrl. " << G4endl; 162 G4cout << "WARNING MESSAGE from VRML << 157 G4cerr << "===========================================" << G4endl; 163 G4cout << " This file name is the f << 158 } 164 G4cout << " automatic updation of t << 159 165 G4cout << " You may overwrite exist << 160 // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl 166 G4cout << " g4_XX.wrl. << 161 if( i >= 0 && i <= 9 ) { 167 G4cout << "========================= << 162 sprintf( fVRMLFileName, "%s%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, "0", i ); 168 } << 163 } else { 169 } << 164 sprintf( fVRMLFileName, "%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, i ); 170 << 165 } 171 // re-determine file name as G4VRMLFILE_ << 166 172 std::ostringstream filename; << 167 // check validity of the file name 173 filename << fVRMLFileDestDir; << 168 std::ifstream fin ; 174 if(std::getenv(ENV_WRL_FILE_HEADER) == N << 169 fin.open(fVRMLFileName) ; 175 { << 170 if(!fin) { 176 filename << WRL_FILE_HEADER; << 171 // new file 177 } << 172 fin.close(); 178 else << 173 break; 179 { << 174 } else { 180 filename << std::getenv(ENV_WRL_FILE_H << 175 // already exists (try next) 181 } << 176 fin.close(); 182 filename << std::setw(2) << std::setfill << 177 } 183 strncpy(fVRMLFileName, filename.str().c_ << 178 184 fVRMLFileName[sizeof(fVRMLFileName) - 1] << 179 } // for 185 << 180 186 // check validity of the file name << 181 // open a VRML 2.0 file with determined file name 187 std::ifstream fin; << 182 G4cerr << "===========================================" << G4endl; 188 fin.open(fVRMLFileName); << 183 G4cerr << "Output VRML 2.0 file: " << fVRMLFileName << G4endl; 189 if(!fin) << 184 G4cerr << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; 190 { << 185 G4cerr << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; 191 // new file << 186 G4cerr << "===========================================" << G4endl; 192 fin.close(); << 187 193 break; << 188 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 } 189 } 219 190 >> 191 220 void G4VRML2FileSceneHandler::closePort() 192 void G4VRML2FileSceneHandler::closePort() 221 { 193 { 222 char command[256]; << 194 char command[256] ; 223 char viewer[256]; << 195 char viewer [256] ; 224 strcpy(viewer, NO_VRML_VIEWER); // initiali << 196 strcpy( viewer, NO_VRML_VIEWER ); // initialization 225 if(std::getenv(ENV_VRML_VIEWER)) << 197 if( getenv( ENV_VRML_VIEWER ) ) { 226 { << 198 strcpy( viewer, getenv( ENV_VRML_VIEWER ) ) ; 227 strcpy(viewer, std::getenv(ENV_VRML_VIEWER << 199 } 228 } << 200 229 << 201 // close VRML file 230 // close VRML file << 202 fDest.close(); fFlagDestOpen = false ; 231 fDest.close(); << 203 G4cerr << "*** VRML 2.0 File " << fVRMLFileName << " is generated." << G4endl; 232 fFlagDestOpen = false; << 204 233 if(G4VisManager::GetVerbosity() >= G4VisMana << 205 234 G4cout << "*** VRML 2.0 File " << fVRMLFi << 206 // Invoke viewer 235 << G4endl; << 207 236 << 208 if ( !strcmp(viewer, NO_VRML_VIEWER )) { 237 // Invoke viewer << 209 G4cerr << "MESSAGE from VRML2FILE driver:" << G4endl; 238 << 210 G4cerr << " Set an environmental variable " ; 239 if(!strcmp(viewer, NO_VRML_VIEWER)) << 211 G4cerr << ENV_VRML_VIEWER << G4endl; 240 { << 212 G4cerr << " if you want to visualize the generated VRML file" << G4endl; 241 if(G4VisManager::GetVerbosity() >= G4VisMa << 213 G4cerr << " automatically. For example, " << G4endl; 242 { << 214 G4cerr << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl; 243 G4cout << "MESSAGE from VRML2FILE driver << 215 } else { 244 G4cout << " Set an environmental vari << 216 sprintf( command, "%s %s", viewer, fVRMLFileName ); 245 G4cout << ENV_VRML_VIEWER << G4endl; << 217 system( command ); 246 G4cout << " if you want to visualize << 218 } 247 << G4endl; << 248 G4cout << " automatically. For examp << 249 G4cout << " setenv " << ENV_VRML_VIE << 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 } 219 } 273 220 274 G4int G4VRML2FileSceneHandler::fSceneIdCount = 221 G4int G4VRML2FileSceneHandler::fSceneIdCount = 0; 275 222