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

Last change on this file since 233 was 233, checked in by barrand, 17 years ago
  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
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.