Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DAWNFILEViewer.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// Satoshi TANAKA
29// DAWNFILE view - opens window, hard copy, etc.
30
31
32#define __G_ANSI_C__
33#define G4DAWNFILE_STRUCTURE_PRIORITY 1.
34
35// #define DEBUG_FR_VIEW
36
37#include "G4ios.hh"
38#include <stdio.h>
39#include <string.h>
40#include <assert.h>
41
42#include "G4VisManager.hh"
43#include "G4Scene.hh"
44#include "G4Vector3D.hh"
45#include "G4VisExtent.hh"
46#include "G4LogicalVolume.hh"
47#include "G4VSolid.hh"
49
50#include "G4FRConst.hh"
51#include "G4DAWNFILE.hh"
53#include "G4DAWNFILEViewer.hh"
54
55
56
57 //----- constants
58const char FR_ENV_MULTI_WINDOW [] = "G4DAWN_MULTI_WINDOW" ;
59const char FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW" ;
60
61 //----- G4DAWNFILEViewer, constructor
63 const G4String& name):
64 G4VViewer (sceneHandler,
65 sceneHandler.IncrementViewCount (),
66 name),
67 fSceneHandler (sceneHandler)
68{
69 // Set a g4.prim-file viewer
70 strcpy( fG4PrimViewer, "dawn" );
71 if( std::getenv( "G4DAWNFILE_VIEWER" ) != NULL ) {
72 strcpy( fG4PrimViewer, std::getenv( "G4DAWNFILE_VIEWER" ) ) ;
73 }
74
75 // string for viewer invocation
76 if ( !strcmp( fG4PrimViewer, "NONE" ) ) {
77
78 strcpy( fG4PrimViewerInvocation, "" );
79 } else {
80
81 strcpy( fG4PrimViewerInvocation, fG4PrimViewer );
82 strcat( fG4PrimViewerInvocation, " ");
83 strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() );
84 }
85
86 // Set a PostScript Viewer
87// strcpy( fPSViewer, "ghostview" );
88 strcpy( fPSViewer, "gv" );
89 if( std::getenv( "G4DAWNFILE_PS_VIEWER" ) != NULL ) {
90 strcpy( fPSViewer, std::getenv( "G4DAWNFILE_PS_VIEWER" ) ) ;
91 }
92
93}
94
95 //----- G4DAWNFILEViewer, destructor
97{}
98
99 //----- G4DAWNFILEViewer::SetView ()
101{
102#if defined DEBUG_FR_VIEW
104 G4cout << "***** G4DAWNFILEViewer::SetView(): No effects" << G4endl;
105#endif
106// Do nothing, since DAWN is running as a different process.
107// SendViewParameters () will do this job instead.
108}
109
110
111 //----- G4DAWNFILEViewer::ClearView()
112void
114{
115#if defined DEBUG_FR_VIEW
117 G4cout << "***** G4DAWNFILEViewer::ClearView (): No effects " << G4endl;
118#endif
119 if (fSceneHandler.fPrimDest.IsOpen()) {
120 fSceneHandler.fPrimDest.Close();
121 // Re-open with same filename...
122 fSceneHandler.fPrimDest.Open(fSceneHandler.fG4PrimFileName);
123 fSceneHandler.SendStr( FR_G4_PRIM_HEADER );
124 fSceneHandler.FRflag_in_modeling = false;
125 fSceneHandler.FRBeginModeling();
126 }
127}
128
129
130 //----- G4DAWNFILEViewer::DrawView ()
132{
133#if defined DEBUG_FR_VIEW
135 G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl;
136#endif
137 //-----
138 fSceneHandler.FRBeginModeling() ;
139
140 //----- Always visit G4 kernel
142
143 //----- Draw
144 ProcessView () ;
145
146} // G4DAWNFILEViewer::DrawView ()
147
148
149
150 //----- G4DAWNFILEViewer::ShowView()
152{
153#if defined DEBUG_FR_VIEW
155 G4cout << "***** G4DAWNFILEViewer::ShowView () " << G4endl;
156#endif
157
158 if( fSceneHandler.FRIsInModeling() )
159 {
160 //----- End of modeling
161 // !EndModeling, !DrawAll, !CloseDevice,
162 // close g4.prim
163 fSceneHandler.FREndModeling();
164
165 //----- Output DAWN GUI file
167
168 //----- string for viewer invocation
169 if ( !strcmp( fG4PrimViewer, "NONE" ) ) {
170
171 strcpy( fG4PrimViewerInvocation, "" );
172 } else {
173
174 strcpy( fG4PrimViewerInvocation, fG4PrimViewer );
175 strcat( fG4PrimViewerInvocation, " ");
176 strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() );
177 }
178
179
180 //----- Invoke DAWN
181 G4cout << G4endl ;
182 if( false == G4FRofstream::DoesFileExist( fSceneHandler.GetG4PrimFileName() ) )
183 {
184 G4cout << "ERROR: Failed to generate file ";
185 G4cout << fSceneHandler.GetG4PrimFileName() << G4endl;
186
187 } else if( strcmp( GetG4PrimViewerInvocation(), "" ) )
188 {
189 G4cout << "File " << fSceneHandler.GetG4PrimFileName() ;
190 G4cout << " is generated." << G4endl;
192 int iErr = system( GetG4PrimViewerInvocation() );
193 if ( iErr != 0) {
195 ed << "Error " << iErr
196 << " when calling system with \"" << GetG4PrimViewerInvocation()
197 << "\".";
198 G4Exception("G4DAWNFILEViewer::ShowView()",
199 "dawn0005", JustWarning, ed);
200 }
201
202 } else { // no view, i.e., only file generation
203 G4cout << "File " << fSceneHandler.GetG4PrimFileName() ;
204 G4cout << " is generated." << G4endl;
205 G4cout << "No viewer is invoked." << G4endl;
206 }
207
208 }
209
210} // G4DAWNFILEViewer::ShowView()
211
212
213 //----- G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out )
215{
216///////////////////////
217//#if defined DEBUG_FR_VIEW
218// G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl;
219//#endif
220//////////////////////
221
222 G4int style = fVP.GetDrawingStyle();
223
224 enum { FR_WIREFRAME_STYLE = 1, FR_WF_STORED_STYLE = 2,
225 FR_HID_STYLE = 3, FR_HID2_STYLE = 4,
226 FR_HID3_STYLE = 5, FR_DRAWING_MODE_END_STYLE = 6 };
227
228 switch( style )
229 {
231 out << FR_WIREFRAME_STYLE << G4endl;
232 break;
234 out << FR_HID2_STYLE << G4endl; // LINE
235 break;
238 out << FR_HID_STYLE << G4endl; // SURFACE
239 break;
240 default:
241 out << FR_WIREFRAME_STYLE << G4endl;
242 break;
243 }
244
245} // G4DAWNFILEViewer::SendDrawingStyle()
246
247
248
249//-----
251{
252 // Calculates view representation based on extent of object being
253 // viewed and (initial) direction of camera. (Note: it can change
254 // later due to user interaction via visualization system's GUI.)
255
256#if defined DEBUG_FR_VIEW
258 G4cout << "***** G4DAWNFILEViewer::SendViewParameters() ";
259 G4cout << "(GUI parameters)" << G4endl;
260 }
261#endif
262
263 //----- Magic number to decide camera distance automatically
264 const G4double HOW_FAR = 1000.0 ; // to define "infinity"
265 const G4double MIN_HALF_ANGLE = 0.01 ;
266 const G4double MAX_HALF_ANGLE = 0.499 * pi ;
267
268 //----- CALC camera distance
269 //..... Note: Camera cannot enter inside object
270 G4double camera_distance ;
271 G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
272
273 G4double half_view_angle = std::fabs ( fVP.GetFieldHalfAngle () ) ;
274 if( half_view_angle > MAX_HALF_ANGLE ) {
275 half_view_angle = MAX_HALF_ANGLE ;
276 }
277
278 if( half_view_angle < MIN_HALF_ANGLE ) {
279 //----- infinity (or ortho projection)
280 camera_distance = radius * HOW_FAR ;
281 } else {
282 //----- Calc camera distance from half view angle
283 camera_distance = radius / std::sin ( half_view_angle );
284 camera_distance -= fVP.GetDolly();
285 }
286
287 if ( camera_distance < radius ) {
289 G4cout << "WARNING from DAWNFILE driver:" << G4endl;
290 G4cout << " Camera cannot enter inside objects" << G4endl;
291 }
292 camera_distance = radius ;
293 }
294
295 //----- CALC camera direction
296 const G4Vector3D& camera_direction \
298 const G4double v_angle = (180.0 / pi) * camera_direction.theta() ;
299 const G4double h_angle = (180.0 / pi) * camera_direction.phi () ;
300
301
302 //########### Generation of the file .DAWN.history for DAWN GUI
303 //-----
304 std::ofstream gui_out (".DAWN_1.history") ;
305
306 // ######### P1
307
308 //----- camera position
309 gui_out << camera_distance << G4endl;
310 gui_out << v_angle << G4endl ;
311 gui_out << h_angle << G4endl ;
312 gui_out << "0" << G4endl ; // auto target
313
314 //----- target point
315 const G4Point3D& target_point
316 = fSceneHandler.GetScene()->GetStandardTargetPoint()
318 gui_out << target_point.x() << G4endl ;
319 gui_out << target_point.y() << G4endl ;
320 gui_out << target_point.z() << G4endl ;
321
322 //----- Magnification
323 const G4double zoom_factor = fVP.GetZoomFactor();
324 if( half_view_angle < MIN_HALF_ANGLE ) {
325
326 gui_out << zoom_factor << G4endl;
327
328 } else {
329 const G4double FR_HALF_SCREEN_SIZE = 0.5 ;
330 G4double focal_distance \
331 = FR_HALF_SCREEN_SIZE / std::tan( half_view_angle );
332 focal_distance *= zoom_factor ;
333
334 gui_out << "fd" << focal_distance << G4endl;
335
336 }
337 SendDrawingStyleToDAWNGUI( gui_out ) ; // gui_out, viewing mode
338 gui_out << "0.001" << G4endl ; // 3D Tolerance
339 gui_out << "0" << G4endl ; // not display parameters
340
341
342 // ######### P2
343 gui_out << 1 << G4endl; // Source light
344 gui_out << 1 << G4endl;
345 gui_out << 1 << G4endl;
346 gui_out << 0.5 << G4endl; // Ambient light
347 gui_out << 0.5 << G4endl;
348 gui_out << 0.5 << G4endl;
349 gui_out << 19.0 << G4endl; // Light direction (Polar)
350 gui_out << 71.0 << G4endl; // Light direction (Azimuthal)
351
352 // ######### P3
353 gui_out << 0.1 << G4endl; // Real edge width
354 gui_out << 0.1 << G4endl; // outline width
355 gui_out << 0.1 << G4endl; // aux edge width
356 gui_out << 3 << G4endl; // aux edge style
357 gui_out << 70.0<< G4endl; // aux-edge threshold angle
358 gui_out << 0.1 << G4endl; // line width
359 gui_out << 0 << G4endl; // haloing
360 gui_out << 1 << G4endl; // Dashed edged for back faces
361
362 //######### P4
363 //----- drawing device
364 // enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6};
365 if( ( ( std::getenv( FR_ENV_MULTI_WINDOW ) != NULL ) && \
366 ( strcmp( std::getenv( FR_ENV_MULTI_WINDOW ),"0" ) ) ) || \
367 ( ( std::getenv( FR_ENV_MULTI_WINDOW2 ) != NULL ) && \
368 ( strcmp( std::getenv( FR_ENV_MULTI_WINDOW2 ),"0" ) ) ) )
369 {
370 gui_out << 2 << G4endl; // OpenWindow
371 } else {
372 gui_out << 1 << G4endl; // Invoke PS viewer
373 }
374
375 gui_out << GetPSViewer() << G4endl; // PS viewer
376 gui_out << 1 << G4endl ; // Do not add showpage
377 gui_out << 0 << G4endl ; // Non-append mode
378
379 gui_out.close();
380 //########### end of generating file .DAWN.history
381
382
383}
const char FR_ENV_MULTI_WINDOW2[]
const char FR_ENV_MULTI_WINDOW[]
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
const char FR_G4_PRIM_HEADER[]
Definition: G4FRConst.hh:37
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void SendStr(const char *char_string)
G4DAWNFILEViewer(G4DAWNFILESceneHandler &scene, const G4String &name="")
virtual ~G4DAWNFILEViewer()
const char * GetG4PrimViewerInvocation()
void SendDrawingStyleToDAWNGUI(std::ostream &out)
const char * GetPSViewer()
void Open(const char *filename)
Definition: G4FRofstream.hh:73
G4bool IsOpen()
Definition: G4FRofstream.hh:59
static G4bool DoesFileExist(const char *filename)
Definition: G4FRofstream.hh:98
const G4VisExtent & GetExtent() const
const G4Point3D & GetStandardTargetPoint() const
G4Scene * GetScene() const
void ProcessView()
Definition: G4VViewer.cc:104
void NeedKernelVisit()
Definition: G4VViewer.cc:77
G4ViewParameters fVP
Definition: G4VViewer.hh:219
const G4Vector3D & GetViewpointDirection() const
const G4Point3D & GetCurrentTargetPoint() const
G4double GetFieldHalfAngle() const
G4double GetZoomFactor() const
DrawingStyle GetDrawingStyle() const
G4double GetDolly() const
G4double GetExtentRadius() const
Definition: G4VisExtent.cc:75
static Verbosity GetVerbosity()
BasicVector3D< T > unit() const