Geant4-11
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 {
79 strcat(fG4PrimViewerInvocation, " ");
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
114 {
116 // Re-open with same filename...
121 }
122}
123
124//----- G4DAWNFILEViewer::DrawView ()
126{
127#if defined DEBUG_FR_VIEW
129 G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl;
130#endif
131 //-----
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
151 {
152 //----- End of modeling
153 // !EndModeling, !DrawAll, !CloseDevice,
154 // close g4.prim
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 {
168 strcat(fG4PrimViewerInvocation, " ");
170 }
171
172 //----- Invoke DAWN
173 G4cout << G4endl;
175 {
176 G4cout << "ERROR: Failed to generate file ";
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{
208 //#if defined DEBUG_FR_VIEW
209 // G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl;
210 //#endif
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;
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 =
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:35
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
const char FR_G4_PRIM_HEADER[]
Definition: G4FRConst.hh:37
static constexpr double pi
Definition: G4SIunits.hh:55
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)
G4DAWNFILESceneHandler & fSceneHandler
G4DAWNFILEViewer(G4DAWNFILESceneHandler &scene, const G4String &name="")
virtual ~G4DAWNFILEViewer()
const char * GetG4PrimViewerInvocation()
void SendDrawingStyleToDAWNGUI(std::ostream &out)
const char * GetPSViewer()
char fG4PrimViewerInvocation[64]
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:105
void NeedKernelVisit()
Definition: G4VViewer.cc:78
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
const char * name(G4int ptype)