Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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#define __G_ANSI_C__
32#define G4DAWNFILE_STRUCTURE_PRIORITY 1.
33
34// #define DEBUG_FR_VIEW
35
36#include "G4ios.hh"
37#include <stdio.h>
38#include <string.h>
39#include <assert.h>
40
41#include "G4VisManager.hh"
42#include "G4Scene.hh"
43#include "G4Vector3D.hh"
44#include "G4VisExtent.hh"
45#include "G4LogicalVolume.hh"
46#include "G4VSolid.hh"
48
49#include "G4FRConst.hh"
50#include "G4DAWNFILE.hh"
52#include "G4DAWNFILEViewer.hh"
53
54//----- constants
55const char FR_ENV_MULTI_WINDOW[] = "G4DAWN_MULTI_WINDOW";
56const char FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW";
57
58//----- G4DAWNFILEViewer, constructor
60 const G4String& name)
61 : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name)
62 , fSceneHandler(sceneHandler)
63{
64 // Set a g4.prim-file viewer
65 strcpy(fG4PrimViewer, "dawn");
66 if(std::getenv("G4DAWNFILE_VIEWER") != NULL)
67 {
68 strcpy(fG4PrimViewer, std::getenv("G4DAWNFILE_VIEWER"));
69 }
70
71 // string for viewer invocation
72 if(!strcmp(fG4PrimViewer, "NONE"))
73 {
74 strcpy(fG4PrimViewerInvocation, "");
75 }
76 else
77 {
78 strcpy(fG4PrimViewerInvocation, fG4PrimViewer);
79 strcat(fG4PrimViewerInvocation, " ");
80 strcat(fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName());
81 }
82
83 // Set a PostScript Viewer
84 // strcpy( fPSViewer, "ghostview" );
85 strcpy(fPSViewer, "gv");
86 if(std::getenv("G4DAWNFILE_PS_VIEWER") != NULL)
87 {
88 strcpy(fPSViewer, std::getenv("G4DAWNFILE_PS_VIEWER"));
89 }
90}
91
92//----- G4DAWNFILEViewer, destructor
94
95//----- G4DAWNFILEViewer::SetView ()
97{
98#if defined DEBUG_FR_VIEW
100 G4cout << "***** G4DAWNFILEViewer::SetView(): No effects" << G4endl;
101#endif
102 // Do nothing, since DAWN is running as a different process.
103 // SendViewParameters () will do this job instead.
104}
105
106//----- G4DAWNFILEViewer::ClearView()
108{
109#if defined DEBUG_FR_VIEW
111 G4cout << "***** G4DAWNFILEViewer::ClearView (): No effects " << G4endl;
112#endif
113 if(fSceneHandler.fPrimDest.IsOpen())
114 {
115 fSceneHandler.fPrimDest.Close();
116 // Re-open with same filename...
117 fSceneHandler.fPrimDest.Open(fSceneHandler.fG4PrimFileName);
118 fSceneHandler.SendStr(FR_G4_PRIM_HEADER);
119 fSceneHandler.FRflag_in_modeling = false;
120 fSceneHandler.FRBeginModeling();
121 }
122}
123
124//----- G4DAWNFILEViewer::DrawView ()
126{
127#if defined DEBUG_FR_VIEW
129 G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl;
130#endif
131 //-----
132 fSceneHandler.FRBeginModeling();
133
134 //----- Always visit G4 kernel
136
137 //----- Draw
138 ProcessView();
139
140} // G4DAWNFILEViewer::DrawView ()
141
142//----- G4DAWNFILEViewer::ShowView()
144{
145#if defined DEBUG_FR_VIEW
147 G4cout << "***** G4DAWNFILEViewer::ShowView () " << G4endl;
148#endif
149
150 if(fSceneHandler.FRIsInModeling())
151 {
152 //----- End of modeling
153 // !EndModeling, !DrawAll, !CloseDevice,
154 // close g4.prim
155 fSceneHandler.FREndModeling();
156
157 //----- Output DAWN GUI file
159
160 //----- string for viewer invocation
161 if(!strcmp(fG4PrimViewer, "NONE"))
162 {
163 strcpy(fG4PrimViewerInvocation, "");
164 }
165 else
166 {
167 strcpy(fG4PrimViewerInvocation, fG4PrimViewer);
168 strcat(fG4PrimViewerInvocation, " ");
169 strcat(fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName());
170 }
171
172 //----- Invoke DAWN
173 G4cout << G4endl;
174 if(false == G4FRofstream::DoesFileExist(fSceneHandler.GetG4PrimFileName()))
175 {
176 G4cout << "ERROR: Failed to generate file ";
177 G4cout << fSceneHandler.GetG4PrimFileName() << G4endl;
178 }
179 else if(strcmp(GetG4PrimViewerInvocation(), ""))
180 {
181 G4cout << "File " << fSceneHandler.GetG4PrimFileName();
182 G4cout << " is generated." << G4endl;
184 int iErr = system(GetG4PrimViewerInvocation());
185 if(iErr != 0)
186 {
188 ed << "Error " << iErr << " when calling system with \""
189 << GetG4PrimViewerInvocation() << "\".";
190 G4Exception("G4DAWNFILEViewer::ShowView()", "dawn0005", JustWarning,
191 ed);
192 }
193 }
194 else
195 { // no view, i.e., only file generation
196 G4cout << "File " << fSceneHandler.GetG4PrimFileName();
197 G4cout << " is generated." << G4endl;
198 G4cout << "No viewer is invoked." << G4endl;
199 }
200 }
201
202} // G4DAWNFILEViewer::ShowView()
203
204//----- G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out )
206{
207 ///////////////////////
208 //#if defined DEBUG_FR_VIEW
209 // G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl;
210 //#endif
211 //////////////////////
212
213 G4int style = fVP.GetDrawingStyle();
214
215 enum
216 {
217 FR_WIREFRAME_STYLE = 1,
218 FR_WF_STORED_STYLE = 2,
219 FR_HID_STYLE = 3,
220 FR_HID2_STYLE = 4,
221 FR_HID3_STYLE = 5,
222 FR_DRAWING_MODE_END_STYLE = 6
223 };
224
225 switch(style)
226 {
228 out << FR_WIREFRAME_STYLE << G4endl;
229 break;
231 out << FR_HID2_STYLE << G4endl; // LINE
232 break;
235 out << FR_HID_STYLE << G4endl; // SURFACE
236 break;
237 default:
238 out << FR_WIREFRAME_STYLE << G4endl;
239 break;
240 }
241
242} // G4DAWNFILEViewer::SendDrawingStyle()
243
244//-----
246{
247 // Calculates view representation based on extent of object being
248 // viewed and (initial) direction of camera. (Note: it can change
249 // later due to user interaction via visualization system's GUI.)
250
251#if defined DEBUG_FR_VIEW
253 {
254 G4cout << "***** G4DAWNFILEViewer::SendViewParameters() ";
255 G4cout << "(GUI parameters)" << G4endl;
256 }
257#endif
258
259 //----- Magic number to decide camera distance automatically
260 const G4double HOW_FAR = 1000.0; // to define "infinity"
261 const G4double MIN_HALF_ANGLE = 0.01;
262 const G4double MAX_HALF_ANGLE = 0.499 * pi;
263
264 //----- CALC camera distance
265 //..... Note: Camera cannot enter inside object
266 G4double camera_distance;
267 G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
268
269 G4double half_view_angle = std::fabs(fVP.GetFieldHalfAngle());
270 if(half_view_angle > MAX_HALF_ANGLE)
271 {
272 half_view_angle = MAX_HALF_ANGLE;
273 }
274
275 if(half_view_angle < MIN_HALF_ANGLE)
276 {
277 //----- infinity (or ortho projection)
278 camera_distance = radius * HOW_FAR;
279 }
280 else
281 {
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)
288 {
290 {
291 G4cout << "WARNING from DAWNFILE driver:" << G4endl;
292 G4cout << " Camera cannot enter inside objects" << G4endl;
293 }
294 camera_distance = radius;
295 }
296
297 //----- CALC camera direction
298 const G4Vector3D& camera_direction = fVP.GetViewpointDirection().unit();
299 const G4double v_angle = (180.0 / pi) * camera_direction.theta();
300 const G4double h_angle = (180.0 / pi) * camera_direction.phi();
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 {
330 const G4double FR_HALF_SCREEN_SIZE = 0.5;
331 G4double focal_distance = FR_HALF_SCREEN_SIZE / std::tan(half_view_angle);
332 focal_distance *= zoom_factor;
333
334 gui_out << "fd" << focal_distance << G4endl;
335 }
336 SendDrawingStyleToDAWNGUI(gui_out); // gui_out, viewing mode
337 gui_out << "0.001" << G4endl; // 3D Tolerance
338 gui_out << "0" << G4endl; // not display parameters
339
340 // ######### P2
341 gui_out << 1 << G4endl; // Source light
342 gui_out << 1 << G4endl;
343 gui_out << 1 << G4endl;
344 gui_out << 0.5 << G4endl; // Ambient light
345 gui_out << 0.5 << G4endl;
346 gui_out << 0.5 << G4endl;
347 gui_out << 19.0 << G4endl; // Light direction (Polar)
348 gui_out << 71.0 << G4endl; // Light direction (Azimuthal)
349
350 // ######### P3
351 gui_out << 0.1 << G4endl; // Real edge width
352 gui_out << 0.1 << G4endl; // outline width
353 gui_out << 0.1 << G4endl; // aux edge width
354 gui_out << 3 << G4endl; // aux edge style
355 gui_out << 70.0 << G4endl; // aux-edge threshold angle
356 gui_out << 0.1 << G4endl; // line width
357 gui_out << 0 << G4endl; // haloing
358 gui_out << 1 << G4endl; // Dashed edged for back faces
359
360 //######### P4
361 //----- drawing device
362 // enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6};
363 if(((std::getenv(FR_ENV_MULTI_WINDOW) != NULL) &&
364 (strcmp(std::getenv(FR_ENV_MULTI_WINDOW), "0"))) ||
365 ((std::getenv(FR_ENV_MULTI_WINDOW2) != NULL) &&
366 (strcmp(std::getenv(FR_ENV_MULTI_WINDOW2), "0"))))
367 {
368 gui_out << 2 << G4endl; // OpenWindow
369 }
370 else
371 {
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}
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:59
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:68
G4bool IsOpen()
Definition: G4FRofstream.hh:55
static G4bool DoesFileExist(const char *filename)
Definition: G4FRofstream.hh:94
const G4VisExtent & GetExtent() const
const G4Point3D & GetStandardTargetPoint() const
G4Scene * GetScene() const
void ProcessView()
Definition: G4VViewer.cc:107
void NeedKernelVisit()
Definition: G4VViewer.cc:80
G4ViewParameters fVP
Definition: G4VViewer.hh:220
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