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 26 /// \file visualization/perspective/src/PerspectiveVisAction.cc 27 /// \brief Implementation of the PerspectiveVi 27 /// \brief Implementation of the PerspectiveVisAction class 28 // 28 // 29 // 29 // >> 30 // $Id: PerspectiveVisAction.cc 69587 2013-05-08 14:26:03Z gcosmo $ 30 31 31 #include "PerspectiveVisAction.hh" 32 #include "PerspectiveVisAction.hh" 32 33 33 #include "PerspectiveVisActionMessenger.hh" 34 #include "PerspectiveVisActionMessenger.hh" 34 << 35 #include "G4VVisManager.hh" >> 36 #include "G4VisAttributes.hh" 35 #include "G4Box.hh" 37 #include "G4Box.hh" 36 #include "G4Point3D.hh" << 37 #include "G4Polyhedron.hh" << 38 #include "G4Polyline.hh" 38 #include "G4Polyline.hh" 39 #include "G4SystemOfUnits.hh" << 39 #include "G4Polyhedron.hh" 40 #include "G4VVisManager.hh" << 41 #include "G4Vector3D.hh" 40 #include "G4Vector3D.hh" 42 #include "G4VisAttributes.hh" << 41 #include "G4Point3D.hh" >> 42 #include "G4SystemOfUnits.hh" 43 43 44 //....oooOO0OOooo........oooOO0OOooo........oo 44 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 45 45 46 PerspectiveVisAction::PerspectiveVisAction() << 46 PerspectiveVisAction::PerspectiveVisAction(): 47 : G4VUserVisAction(), << 47 G4VUserVisAction(), 48 fpVisManager(0), << 48 fpVisManager(0), 49 fOptionString("none"), << 49 fOptionString("none"), 50 fScene("room-and-chair"), << 50 fScene("room-and-chair"), 51 fRoomX(2.5 * m), // Half-lengths... << 51 fRoomX(2.5*m), // Half-lengths... 52 fRoomY(2.5 * m), << 52 fRoomY(2.5*m), 53 fRoomZ(1.3 * m), << 53 fRoomZ(1.3*m), 54 fWindowX(10 * cm), << 54 fWindowX(10*cm), 55 fWindowY(75 * cm), << 55 fWindowY(75*cm), 56 fWindowZ(50 * cm), << 56 fWindowZ(50*cm), 57 fWindowSillHeight(80 * cm), << 57 fWindowSillHeight(80*cm), 58 fWindowOffset(-50 * cm), << 58 fWindowOffset(-50*cm), 59 fDoorFrameX(10 * cm), << 59 fDoorFrameX(10*cm), 60 fDoorFrameY(50 * cm), << 60 fDoorFrameY(50*cm), 61 fDoorFrameZ(1 * m), << 61 fDoorFrameZ(1*m), 62 fDoorFrameOffset(1.5 * m), << 62 fDoorFrameOffset(1.5*m), 63 fDoorX(2 * cm), << 63 fDoorX(2*cm), 64 fDoorY(50 * cm), << 64 fDoorY(50*cm), 65 fDoorZ(1 * m), << 65 fDoorZ(1*m), 66 fChairX(20 * cm), // Half overall width. << 66 fChairX(20*cm), // Half overall width. 67 fChairY(20 * cm), // Half overall depth. << 67 fChairY(20*cm), // Half overall depth. 68 fChairZ(45 * cm), // Half overall height. << 68 fChairZ(45*cm), // Half overall height. 69 fChairSeat(20 * cm), // Half height of to << 69 fChairSeat(20*cm), // Half height of top of seat. 70 fChairThickness(3. * cm) // Half thicknes << 70 fChairThickness(3.*cm) // Half thicknes of back, seat, legs. 71 { 71 { 72 new PerspectiveVisActionMessenger(this); 72 new PerspectiveVisActionMessenger(this); 73 } 73 } 74 74 75 //....oooOO0OOooo........oooOO0OOooo........oo 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 76 77 void PerspectiveVisAction::Draw() 77 void PerspectiveVisAction::Draw() 78 { 78 { 79 fpVisManager = G4VVisManager::GetConcreteIns 79 fpVisManager = G4VVisManager::GetConcreteInstance(); 80 if (fpVisManager) { 80 if (fpVisManager) { >> 81 81 // All scenes assume upvector z and origin 82 // All scenes assume upvector z and origin on "floor"... 82 83 83 if (fScene == "room-and-chair") { << 84 if (fScene == "room-and-chair" ) 84 RoomAndChair(); << 85 { 85 } << 86 RoomAndChair(); >> 87 } 86 } 88 } 87 } 89 } 88 90 89 //....oooOO0OOooo........oooOO0OOooo........oo 91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 92 91 void PerspectiveVisAction::RoomAndChair() 93 void PerspectiveVisAction::RoomAndChair() 92 { 94 { 93 // Simple box, size of a room, translated so 95 // Simple box, size of a room, translated so origin is on xy "floor"... 94 G4VisAttributes room_visAtts(G4Colour::Red() 96 G4VisAttributes room_visAtts(G4Colour::Red()); 95 room_visAtts.SetForceWireframe(true); 97 room_visAtts.SetForceWireframe(true); 96 ExtendedDraw(G4Box("box", fRoomX, fRoomY, fR << 98 ExtendedDraw >> 99 (G4Box("box",fRoomX,fRoomY,fRoomZ), room_visAtts, G4TranslateZ3D(fRoomZ)); 97 100 98 // Windows... 101 // Windows... 99 G4Box("window", fWindowX, fWindowY, fWindowZ << 102 G4Box ("window",fWindowX,fWindowY,fWindowZ); 100 ExtendedDraw(G4Box("window-x", fWindowX, fWi << 103 ExtendedDraw 101 G4Translate3D(-fRoomX - fWindow << 104 (G4Box("window-x",fWindowX,fWindowY,fWindowZ), 102 ExtendedDraw(G4Box("window-y1", fWindowX, fW << 105 room_visAtts, 103 G4Translate3D(0., -fRoomY - fWi << 106 G4Translate3D(-fRoomX - fWindowX, fWindowOffset, fWindowY + fWindowSillHeight)); 104 * G4RotateZ3D(90. * deg)); << 107 ExtendedDraw 105 ExtendedDraw(G4Box("window-y2", fWindowX, fW << 108 (G4Box("window-y1",fWindowX,fWindowY,fWindowZ), 106 G4Translate3D(0., fRoomY + fWin << 109 room_visAtts, 107 * G4RotateZ3D(-90. * deg)); << 110 G4Translate3D(0., -fRoomY - fWindowX, fWindowY + fWindowSillHeight) * >> 111 G4RotateZ3D(90.*deg)); >> 112 ExtendedDraw >> 113 (G4Box("window-y2",fWindowX,fWindowY,fWindowZ), >> 114 room_visAtts, >> 115 G4Translate3D(0., fRoomY + fWindowX, fWindowY + fWindowSillHeight) * >> 116 G4RotateZ3D(-90.*deg)); 108 117 109 // Door... 118 // Door... 110 ExtendedDraw(G4Box("door-frame", fDoorFrameX << 119 ExtendedDraw 111 G4Translate3D(-fRoomX - fDoorFr << 120 (G4Box("door-frame",fDoorFrameX,fDoorFrameY,fDoorFrameZ), 112 ExtendedDraw(G4Box("door", fDoorX, fDoorY, f << 121 room_visAtts, 113 G4Translate3D(-fRoomX - fDoorX, << 122 G4Translate3D(-fRoomX - fDoorFrameX, fDoorFrameOffset, fDoorFrameZ)); 114 * G4RotateZ3D(60. * deg) << 123 ExtendedDraw 115 * G4TranslateY3D(-fDoorY)); << 124 (G4Box("door",fDoorX,fDoorY,fDoorZ), >> 125 room_visAtts, >> 126 G4Translate3D(-fRoomX - fDoorX, fDoorFrameOffset, fDoorZ) * >> 127 G4TranslateY3D(fDoorY) * >> 128 G4RotateZ3D(60.*deg) * >> 129 G4TranslateY3D(-fDoorY)); // Last transform operates first. 116 130 117 // Chair... 131 // Chair... 118 G4VisAttributes chair_visAtts(G4Colour::Cyan 132 G4VisAttributes chair_visAtts(G4Colour::Cyan()); 119 G4Transform3D A = G4RotateZ3D(90. * deg); / << 133 G4Transform3D A = G4RotateZ3D(90.*deg); // Turn through 90 deg. 120 G4Transform3D B = G4RotateY3D(90. * deg); / << 134 G4Transform3D B = G4RotateY3D(90.*deg); // Lie down. 121 G4Transform3D C = G4RotateZ3D(-20. * deg); << 135 G4Transform3D C = G4RotateZ3D(-20.*deg) ; // Rotate a little. 122 G4Transform3D D = G4TranslateZ3D(fChairY); << 136 G4Transform3D D = G4TranslateZ3D(fChairY); // Place on floor. 123 G4Transform3D E = G4TranslateY3D(-0.5 * fRoo 137 G4Transform3D E = G4TranslateY3D(-0.5 * fRoomY); // Move over to the left... 124 G4Transform3D chair_transform = E * D * C * << 138 G4Transform3D chair_transform = E*D*C*B*A; 125 Chair(chair_visAtts, chair_transform); 139 Chair(chair_visAtts, chair_transform); 126 } 140 } 127 141 128 //....oooOO0OOooo........oooOO0OOooo........oo 142 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 129 143 130 void PerspectiveVisAction::Chair(const G4VisAt << 144 void PerspectiveVisAction::Chair >> 145 (const G4VisAttributes& visAtts, >> 146 const G4Transform3D& transform) 131 { 147 { 132 // Origin is on floor, z = 0, and in the xy 148 // Origin is on floor, z = 0, and in the xy centre... 133 ExtendedDraw(G4Box("chair-back", fChairX, fC << 149 ExtendedDraw 134 transform * G4Translate3D(0., - << 150 (G4Box("chair-back",fChairX, fChairThickness, fChairZ - fChairSeat), 135 ExtendedDraw(G4Box("chair-seat", fChairX, fC << 151 visAtts, transform * 136 transform * G4TranslateZ3D(-fCh << 152 G4Translate3D(0.,-fChairY + fChairThickness, fChairZ + fChairSeat)); 137 for (int i = -1; i < 2; i += 2) { << 153 ExtendedDraw 138 for (int j = -1; j < 2; j += 2) { << 154 (G4Box("chair-seat",fChairX, fChairY, fChairThickness), 139 ExtendedDraw( << 155 visAtts, transform * G4TranslateZ3D(-fChairThickness + 2.* fChairSeat)); 140 G4Box("chair-leg", fChairThickness, fC << 156 for (int i = -1; i < 2; i+=2) { 141 transform << 157 for (int j = -1; j < 2; j+=2) { 142 * G4Translate3D(i * (fChairX - fChai << 158 ExtendedDraw 143 fChairSeat - fChairT << 159 (G4Box("chair-leg",fChairThickness, >> 160 fChairThickness, >> 161 fChairSeat - fChairThickness), >> 162 visAtts, transform * >> 163 G4Translate3D(i * (fChairX - fChairThickness), >> 164 j * (fChairY - fChairThickness), >> 165 fChairSeat - fChairThickness)); 144 } 166 } 145 } 167 } 146 } 168 } 147 169 148 //....oooOO0OOooo........oooOO0OOooo........oo 170 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 149 171 150 void PerspectiveVisAction::ExtendedDraw(const << 172 void PerspectiveVisAction::ExtendedDraw 151 const << 173 (const G4VSolid& solid, >> 174 const G4VisAttributes& visAtts, >> 175 const G4Transform3D& transform) 152 { 176 { 153 static const G4double extender = 100. * m; << 177 static const G4double extender = 100.*m; 154 static const G4Vector3D x(1, 0, 0); << 178 static const G4Vector3D x(1,0,0); 155 static const G4Vector3D y(0, 1, 0); << 179 static const G4Vector3D y(0,1,0); 156 static const G4Vector3D z(0, 0, 1); << 180 static const G4Vector3D z(0,0,1); 157 181 158 // Draw extended edges as requested... 182 // Draw extended edges as requested... 159 G4bool any = false, A = false, X = false, Y 183 G4bool any = false, A = false, X = false, Y = false, Z = false; 160 if (G4StrUtil::contains(fOptionString, "a")) << 184 if (fOptionString.contains("a")) {A = true; any = true;} 161 A = true; << 185 if (fOptionString.contains("x")) {X = true; any = true;} 162 any = true; << 186 if (fOptionString.contains("y")) {Y = true; any = true;} 163 } << 187 if (fOptionString.contains("z")) {Z = true; any = true;} 164 if (G4StrUtil::contains(fOptionString, "x")) << 188 if (any) 165 X = true; << 189 { 166 any = true; << 190 G4Polyhedron* polyhedron = solid.GetPolyhedron(); 167 } << 191 G4bool isAuxEdgeVisible = false; // How do I pick this up??? Can't. 168 if (G4StrUtil::contains(fOptionString, "y")) << 192 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 { 193 do { 186 G4Point3D v1, v2; << 194 G4int n; 187 G4int edgeFlag; << 195 G4Point3D nodes[4]; 188 notLastEdge = polyhedron->GetNextEdge( << 196 notLastFace = polyhedron->GetNextFacet(n, nodes); 189 if (isAuxEdgeVisible || edgeFlag > 0) << 197 G4bool notLastEdge; 190 G4Vector3D v21 = v2 - v1; << 198 do { 191 // Check for components of actual ed << 199 G4Point3D v1, v2; 192 G4Vector3D v21a = v21; << 200 G4int edgeFlag; 193 v21a.transform(transform); << 201 notLastEdge = polyhedron->GetNextEdge(v1, v2, edgeFlag); 194 // G4cout << "v21a: " << v21a << G4e << 202 if (isAuxEdgeVisible || edgeFlag > 0) { 195 using namespace std; << 203 G4Vector3D v21 = v2 - v1; 196 if (A || (Z && abs(v21a.z()) > sqrt( << 204 // Check for components of actual edge... 197 || (X && abs(v21a.x()) > sqrt(v2 << 205 G4Vector3D v21a = v21; 198 || (Y && abs(v21a.y()) > sqrt(v2 << 206 v21a.transform(transform); 199 { << 207 // G4cout << "v21a: " << v21a << G4endl; 200 G4Polyline edge; << 208 using namespace std; 201 edge.SetVisAttributes(G4Colour(.2, << 209 if (A || 202 edge.push_back(v1 - extender * v21 << 210 (Z && abs(v21a.z()) > 203 edge.push_back(v2 + extender * v21 << 211 sqrt(v21a.x()*v21a.x()+v21a.y()*v21a.y())) || 204 fpVisManager->Draw(edge, transform << 212 (X && abs(v21a.x()) > >> 213 sqrt(v21a.y()*v21a.y()+v21a.z()*v21a.z())) || >> 214 (Y && abs(v21a.y()) > >> 215 sqrt(v21a.x()*v21a.x()+v21a.x()*v21a.z()))) { >> 216 G4Polyline edge; >> 217 edge.SetVisAttributes(G4Colour(.2,.2,.2)); >> 218 edge.push_back(v1 - extender * v21.unit()); >> 219 edge.push_back(v2 + extender * v21.unit()); >> 220 fpVisManager->Draw(edge, transform); >> 221 } 205 } 222 } 206 } << 223 } while (notLastEdge); 207 } while (notLastEdge); << 224 } while (notLastFace); 208 } while (notLastFace); << 225 } 209 } << 210 226 211 // Draw actual object... 227 // Draw actual object... 212 fpVisManager->Draw(solid, visAtts, transform 228 fpVisManager->Draw(solid, visAtts, transform); 213 } 229 } 214 230 215 //....oooOO0OOooo........oooOO0OOooo........oo 231 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 216 232