Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /// \file visualization/perspective/src/Perspe << 27 /// \brief Implementation of the PerspectiveVi << 28 // << 29 // 26 // >> 27 // $Id: PerspectiveVisAction.cc,v 1.2 2006/06/29 17:45:48 gunter Exp $ >> 28 // GEANT4 tag $Name: geant4-09-02 $ 30 29 31 #include "PerspectiveVisAction.hh" 30 #include "PerspectiveVisAction.hh" 32 31 33 #include "PerspectiveVisActionMessenger.hh" 32 #include "PerspectiveVisActionMessenger.hh" 34 << 33 #include "G4VVisManager.hh" >> 34 #include "G4VisAttributes.hh" 35 #include "G4Box.hh" 35 #include "G4Box.hh" 36 #include "G4Point3D.hh" << 37 #include "G4Polyhedron.hh" << 38 #include "G4Polyline.hh" 36 #include "G4Polyline.hh" 39 #include "G4SystemOfUnits.hh" << 37 #include "G4Polyhedron.hh" 40 #include "G4VVisManager.hh" << 41 #include "G4Vector3D.hh" 38 #include "G4Vector3D.hh" 42 #include "G4VisAttributes.hh" << 39 #include "G4Point3D.hh" 43 << 44 //....oooOO0OOooo........oooOO0OOooo........oo << 45 40 46 PerspectiveVisAction::PerspectiveVisAction() << 41 PerspectiveVisAction::PerspectiveVisAction(): 47 : G4VUserVisAction(), << 42 fpVisManager(0), 48 fpVisManager(0), << 43 fOptionString("none"), 49 fOptionString("none"), << 44 fScene("room-and-chair"), 50 fScene("room-and-chair"), << 45 fRoomX(2.5*m), // Half-lengths... 51 fRoomX(2.5 * m), // Half-lengths... << 46 fRoomY(2.5*m), 52 fRoomY(2.5 * m), << 47 fRoomZ(1.3*m), 53 fRoomZ(1.3 * m), << 48 fWindowX(10*cm), 54 fWindowX(10 * cm), << 49 fWindowY(75*cm), 55 fWindowY(75 * cm), << 50 fWindowZ(50*cm), 56 fWindowZ(50 * cm), << 51 fWindowSillHeight(80*cm), 57 fWindowSillHeight(80 * cm), << 52 fWindowOffset(-50*cm), 58 fWindowOffset(-50 * cm), << 53 fDoorFrameX(10*cm), 59 fDoorFrameX(10 * cm), << 54 fDoorFrameY(50*cm), 60 fDoorFrameY(50 * cm), << 55 fDoorFrameZ(1*m), 61 fDoorFrameZ(1 * m), << 56 fDoorFrameOffset(1.5*m), 62 fDoorFrameOffset(1.5 * m), << 57 fDoorX(2*cm), 63 fDoorX(2 * cm), << 58 fDoorY(50*cm), 64 fDoorY(50 * cm), << 59 fDoorZ(1*m), 65 fDoorZ(1 * m), << 60 fChairX(20*cm), // Half overall width. 66 fChairX(20 * cm), // Half overall width. << 61 fChairY(20*cm), // Half overall depth. 67 fChairY(20 * cm), // Half overall depth. << 62 fChairZ(45*cm), // Half overall height. 68 fChairZ(45 * cm), // Half overall height. << 63 fChairSeat(20*cm), // Half height of top of seat. 69 fChairSeat(20 * cm), // Half height of to << 64 fChairThickness(3.*cm) // Half thicknes of back, seat, legs. 70 fChairThickness(3. * cm) // Half thicknes << 71 { 65 { 72 new PerspectiveVisActionMessenger(this); 66 new PerspectiveVisActionMessenger(this); 73 } 67 } 74 68 75 //....oooOO0OOooo........oooOO0OOooo........oo << 76 << 77 void PerspectiveVisAction::Draw() 69 void PerspectiveVisAction::Draw() 78 { 70 { 79 fpVisManager = G4VVisManager::GetConcreteIns 71 fpVisManager = G4VVisManager::GetConcreteInstance(); 80 if (fpVisManager) { 72 if (fpVisManager) { >> 73 81 // All scenes assume upvector z and origin 74 // All scenes assume upvector z and origin on "floor"... 82 75 83 if (fScene == "room-and-chair") { << 76 if (fScene == "room-and-chair" ) 84 RoomAndChair(); << 77 { 85 } << 78 RoomAndChair(); >> 79 } 86 } 80 } 87 } 81 } 88 82 89 //....oooOO0OOooo........oooOO0OOooo........oo << 90 << 91 void PerspectiveVisAction::RoomAndChair() 83 void PerspectiveVisAction::RoomAndChair() 92 { 84 { 93 // Simple box, size of a room, translated so 85 // Simple box, size of a room, translated so origin is on xy "floor"... 94 G4VisAttributes room_visAtts(G4Colour::Red() 86 G4VisAttributes room_visAtts(G4Colour::Red()); 95 room_visAtts.SetForceWireframe(true); 87 room_visAtts.SetForceWireframe(true); 96 ExtendedDraw(G4Box("box", fRoomX, fRoomY, fR << 88 ExtendedDraw >> 89 (G4Box("box",fRoomX,fRoomY,fRoomZ), room_visAtts, G4TranslateZ3D(fRoomZ)); 97 90 98 // Windows... 91 // Windows... 99 G4Box("window", fWindowX, fWindowY, fWindowZ << 92 G4Box ("window",fWindowX,fWindowY,fWindowZ); 100 ExtendedDraw(G4Box("window-x", fWindowX, fWi << 93 ExtendedDraw 101 G4Translate3D(-fRoomX - fWindow << 94 (G4Box("window-x",fWindowX,fWindowY,fWindowZ), 102 ExtendedDraw(G4Box("window-y1", fWindowX, fW << 95 room_visAtts, 103 G4Translate3D(0., -fRoomY - fWi << 96 G4Translate3D(-fRoomX - fWindowX, fWindowOffset, fWindowY + fWindowSillHeight)); 104 * G4RotateZ3D(90. * deg)); << 97 ExtendedDraw 105 ExtendedDraw(G4Box("window-y2", fWindowX, fW << 98 (G4Box("window-y1",fWindowX,fWindowY,fWindowZ), 106 G4Translate3D(0., fRoomY + fWin << 99 room_visAtts, 107 * G4RotateZ3D(-90. * deg)); << 100 G4Translate3D(0., -fRoomY - fWindowX, fWindowY + fWindowSillHeight) * >> 101 G4RotateZ3D(90.*deg)); >> 102 ExtendedDraw >> 103 (G4Box("window-y2",fWindowX,fWindowY,fWindowZ), >> 104 room_visAtts, >> 105 G4Translate3D(0., fRoomY + fWindowX, fWindowY + fWindowSillHeight) * >> 106 G4RotateZ3D(-90.*deg)); 108 107 109 // Door... 108 // Door... 110 ExtendedDraw(G4Box("door-frame", fDoorFrameX << 109 ExtendedDraw 111 G4Translate3D(-fRoomX - fDoorFr << 110 (G4Box("door-frame",fDoorFrameX,fDoorFrameY,fDoorFrameZ), 112 ExtendedDraw(G4Box("door", fDoorX, fDoorY, f << 111 room_visAtts, 113 G4Translate3D(-fRoomX - fDoorX, << 112 G4Translate3D(-fRoomX - fDoorFrameX, fDoorFrameOffset, fDoorFrameZ)); 114 * G4RotateZ3D(60. * deg) << 113 ExtendedDraw 115 * G4TranslateY3D(-fDoorY)); << 114 (G4Box("door",fDoorX,fDoorY,fDoorZ), >> 115 room_visAtts, >> 116 G4Translate3D(-fRoomX - fDoorX, fDoorFrameOffset, fDoorZ) * >> 117 G4TranslateY3D(fDoorY) * >> 118 G4RotateZ3D(60.*deg) * >> 119 G4TranslateY3D(-fDoorY)); // Last transform operates first. 116 120 117 // Chair... 121 // Chair... 118 G4VisAttributes chair_visAtts(G4Colour::Cyan 122 G4VisAttributes chair_visAtts(G4Colour::Cyan()); 119 G4Transform3D A = G4RotateZ3D(90. * deg); / << 123 G4Transform3D A = G4RotateZ3D(90.*deg); // Turn through 90 deg. 120 G4Transform3D B = G4RotateY3D(90. * deg); / << 124 G4Transform3D B = G4RotateY3D(90.*deg); // Lie down. 121 G4Transform3D C = G4RotateZ3D(-20. * deg); << 125 G4Transform3D C = G4RotateZ3D(-20.*deg) ; // Rotate a little. 122 G4Transform3D D = G4TranslateZ3D(fChairY); << 126 G4Transform3D D = G4TranslateZ3D(fChairY); // Place on floor. 123 G4Transform3D E = G4TranslateY3D(-0.5 * fRoo 127 G4Transform3D E = G4TranslateY3D(-0.5 * fRoomY); // Move over to the left... 124 G4Transform3D chair_transform = E * D * C * << 128 G4Transform3D chair_transform = E*D*C*B*A; 125 Chair(chair_visAtts, chair_transform); 129 Chair(chair_visAtts, chair_transform); 126 } 130 } 127 131 128 //....oooOO0OOooo........oooOO0OOooo........oo << 132 void PerspectiveVisAction::Chair 129 << 133 (const G4VisAttributes& visAtts, 130 void PerspectiveVisAction::Chair(const G4VisAt << 134 const G4Transform3D& transform) 131 { 135 { 132 // Origin is on floor, z = 0, and in the xy 136 // Origin is on floor, z = 0, and in the xy centre... 133 ExtendedDraw(G4Box("chair-back", fChairX, fC << 137 ExtendedDraw 134 transform * G4Translate3D(0., - << 138 (G4Box("chair-back",fChairX, fChairThickness, fChairZ - fChairSeat), 135 ExtendedDraw(G4Box("chair-seat", fChairX, fC << 139 visAtts, transform * 136 transform * G4TranslateZ3D(-fCh << 140 G4Translate3D(0.,-fChairY + fChairThickness, fChairZ + fChairSeat)); 137 for (int i = -1; i < 2; i += 2) { << 141 ExtendedDraw 138 for (int j = -1; j < 2; j += 2) { << 142 (G4Box("chair-seat",fChairX, fChairY, fChairThickness), 139 ExtendedDraw( << 143 visAtts, transform * G4TranslateZ3D(-fChairThickness + 2.* fChairSeat)); 140 G4Box("chair-leg", fChairThickness, fC << 144 for (int i = -1; i < 2; i+=2) { 141 transform << 145 for (int j = -1; j < 2; j+=2) { 142 * G4Translate3D(i * (fChairX - fChai << 146 ExtendedDraw 143 fChairSeat - fChairT << 147 (G4Box("chair-leg",fChairThickness, >> 148 fChairThickness, >> 149 fChairSeat - fChairThickness), >> 150 visAtts, transform * >> 151 G4Translate3D(i * (fChairX - fChairThickness), >> 152 j * (fChairY - fChairThickness), >> 153 fChairSeat - fChairThickness)); 144 } 154 } 145 } 155 } 146 } 156 } 147 157 148 //....oooOO0OOooo........oooOO0OOooo........oo << 158 void PerspectiveVisAction::ExtendedDraw 149 << 159 (const G4VSolid& solid, 150 void PerspectiveVisAction::ExtendedDraw(const << 160 const G4VisAttributes& visAtts, 151 const << 161 const G4Transform3D& transform) 152 { 162 { 153 static const G4double extender = 100. * m; << 163 static const G4double extender = 100.*m; 154 static const G4Vector3D x(1, 0, 0); << 164 static const G4Vector3D x(1,0,0); 155 static const G4Vector3D y(0, 1, 0); << 165 static const G4Vector3D y(0,1,0); 156 static const G4Vector3D z(0, 0, 1); << 166 static const G4Vector3D z(0,0,1); 157 167 158 // Draw extended edges as requested... 168 // Draw extended edges as requested... 159 G4bool any = false, A = false, X = false, Y 169 G4bool any = false, A = false, X = false, Y = false, Z = false; 160 if (G4StrUtil::contains(fOptionString, "a")) << 170 if (fOptionString.contains("a")) {A = true; any = true;} 161 A = true; << 171 if (fOptionString.contains("x")) {X = true; any = true;} 162 any = true; << 172 if (fOptionString.contains("y")) {Y = true; any = true;} 163 } << 173 if (fOptionString.contains("z")) {Z = true; any = true;} 164 if (G4StrUtil::contains(fOptionString, "x")) << 174 if (any) 165 X = true; << 175 { 166 any = true; << 176 G4Polyhedron* polyhedron = solid.GetPolyhedron(); 167 } << 177 G4bool isAuxEdgeVisible = false; // How do I pick this up??? Can't. 168 if (G4StrUtil::contains(fOptionString, "y")) << 178 G4bool notLastFace; 169 Y = true; << 170 any = true; << 171 } << 172 if (G4StrUtil::contains(fOptionString, "z")) << 173 Z = true; << 174 any = true; << 175 } << 176 if (any) { << 177 G4Polyhedron* polyhedron = solid.GetPolyhe << 178 G4bool isAuxEdgeVisible = false; // How d << 179 G4bool notLastFace; << 180 do { << 181 G4int n; << 182 G4Point3D nodes[4]; << 183 notLastFace = polyhedron->GetNextFacet(n << 184 G4bool notLastEdge; << 185 do { 179 do { 186 G4Point3D v1, v2; << 180 G4int n; 187 G4int edgeFlag; << 181 G4Point3D nodes[4]; 188 notLastEdge = polyhedron->GetNextEdge( << 182 notLastFace = polyhedron->GetNextFacet(n, nodes); 189 if (isAuxEdgeVisible || edgeFlag > 0) << 183 G4bool notLastEdge; 190 G4Vector3D v21 = v2 - v1; << 184 do { 191 // Check for components of actual ed << 185 G4Point3D v1, v2; 192 G4Vector3D v21a = v21; << 186 G4int edgeFlag; 193 v21a.transform(transform); << 187 notLastEdge = polyhedron->GetNextEdge(v1, v2, edgeFlag); 194 // G4cout << "v21a: " << v21a << G4e << 188 if (isAuxEdgeVisible || edgeFlag > 0) { 195 using namespace std; << 189 G4Vector3D v21 = v2 - v1; 196 if (A || (Z && abs(v21a.z()) > sqrt( << 190 // Check for components of actual edge... 197 || (X && abs(v21a.x()) > sqrt(v2 << 191 G4Vector3D v21a = v21; 198 || (Y && abs(v21a.y()) > sqrt(v2 << 192 v21a.transform(transform); 199 { << 193 // G4cout << "v21a: " << v21a << G4endl; 200 G4Polyline edge; << 194 using namespace std; 201 edge.SetVisAttributes(G4Colour(.2, << 195 if (A || 202 edge.push_back(v1 - extender * v21 << 196 (Z && abs(v21a.z()) > 203 edge.push_back(v2 + extender * v21 << 197 sqrt(v21a.x()*v21a.x()+v21a.y()*v21a.y())) || 204 fpVisManager->Draw(edge, transform << 198 (X && abs(v21a.x()) > 205 } << 199 sqrt(v21a.y()*v21a.y()+v21a.z()*v21a.z())) || 206 } << 200 (Y && abs(v21a.y()) > 207 } while (notLastEdge); << 201 sqrt(v21a.x()*v21a.x()+v21a.x()*v21a.z()))) { 208 } while (notLastFace); << 202 G4Polyline edge; 209 } << 203 edge.SetVisAttributes(G4Colour(.2,.2,.2)); >> 204 edge.push_back(v1 - extender * v21.unit()); >> 205 edge.push_back(v2 + extender * v21.unit()); >> 206 fpVisManager->Draw(edge, transform); >> 207 } >> 208 } >> 209 } while (notLastEdge); >> 210 } while (notLastFace); >> 211 } 210 212 211 // Draw actual object... 213 // Draw actual object... 212 fpVisManager->Draw(solid, visAtts, transform 214 fpVisManager->Draw(solid, visAtts, transform); 213 } 215 } 214 << 215 //....oooOO0OOooo........oooOO0OOooo........oo << 216 216