Geant4 Cross Reference |
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" 47 #include "G4PhysicalConstants.hh" 48 49 #include "G4FRConst.hh" 50 #include "G4DAWNFILE.hh" 51 #include "G4DAWNFILESceneHandler.hh" 52 #include "G4DAWNFILEViewer.hh" 53 54 //----- constants 55 const char FR_ENV_MULTI_WINDOW[] = "G4DAWN_MULTI_WINDOW"; 56 const char FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW"; 57 58 //----- G4DAWNFILEViewer, constructor 59 G4DAWNFILEViewer::G4DAWNFILEViewer(G4DAWNFILESceneHandler& sceneHandler, 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 93 G4DAWNFILEViewer::~G4DAWNFILEViewer() {} 94 95 //----- G4DAWNFILEViewer::SetView () 96 void G4DAWNFILEViewer::SetView() 97 { 98 #if defined DEBUG_FR_VIEW 99 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 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() 107 void G4DAWNFILEViewer::ClearView(void) 108 { 109 #if defined DEBUG_FR_VIEW 110 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 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 () 125 void G4DAWNFILEViewer::DrawView() 126 { 127 #if defined DEBUG_FR_VIEW 128 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 129 G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl; 130 #endif 131 //----- 132 fSceneHandler.FRBeginModeling(); 133 134 //----- Always visit G4 kernel 135 NeedKernelVisit(); 136 137 //----- Draw 138 ProcessView(); 139 140 } // G4DAWNFILEViewer::DrawView () 141 142 //----- G4DAWNFILEViewer::ShowView() 143 void G4DAWNFILEViewer::ShowView(void) 144 { 145 #if defined DEBUG_FR_VIEW 146 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 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 158 SendViewParameters(); 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; 183 G4cout << GetG4PrimViewerInvocation() << G4endl; 184 int iErr = system(GetG4PrimViewerInvocation()); 185 if(iErr != 0) 186 { 187 G4ExceptionDescription ed; 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 ) 205 void 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 { 227 case G4ViewParameters::wireframe: 228 out << FR_WIREFRAME_STYLE << G4endl; 229 break; 230 case G4ViewParameters::hlr: 231 out << FR_HID2_STYLE << G4endl; // LINE 232 break; 233 case G4ViewParameters::hsr: 234 case G4ViewParameters::hlhsr: 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 //----- 245 void G4DAWNFILEViewer::SendViewParameters() 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 252 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 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 { 289 if(G4VisManager::GetVerbosity() >= G4VisManager::errors) 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() + 317 fVP.GetCurrentTargetPoint(); 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 } 382