Geant4 11.3.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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//
28// G4VRML2FileSceneHandler.cc
29// Satoshi Tanaka & Yasuhide Sawada
30
31//#define DEBUG_FR_SCENE
32
33#include <fstream>
34#include <stdio.h>
35#include <string.h>
36#include <stdlib.h>
37#include <cmath>
38#include <sstream>
39#include <iomanip>
40
41#include "globals.hh"
42#include "G4VPhysicalVolume.hh"
43#include "G4LogicalVolume.hh"
44#include "G4VisManager.hh"
45#include "G4VisAttributes.hh"
46#include "G4VModel.hh"
47#include "G4Scene.hh"
48#include "G4Polyhedron.hh"
49#include "G4Box.hh"
50#include "G4Cons.hh"
51#include "G4Polyline.hh"
52#include "G4Trd.hh"
53#include "G4Tubs.hh"
54#include "G4Text.hh"
55#include "G4Circle.hh"
56#include "G4Square.hh"
57
59#include "G4VRML2FileViewer.hh"
60#include "G4VRML2File.hh"
61
62// CONST
63
64const char WRL_FILE_HEADER[] = "g4_";
65const char ENV_WRL_FILE_HEADER[] = "G4VRMLFILE_HEADER";
66const char ENV_WRL_FILE_NAME[] = "G4VRMLFILE_FILE_NAME";
67const char ENV_VRML_VIEWER[] = "G4VRMLFILE_VIEWER";
68const char NO_VRML_VIEWER[] = "NONE";
69const char VRMLFILE_DEST_DIR[] = "G4VRMLFILE_DEST_DIR";
71
73 const G4String& name)
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(std::getenv(VRMLFILE_DEST_DIR) == NULL)
85 {
86 strcpy(fVRMLFileDestDir, "");
87 }
88 else
89 {
90 strcpy(fVRMLFileDestDir, std::getenv(VRMLFILE_DEST_DIR));
91 }
92
93 // maximum number of g4.prim files in the dest directory
94 fMaxFileNum = DEFAULT_MAX_WRL_FILE_NUM; // initialization
95 if(std::getenv("G4VRMLFILE_MAX_FILE_NUM") != NULL)
96 {
97 sscanf(std::getenv("G4VRMLFILE_MAX_FILE_NUM"), "%d", &fMaxFileNum);
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"), "%d", &is_pickable);
113
114 if(is_pickable)
115 {
116 SetPVPickability(true);
117 }
118 }
119
120 // PV Transparency
121 SetPVTransparency();
122}
123
125{
126#if defined DEBUG_FR_SCENE
128 G4cout << "***** ~G4VRML2FileSceneHandler" << G4endl;
129#endif
131}
132
133#define G4VRML2SCENEHANDLER G4VRML2FileSceneHandler
134#define IS_CONNECTED this->isConnected()
135#include "G4VRML2SceneHandlerFunc.icc"
136#undef IS_CONNECTED
137#undef G4VRML2SCENEHANDLER
138
140{
141 // g4_00.wrl, g4_01.wrl, ..., g4_MAX_FILE_INDEX.wrl
142 const int MAX_FILE_INDEX = fMaxFileNum - 1;
143
144 // dest directory (null if no environmental variables is set)
145 strcpy(fVRMLFileName, fVRMLFileDestDir);
146 // add filename if environment variable supplied
147 if(std::getenv(ENV_WRL_FILE_NAME))
148 {
149 strcat(fVRMLFileName, std::getenv(ENV_WRL_FILE_NAME));
150 }
151 else
152 {
153 // Determine VRML file name
154 for(int i = 0; i < fMaxFileNum; i++)
155 {
156 // Message in the final execution
157 if(i == MAX_FILE_INDEX)
158 {
160 {
161 G4cout << "===========================================" << G4endl;
162 G4cout << "WARNING MESSAGE from VRML2FILE driver: " << G4endl;
163 G4cout << " This file name is the final one in the " << G4endl;
164 G4cout << " automatic updation of the output file name." << G4endl;
165 G4cout << " You may overwrite existing files, i.e. " << G4endl;
166 G4cout << " g4_XX.wrl. " << G4endl;
167 G4cout << "===========================================" << G4endl;
168 }
169 }
170
171 // re-determine file name as G4VRMLFILE_DEST_DIR/g4_XX.wrl
172 std::ostringstream filename;
173 filename << fVRMLFileDestDir;
174 if(std::getenv(ENV_WRL_FILE_HEADER) == NULL)
175 {
176 filename << WRL_FILE_HEADER;
177 }
178 else
179 {
180 filename << std::getenv(ENV_WRL_FILE_HEADER) << '_';
181 }
182 filename << std::setw(2) << std::setfill('0') << i << ".wrl";
183 strncpy(fVRMLFileName, filename.str().c_str(), sizeof(fVRMLFileName) - 1);
184 fVRMLFileName[sizeof(fVRMLFileName) - 1] = '\0';
185
186 // check validity of the file name
187 std::ifstream fin;
188 fin.open(fVRMLFileName);
189 if(!fin)
190 {
191 // new file
192 fin.close();
193 break;
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 name
206 {
207 G4cout << "===========================================" << G4endl;
208 G4cout << "Output VRML 2.0 file: " << fVRMLFileName << G4endl;
209 G4cout << "Maximum number of files in the destination directory: "
210 << fMaxFileNum << G4endl;
211 G4cout << " (Customizable with the environment variable: "
212 "G4VRMLFILE_MAX_FILE_NUM) "
213 << G4endl;
214 G4cout << "===========================================" << G4endl;
215 }
216 fDest.open(fVRMLFileName);
217 fFlagDestOpen = true;
218}
219
221{
222 char command[256];
223 char viewer[256];
224 strcpy(viewer, NO_VRML_VIEWER); // initialization
225 if(std::getenv(ENV_VRML_VIEWER))
226 {
227 strcpy(viewer, std::getenv(ENV_VRML_VIEWER));
228 }
229
230 // close VRML file
231 fDest.close();
232 fFlagDestOpen = false;
234 G4cout << "*** VRML 2.0 File " << fVRMLFileName << " is generated."
235 << G4endl;
236
237 // Invoke viewer
238
239 if(!strcmp(viewer, NO_VRML_VIEWER))
240 {
242 {
243 G4cout << "MESSAGE from VRML2FILE driver:" << G4endl;
244 G4cout << " Set an environmental variable ";
246 G4cout << " if you want to visualize the generated VRML file"
247 << G4endl;
248 G4cout << " automatically. For example, " << G4endl;
249 G4cout << " setenv " << ENV_VRML_VIEWER << " vrwave " << G4endl;
250 G4cout << "ALSO you may change the file header with "
252 G4cout << " or the whole filename with " << ENV_WRL_FILE_NAME
253 << G4endl;
254 }
255 }
256 else
257 {
258 std::ostringstream ossCommand;
259 ossCommand << viewer << ' ' << fVRMLFileName;
260 strncpy(command, ossCommand.str().c_str(), sizeof(command) - 1);
261 command[sizeof(command) - 1] = '\0';
262 int iErr = system(command);
263 if(iErr != 0)
264 {
266 ed << "Error " << iErr << " when calling system with \"" << command
267 << "\".";
268 G4Exception("G4VRML2FileSceneHandler::closePort()", "VRML-2006",
269 JustWarning, ed);
270 }
271 }
272}
273
274G4int G4VRML2FileSceneHandler::fSceneIdCount = 0;
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
int G4int
Definition G4Types.hh:85
const int DEFAULT_MAX_WRL_FILE_NUM
const char ENV_WRL_FILE_NAME[]
const char WRL_FILE_HEADER[]
const char VRMLFILE_DEST_DIR[]
const char NO_VRML_VIEWER[]
const char ENV_WRL_FILE_HEADER[]
const char ENV_VRML_VIEWER[]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4VRML2FileSceneHandler(G4VRML2File &system, const G4String &name="")
G4VSceneHandler(G4VGraphicsSystem &system, G4int id, const G4String &name="")
static Verbosity GetVerbosity()