Links

Content Skeleton

This Page

Previous topic

Polyhedron

Next topic

GDML

VRML2FILE implementation

Observations

The VRML2 polyhedra created, have either triangle or quad faces ?

  • how to switch to triangle ? or just fix by splitting quad afterwards ?

Visualization Steering

stacktrace from draw command to graphics primitives

(gdb) b 'G4VRML2FileSceneHandler::AddPrimitive(G4Polyhedron const&)'
Breakpoint 1 at 0x46c7fcf: file src/G4VRML2SceneHandlerFunc.icc, line 175.
(gdb)
...
/vis/sceneHandler/attach
Scene "scene-0" attached to scene handler "scene-handler-0.
  (You may have to refresh with "/vis/viewer/flush" if view is not "auto-refresh".)
NOTE: For systems which are not "auto-refresh" you will need to
  issue "/vis/viewer/refresh" or "/vis/viewer/flush".
/vis/viewer/refresh viewer-0
Refreshing viewer "viewer-0 (VRML2FILE)"...
===========================================
Output VRML 2.0 file: g4_03.wrl
Maximum number of files in the destination directory: 100
  (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM)
===========================================
Traversing scene data...

Breakpoint 1, G4VRML2FileSceneHandler::AddPrimitive (this=0x1024ab10, polyhedron=@0x1024aaa8) at src/G4VRML2SceneHandlerFunc.icc:175
175             if (polyhedron.GetNoFacets() == 0) return;
(gdb) bt
#0  G4VRML2FileSceneHandler::AddPrimitive (this=0x1024ab10, polyhedron=@0x1024aaa8) at src/G4VRML2SceneHandlerFunc.icc:175
#1  0xb709af73 in G4VSceneHandler::RequestPrimitives (this=0x1024ab10, solid=@0xbb7cce0) at src/G4VSceneHandler.cc:453
#2  0xb709999b in G4VSceneHandler::AddSolid (this=0x1024ab10, solid=@0xbb7cce0) at src/G4VSceneHandler.cc:252
#3  0x046c8889 in G4VRML2FileSceneHandler::AddSolid (this=0x1024ab10, vsolid=@0xbb7cce0) at src/G4VRML2SceneHandlerFunc.icc:78
#4  0x0458f405 in G4SubtractionSolid::DescribeYourselfTo (this=0xbb7cce0, scene=@0x1024ab10) at src/G4SubtractionSolid.cc:459
#5  0xb5ef6186 in G4PhysicalVolumeModel::DescribeSolid (this=0x1024b0c0, theAT=@0xbfabb230, pSol=0xbb7cce0, pVisAttribs=0x1024cdc8, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:551
#6  0xb5ef7bf2 in G4PhysicalVolumeModel::DescribeAndDescend (this=0x1024b0c0, pVPV=0xba26fd0, requestedDepth=-2, pLV=0xbb61578, pSol=0xbb7cce0, pMaterial=0xbb7e670, theAT=@0xbfabba10, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:456
#7  0xb5ef6ba3 in G4PhysicalVolumeModel::VisitGeometryAndGetVisReps (this=0x1024b0c0, pVPV=0xba26fd0, requestedDepth=-2, theAT=@0xbfabba10, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:222
#8  0xb5ef7dc1 in G4PhysicalVolumeModel::DescribeAndDescend (this=0x1024b0c0, pVPV=0xbc0f528, requestedDepth=-1, pLV=0xba26c80, pSol=0xba26c00, pMaterial=0xbe623f8, theAT=@0xbfabbf80, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:523
#9  0xb5ef6ba3 in G4PhysicalVolumeModel::VisitGeometryAndGetVisReps (this=0x1024b0c0, pVPV=0xbc0f528, requestedDepth=-1, theAT=@0xbfabbf80, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:222
#10 0xb5ef8219 in G4PhysicalVolumeModel::DescribeYourselfTo (this=0x1024b0c0, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:170
#11 0xb709a9f2 in G4VSceneHandler::ProcessScene (this=0x1024ab10) at src/G4VSceneHandler.cc:516
#12 0xb70a162b in G4VViewer::ProcessView (this=0x1024cc58) at src/G4VViewer.cc:122
#13 0x046c980c in G4VRML2FileViewer::DrawView (this=0x1024cc58) at src/G4VRML2FileViewer.cc:83
#14 0xb70d81d7 in G4VisCommandViewerRefresh::SetNewValue (this=0xbf8a760, newValue=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc1d8 "o2$\020\001"}}, <No data fields>}) at src/G4VisCommandsViewer.cc:1141
#15 0x072c1dc4 in G4UIcommand::DoIt (this=0xbf8b010, parameterList=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc28c "$2$\020\023"}}, <No data fields>}) at src/G4UIcommand.cc:210
#16 0x072ce32b in G4UImanager::ApplyCommand (this=0xbe49a98, aCmd=0x1024aeec "/vis/viewer/refresh viewer-0") at src/G4UImanager.cc:410
#17 0x072ce47a in G4UImanager::ApplyCommand (this=0xbe49a98, aCmd=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc2f8 "i(R)$\020i(R)$\020THaN(w\r\005"}}, <No data fields>}) at src/G4UImanager.cc:354
#18 0xb70d8adb in G4VisCommandViewerFlush::SetNewValue (this=0xbf89e98, newValue=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc438 "d2$\020\001"}}, <No data fields>}) at src/G4VisCommandsViewer.cc:801
#19 0x072c1dc4 in G4UIcommand::DoIt (this=0xbf8a028, parameterList=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc4ec "1/4\233\200\004yyyy\021"}}, <No data fields>}) at src/G4UIcommand.cc:210
#20 0x072ce32b in G4UImanager::ApplyCommand (this=0xbe49a98, aCmd=0xbf7075c "/vis/viewer/flush") at src/G4UImanager.cc:410
#21 0x072ce47a in G4UImanager::ApplyCommand (this=0xbe49a98, aCmd=
          {<std::basic_string<char,std::char_traits<char>,std::allocator<char> >> = {static npos = 4294967295, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0xbfabc5c8 "\\\a/\v\230\232a\vO\204\032\005~O]OAE<<?\022}\030\005h0o\vpC$\020 AE<<?O\226e\vAXja"}}, <No data fields>}) at src/G4UImanager.cc:354
#22 0xb744c4f2 in GiGaRunActionCommand::BeginOfRunAction (this=0xbf63068, run=0x1024c770) at ../src/Components/GiGaRunActionCommand.cpp:79
#23 0x05187d12 in G4RunManager::RunInitialization (this=0xbe9c014) at src/G4RunManager.cc:203
#24 0xb45dd722 in GiGaRunManager::initializeRun (this=0xbe9be40) at ../src/component/GiGaRunManager.cpp:347
#25 0xb45dd984 in GiGaRunManager::prepareTheEvent (this=0xbe9be40, vertex=0xbb24038) at ../src/component/GiGaRunManager.cpp:250
#26 0xb45bae97 in GiGa::prepareTheEvent (this=0xbe9b448, vertex=0xbb24038) at ../src/component/GiGa.cpp:444
#27 0xb45b7620 in GiGa::operator<< (this=0xbe9b448, vertex=0xbb24038) at ../src/component/GiGaIGiGaSvc.cpp:52
#28 0xb4806ad5 in DsPushKine::execute (this=0xbe8d218) at ../src/DsPushKine.cc:55
#29 0x0226c408 in Algorithm::sysExecute (this=0xbe8d218) at ../src/Lib/Algorithm.cpp:558
#30 0x0601768f in GaudiAlgorithm::sysExecute (this=0xbe8d218) at ../src/lib/GaudiAlgorithm.cpp:161
#31 0x0607ffd4 in GaudiSequencer::execute (this=0xb951210) at ../src/lib/GaudiSequencer.cpp:100
#32 0x0226c408 in Algorithm::sysExecute (this=0xb951210) at ../src/Lib/Algorithm.cpp:558
#33 0x0601768f in GaudiAlgorithm::sysExecute (this=0xb951210) at ../src/lib/GaudiAlgorithm.cpp:161
#34 0x022e841a in MinimalEventLoopMgr::executeEvent (this=0xb50e180) at ../src/Lib/MinimalEventLoopMgr.cpp:450
#35 0x03e12956 in DybEventLoopMgr::executeEvent (this=0xb50e180, par=0x0) at ../src/DybEventLoopMgr.cpp:125
#36 0x03e1318a in DybEventLoopMgr::nextEvent (this=0xb50e180, maxevt=10) at ../src/DybEventLoopMgr.cpp:188
#37 0x022e6dbd in MinimalEventLoopMgr::executeRun (this=0xb50e180, maxevt=10) at ../src/Lib/MinimalEventLoopMgr.cpp:400
#38 0x090a46d9 in ApplicationMgr::executeRun (this=0xb1d4cb8, evtmax=10) at ../src/ApplicationMgr/ApplicationMgr.cpp:867
#39 0x07021f57 in method_3426 (retaddr=0xbf9d3f0, o=0xb1d50e4, arg=@0xb240e30) at ../i686-slc5-gcc41-dbg/dict/GaudiKernel/dictionary_dict.cpp:4375
#40 0x007ccadd in ROOT::Cintex::Method_stub_with_context (context=0xb240e28, result=0xbfe6224, libp=0xbfe627c) at cint/cintex/src/CINTFunctional.cxx:319
#41 0x03921034 in ?? ()
#42 0x0b240e28 in ?? ()
#43 0x0bfe6224 in ?? ()
#44 0x00000000 in ?? ()
(gdb)

(gdb) frame 13
#13 0x046c980c in G4VRML2FileViewer::DrawView (this=0x1024cc58) at src/G4VRML2FileViewer.cc:83
83              ProcessView();
(gdb) list
78              // Viewpoint node
79              SendViewParameters();
80
81              // Here is a minimal DrawView() function.
82              NeedKernelVisit();
83              ProcessView();
84              FinishView();
85      }
86

(gdb) frame 12
#12 0xb70a162b in G4VViewer::ProcessView (this=0x1024cc58) at src/G4VViewer.cc:122
122         fSceneHandler.ProcessScene (*this);
(gdb) list
117       // DrawView)...
118       if (fNeedKernelVisit) {
119         // Reset flag.  This must be done before ProcessScene to prevent
120         // recursive calls when recomputing transients...
121         fNeedKernelVisit = false;
122         fSceneHandler.ProcessScene (*this);
123       }
124     }
125

(gdb) frame 11
#11 0xb709a9f2 in G4VSceneHandler::ProcessScene (this=0x1024ab10) at src/G4VSceneHandler.cc:516
516           pModel -> DescribeYourselfTo (*this);
(gdb) list
511           // pModel->GetTransformation().  The model must take care of
512           // this in pModel->DescribeYourselfTo(*this).  See, for example,
513           // G4PhysicalVolumeModel and /vis/scene/add/logo.
514           pModel -> SetModelingParameters (pMP);
515           SetModel (pModel);  // Store for use by derived class.
516           pModel -> DescribeYourselfTo (*this);
517           pModel -> SetModelingParameters (0);
518         }
519
520         // Repeat if required...

(gdb) frame 10
#10 0xb5ef8219 in G4PhysicalVolumeModel::DescribeYourselfTo (this=0x1024b0c0, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:170
170          sceneHandler);
(gdb) list
165
166       VisitGeometryAndGetVisReps
167         (fpTopPV,
168          fRequestedDepth,
169          startingTransformation,
170          sceneHandler);
171

(gdb) frame 9
#9  0xb5ef6ba3 in G4PhysicalVolumeModel::VisitGeometryAndGetVisReps (this=0x1024b0c0, pVPV=0xbc0f528, requestedDepth=-1, theAT=@0xbfabbf80, sceneHandler=@0x1024ab10) at src/G4PhysicalVolumeModel.cc:222
222                             theAT, sceneHandler);
(gdb) list
217       if (!(pVPV -> IsReplicated ())) {
218         // Non-replicated physical volume.
219         pSol = pLV -> GetSolid ();
220         pMaterial = pLV -> GetMaterial ();
221         DescribeAndDescend (pVPV, requestedDepth, pLV, pSol, pMaterial,
222                             theAT, sceneHandler);
223       }
224       else {
225         // Replicated or parametrised physical volume.
226         EAxis axis;

Traversing scene data

[blyth@cms01 source]$ find . -name '*.cc' -exec grep -H Traversing {} \;
./visualization/management/src/G4VSceneHandler.cc:      G4cout << "Traversing scene data..." << G4endl;
471 void G4VSceneHandler::ProcessScene (G4VViewer&) {
472
473   if (!fpScene) return;
474
475   G4VisManager* visManager = G4VisManager::GetInstance();
476
477   if (!visManager->GetConcreteInstance()) return;
478
479   G4VisManager::Verbosity verbosity = visManager->GetVerbosity();
480
481   fReadyForTransients = false;
482
483   // Clear stored scene, if any, i.e., display lists, scene graphs.
484   ClearStore ();
485
486   // Reset fMarkForClearingTransientStore.  No need to clear transient
487   // store since it has just been cleared above.  (Leaving
488   // fMarkForClearingTransientStore true causes problems with
489   // recomputing transients below.)  Restore it again at end...
490   G4bool tmpMarkForClearingTransientStore = fMarkForClearingTransientStore;
491   fMarkForClearingTransientStore = false;
492
493   // Traverse geometry tree and send drawing primitives to window(s).
494
495   const std::vector<G4VModel*>& runDurationModelList =
496     fpScene -> GetRunDurationModelList ();
497
498   if (runDurationModelList.size ()) {
499     if (verbosity >= G4VisManager::confirmations) {
500       G4cout << "Traversing scene data..." << G4endl;
501     }
502
503     BeginModeling ();
504
505     // Create modeling parameters from view parameters...
506     G4ModelingParameters* pMP = CreateModelingParameters ();
507
508     for (size_t i = 0; i < runDurationModelList.size (); i++) {
509       G4VModel* pModel = runDurationModelList[i];
510       // Note: this is not the place to take action on
511       // pModel->GetTransformation().  The model must take care of
512       // this in pModel->DescribeYourselfTo(*this).  See, for example,
513       // G4PhysicalVolumeModel and /vis/scene/add/logo.
514       pModel -> SetModelingParameters (pMP);
515       SetModel (pModel);  // Store for use by derived class.
516       pModel -> DescribeYourselfTo (*this);
517       pModel -> SetModelingParameters (0);
518     }
519
520     // Repeat if required...
521     if (fSecondPassRequested) {

runDurationModelList

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/include/G4Scene.hh:

74   const std::vector<G4VModel*>& GetRunDurationModelList () const;
75   // Contains models which are expected to last for the duration of
76   // the run, for example geometry volumes.

The scene and this list are populated via draw commands.

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VisCommandsCompound.cc:

170 ////////////// /vis/drawVolume ///////////////////////////////////////
171
172 G4VisCommandDrawVolume::G4VisCommandDrawVolume() {
173   G4bool omitable;
174   fpCommand = new G4UIcmdWithAString("/vis/drawVolume", this);
175   fpCommand->SetGuidance
176     ("Creates a scene containing this physical volume and asks the"
177      "\ncurrent viewer to draw it.  The scene becomes current.");
178   fpCommand -> SetGuidance
179     ("If physical-volume-name is \"world\" (the default), the main geometry"
180      "\ntree (material world) is drawn.  If \"worlds\", all worlds - material"
181      "\nworld and parallel worlds, if any - are drawn.  Otherwise a search of"
182      "\nall worlds is made, taking the first matching occurence only.  To see"
183      "\na representation of the geometry hierarchy of the worlds, try"
184      "\n\"/vis/drawTree [worlds]\" or one of the driver/browser combinations"
185      "\nthat have the required functionality, e.g., HepRep");
186   fpCommand->SetParameterName("physical-volume-name", omitable = true);
187   fpCommand->SetDefaultValue("world");
188 }

$DYB/external/build/LCG/geant4.9.2.p01/source/intercoms/src/G4UIcommand.cc:

104 G4int G4UIcommand::DoIt(G4String parameterList)
105 {
210   messenger->SetNewValue( this, correctParameters );
211   return 0;
212 }

Invoking/Applying command boils down to a SetNewValue which applys /vis/scene/add/volume World:

194 void G4VisCommandDrawVolume::SetNewValue(G4UIcommand*, G4String newValue) {
195   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
196   G4UImanager* UImanager = G4UImanager::GetUIpointer();
197   G4int keepVerbose = UImanager->GetVerboseLevel();
198   G4int newVerbose(0);
199   if (keepVerbose >= 2 || verbosity >= G4VisManager::confirmations)
200     newVerbose = 2;
201   UImanager->SetVerboseLevel(newVerbose);
202   UImanager->ApplyCommand("/vis/scene/create");
203   UImanager->ApplyCommand(G4String("/vis/scene/add/volume " + newValue));
204   UImanager->ApplyCommand("/vis/sceneHandler/attach");
205   UImanager->SetVerboseLevel(keepVerbose);
206   static G4bool warned = false;
207   if (verbosity >= G4VisManager::confirmations && !warned) {
208     G4cout <<
209       "NOTE: For systems which are not \"auto-refresh\" you will need to"
210       "\n  issue \"/vis/viewer/refresh\" or \"/vis/viewer/flush\"."
211        << G4endl;
212     warned = true;
213   }
214 }

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VisCommandsSceneAdd.cc:

1479 ////////////// /vis/scene/add/volume ///////////////////////////////////////
1480
1481 G4VisCommandSceneAddVolume::G4VisCommandSceneAddVolume () {
1482   G4bool omitable;
1483   fpCommand = new G4UIcommand ("/vis/scene/add/volume", this);
1484   fpCommand -> SetGuidance
1485    ("Adds a physical volume to current scene, with optional clipping volume.");
1486   fpCommand -> SetGuidance
1487     ("If physical-volume-name is \"world\" (the default), the top of the"
1488      "\nmain geometry tree (material world) is added.  If \"worlds\", the"
1489      "\ntop of all worlds - material world and parallel worlds, if any - are"
1490      "\nadded.  Otherwise a search of all worlds is made, taking the first"
1491      "\nmatching occurence only.  To see a representation of the geometry"
1492      "\nhierarchy of the worlds, try \"/vis/drawTree [worlds]\" or one of the"
1493      "\ndriver/browser combinations that have the required functionality, e.g., HepRep.");
....
1558 void G4VisCommandSceneAddVolume::SetNewValue (G4UIcommand*,
1559                           G4String newValue) {
1560
1561   G4VisManager::Verbosity verbosity = fpVisManager->GetVerbosity();
1562   G4bool warn = verbosity >= G4VisManager::warnings;
1563
1564   G4Scene* pScene = fpVisManager->GetCurrentScene();
....
1654   std::vector<G4PhysicalVolumeModel*> models;
1655   std::vector<G4VPhysicalVolume*> foundVolumes;
1656   G4VPhysicalVolume* foundWorld = 0;
1657   std::vector<G4int> foundDepths;
1658   std::vector<G4Transform3D> transformations;
1659
1660   if (name == "world") {
1661
1662     models.push_back
1663       (new G4PhysicalVolumeModel (world, requestedDepthOfDescent));
1664     foundVolumes.push_back(world);
1665     foundDepths.push_back(0);
1666     transformations.push_back(G4Transform3D());
....
1746   const G4String& currentSceneName = pScene -> GetName ();
1747   G4bool failure = true;
1748   for (size_t i = 0; i < foundVolumes.size(); ++i) {
1749     G4bool successful = pScene -> AddRunDurationModel (models[i], warn);
1750     if (successful) {

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/include/G4Scene.hh:

108   G4bool AddRunDurationModel (G4VModel*, G4bool warn = false);
109   // Adds models of type which are expected to last for the duration
110   // of the run, for example geometry volumes.
111   // Returns false if model is already in the list.
112   // Prints warnings if warn is true.
113

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4Scene.cc:

50 G4bool G4Scene::AddRunDurationModel (G4VModel* pModel, G4bool warn) {
51   std::vector<G4VModel*>::const_iterator i;
52   for (i = fRunDurationModelList.begin ();
53        i != fRunDurationModelList.end (); ++i) {
54     if (pModel -> GetGlobalDescription () ==
55     (*i) -> GetGlobalDescription ()) break;
56   }
57   if (i != fRunDurationModelList.end ()) {
58     if (warn) {
59       G4cout << "G4Scene::AddRunDurationModel: model \""
60          << pModel -> GetGlobalDescription ()
61          << "\"\n  is already in the run-duration list of scene \""
62          << fName
63          << "\"."
64          << G4endl;
65     }
66     return false;
67   }
68   fRunDurationModelList.push_back (pModel);
69   CalculateExtent ();
70   return true;
71 }

According to my reading the RunDurationModel contains just world. Actually G4PhysicalVolumeModel (world, requestedDepthOfDescent))

G4PhysicalVolumeModel

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/include/G4PhysicalVolumeModel.hh:

67 class G4PhysicalVolumeModel: public G4VModel {
68
69 public: // With description
70
71   enum {UNLIMITED = -1};
72
73   enum ClippingMode {subtraction, intersection};
74
75   class G4PhysicalVolumeNodeID {
76   public:
77     G4PhysicalVolumeNodeID
78     (G4VPhysicalVolume* pPV = 0, G4int iCopyNo = 0, G4int depth = 0):
79       fpPV(pPV), fCopyNo(iCopyNo), fNonCulledDepth(depth) {}
80     G4VPhysicalVolume* GetPhysicalVolume() const {return fpPV;}
81     G4int GetCopyNo() const {return fCopyNo;}
82     G4int GetNonCulledDepth() const {return fNonCulledDepth;}
83     G4bool operator< (const G4PhysicalVolumeNodeID& right) const;
84   private:
85     G4VPhysicalVolume* fpPV;
86     G4int fCopyNo;
87     G4int fNonCulledDepth;
88   };
89   // Nested class for identifying physical volume nodes.
90
91   G4PhysicalVolumeModel
92   (G4VPhysicalVolume*,
93    G4int requestedDepth = UNLIMITED,
94    const G4Transform3D& modelTransformation = G4Transform3D(),
95    const G4ModelingParameters* = 0,
96    G4bool useFullExtent = false);
97
98   virtual ~G4PhysicalVolumeModel ();
99
00   void DescribeYourselfTo (G4VGraphicsScene&);
01   // The main task of a model is to describe itself to the graphics scene
02   // handler (a object which inherits G4VSceneHandler, which inherits
03   // G4VGraphicsScene).

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:

/// kick off the descent
///
155 void G4PhysicalVolumeModel::DescribeYourselfTo
156 (G4VGraphicsScene& sceneHandler)
157 {
158   if (!fpMP) G4Exception
159     ("G4PhysicalVolumeModel::DescribeYourselfTo: No modeling parameters.");
160
161   // For safety...
162   fCurrentDepth = 0;
163
164   G4Transform3D startingTransformation = fTransform;
165
166   VisitGeometryAndGetVisReps
167     (fpTopPV,
168      fRequestedDepth,
169      startingTransformation,
170      sceneHandler);
///
///   handle the recursive descent
///
198 void G4PhysicalVolumeModel::VisitGeometryAndGetVisReps
199 (G4VPhysicalVolume* pVPV,
200  G4int requestedDepth,
201  const G4Transform3D& theAT,
202  G4VGraphicsScene& sceneHandler)
203 {
204   // Visits geometry structure to a given depth (requestedDepth), starting
205   //   at given physical volume with given starting transformation and
206   //   describes volumes to the scene handler.
207   // requestedDepth < 0 (default) implies full visit.
208   // theAT is the Accumulated Transformation.
209
210   // Find corresponding logical volume and (later) solid, storing in
211   // local variables to preserve re-entrancy.
212   G4LogicalVolume* pLV  = pVPV -> GetLogicalVolume ();
213
214   G4VSolid* pSol;
215   G4Material* pMaterial;
216
217   if (!(pVPV -> IsReplicated ())) {
218     // Non-replicated physical volume.
219     pSol = pLV -> GetSolid ();
220     pMaterial = pLV -> GetMaterial ();
221     DescribeAndDescend (pVPV, requestedDepth, pLV, pSol, pMaterial,
222             theAT, sceneHandler);
///
///
///
336 void G4PhysicalVolumeModel::DescribeAndDescend
337 (G4VPhysicalVolume* pVPV,
338  G4int requestedDepth,
339  G4LogicalVolume* pLV,
340  G4VSolid* pSol,
341  G4Material* pMaterial,
342  const G4Transform3D& theAT,
343  G4VGraphicsScene& sceneHandler)
344 {
345   // Maintain useful data members...
346   fpCurrentPV = pVPV;
347   fpCurrentLV = pLV;
348   fpCurrentMaterial = pMaterial;
349
350   const G4RotationMatrix objectRotation = pVPV -> GetObjectRotationValue ();
351   const G4ThreeVector&  translation     = pVPV -> GetTranslation ();
352   G4Transform3D theLT (G4Transform3D (objectRotation, translation));
353
354   // Compute the accumulated transformation...
355   // Note that top volume's transformation relative to the world
356   // coordinate system is specified in theAT == startingTransformation
357   // = fTransform (see DescribeYourselfTo), so first time through the
358   // volume's own transformation, which is only relative to its
359   // mother, i.e., not relative to the world coordinate system, should
360   // not be accumulated.
361   G4Transform3D theNewAT (theAT);
362   if (fCurrentDepth != 0) theNewAT = theAT * theLT;
363   fpCurrentTransform = &theNewAT;
364
...
428   // Update full path of physical volumes...
429   G4int copyNo = fpCurrentPV->GetCopyNo();
430   fFullPVPath.push_back
431     (G4PhysicalVolumeNodeID(fpCurrentPV,copyNo,fCurrentDepth));
...
433   if (thisToBeDrawn) {
434
435     // Update path of drawn physical volumes...
436     G4int copyNo = fpCurrentPV->GetCopyNo();
437     fDrawnPVPath.push_back
438       (G4PhysicalVolumeNodeID(fpCurrentPV,copyNo,fCurrentDepth));
439
440     if (fpMP->IsExplode() && fDrawnPVPath.size() == 1) {
...
454     }
455
456     DescribeSolid (theNewAT, pSol, pVisAttribs, sceneHandler);
457
458   }
...
517   if (daughtersToBeDrawn) {
518     for (G4int iDaughter = 0; iDaughter < nDaughters; iDaughter++) {
519       G4VPhysicalVolume* pVPV = pLV -> GetDaughter (iDaughter);
520       // Descend the geometry structure recursively...
521       fCurrentDepth++;
522       VisitGeometryAndGetVisReps
523     (pVPV, requestedDepth - 1, theNewAT, sceneHandler);
524       fCurrentDepth--;
525     }
526   }
...
538 void G4PhysicalVolumeModel::DescribeSolid
539 (const G4Transform3D& theAT,
540  G4VSolid* pSol,
541  const G4VisAttributes* pVisAttribs,
542  G4VGraphicsScene& sceneHandler)
543 {
544   sceneHandler.PreAddSolid (theAT, *pVisAttribs);
545
546   const G4Polyhedron* pSectionPolyhedron = fpMP->GetSectionPolyhedron();
547   const G4Polyhedron* pCutawayPolyhedron = fpMP->GetCutawayPolyhedron();
548
549   if (!fpClippingPolyhedron && !pSectionPolyhedron && !pCutawayPolyhedron) {
550
551     pSol -> DescribeYourselfTo (sceneHandler);  // Standard treatment.
552
553   } else {
554
555     // Clipping, etc., performed by Boolean operations on polyhedron objects.
...
633   sceneHandler.PostAddSolid ();
634 }

DescribeYourselfTo

[blyth@cms01 src]$ find $DYB/external/build/LCG/geant4.9.2.p01/source -name '*.cc' -exec grep -H DescribeYourselfTo {} \;
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VisCommandsSceneAdd.cc:      searchModel.DescribeYourselfTo (searchScene);  // Initiate search.
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VSceneHandler.cc:      // this in pModel->DescribeYourselfTo(*this).  See, for example,
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VSceneHandler.cc:      pModel -> DescribeYourselfTo (*this);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VSceneHandler.cc:     pModel -> DescribeYourselfTo (*this);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VSceneHandler.cc:      pModel -> DescribeYourselfTo (*this);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/management/src/G4VisManager.cc:    solid.DescribeYourselfTo (*fpSceneHandler);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4AxesModel.cc:void G4AxesModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) {
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:    DescribeYourselfTo (bsScene);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:void G4PhysicalVolumeModel::DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:    ("G4PhysicalVolumeModel::DescribeYourselfTo: No modeling parameters.");
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:  // = fTransform (see DescribeYourselfTo), so first time through the
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:    pSol -> DescribeYourselfTo (sceneHandler);  // Standard treatment.
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc: pSol -> DescribeYourselfTo (sceneHandler);  // Standard treatment.
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4PhysicalVolumeModel.cc:  searchModel.DescribeYourselfTo (searchScene);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4HitsModel.cc:void G4HitsModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler)
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4ScaleModel.cc:void G4ScaleModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) {
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4TrajectoriesModel.cc:void G4TrajectoriesModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) {
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4LogicalVolumeModel.cc:void G4LogicalVolumeModel::DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4LogicalVolumeModel.cc:  G4PhysicalVolumeModel::DescribeYourselfTo (sceneHandler);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4LogicalVolumeModel.cc:  pvModel.DescribeYourselfTo(sceneHandler);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4LogicalVolumeModel.cc:  pSol -> DescribeYourselfTo (sceneHandler);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4NullModel.cc:void G4NullModel::DescribeYourselfTo (G4VGraphicsScene&) {
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4NullModel.cc:  G4Exception ("G4NullModel::DescribeYourselfTo called.");
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4TextModel.cc:void G4TextModel::DescribeYourselfTo (G4VGraphicsScene& sceneHandler) {
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/visualization/Tree/src/G4ASCIITreeSceneHandler.cc:     pvModel->DescribeYourselfTo (massScene);
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/management/src/G4ReflectedSolid.cc:G4ReflectedSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/BREPS/src/G4BREPSolid.cc:void G4BREPSolid::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/BREPS/src/G4BREPSolidOpenPCone.cc:void G4BREPSolidOpenPCone::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Tubs.cc:void G4Tubs::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Torus.cc:void G4Torus::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Trap.cc:void G4Trap::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Para.cc:void G4Para::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Cons.cc:void G4Cons::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Trd.cc:void G4Trd::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Sphere.cc:void G4Sphere::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Orb.cc:void G4Orb::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Box.cc:void G4Box::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4VCSGfaceted.cc:// DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4VCSGfaceted.cc:void G4VCSGfaceted::DescribeYourselfTo( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Tet.cc:// DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Tet.cc:void G4Tet::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4EllipticalTube.cc:// DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4EllipticalTube.cc:void G4EllipticalTube::DescribeYourselfTo( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Hype.cc:// DescribeYourselfTo
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Hype.cc:void G4Hype::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4VTwistedFaceted.cc:void G4VTwistedFaceted::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4TessellatedSolid.cc://  - Changed ::DescribeYourselfTo(), line 464
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4TessellatedSolid.cc:void G4TessellatedSolid::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Paraboloid.cc:void G4Paraboloid::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4Ellipsoid.cc:void G4Ellipsoid::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4EllipticalCone.cc:void G4EllipticalCone::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/specific/src/G4TwistedTubs.cc:void G4TwistedTubs::DescribeYourselfTo (G4VGraphicsScene& scene) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/Boolean/src/G4DisplacedSolid.cc:G4DisplacedSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/Boolean/src/G4IntersectionSolid.cc:G4IntersectionSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/Boolean/src/G4SubtractionSolid.cc:G4SubtractionSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
/data/env/local/dyb/trunk/external/build/LCG/geant4.9.2.p01/source/geometry/solids/Boolean/src/G4UnionSolid.cc:G4UnionSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
[blyth@cms01 src]$
1885 void G4Tubs::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
1886 {
1887   scene.AddSolid (*this) ;
1888 }
443 void
444 G4UnionSolid::DescribeYourselfTo ( G4VGraphicsScene& scene ) const
445 {
446   scene.AddSolid (*this);
447 }

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/modeling/src/G4LogicalVolumeModel.cc:

//
//  POSSIBLE EXPLANATION FOR GETTING MORE VRML2 SOLIDS THAN EXPECTED IN THE .wrl ???
//  THE LOGICALS ARE BEING DRAWN
//
//
45 G4LogicalVolumeModel::G4LogicalVolumeModel
46 (G4LogicalVolume*            pLV,
47  G4int                       soughtDepth,
48  G4bool                      booleans,
49  G4bool                      voxels,
50  G4bool                      readout,
51  const G4Transform3D&        modelTransformation,
52  const G4ModelingParameters* pMP):
53   // Instantiate a G4PhysicalVolumeModel with a G4PVPlacement to
54   // represent this logical volume.  It has no rotation and a null
55   // translation so that the logical volume will be seen in its own
56   // reference system.  It will be added to the physical volume store
57   // but it will not be part of the normal geometry heirarchy so it
58   // has no mother.
59   G4PhysicalVolumeModel
60 (new G4PVPlacement (0,                   // No rotation.
61             G4ThreeVector(),     // Null traslation.
62             "PhysVol representaion of LogVol " + pLV -> GetName (),
63             pLV,
64             0,                   // No mother.
65             false,               // Not "MANY".
66             0),                  // Copy number.
67  soughtDepth,
..
82 void G4LogicalVolumeModel::DescribeYourselfTo
83 (G4VGraphicsScene& sceneHandler) {
84
85   // Store current modeling parameters and ensure nothing is culled.
86   const G4ModelingParameters* tmpMP = fpMP;
87   G4ModelingParameters nonCulledMP;
88   if (fpMP) nonCulledMP = *fpMP;
89   nonCulledMP.SetCulling (false);
90   fpMP = &nonCulledMP;
91   G4PhysicalVolumeModel::DescribeYourselfTo (sceneHandler);
92   fpMP = tmpMP;
130 // This called from G4PhysicalVolumeModel::DescribeAndDescend by the
131 // virtual function mechanism.
132 void G4LogicalVolumeModel::DescribeSolid
133 (const G4Transform3D& theAT,
134  G4VSolid* pSol,
135  const G4VisAttributes* pVisAttribs,
136  G4VGraphicsScene& sceneHandler) {
137
138   if (fBooleans) {
139     // Look for "constituents".  Could be a Boolean solid.
140     G4VSolid* pSol0 = pSol -> GetConstituentSolid (0);
141     if (pSol0) {  // Composite solid...
142       G4VSolid* pSol1 = pSol -> GetConstituentSolid (1);
143       if (!pSol1) {
144     G4Exception
145       ("G4PhysicalVolumeModel::DescribeSolid:"
146        " 2nd component solid is missing.");
147       }
148       // Draw these constituents white and "forced wireframe"...
149       G4VisAttributes constituentAttributes;
150       constituentAttributes.SetForceWireframe(true);
151       DescribeSolid (theAT, pSol0, &constituentAttributes, sceneHandler);
152       DescribeSolid (theAT, pSol1, &constituentAttributes, sceneHandler);
153     }
154   }
155
156   // In any case draw the original/resultant solid...
157   sceneHandler.PreAddSolid (theAT, *pVisAttribs);
158   pSol -> DescribeYourselfTo (sceneHandler);
159   sceneHandler.PostAddSolid ();
160 }

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/VRML/src/G4VRML2SceneHandlerFunc.icc:

111 void G4VRML2SCENEHANDLER::AddSolid(const G4Sphere& sphere)
112 {
113 #if defined DEBUG_SCENE_FUNC
114     G4cerr << "***** AddSolid sphere" << "\n" ;
115 #endif
116     VRMLBeginModeling () ;
117     G4VSceneHandler::AddSolid(sphere) ;
118 }
...
...
169 void G4VRML2SCENEHANDLER::AddPrimitive(const G4Polyhedron& polyhedron)
170 {
...
174
175     if (polyhedron.GetNoFacets() == 0) return;
176
177     VRMLBeginModeling () ;
178
179     // Transparency checking: If completely transparent, skip drawing
180     if ( GetPVTransparency() > 0.99 ) { return ; }
181
182     // Current Model
183     const G4VModel* pv_model  = GetModel();
184     G4String pv_name = "No model";
185         if (pv_model) pv_name = pv_model->GetCurrentTag() ;
186
187     // VRML codes are generated below
188
189     fDest << "#---------- SOLID: " << pv_name << "\n";
190
...
198
199     fDest << "\t"; fDest << "Shape {" << "\n";
200
201     SendMaterialNode();
202
203     fDest << "\t\t" << "geometry IndexedFaceSet {" << "\n";
204
205     fDest << "\t\t\t"   << "coord Coordinate {" << "\n";
206     fDest << "\t\t\t\t" <<      "point [" << "\n";
207     G4int i, j;
208     for (i = 1, j = polyhedron.GetNoVertices(); j; j--, i++) {
209         G4Point3D point = polyhedron.GetVertex(i);
210

$DYB/external/build/LCG/geant4.9.2.p01/source/visualization/management/include/G4VSceneHandler.hh:

200 void G4VSceneHandler::AddSolid (const G4Box& box) {
201   RequestPrimitives (box);
202 // If your graphics system is sophisticated enough to handle a
203 //  particular solid shape as a primitive, in your derived class write a
204 //  function to override this.  (Note: some compilers warn that your
205 //  function "hides" this one.  That's OK.)
206 // Your function might look like this...
207 // void G4MyScene::AddSolid (const G4Box& box) {
208 // Get parameters of appropriate object, e.g.:
209 //   G4double dx = box.GetXHalfLength ();
210 //   G4double dy = box.GetYHalfLength ();
211 //   G4double dz = box.GetZHalfLength ();
212 // and Draw or Store in your display List.
213 }
214
215 void G4VSceneHandler::AddSolid (const G4Tubs& tubs) {
216   RequestPrimitives (tubs);
217 }
218
219 void G4VSceneHandler::AddSolid (const G4Cons& cons) {
220   RequestPrimitives (cons);
221 }
///
///      HERE THE POLYHEDRON REPRESENTATION OF THE SOLID SPRINGS INTO EXISTANCE
///
421 void G4VSceneHandler::RequestPrimitives (const G4VSolid& solid) {
422   BeginPrimitives (*fpObjectTransformation);
423   G4NURBS* pNURBS = 0;
424   G4Polyhedron* pPolyhedron = 0;
425   switch (fpViewer -> GetViewParameters () . GetRepStyle ()) {
426   case G4ViewParameters::nurbs:
427     pNURBS = solid.CreateNURBS ();
428     if (pNURBS) {
429       pNURBS -> SetVisAttributes (fpVisAttribs);
430       AddPrimitive (*pNURBS);
431       delete pNURBS;
432       break;
433     }
434     else {
435       G4VisManager::Verbosity verbosity =
436     G4VisManager::GetInstance()->GetVerbosity();
437       if (verbosity >= G4VisManager::errors) {
438     G4cout <<
439       "ERROR: G4VSceneHandler::RequestPrimitives"
440       "\n  NURBS not available for "
441            << solid.GetName () << G4endl;
442     G4cout << "Trying polyhedron." << G4endl;
443       }
444     }
445     // Dropping through to polyhedron...
446   case G4ViewParameters::polyhedron:
447   default:
448     G4Polyhedron::SetNumberOfRotationSteps (GetNoOfSides (fpVisAttribs));
449     pPolyhedron = solid.GetPolyhedron ();
450     G4Polyhedron::ResetNumberOfRotationSteps ();
451     if (pPolyhedron) {
452       pPolyhedron -> SetVisAttributes (fpVisAttribs);
453       AddPrimitive (*pPolyhedron);
454     }
455     else {
456       G4VisManager::Verbosity verbosity =
457     G4VisManager::GetInstance()->GetVerbosity();
458       if (verbosity >= G4VisManager::errors) {
459     G4cout <<
460       "ERROR: G4VSceneHandler::RequestPrimitives"
461       "\n  Polyhedron not available for " << solid.GetName () <<
462       ".\n  This means it cannot be visualized on most systems."
463       "\n  Contact the Visualization Coordinator." << G4endl;
464       }
465     }
466     break;
467   }
468   EndPrimitives ();
469 }

GetPolyhedron

[blyth@cms01 source]$ find . -name '*.hh' -exec grep -H GetPolyhedron {} \;
./graphics_reps/include/G4PlacedPolyhedron.hh:  const G4Polyhedron&  GetPolyhedron () const {return fPolyhedron;}
./geometry/management/include/G4VSolid.hh:    virtual G4Polyhedron* GetPolyhedron () const;
./geometry/management/include/G4ReflectedSolid.hh:    G4Polyhedron* GetPolyhedron    () const;
./geometry/solids/BREPS/include/G4BREPSolid.hh:  virtual G4Polyhedron* GetPolyhedron () const;
./geometry/solids/CSG/include/G4CSGSolid.hh:    virtual G4Polyhedron* GetPolyhedron () const;
./geometry/solids/specific/include/G4TessellatedSolid.hh://  - Added GetPolyhedron()
./geometry/solids/specific/include/G4TessellatedSolid.hh:    virtual G4Polyhedron* GetPolyhedron    () const;
./geometry/solids/specific/include/G4VCSGfaceted.hh:    virtual G4Polyhedron* GetPolyhedron () const;
./geometry/solids/specific/include/G4TwistedTubs.hh:  G4Polyhedron   *GetPolyhedron      () const;
./geometry/solids/specific/include/G4Paraboloid.hh:    G4Polyhedron* GetPolyhedron () const;
./geometry/solids/specific/include/G4EllipticalTube.hh:    G4Polyhedron* GetPolyhedron () const;
./geometry/solids/specific/include/G4Ellipsoid.hh:    G4Polyhedron* GetPolyhedron () const;
./geometry/solids/specific/include/G4Hype.hh:  G4Polyhedron* GetPolyhedron      () const;
./geometry/solids/specific/include/G4Tet.hh:    G4Polyhedron* GetPolyhedron      () const;
./geometry/solids/specific/include/G4VTwistedFaceted.hh:  virtual G4Polyhedron   *GetPolyhedron      () const;
./geometry/solids/specific/include/G4EllipticalCone.hh:    G4Polyhedron* GetPolyhedron () const;
./geometry/solids/Boolean/include/G4BooleanSolid.hh:    virtual G4Polyhedron* GetPolyhedron () const;
./geometry/solids/Boolean/include/G4DisplacedSolid.hh:    virtual G4Polyhedron* GetPolyhedron () const;
[blyth@cms01 source]$
[blyth@cms01 source]$ find . -name '*.cc' -exec grep -H GetPolyhedron {} \;
./visualization/management/src/G4VSceneHandler.cc:    pPolyhedron = solid.GetPolyhedron ();
./visualization/modeling/src/G4PhysicalVolumeModel.cc:    G4Polyhedron* pOriginal = pSol->GetPolyhedron();
./visualization/modeling/src/G4PhysicalVolumeMassScene.cc:  G4Polyhedron* pPolyhedron = solid.GetPolyhedron();
./visualization/modeling/src/G4LogicalVolumeModel.cc:   const G4Polyhedron& polyhedron = (*pPPL)[i].GetPolyhedron ();
./geometry/management/src/G4ReflectedSolid.cc:G4ReflectedSolid::GetPolyhedron () const
./geometry/management/src/G4VSolid.cc:G4Polyhedron* G4VSolid::GetPolyhedron () const
./geometry/solids/BREPS/src/G4BREPSolid.cc:G4Polyhedron* G4BREPSolid::GetPolyhedron () const
./geometry/solids/CSG/src/G4CSGSolid.cc:G4Polyhedron* G4CSGSolid::GetPolyhedron () const
./geometry/solids/specific/src/G4VCSGfaceted.cc:// GetPolyhedron
./geometry/solids/specific/src/G4VCSGfaceted.cc:G4Polyhedron* G4VCSGfaceted::GetPolyhedron () const
./geometry/solids/specific/src/G4Tet.cc:// GetPolyhedron
./geometry/solids/specific/src/G4Tet.cc:G4Polyhedron* G4Tet::GetPolyhedron () const
./geometry/solids/specific/src/G4EllipticalTube.cc:// GetPolyhedron
./geometry/solids/specific/src/G4EllipticalTube.cc:G4Polyhedron* G4EllipticalTube::GetPolyhedron () const
./geometry/solids/specific/src/G4Hype.cc:// GetPolyhedron
./geometry/solids/specific/src/G4Hype.cc:G4Polyhedron* G4Hype::GetPolyhedron () const
./geometry/solids/specific/src/G4VTwistedFaceted.cc://* GetPolyhedron -----------------------------------------------------
./geometry/solids/specific/src/G4VTwistedFaceted.cc:G4Polyhedron* G4VTwistedFaceted::GetPolyhedron() const
./geometry/solids/specific/src/G4TessellatedSolid.cc:// GetPolyhedron
./geometry/solids/specific/src/G4TessellatedSolid.cc:G4Polyhedron* G4TessellatedSolid::GetPolyhedron () const
./geometry/solids/specific/src/G4Paraboloid.cc:G4Polyhedron* G4Paraboloid::GetPolyhedron () const
./geometry/solids/specific/src/G4Ellipsoid.cc:G4Polyhedron* G4Ellipsoid::GetPolyhedron () const
./geometry/solids/specific/src/G4EllipticalCone.cc:G4Polyhedron* G4EllipticalCone::GetPolyhedron () const
./geometry/solids/specific/src/G4TwistedTubs.cc://* GetPolyhedron -----------------------------------------------------
./geometry/solids/specific/src/G4TwistedTubs.cc:G4Polyhedron* G4TwistedTubs::GetPolyhedron () const
./geometry/solids/Boolean/src/G4DisplacedSolid.cc:G4Polyhedron* G4DisplacedSolid::GetPolyhedron () const
./geometry/solids/Boolean/src/G4IntersectionSolid.cc:  G4Polyhedron* pA = fPtrSolidA->GetPolyhedron();
./geometry/solids/Boolean/src/G4IntersectionSolid.cc:  G4Polyhedron* pB = fPtrSolidB->GetPolyhedron();
./geometry/solids/Boolean/src/G4SubtractionSolid.cc:  G4Polyhedron* pA = fPtrSolidA->GetPolyhedron();
./geometry/solids/Boolean/src/G4SubtractionSolid.cc:  G4Polyhedron* pB = fPtrSolidB->GetPolyhedron();
./geometry/solids/Boolean/src/G4UnionSolid.cc:  G4Polyhedron* pA = fPtrSolidA->GetPolyhedron();
./geometry/solids/Boolean/src/G4UnionSolid.cc:  G4Polyhedron* pB = fPtrSolidB->GetPolyhedron();
./geometry/solids/Boolean/src/G4BooleanSolid.cc:G4Polyhedron* G4BooleanSolid::GetPolyhedron () const
./geometry/navigation/src/G4DrawVoxels.cc:       pVVisManager->Draw((*pplist)[i].GetPolyhedron(),
[blyth@cms01 source]$
1048 //* GetPolyhedron -----------------------------------------------------
1049
1050 G4Polyhedron* G4TwistedTubs::GetPolyhedron () const
1051 {
1052   if ((!fpPolyhedron) ||
1053       (fpPolyhedron->GetNumberOfRotationStepsAtTimeOfCreation() !=
1054        fpPolyhedron->GetNumberOfRotationSteps()))
1055   {
1056     delete fpPolyhedron;
1057     fpPolyhedron = CreatePolyhedron();
1058   }
1059   return fpPolyhedron;
1060 }
1003 G4Polyhedron* G4TwistedTubs::CreatePolyhedron () const
1004 {
1005   // number of meshes
1006   //
1007   G4double dA = std::max(fDPhi,fPhiTwist);
1008   const G4int m =
1009     G4int(G4Polyhedron::GetNumberOfRotationSteps() * dA / twopi) + 2;
1010   const G4int n =
1011     G4int(G4Polyhedron::GetNumberOfRotationSteps() * fPhiTwist / twopi) + 2;
1012
1013   const G4int nnodes = 4*(m-1)*(n-2) + 2*m*m ;
1014   const G4int nfaces = 4*(m-1)*(n-1) + 2*(m-1)*(m-1) ;
1015
1016   G4Polyhedron *ph=new G4Polyhedron;
1017   typedef G4double G4double3[3];
1018   typedef G4int G4int4[4];
1019   G4double3* xyz = new G4double3[nnodes];  // number of nodes
1020   G4int4*  faces = new G4int4[nfaces] ;    // number of faces
1021   fLowerEndcap->GetFacets(m,m,xyz,faces,0) ;
1022   fUpperEndcap->GetFacets(m,m,xyz,faces,1) ;
1023   fInnerHype->GetFacets(m,n,xyz,faces,2) ;
1024   fFormerTwisted->GetFacets(m,n,xyz,faces,3) ;
1025   fOuterHype->GetFacets(m,n,xyz,faces,4) ;
1026   fLatterTwisted->GetFacets(m,n,xyz,faces,5) ;
1027
1028   ph->createPolyhedron(nnodes,nfaces,xyz,faces);
1029
1030   delete[] xyz;
1031   delete[] faces;
1032
1033   return ph;
1034 }
74 G4Polyhedron* G4CSGSolid::GetPolyhedron () const
75 {
76   if (!fpPolyhedron ||
77       fpPolyhedron->GetNumberOfRotationStepsAtTimeOfCreation() !=
78       fpPolyhedron->GetNumberOfRotationSteps())
79     {
80       delete fpPolyhedron;
81       fpPolyhedron = CreatePolyhedron();
82     }
83   return fpPolyhedron;

CreateSurfaces

1065 void G4TwistedTubs::CreateSurfaces()
1066 {
1067    // create 6 surfaces of TwistedTub
1068
1069    G4ThreeVector x0(0, 0, fEndZ[0]);
1070    G4ThreeVector n (0, 0, -1);
1071
1072    fLowerEndcap = new G4TwistTubsFlatSide("LowerEndcap",
1073                                     fEndInnerRadius, fEndOuterRadius,
1074                                     fDPhi, fEndPhi, fEndZ, -1) ;
1075
1076    fUpperEndcap = new G4TwistTubsFlatSide("UpperEndcap",
1077                                     fEndInnerRadius, fEndOuterRadius,
1078                                     fDPhi, fEndPhi, fEndZ, 1) ;
1079
1080    G4RotationMatrix    rotHalfDPhi;
1081    rotHalfDPhi.rotateZ(0.5*fDPhi);
....
1106    // set neighbour surfaces
1107    //
1108    fLowerEndcap->SetNeighbours(fInnerHype, fLatterTwisted,
1109                                fOuterHype, fFormerTwisted);
1110    fUpperEndcap->SetNeighbours(fInnerHype, fLatterTwisted,
1111                                fOuterHype, fFormerTwisted);
....
1120 }

CreatePolyhedron

[blyth@cms01 source]$ find . -name '*.hh' -exec grep -H CreatePolyhedron {} \;
./geometry/management/include/G4VSolid.hh:    virtual G4Polyhedron* CreatePolyhedron () const;
./geometry/management/include/G4ReflectedSolid.hh:    G4Polyhedron* CreatePolyhedron () const ;
./geometry/solids/BREPS/include/G4BREPSolidPCone.hh:  G4Polyhedron* CreatePolyhedron () const;
./geometry/solids/BREPS/include/G4BREPSolid.hh:  G4Polyhedron* CreatePolyhedron () const;
./geometry/solids/BREPS/include/G4BREPSolidPolyhedra.hh:  G4Polyhedron* CreatePolyhedron () const;
./geometry/solids/CSG/include/G4Orb.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/CSG/include/G4Trap.hh:    G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/CSG/include/G4Cons.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/CSG/include/G4Sphere.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/CSG/include/G4Torus.hh:    G4Polyhedron*       CreatePolyhedron   () const;
./geometry/solids/CSG/include/G4Trd.hh:    G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/CSG/include/G4Tubs.hh:// 22.07.96 J.Allison: Changed SendPolyhedronTo to CreatePolyhedron
./geometry/solids/CSG/include/G4Tubs.hh:    G4Polyhedron*       CreatePolyhedron   () const;
./geometry/solids/CSG/include/G4Para.hh:    G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/CSG/include/G4Box.hh://                     and SendPolyhedronTo() to CreatePolyhedron()
./geometry/solids/CSG/include/G4Box.hh:    G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/specific/include/G4TessellatedSolid.hh:    virtual G4Polyhedron* CreatePolyhedron () const;
./geometry/solids/specific/include/G4Polycone.hh:  G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/specific/include/G4VCSGfaceted.hh:    virtual G4Polyhedron* CreatePolyhedron() const = 0;
./geometry/solids/specific/include/G4TwistedTubs.hh:  G4Polyhedron   *CreatePolyhedron   () const;
./geometry/solids/specific/include/G4Paraboloid.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/specific/include/G4EllipticalTube.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/specific/include/G4Ellipsoid.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/specific/include/G4Polyhedra.hh:  G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/specific/include/G4Hype.hh:  G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/specific/include/G4Tet.hh:    G4Polyhedron* CreatePolyhedron   () const;
./geometry/solids/specific/include/G4VTwistedFaceted.hh:  virtual G4Polyhedron   *CreatePolyhedron   () const ;
./geometry/solids/specific/include/G4EllipticalCone.hh:    G4Polyhedron* CreatePolyhedron() const;
./geometry/solids/Boolean/include/G4DisplacedSolid.hh:    G4Polyhedron* CreatePolyhedron () const ;
./geometry/solids/Boolean/include/G4UnionSolid.hh:    G4Polyhedron* CreatePolyhedron () const ;
./geometry/solids/Boolean/include/G4SubtractionSolid.hh:    G4Polyhedron* CreatePolyhedron () const ;
./geometry/solids/Boolean/include/G4IntersectionSolid.hh:    G4Polyhedron* CreatePolyhedron () const ;

$DYB/external/build/LCG/geant4.9.2.p01/source/geometry/solids/CSG/src/G4Tubs.cc:

1890 G4Polyhedron* G4Tubs::CreatePolyhedron () const
1891 {
1892   return new G4PolyhedronTubs (fRMin, fRMax, fDz, fSPhi, fDPhi) ;
1893 }