MCPcopy Create free account
hub / github.com/Geant4/geant4 / InsertModelInSceneTree

Method InsertModelInSceneTree

source/visualization/management/src/G4VViewer.cc:346–406  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

344}
345
346void G4VViewer::InsertModelInSceneTree(G4VModel* model)
347{
348 const auto& modelType = model->GetType();
349 const auto& modelDescription = model->GetGlobalDescription();
350
351 auto type = G4SceneTreeItem::model;
352 auto pvModel = dynamic_cast<G4PhysicalVolumeModel*>(model);
353 if (pvModel) type = G4SceneTreeItem::pvmodel;
354
355 fCurtailDescent = false; // This is used later in SceneTreeScene::ProcessVolume
356 G4String furtherInfo;
357 static G4bool firstWarning = true;
358 G4bool warned = false;
359 if (pvModel) {
360 const auto& nAllTouchables = pvModel->GetTotalAllTouchables();
361 if (nAllTouchables > fMaxAllTouchables) {
362 std::ostringstream oss;
363 oss << nAllTouchables << " touchables - too many for scene tree";
364 furtherInfo = oss.str();
365 if (firstWarning) {
366 warned = true;
367 if (G4VisManager::GetInstance()->GetVerbosity() >= G4VisManager::warnings) {
368 G4ExceptionDescription ed;
369 ed << pvModel->GetGlobalDescription() <<
370 ":\n Too many touchables (" << nAllTouchables
371 << ") for scene tree. Scene tree for this model will be empty.";
372 G4Exception("G4VViewer::InsertModelInSceneTree", "visman0404", JustWarning, ed);
373 }
374 }
375 fCurtailDescent = true; // This is used later in SceneTreeScene::ProcessVolume
376 }
377 }
378 if (warned) firstWarning = false;
379
380 // Find appropriate model
381 auto& modelItems = fSceneTree.AccessChildren();
382 auto modelIter = modelItems.begin();
383 auto pvModelIter = modelItems.end();
384 for (; modelIter != modelItems.end(); ++modelIter) {
385 if (modelIter->GetType() == G4SceneTreeItem::pvmodel) {
386 pvModelIter = modelIter; // Last pre-existing PV model (if any)
387 }
388 if (modelIter->GetModelDescription() == modelDescription) break;
389 }
390
391 if (modelIter == modelItems.end()) { // Model not seen before
392 G4SceneTreeItem modelItem(type);
393 modelItem.SetDescription("model");
394 modelItem.SetModelType(modelType);
395 modelItem.SetModelDescription(modelDescription);
396 modelItem.SetFurtherInfo(furtherInfo);
397 if (pvModelIter != modelItems.end() && // There was pre-existing PV Model...
398 type == G4SceneTreeItem::pvmodel) { // ...and the new model is also PV...
399 fSceneTree.InsertChild(++pvModelIter, modelItem); // ...insert after, else...
400 } else {
401 fSceneTree.InsertChild(modelIter, modelItem); // ...insert at end
402 }
403 } else { // Existing model - mark visible == active

Callers 3

ProcessSceneMethod · 0.80
DrawEventMethod · 0.80
DrawEndOfRunModelsMethod · 0.80

Calls 12

GetInstanceFunction · 0.85
G4ExceptionFunction · 0.85
GetTotalAllTouchablesMethod · 0.80
SetDescriptionMethod · 0.80
SetModelDescriptionMethod · 0.80
SetFurtherInfoMethod · 0.80
InsertChildMethod · 0.80
GetTypeMethod · 0.45
GetVerbosityMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
SetModelTypeMethod · 0.45

Tested by

no test coverage detected