Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4XXXStoredSceneHandler.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30// John Allison 7th March 2006
31// A template for a graphics driver with a store/database.
32//?? Lines beginning like this require specialisation for your driver.
33
35
36#include "G4XXXStoredViewer.hh"
39#include "G4VPhysicalVolume.hh"
40#include "G4LogicalVolume.hh"
41#include "G4Box.hh"
42#include "G4Polyline.hh"
43#include "G4Text.hh"
44#include "G4Circle.hh"
45#include "G4Square.hh"
46#include "G4Polyhedron.hh"
47#include "G4UnitsTable.hh"
48#include "G4AttDef.hh"
49#include "G4AttValue.hh"
50#include "G4AttCheck.hh"
51
52#include <sstream>
53
55// Counter for XXX scene handlers.
56
58 const G4String& name):
59 G4VSceneHandler(system, fSceneIdCount++, name)
60{}
61
63
64#ifdef G4XXXStoredDEBUG
65// Useful function...
66void G4XXXStoredSceneHandler::PrintThings() {
67 G4cout <<
68 " with transformation "
69 << (void*)fpObjectTransformation;
70 if (fpModel) {
71 G4cout << " from " << fpModel->GetCurrentDescription()
72 << " (tag " << fpModel->GetCurrentTag()
73 << ')';
74 } else {
75 G4cout << "(not from a model)";
76 }
77 G4PhysicalVolumeModel* pPVModel =
78 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
79 if (pPVModel) {
80 G4cout <<
81 "\n current physical volume: "
82 << pPVModel->GetCurrentPV()->GetName() <<
83 "\n current logical volume: "
84// There might be a problem with the LV pointer if this is a G4LogicalVolumeModel
85 << pPVModel->GetCurrentLV()->GetName() <<
86 "\n current depth of geometry tree: "
87 << pPVModel->GetCurrentDepth();
88 }
89 G4cout << G4endl;
90}
91#endif
92
94(const G4Transform3D& objectTransformation,
95 const G4VisAttributes& visAttribs)
96{
97 G4VSceneHandler::PreAddSolid(objectTransformation, visAttribs);
98
99 // Get user G4Atts...
100 const std::map<G4String,G4AttDef>* userAttDefs = visAttribs.GetAttDefs();
101 if (userAttDefs) {
102#ifdef G4XXXStoredDEBUG
103 const std::vector<G4AttValue>* userAttValues =
104 visAttribs.CreateAttValues();
105 G4cout << "\nProvided G4Atts:\n"
106 << G4AttCheck(userAttValues, userAttDefs);
107 // Extra checks...
108 G4AttCheck attCheck(userAttValues, userAttDefs);
109 if (attCheck.Check()) G4cout << "Error" << G4endl;
110 else {
111 std::vector<G4AttValue> standardValues;
112 std::map<G4String,G4AttDef> standardDefinitions;
113 attCheck.Standard(&standardValues, &standardDefinitions);
114 G4cout << "\nStandard G4Atts:\n"
115 << G4AttCheck(&standardValues, &standardDefinitions);
116 }
117 // End of extra checks.
118 delete userAttValues; // (Must be deleted after use.)
119#endif
120 }
121
122 // Get solid's G4Atts created by G4PhysicalVolumeModel...
123 G4PhysicalVolumeModel* pPVModel =
124 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
125 if (pPVModel) {
126 const std::map<G4String,G4AttDef>* solidAttDefs = pPVModel->GetAttDefs();
127 if (solidAttDefs) {
128#ifdef G4XXXStoredDEBUG
129 std::vector<G4AttValue>* solidAttValues =
130 pPVModel->CreateCurrentAttValues();
131 G4cout << "\nProvided G4Atts:\n"
132 << G4AttCheck(solidAttValues, solidAttDefs);
133 // Extra checks...
134 G4AttCheck attCheck(solidAttValues,solidAttDefs);
135 if (attCheck.Check()) G4cout << "Error" << G4endl;
136 else {
137 std::vector<G4AttValue> standardValues;
138 std::map<G4String,G4AttDef> standardDefinitions;
139 attCheck.Standard(&standardValues, &standardDefinitions);
140 G4cout << "\nStandard G4Atts:\n"
141 << G4AttCheck(&standardValues, &standardDefinitions);
142 }
143 // End of extra checks.
144 delete solidAttValues; // (Must be deleted after use.)
145#endif
146 }
147 }
148
149 // Create a place for current solid...
150 fCurrentItem = fStore.insert(fStore.end(), G4String("\nPreAddSolid:\n"));
152 fTransients.push_back(fCurrentItem);
153 } else {
154 fPermanents.push_back(fCurrentItem);
155 }
156}
157
159{
160 *fCurrentItem += "\nEndSolid\n";
162}
163
165(const G4Transform3D& objectTransformation)
166{
167 G4VSceneHandler::BeginPrimitives(objectTransformation);
168
169 // If thread of control has already passed through PreAddSolid,
170 // avoid opening a graphical data base component again.
171 if (!fProcessingSolid) {
172 // Create a place for current primitive...
173 fCurrentItem = fStore.insert(fStore.end(),
174 G4String("\nBeginPrimitives:\n"));
176 fTransients.push_back(fCurrentItem);
177 } else {
178 fPermanents.push_back(fCurrentItem);
179 }
180 }
181}
182
184{
185 if (!fProcessingSolid) { // Already done if so.
186 *fCurrentItem += "\nEndPrimitives\n";
187 }
189}
190
191// Note: This function overrides G4VSceneHandler::AddSolid(const
192// G4Box&). You may not want to do this, but this is how it's done if
193// you do. Certain other specific solids may be treated this way -
194// see G4VSceneHandler.hh. The simplest possible driver would *not*
195// implement these polymorphic functions, with the effect that the
196// default versions in G4VSceneHandler are used, which simply call
197// G4VSceneHandler::RequestPrimitives to turn the solid into a
198// G4Polyhedron usually.
199// Don't forget, solids can be transients too (e.g., representing a hit).
201#ifdef G4XXXStoredDEBUG
202 G4cout <<
203 "G4XXXStoredSceneHandler::AddSolid(const G4Box& box) called for "
204 << box.GetName()
205 << G4endl;
206#endif
207 //?? Process your box...
208 std::ostringstream oss;
209 oss << "G4Box(" <<
213 (box.GetXHalfLength(), box.GetYHalfLength(), box.GetZHalfLength()),
214 "Length")).strip() << ')';
215 *fCurrentItem += oss.str();
216}
217
219#ifdef G4XXXStoredDEBUG
220 G4cout <<
221 "G4XXXStoredSceneHandler::AddPrimitive(const G4Polyline& polyline) called.\n"
222 << polyline
223 << G4endl;
224#endif
225 // Get vis attributes - pick up defaults if none.
226 //const G4VisAttributes* pVA =
227 // fpViewer -> GetApplicableVisAttributes (polyline.GetVisAttributes ());
228 //?? Process polyline.
229 std::ostringstream oss;
230 oss << polyline;
231 *fCurrentItem += oss.str();
232}
233
235#ifdef G4XXXStoredDEBUG
236 G4cout <<
237 "G4XXXStoredSceneHandler::AddPrimitive(const G4Text& text) called.|n"
238 << text
239 << G4endl;
240#endif
241 // Get text colour - special method since default text colour is
242 // determined by the default text vis attributes, which may be
243 // specified independent of default vis attributes of other types of
244 // visible objects.
245 //const G4Colour& c = GetTextColour (text); // Picks up default if none.
246 //?? Process text.
247 std::ostringstream oss;
248 oss << text;
249 *fCurrentItem += oss.str();
250}
251
253#ifdef G4XXXStoredDEBUG
254 G4cout <<
255 "G4XXXStoredSceneHandler::AddPrimitive(const G4Circle& circle) called.\n"
256 << circle
257 << G4endl;
258 MarkerSizeType sizeType;
259 G4double size = GetMarkerSize (circle, sizeType);
260 switch (sizeType) {
261 default:
262 case screen:
263 // Draw in screen coordinates.
264 G4cout << "screen";
265 break;
266 case world:
267 // Draw in world coordinates.
268 G4cout << "world";
269 break;
270 }
271 G4cout << " size: " << size << G4endl;
272#endif
273 // Get vis attributes - pick up defaults if none.
274 //const G4VisAttributes* pVA =
275 // fpViewer -> GetApplicableVisAttributes (circle.GetVisAttributes ());
276 //?? Process circle.
277 std::ostringstream oss;
278 oss << circle;
279 *fCurrentItem += oss.str();
280}
281
283#ifdef G4XXXStoredDEBUG
284 G4cout <<
285 "G4XXXStoredSceneHandler::AddPrimitive(const G4Square& square) called.\n"
286 << square
287 << G4endl;
288 MarkerSizeType sizeType;
289 G4double size = GetMarkerSize (square, sizeType);
290 switch (sizeType) {
291 default:
292 case screen:
293 // Draw in screen coordinates.
294 G4cout << "screen";
295 break;
296 case world:
297 // Draw in world coordinates.
298 G4cout << "world";
299 break;
300 }
301 G4cout << " size: " << size << G4endl;
302#endif
303 // Get vis attributes - pick up defaults if none.
304 //const G4VisAttributes* pVA =
305 // fpViewer -> GetApplicableVisAttributes (square.GetVisAttributes ());
306 //?? Process square.
307 std::ostringstream oss;
308 oss << square;
309 *fCurrentItem += oss.str();
310}
311
313#ifdef G4XXXStoredDEBUG
314 G4cout <<
315 "G4XXXStoredSceneHandler::AddPrimitive(const G4Polyhedron&) called.\n"
316 << polyhedron
317 << G4endl;
318#endif
319 //?? Process polyhedron.
320 std::ostringstream oss;
321 oss << polyhedron;
322 *fCurrentItem += oss.str();
323
324 //?? Or... here are some ideas for decomposing into polygons...
325 //Assume all facets are convex quadrilaterals.
326 //Draw each G4Facet individually
327
328 //Get colour, etc..
329 if (polyhedron.GetNoFacets() == 0) return;
330
331 // Get vis attributes - pick up defaults if none.
332 const G4VisAttributes* pVA =
333 fpViewer -> GetApplicableVisAttributes (polyhedron.GetVisAttributes ());
334
335 // Get view parameters that the user can force through the vis
336 // attributes, thereby over-riding the current view parameter.
338 //G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pVA);
339
340 //Get colour, etc..
341 //const G4Colour& c = pVA -> GetColour ();
342
343 // Initial action depending on drawing style.
344 switch (drawing_style) {
346 {
347 break;
348 }
350 {
351 break;
352 }
354 {
355 break;
356 }
357 default:
358 {
359 break;
360 }
361 }
362
363 // Loop through all the facets...
364
365 // Look at G4OpenGLSceneHandler::AddPrimitive(const G4Polyhedron&)
366 // for an example of how to get facets out of a G4Polyhedron,
367 // including how to cope with triangles if that's a problem.
368}
369
371#ifdef G4XXXStoredDEBUG
372 G4cout <<
373 "G4XXXStoredSceneHandler::AddPrimitive(const G4NURBS& nurbs) called."
374 << G4endl;
375#endif
376 //?? Don't bother implementing this. NURBS are not functional.
377}
378
380{
381 fStore.clear();
382 fPermanents.clear();
383 fTransients.clear();
384}
385
387{
388 typedef std::vector<StoreIterator>::iterator StoreIteratorIterator;
389 for (StoreIteratorIterator i = fTransients.begin();
390 i != fTransients.end(); ++i) {
391 fStore.erase(*i);
392 }
393 fTransients.clear();
394
395 // Make sure screen corresponds to graphical database...
396 if (fpViewer) {
397 fpViewer -> SetView ();
398 fpViewer -> ClearView ();
399 fpViewer -> DrawView ();
400 }
401}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4bool Check(const G4String &leader="") const
Definition: G4AttCheck.cc:110
G4bool Standard(std::vector< G4AttValue > *standardValues, std::map< G4String, G4AttDef > *standardDefinitions) const
Definition: G4AttCheck.cc:336
Definition: G4Box.hh:55
G4double GetYHalfLength() const
G4double GetZHalfLength() const
G4double GetXHalfLength() const
G4String GetName() const
G4VPhysicalVolume * GetCurrentPV() const
std::vector< G4AttValue > * CreateCurrentAttValues() const
G4LogicalVolume * GetCurrentLV() const
const std::map< G4String, G4AttDef > * GetAttDefs() const
G4String strip(G4int strip_Type=trailing, char c=' ')
Definition: G4Text.hh:73
virtual G4String GetCurrentDescription() const
Definition: G4VModel.cc:54
virtual G4String GetCurrentTag() const
Definition: G4VModel.cc:49
const G4String & GetName() const
virtual void EndPrimitives()
G4double GetMarkerSize(const G4VMarker &, MarkerSizeType &)
virtual void PreAddSolid(const G4Transform3D &objectTransformation, const G4VisAttributes &)
G4VViewer * fpViewer
virtual void PostAddSolid()
virtual void BeginPrimitives(const G4Transform3D &objectTransformation)
G4ViewParameters::DrawingStyle GetDrawingStyle(const G4VisAttributes *)
G4String GetName() const
const std::map< G4String, G4AttDef > * GetAttDefs() const
const std::vector< G4AttValue > * CreateAttValues() const
const G4VisAttributes * GetVisAttributes() const
void BeginPrimitives(const G4Transform3D &objectTransformation)
std::vector< StoreIterator > fTransients
std::vector< StoreIterator > fPermanents
void PreAddSolid(const G4Transform3D &objectTransformation, const G4VisAttributes &)
void AddPrimitive(const G4Polyline &)
G4XXXStoredSceneHandler(G4VGraphicsSystem &system, const G4String &name)
G4int GetNoFacets() const