Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4VRML1FileSceneHandler.cc
Go to the documentation of this file.
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// $Id$
28//
29// G4VRML1FileSceneHandler.cc
30// Satoshi Tanaka & Yasuhide Sawada
31
32
33//#define DEBUG_FR_SCENE
34
35#include <fstream>
36#include <stdio.h>
37#include <string.h>
38#include <stdlib.h>
39
40#include "globals.hh"
41#include "G4VisManager.hh"
42#include "G4Scene.hh"
43#include "G4VPhysicalVolume.hh"
44#include "G4LogicalVolume.hh"
45#include "G4Point3D.hh"
46#include "G4VisAttributes.hh"
47#include "G4Polyhedron.hh"
48#include "G4Box.hh"
49#include "G4Cons.hh"
50#include "G4Polyline.hh"
51#include "G4Trd.hh"
52#include "G4Tubs.hh"
53#include "G4Trap.hh"
54#include "G4Para.hh"
55#include "G4Torus.hh"
56#include "G4Sphere.hh"
57#include "G4Text.hh"
58#include "G4Circle.hh"
59#include "G4Square.hh"
60
62#include "G4VRML1FileViewer.hh"
63#include "G4VRML1File.hh"
64
65// CONST
66
67const char WRL_FILE_HEADER [] = "g4_";
68const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl";
69const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER";
70const char NO_VRML_VIEWER [] = "NONE";
71const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR";
72const int DEFAULT_MAX_WRL_FILE_NUM = 100 ;
73
75 G4VSceneHandler(system, fSceneIdCount++, name),
76 fSystem(system),
77 fDest() ,
78 fFlagDestOpen( false )
79{
80 fCurrentDEF = "";
81 strcpy(fVRMLFileName, "");
82
83 if ( getenv( VRMLFILE_DEST_DIR ) == NULL ) {
84 strcpy( fVRMLFileDestDir, "" );
85 } else {
86 strcpy( fVRMLFileDestDir, getenv( VRMLFILE_DEST_DIR ) );
87 }
88
89 // maximum number of g4.wrl files in the dest directory
90 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ; // initialization
91 if ( getenv( "G4VRMLFILE_MAX_FILE_NUM" ) != NULL ) {
92
93 sscanf( getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum ) ;
94
95 } else {
96 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM ;
97 }
98 if( fMaxFileNum < 1 ) { fMaxFileNum = 1; }
99
100}
101
102
104{
105#if defined DEBUG_FR_SCENE
107 G4cout << "***** ~G4VRML1FileSceneHandler" << G4endl;
108#endif
110}
111
112
113#define G4VRML1SCENEHANDLER G4VRML1FileSceneHandler
114#define IS_CONNECTED this->isConnected()
115#include "G4VRML1SceneHandlerFunc.icc"
116#undef IS_CONNECTED
117#undef G4VRML1SCENEHANDLER
118
119
121{
122 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl
123 const int MAX_FILE_INDEX = fMaxFileNum - 1 ;
124
125 // dest directory (null if no environmental variables is set)
126 strcpy ( fVRMLFileName, fVRMLFileDestDir) ;
127
128 // create (full) path name (default)
129 strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME );
130
131 // Determine VRML file name
132 for( int i = 0 ; i < fMaxFileNum ; i++) {
133
134 // Message in the final execution
135 if( i == MAX_FILE_INDEX )
136 {
138 G4cout << "===========================================" << G4endl;
139 G4cout << "WARNING MESSAGE from VRML1FILE driver: " << G4endl;
140 G4cout << " This file name is the final one in the " << G4endl;
141 G4cout << " automatic updation of the output file name." << G4endl;
142 G4cout << " You may overwrite existing files, i.e. " << G4endl;
143 G4cout << " g4_XX.wrl. " << G4endl;
144 G4cout << "===========================================" << G4endl;
145 }
146 }
147
148 // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl
149 if( i >= 0 && i <= 9 ) {
150 sprintf( fVRMLFileName, "%s%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, "0", i );
151 } else {
152 sprintf( fVRMLFileName, "%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, i );
153 }
154
155 // check validity of the file name
156 std::ifstream fin ;
157 fin.open(fVRMLFileName) ;
158 if(!fin) {
159 // new file
160 fin.close();
161 break;
162 } else {
163 // already exists (try next)
164 fin.close();
165 }
166
167
168 } // for
169
170 // open a VRML 1.0 file with determined file name
172 G4cout << "===========================================" << G4endl;
173 G4cout << "Output VRML 1.0 file: " << fVRMLFileName << G4endl;
174 G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl;
175 G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl;
176 G4cout << "===========================================" << G4endl;
177 }
178 fDest.open(fVRMLFileName) ; fFlagDestOpen = true ;
179}
180
181
183{
184 char command[256] ;
185 char viewer [256] ;
186 strcpy( viewer, NO_VRML_VIEWER ); // initialization
187 if( getenv( ENV_VRML_VIEWER ) ) {
188 strcpy( viewer, getenv( ENV_VRML_VIEWER ) ) ;
189 }
190
191 // close VRML file
192 fDest.close(); fFlagDestOpen = false ;
194 G4cout << "*** VRML 1.0 File " << fVRMLFileName << " is generated." << G4endl;
195
196
197 // Invoke viewer
198
199 if ( !strcmp(viewer, NO_VRML_VIEWER )) {
201 G4cout << "MESSAGE from VRML1FILE driver:" << G4endl;
202 G4cout << " Set an environmental variable " ;
204 G4cout << " if you want to visualize the generated VRML file" << G4endl;
205 G4cout << " automatically. For example, " << G4endl;
206 G4cout << " setenv " << ENV_VRML_VIEWER << " vrweb " << G4endl;
207 }
208 } else {
209 sprintf( command, "%s %s", viewer, fVRMLFileName );
210 (void) system( command );
211 }
212}
213
214G4int G4VRML1FileSceneHandler::fSceneIdCount = 0;
int G4int
Definition: G4Types.hh:66
const int DEFAULT_MAX_WRL_FILE_NUM
const char DEFAULT_WRL_FILE_NAME[]
const char WRL_FILE_HEADER[]
const char VRMLFILE_DEST_DIR[]
const char NO_VRML_VIEWER[]
const char ENV_VRML_VIEWER[]
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4VRML1FileSceneHandler(G4VRML1File &system, const G4String &name="")
static Verbosity GetVerbosity()