source: snovis/trunk/source/G4Lab/cxx/PhysicalVolumeAccessor.cxx

Last change on this file was 233, checked in by barrand, 19 years ago
  • Property svn:eol-style set to native
File size: 5.1 KB
RevLine 
[233]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//////////////////////////////////////////////////////////////////////////////
32G4Lab::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//////////////////////////////////////////////////////////////////////////////
45G4Lab::PhysicalVolumeAccessor::~PhysicalVolumeAccessor(
46)
47//////////////////////////////////////////////////////////////////////////////
48//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
49{
50}
51//////////////////////////////////////////////////////////////////////////////
52std::string G4Lab::PhysicalVolumeAccessor::name(
53) const
54//////////////////////////////////////////////////////////////////////////////
55//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
56{
57 return fType;
58}
59namespace 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//////////////////////////////////////////////////////////////////////////////
79Slash::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//////////////////////////////////////////////////////////////////////////////
94Slash::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//////////////////////////////////////////////////////////////////////////////
116void 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}
Note: See TracBrowser for help on using the repository browser.