1 | // this : |
---|
2 | #include <G4Lab/PhysicalVolumeAccessor.h> |
---|
3 | |
---|
4 | // Inventor : |
---|
5 | #include <Inventor/nodes/SoSeparator.h> |
---|
6 | |
---|
7 | #ifdef WIN32 |
---|
8 | #undef pascal // Clash between windef.h and Geant4/SystemOfUnits.hh |
---|
9 | #endif |
---|
10 | |
---|
11 | // Geant4 : |
---|
12 | #include <G4VPhysicalVolume.hh> |
---|
13 | #include <G4LogicalVolume.hh> |
---|
14 | #include <G4PhysicalVolumeStore.hh> |
---|
15 | #include <G4TransportationManager.hh> |
---|
16 | #include <G4Navigator.hh> |
---|
17 | |
---|
18 | // Lib : |
---|
19 | #include <Slash/Core/ISession.h> |
---|
20 | #include <Slash/Data/IIterator.h> |
---|
21 | #include <Lib/Out.h> |
---|
22 | #include <Lib/Value.h> |
---|
23 | #include <Lib/smanip.h> |
---|
24 | |
---|
25 | // G4Lab : |
---|
26 | #include <G4Lab/GeometryVisitor.h> |
---|
27 | #include <G4Lab/SoVisitedVolume.h> |
---|
28 | |
---|
29 | #define UNLIMITED (-1) |
---|
30 | |
---|
31 | ////////////////////////////////////////////////////////////////////////////// |
---|
32 | G4Lab::PhysicalVolumeAccessor::PhysicalVolumeAccessor( |
---|
33 | Slash::Core::ISession& aSession |
---|
34 | ) |
---|
35 | :OnX::InventorAccessor(aSession) |
---|
36 | ,fType("PV") |
---|
37 | ////////////////////////////////////////////////////////////////////////////// |
---|
38 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
39 | { |
---|
40 | //addProperty("id",Lib::Property::POINTER); |
---|
41 | addProperty("name",Lib::Property::STRING); |
---|
42 | addProperty("daughters",Lib::Property::INTEGER); |
---|
43 | } |
---|
44 | ////////////////////////////////////////////////////////////////////////////// |
---|
45 | G4Lab::PhysicalVolumeAccessor::~PhysicalVolumeAccessor( |
---|
46 | ) |
---|
47 | ////////////////////////////////////////////////////////////////////////////// |
---|
48 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
49 | { |
---|
50 | } |
---|
51 | ////////////////////////////////////////////////////////////////////////////// |
---|
52 | std::string G4Lab::PhysicalVolumeAccessor::name( |
---|
53 | ) const |
---|
54 | ////////////////////////////////////////////////////////////////////////////// |
---|
55 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
56 | { |
---|
57 | return fType; |
---|
58 | } |
---|
59 | namespace G4Lab { |
---|
60 | class PhysicalVolumeIterator : public virtual Slash::Data::IIterator { |
---|
61 | public: //Slash::Data::IIterator |
---|
62 | virtual Slash::Data::IAccessor::Data object() { |
---|
63 | if(fIterator==fVector.end()) return 0; |
---|
64 | return *fIterator; |
---|
65 | } |
---|
66 | virtual void next() { ++fIterator; } |
---|
67 | virtual void* tag() { return 0;} |
---|
68 | public: |
---|
69 | PhysicalVolumeIterator(G4PhysicalVolumeStore& aVector):fVector(aVector) { |
---|
70 | fIterator = fVector.begin(); |
---|
71 | } |
---|
72 | virtual ~PhysicalVolumeIterator() {} |
---|
73 | private: |
---|
74 | G4PhysicalVolumeStore& fVector; |
---|
75 | G4PhysicalVolumeStore::iterator fIterator; |
---|
76 | }; |
---|
77 | } |
---|
78 | ////////////////////////////////////////////////////////////////////////////// |
---|
79 | Slash::Data::IIterator* G4Lab::PhysicalVolumeAccessor::iterator( |
---|
80 | ) |
---|
81 | ////////////////////////////////////////////////////////////////////////////// |
---|
82 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
83 | { |
---|
84 | G4PhysicalVolumeStore* pvStore = G4PhysicalVolumeStore::GetInstance(); |
---|
85 | if(!pvStore) { |
---|
86 | Lib::Out out(fSession.printer()); |
---|
87 | out << "No physical volume store." << Lib::endl; |
---|
88 | return 0; |
---|
89 | } |
---|
90 | |
---|
91 | return new PhysicalVolumeIterator(*pvStore); |
---|
92 | } |
---|
93 | ////////////////////////////////////////////////////////////////////////////// |
---|
94 | Slash::Core::IValue* G4Lab::PhysicalVolumeAccessor::findValue( |
---|
95 | Slash::Data::IAccessor::Data aData |
---|
96 | ,const std::string& aName |
---|
97 | ,void* |
---|
98 | ) |
---|
99 | ////////////////////////////////////////////////////////////////////////////// |
---|
100 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
101 | { |
---|
102 | G4VPhysicalVolume* obj = (G4VPhysicalVolume*)aData; |
---|
103 | //if(aName=="id") { |
---|
104 | // return new Lib::Value((void*)obj); |
---|
105 | //} else |
---|
106 | if(aName=="name") { |
---|
107 | return new Lib::Value(obj->GetName()); |
---|
108 | } else if(aName=="daughters") { |
---|
109 | G4LogicalVolume* logicalVolume = obj->GetLogicalVolume(); |
---|
110 | return new Lib::Value(logicalVolume->GetNoDaughters()); |
---|
111 | } else { |
---|
112 | return new Lib::Value(); |
---|
113 | } |
---|
114 | } |
---|
115 | ////////////////////////////////////////////////////////////////////////////// |
---|
116 | void G4Lab::PhysicalVolumeAccessor::visualize( |
---|
117 | Slash::Data::IAccessor::Data aData |
---|
118 | ,void* |
---|
119 | ) |
---|
120 | ////////////////////////////////////////////////////////////////////////////// |
---|
121 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// |
---|
122 | { |
---|
123 | G4TransportationManager* tsp = |
---|
124 | G4TransportationManager::GetTransportationManager(); |
---|
125 | if(!tsp) return; |
---|
126 | G4Navigator* nav = tsp->GetNavigatorForTracking(); |
---|
127 | if(!nav) return; |
---|
128 | G4VPhysicalVolume* top = nav->GetWorldVolume(); |
---|
129 | if(!top) return; |
---|
130 | |
---|
131 | G4VPhysicalVolume* obj = (G4VPhysicalVolume*)aData; |
---|
132 | |
---|
133 | //Get a style corresponding to PV type. |
---|
134 | {std::string s = obj->GetName(); |
---|
135 | Lib::smanip::strip(s); |
---|
136 | std::string style = "PV("+s+")"; |
---|
137 | if(!isStyle(style)) { |
---|
138 | style = "PV_"+s; //Backward compatibility. |
---|
139 | if(!isStyle(style)) { |
---|
140 | style = "PV"; //Default. |
---|
141 | } |
---|
142 | } |
---|
143 | fillSoGC(style);} |
---|
144 | |
---|
145 | SoSeparator* separator = new SoSeparator; |
---|
146 | |
---|
147 | SoVisitedVolume soVisitedVolume(fSoGC,*separator,*obj); |
---|
148 | |
---|
149 | // WARNING : it may produces more than one scene object. |
---|
150 | // (Because the same PV may be found more than once in the |
---|
151 | // Geant4 geometry tree). |
---|
152 | GeometryVisitor geometryVisitor; |
---|
153 | G4Transform3D identity; //WIN32. |
---|
154 | geometryVisitor.visit(top,UNLIMITED,identity,&soVisitedVolume); |
---|
155 | |
---|
156 | // Send scene graph to the viewing region : |
---|
157 | if(separator->getNumChildren()) { |
---|
158 | fSoRegion->doIt(SbAddNode(separator,"staticScene")); |
---|
159 | } else { |
---|
160 | separator->unref(); |
---|
161 | } |
---|
162 | } |
---|