source: trunk/source/visualization/XXX/src/G4XXXStoredSceneHandler.cc@ 1106

Last change on this file since 1106 was 944, checked in by garnier, 17 years ago

mise a jour des tags

File size: 12.6 KB
Line 
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: G4XXXStoredSceneHandler.cc,v 1.9 2006/10/26 11:30:10 allison Exp $
28// GEANT4 tag $Name: $
29//
30//
31// John Allison 7th March 2006
32// A template for a graphics driver with a store/database.
33//?? Lines beginning like this require specialisation for your driver.
34
35#include "G4XXXStoredSceneHandler.hh"
36
37#include "G4XXXStoredViewer.hh"
38#include "G4PhysicalVolumeModel.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
54G4int G4XXXStoredSceneHandler::fSceneIdCount = 0;
55// Counter for XXX scene handlers.
56
57G4XXXStoredSceneHandler::G4XXXStoredSceneHandler(G4VGraphicsSystem& system,
58 const G4String& name):
59 G4VSceneHandler(system, fSceneIdCount++, name)
60{}
61
62G4XXXStoredSceneHandler::~G4XXXStoredSceneHandler() {}
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 << pPVModel->GetCurrentLV()->GetName() <<
85 "\n current depth of geometry tree: "
86 << pPVModel->GetCurrentDepth();
87 }
88 G4cout << G4endl;
89}
90#endif
91
92void G4XXXStoredSceneHandler::PreAddSolid
93(const G4Transform3D& objectTransformation,
94 const G4VisAttributes& visAttribs)
95{
96 G4VSceneHandler::PreAddSolid(objectTransformation, visAttribs);
97
98 // Get user G4Atts...
99 const std::map<G4String,G4AttDef>* userAttDefs = visAttribs.GetAttDefs();
100 if (userAttDefs) {
101#ifdef G4XXXStoredDEBUG
102 const std::vector<G4AttValue>* userAttValues =
103 visAttribs.CreateAttValues();
104 G4cout << "\nProvided G4Atts:\n"
105 << G4AttCheck(userAttValues, userAttDefs);
106 // Extra checks...
107 G4AttCheck attCheck(userAttValues, userAttDefs);
108 if (attCheck.Check()) G4cout << "Error" << G4endl;
109 else {
110 std::vector<G4AttValue> standardValues;
111 std::map<G4String,G4AttDef> standardDefinitions;
112 attCheck.Standard(&standardValues, &standardDefinitions);
113 G4cout << "\nStandard G4Atts:\n"
114 << G4AttCheck(&standardValues, &standardDefinitions);
115 }
116 // End of extra checks.
117 delete userAttValues; // (Must be deleted after use.)
118#endif
119 }
120
121 // Get solid's G4Atts created by G4PhysicalVolumeModel...
122 G4PhysicalVolumeModel* pPVModel =
123 dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
124 if (pPVModel) {
125 const std::map<G4String,G4AttDef>* solidAttDefs = pPVModel->GetAttDefs();
126 if (solidAttDefs) {
127#ifdef G4XXXStoredDEBUG
128 std::vector<G4AttValue>* solidAttValues =
129 pPVModel->CreateCurrentAttValues();
130 G4cout << "\nProvided G4Atts:\n"
131 << G4AttCheck(solidAttValues, solidAttDefs);
132 // Extra checks...
133 G4AttCheck attCheck(solidAttValues,solidAttDefs);
134 if (attCheck.Check()) G4cout << "Error" << G4endl;
135 else {
136 std::vector<G4AttValue> standardValues;
137 std::map<G4String,G4AttDef> standardDefinitions;
138 attCheck.Standard(&standardValues, &standardDefinitions);
139 G4cout << "\nStandard G4Atts:\n"
140 << G4AttCheck(&standardValues, &standardDefinitions);
141 }
142 // End of extra checks.
143 delete solidAttValues; // (Must be deleted after use.)
144#endif
145 }
146 }
147
148 // Create a place for current solid...
149 fCurrentItem = fStore.insert(fStore.end(), G4String("\nPreAddSolid:\n"));
150 if (fReadyForTransients) {
151 fTransients.push_back(fCurrentItem);
152 } else {
153 fPermanents.push_back(fCurrentItem);
154 }
155}
156
157void G4XXXStoredSceneHandler::PostAddSolid()
158{
159 *fCurrentItem += "\nEndSolid\n";
160 G4VSceneHandler::PostAddSolid();
161}
162
163void G4XXXStoredSceneHandler::BeginPrimitives
164(const G4Transform3D& objectTransformation)
165{
166 G4VSceneHandler::BeginPrimitives(objectTransformation);
167
168 // If thread of control has already passed through PreAddSolid,
169 // avoid opening a graphical data base component again.
170 if (!fProcessingSolid) {
171 // Create a place for current primitive...
172 fCurrentItem = fStore.insert(fStore.end(),
173 G4String("\nBeginPrimitives:\n"));
174 if (fReadyForTransients) {
175 fTransients.push_back(fCurrentItem);
176 } else {
177 fPermanents.push_back(fCurrentItem);
178 }
179 }
180}
181
182void G4XXXStoredSceneHandler::EndPrimitives ()
183{
184 if (!fProcessingSolid) { // Already done if so.
185 *fCurrentItem += "\nEndPrimitives\n";
186 }
187 G4VSceneHandler::EndPrimitives ();
188}
189
190// Note: This function overrides G4VSceneHandler::AddSolid(const
191// G4Box&). You may not want to do this, but this is how it's done if
192// you do. Certain other specific solids may be treated this way -
193// see G4VSceneHandler.hh. The simplest possible driver would *not*
194// implement these polymorphic functions, with the effect that the
195// default versions in G4VSceneHandler are used, which simply call
196// G4VSceneHandler::RequestPrimitives to turn the solid into a
197// G4Polyhedron usually.
198// Don't forget, solids can be transients too (e.g., representing a hit).
199void G4XXXStoredSceneHandler::AddSolid(const G4Box& box) {
200#ifdef G4XXXStoredDEBUG
201 G4cout <<
202 "G4XXXStoredSceneHandler::AddSolid(const G4Box& box) called for "
203 << box.GetName()
204 << G4endl;
205#endif
206 //?? Process your box...
207 std::ostringstream oss;
208 oss << "G4Box(" <<
209 G4String
210 (G4BestUnit
211 (G4ThreeVector
212 (box.GetXHalfLength(), box.GetYHalfLength(), box.GetZHalfLength()),
213 "Length")).strip() << ')';
214 *fCurrentItem += oss.str();
215}
216
217void G4XXXStoredSceneHandler::AddPrimitive(const G4Polyline& polyline) {
218#ifdef G4XXXStoredDEBUG
219 G4cout <<
220 "G4XXXStoredSceneHandler::AddPrimitive(const G4Polyline& polyline) called.\n"
221 << polyline
222 << G4endl;
223#endif
224 // Get vis attributes - pick up defaults if none.
225 //const G4VisAttributes* pVA =
226 // fpViewer -> GetApplicableVisAttributes (polyline.GetVisAttributes ());
227 //?? Process polyline.
228 std::ostringstream oss;
229 oss << polyline;
230 *fCurrentItem += oss.str();
231}
232
233void G4XXXStoredSceneHandler::AddPrimitive(const G4Text& text) {
234#ifdef G4XXXStoredDEBUG
235 G4cout <<
236 "G4XXXStoredSceneHandler::AddPrimitive(const G4Text& text) called.|n"
237 << text
238 << G4endl;
239#endif
240 // Get text colour - special method since default text colour is
241 // determined by the default text vis attributes, which may be
242 // specified independent of default vis attributes of other types of
243 // visible objects.
244 //const G4Colour& c = GetTextColour (text); // Picks up default if none.
245 //?? Process text.
246 std::ostringstream oss;
247 oss << text;
248 *fCurrentItem += oss.str();
249}
250
251void G4XXXStoredSceneHandler::AddPrimitive(const G4Circle& circle) {
252#ifdef G4XXXStoredDEBUG
253 G4cout <<
254 "G4XXXStoredSceneHandler::AddPrimitive(const G4Circle& circle) called.\n"
255 << circle
256 << G4endl;
257 MarkerSizeType sizeType;
258 G4double size = GetMarkerSize (circle, sizeType);
259 switch (sizeType) {
260 default:
261 case screen:
262 // Draw in screen coordinates.
263 G4cout << "screen";
264 break;
265 case world:
266 // Draw in world coordinates.
267 G4cout << "world";
268 break;
269 }
270 G4cout << " size: " << size << G4endl;
271#endif
272 // Get vis attributes - pick up defaults if none.
273 //const G4VisAttributes* pVA =
274 // fpViewer -> GetApplicableVisAttributes (circle.GetVisAttributes ());
275 //?? Process circle.
276 std::ostringstream oss;
277 oss << circle;
278 *fCurrentItem += oss.str();
279}
280
281void G4XXXStoredSceneHandler::AddPrimitive(const G4Square& square) {
282#ifdef G4XXXStoredDEBUG
283 G4cout <<
284 "G4XXXStoredSceneHandler::AddPrimitive(const G4Square& square) called.\n"
285 << square
286 << G4endl;
287 MarkerSizeType sizeType;
288 G4double size = GetMarkerSize (square, sizeType);
289 switch (sizeType) {
290 default:
291 case screen:
292 // Draw in screen coordinates.
293 G4cout << "screen";
294 break;
295 case world:
296 // Draw in world coordinates.
297 G4cout << "world";
298 break;
299 }
300 G4cout << " size: " << size << G4endl;
301#endif
302 // Get vis attributes - pick up defaults if none.
303 //const G4VisAttributes* pVA =
304 // fpViewer -> GetApplicableVisAttributes (square.GetVisAttributes ());
305 //?? Process square.
306 std::ostringstream oss;
307 oss << square;
308 *fCurrentItem += oss.str();
309}
310
311void G4XXXStoredSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) {
312#ifdef G4XXXStoredDEBUG
313 G4cout <<
314 "G4XXXStoredSceneHandler::AddPrimitive(const G4Polyhedron&) called.\n"
315 << polyhedron
316 << G4endl;
317#endif
318 //?? Process polyhedron.
319 std::ostringstream oss;
320 oss << polyhedron;
321 *fCurrentItem += oss.str();
322
323 //?? Or... here are some ideas for decomposing into polygons...
324 //Assume all facets are convex quadrilaterals.
325 //Draw each G4Facet individually
326
327 //Get colour, etc..
328 if (polyhedron.GetNoFacets() == 0) return;
329
330 // Get vis attributes - pick up defaults if none.
331 const G4VisAttributes* pVA =
332 fpViewer -> GetApplicableVisAttributes (polyhedron.GetVisAttributes ());
333
334 // Get view parameters that the user can force through the vis
335 // attributes, thereby over-riding the current view parameter.
336 G4ViewParameters::DrawingStyle drawing_style = GetDrawingStyle (pVA);
337 //G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pVA);
338
339 //Get colour, etc..
340 //const G4Colour& c = pVA -> GetColour ();
341
342 // Initial action depending on drawing style.
343 switch (drawing_style) {
344 case (G4ViewParameters::hsr):
345 {
346 break;
347 }
348 case (G4ViewParameters::hlr):
349 {
350 break;
351 }
352 case (G4ViewParameters::wireframe):
353 {
354 break;
355 }
356 default:
357 {
358 break;
359 }
360 }
361
362 // Loop through all the facets...
363
364 // Look at G4OpenGLSceneHandler::AddPrimitive(const G4Polyhedron&)
365 // for an example of how to get facets out of a G4Polyhedron,
366 // including how to cope with triangles if that's a problem.
367}
368
369void G4XXXStoredSceneHandler::AddPrimitive(const G4NURBS&) {
370#ifdef G4XXXStoredDEBUG
371 G4cout <<
372 "G4XXXStoredSceneHandler::AddPrimitive(const G4NURBS& nurbs) called."
373 << G4endl;
374#endif
375 //?? Don't bother implementing this. NURBS are not functional.
376}
377
378void G4XXXStoredSceneHandler::ClearStore () {
379
380 G4VSceneHandler::ClearStore (); // Sets need kernel visit, etc.
381
382 fStore.clear();
383 fPermanents.clear();
384 fTransients.clear();
385}
386
387void G4XXXStoredSceneHandler::ClearTransientStore () {
388
389 G4VSceneHandler::ClearTransientStore ();
390
391 typedef std::list<G4String> Store;
392 typedef std::list<G4String>::iterator StoreIterator;
393 typedef std::vector<StoreIterator>::iterator StoreIteratorIterator;
394 for (StoreIteratorIterator i = fTransients.begin();
395 i != fTransients.end(); ++i) {
396 fStore.erase(*i);
397 }
398 fTransients.clear();
399
400 // Make sure screen corresponds to graphical database...
401 if (fpViewer) {
402 fpViewer -> SetView ();
403 fpViewer -> ClearView ();
404 fpViewer -> DrawView ();
405 }
406}
Note: See TracBrowser for help on using the repository browser.