source: trunk/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc@ 1350

Last change on this file since 1350 was 1347, checked in by garnier, 15 years ago

geant4 tag 9.4

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