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
G4VRML2FileSceneHandler.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// G4VRML2FileSceneHandler.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#include <cmath>
40
41#include "globals.hh"
42#include "G4VPhysicalVolume.hh"
43#include "G4LogicalVolume.hh"
44#include "G4VisManager.hh"
45#include "G4Point3D.hh"
46#include "G4VisAttributes.hh"
47#include "G4VModel.hh"
48#include "G4Scene.hh"
49#include "G4Polyhedron.hh"
50#include "G4Box.hh"
51#include "G4Cons.hh"
52#include "G4Polyline.hh"
53#include "G4Trd.hh"
54#include "G4Tubs.hh"
55#include "G4Text.hh"
56#include "G4Circle.hh"
57#include "G4Square.hh"
58
60#include "G4VRML2FileViewer.hh"
61#include "G4VRML2File.hh"
62
63// CONST
64
65const char WRL_FILE_HEADER [] = "g4_";
66const char DEFAULT_WRL_FILE_NAME[] = "g4.wrl";
67const char ENV_VRML_VIEWER [] = "G4VRMLFILE_VIEWER";
68const char NO_VRML_VIEWER [] = "NONE";
69const char VRMLFILE_DEST_DIR [] = "G4VRMLFILE_DEST_DIR";
70const int DEFAULT_MAX_WRL_FILE_NUM = 100 ;
71
72
74 G4VSceneHandler(system, fSceneIdCount++, name),
75 fSystem(system),
76 fFlagDestOpen( false ),
77 fPVPickable ( false ),
78 fDest()
79{
80 // output file name
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 ) {
105
106 int is_pickable ;
107 sscanf( getenv("G4VRML_PV_PICKABLE"), "%d", &is_pickable ) ;
108
109 if ( is_pickable ) { SetPVPickability ( true ) ; }
110 }
111
112 // PV Transparency
113 SetPVTransparency ();
114
115}
116
117
119{
120#if defined DEBUG_FR_SCENE
122 G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl;
123#endif
125}
126
127
128#define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler
129#define IS_CONNECTED this->isConnected()
130#include "G4VRML2SceneHandlerFunc.icc"
131#undef IS_CONNECTED
132#undef G4VRML2SCENEHANDLER
133
134
136{
137 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl
138 const int MAX_FILE_INDEX = fMaxFileNum - 1 ;
139
140 // dest directory (null if no environmental variables is set)
141 strcpy ( fVRMLFileName, fVRMLFileDestDir) ;
142
143 // create full path name (default)
144 strcat ( fVRMLFileName, DEFAULT_WRL_FILE_NAME );
145
146 // Determine VRML file name
147 for( int i = 0 ; i < fMaxFileNum ; i++) {
148
149 // Message in the final execution
150 if( i == MAX_FILE_INDEX )
151 {
153 G4cout << "===========================================" << G4endl;
154 G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl;
155 G4cout << " This file name is the final one in the " << G4endl;
156 G4cout << " automatic updation of the output file name." << G4endl;
157 G4cout << " You may overwrite existing files, i.e. " << G4endl;
158 G4cout << " g4_XX.wrl. " << G4endl;
159 G4cout << "===========================================" << G4endl;
160 }
161 }
162
163 // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl
164 if( i >= 0 && i <= 9 ) {
165 sprintf( fVRMLFileName, "%s%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, "0", i );
166 } else {
167 sprintf( fVRMLFileName, "%s%s%d.wrl" , fVRMLFileDestDir, WRL_FILE_HEADER, i );
168 }
169
170 // check validity of the file name
171 std::ifstream fin ;
172 fin.open(fVRMLFileName) ;
173 if(!fin) {
174 // new file
175 fin.close();
176 break;
177 } else {
178 // already exists (try next)
179 fin.close();
180 }
181
182 } // for
183
184 // open a VRML 2.0 file with determined file name
186 G4cout << "===========================================" << G4endl;
187 G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl;
188 G4cout << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl;
189 G4cout << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl;
190 G4cout << "===========================================" << G4endl;
191 }
192 fDest.open(fVRMLFileName) ; fFlagDestOpen = true ;
193}
194
195
197{
198 char command[256] ;
199 char viewer [256] ;
200 strcpy( viewer, NO_VRML_VIEWER ); // initialization
201 if( getenv( ENV_VRML_VIEWER ) ) {
202 strcpy( viewer, getenv( ENV_VRML_VIEWER ) ) ;
203 }
204
205 // close VRML file
206 fDest.close(); fFlagDestOpen = false ;
208 G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated." << G4endl;
209
210
211 // Invoke viewer
212
213 if ( !strcmp(viewer, NO_VRML_VIEWER )) {
215 G4cout << "MESSAGE from VRML2FILE driver:" << G4endl;
216 G4cout << " Set an environmental variable " ;
218 G4cout << " if you want to visualize the generated VRML file" << G4endl;
219 G4cout << " automatically. For example, " << G4endl;
220 G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl;
221 }
222 } else {
223 sprintf( command, "%s %s", viewer, fVRMLFileName );
224 (void) system( command );
225 }
226}
227
228G4int G4VRML2FileSceneHandler::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[]
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
G4VRML2FileSceneHandler(G4VRML2File &system, const G4String &name="")
static Verbosity GetVerbosity()