Files
geant4/source/visualization/management/src/G4VisManMessDraw.cc
T
2016-06-08 16:03:00 +02:00

273 lines
9.5 KiB
C++

// This code implementation is the intellectual property of
// the GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4VisManMessDraw.cc,v 1.7 2001/02/23 15:43:29 johna Exp $
// GEANT4 tag $Name: geant4-03-01 $
//
//
// GEANT4 Visualization Manager Messenger - John Allison 22nd July 1996.
// Draw sub-menu.
#include "G4VisManMessenger.hh"
#include "G4VisManager.hh"
#include "G4Polyline.hh"
#include "G4Text.hh"
#include "G4UImanager.hh"
#include "G4UIcommand.hh"
#include "G4UIparameter.hh"
#include "G4UnitsTable.hh"
#include "G4ios.hh"
#include "G4VGlobalFastSimulationManager.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4FlavoredParallelWorldModel.hh"
#include "G4ModelingParameters.hh"
void G4VisManMessenger::AddCommandDraw () {
G4UIcommand* command;
G4UIparameter* param;
//////////////////////////////////// /vis~/draw/axes /////
//draw \hline
//draw /vis~/draw/axes & $x_0$, $y_0$, $z_0$, length, unit &
//draw Draws axes at $(x_0, y_0, z_0)$ of given length. \\%
command = new G4UIcommand ("/vis~/draw/axes", this);
command -> SetGuidance
(
"Draws axes at (x0, y0, z0) of given length."
);
param = new G4UIparameter ("x0", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("y0", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("z0", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("length", 'd', true);
param -> SetDefaultValue (10000.);
command -> SetParameter (param);
param = new G4UIparameter ("unit", 's', true);
param -> SetDefaultValue ("mm");
param -> SetGuidance ("mm, cm, or m.");
command -> SetParameter (param);
fCommandList.push_back (command);
//////////////////////////////////// /vis~/draw/text /////
//draw \hline
//draw /vis~/draw/text & $x$, $y$, $z$, unit,
//draw font\_size, x\_offset, y\_offset, text &
//draw Draws text at $(x, y, z)$ with given parameters.
//draw Font size and offsets in pixels. \\%
command = new G4UIcommand ("/vis~/draw/text", this);
command -> SetGuidance
("Draws at (x, y, z) unit font_size x_offset y_offset text.");
command -> SetGuidance
("Font size and offsets in pixels.");
param = new G4UIparameter ("x", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("y", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("z", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("unit", 's', true);
param -> SetDefaultValue ("mm");
param -> SetGuidance ("mm, cm, or m.");
command -> SetParameter (param);
param = new G4UIparameter ("font_size", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("x_offset", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("y_offset", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("text", 's', true);
param -> SetDefaultValue ("text");
command -> SetParameter (param);
fCommandList.push_back (command);
//
//////////////////////////////////// /vis~/draw/ghosts /////
command = new G4UIcommand ("/vis~/draw/ghosts", this);
command -> SetGuidance
(
"Adds to the current scene all ghost volumes"
);
param = new G4UIparameter ("ParticleName", 's', true);
param -> SetDefaultValue ("all");
command -> SetParameter (param);
fCommandList.push_back (command);
/******************************** UNDER DEVELOPMENT ?????????????
////////////////////////// /vis~/draw/volume /////
//??draw \hline
//??draw /vis~/draw/volume & name &
//??draw Clears the current scene, makes a new one consisting of the
//??draw physical volume ``name'' and
//??draw draws it in the current view, marking all other views of this scene
//??draw as needing refreshing. \\%
command = new G4UIcommand ("/vis~/draw/volume", this);
command -> SetGuidance
(
"Clears the current scene, makes a new one consisting of the "
"physical volume \"name\" and "
"draws it in the current view, marking all other views of this scene "
"as needing refreshing."
);
param = new G4UIparameter ("Physical volume name", 's', true);
param -> SetDefaultValue ("__none__");
command -> SetParameter (param);
fCommandList.push_back (command);
**************************************************************/
}
void G4VisManMessenger::DoCommandDraw (const G4String& commandPath,
G4String& newValues) {
///////////////////////////////////////// /vis~/draw/axes ////
if (commandPath == "/vis~/draw/axes") {
if (ViewValid ()) {
G4double x0, y0, z0;
G4double length ;
G4String unitString;
const char* aString = newValues;
G4std::istrstream is((char*) aString);
is >> x0 >> y0 >> z0 >> length >> unitString;
G4double unit = G4UnitDefinition::GetValueOf (unitString);
x0 *= unit; y0 *= unit; z0 *= unit; length *= unit;
G4Polyline x_axis, y_axis, z_axis;
G4Colour cx(1.0, 0.0, 0.0); // color for x-axis
G4Colour cy(0.0, 1.0, 0.0); // color for y-axis
G4Colour cz(0.0, 0.0, 1.0); // color for z-axis
G4VisAttributes ax(cx); // VA for x-axis
G4VisAttributes ay(cy); // VA for y-axis
G4VisAttributes az(cz); // VA for z-axis
//----- Draw x-axis
x_axis.SetVisAttributes(&ax);
x_axis.append (G4Point3D (x0*unit,y0,z0));
x_axis.append ( G4Point3D ( (x0 +length) , y0, z0 ) );
fpVMan -> Draw (x_axis);
x_axis.clear ();
//----- Draw y-axis
y_axis.SetVisAttributes(&ay);
y_axis.append (G4Point3D (x0,y0,z0));
y_axis.append ( G4Point3D ( x0 , (y0 +length ) , z0 ) );
fpVMan -> Draw (y_axis);
y_axis.clear ();
//----- Draw z-axis
z_axis.SetVisAttributes(&az);
z_axis.append (G4Point3D (x0,y0,z0));
z_axis.append ( G4Point3D ( x0 , y0 , ( z0 +length ) ) );
fpVMan -> Draw (z_axis);
z_axis.clear ();
}
}
///////////////////////////////////////// /vis~/draw/text ////
if (commandPath == "/vis~/draw/text") {
if (ViewValid ()) {
G4double x, y, z;
G4double font_size, x_offset, y_offset;
G4String unitString, textString;
const char* aString = newValues;
G4std::istrstream is((char*) aString);
is >> x >> y >> z >> unitString
>> font_size >> x_offset >> y_offset >> textString;
G4double unit = G4UnitDefinition::GetValueOf (unitString);
x *= unit; y *= unit; z *= unit;
G4Text g4Text (textString, G4Point3D (x, y, z));
g4Text.SetScreenSize (font_size);
g4Text.SetOffset (x_offset, y_offset);
fpVMan -> Draw (g4Text);
}
}
////////////////////////// /vis~/draw/volume /////
if (commandPath == "/vis~/draw/volume") {
G4VisManager::PrintCommandDeprecation
("Use \"/vis/scene/add/volume\" or \"/vis/drawVolume\".");
// Find physical_volume.
G4String name;
const char* aString = newValues;
G4std::istrstream is((char*) aString) ; is >> name;
G4cout << "/vis~/draw/volume: requested name is " << name;
G4cout << "\n...but this command is \"UNDER DEVELOPMENT\"!";
G4cout << G4endl;
}
////////////////////////// /vis~/draw/ghosts /////
if (commandPath == "/vis~/draw/ghosts") {
G4VisManager::PrintCommandDeprecation
("Use \"/vis/scene/add/ghosts\".");
// preliminaries
G4VisManager* theVisManager;
if(!(theVisManager= G4VisManager::GetInstance())) {
G4cout<< "grafic system not yet avaliable." << G4endl;
return;
}
G4VGlobalFastSimulationManager* theGlobalFastSimulationManager;
if(!(theGlobalFastSimulationManager =
G4VGlobalFastSimulationManager::GetConcreteInstance ())){
G4cout<< "WARNING: none G4GlobalFastSimulationManager" << G4endl;
return;
}
G4ParticleTable* theParticleTable=G4ParticleTable::GetParticleTable();
G4Scene* currentScene = theVisManager -> GetCurrentScene ();
// Ok, lets look on the parameters
if(newValues=="all") {
G4VFlavoredParallelWorld* CurrentFlavoredWorld;
for (G4int iParticle=0; iParticle<theParticleTable->entries();
iParticle++)
if(CurrentFlavoredWorld=theGlobalFastSimulationManager->
GetFlavoredWorldForThis(theParticleTable->
GetParticle(iParticle)))
currentScene -> AddRunDurationModel
(new G4FlavoredParallelWorldModel (CurrentFlavoredWorld));
G4cout << "Ghosts added to the Scene, refresh the view to see it."
<< G4endl;
return;
}
G4ParticleDefinition* currentParticle =
theParticleTable->FindParticle(newValues);
if (currentParticle == NULL) {
G4cout << newValues << ": not found this particle name!" << G4endl;
return;
}
G4VFlavoredParallelWorld* worldForThis;
if(worldForThis=theGlobalFastSimulationManager->
GetFlavoredWorldForThis(currentParticle)) {
currentScene -> AddRunDurationModel
(new G4FlavoredParallelWorldModel (worldForThis));
G4cout << "Ghosts added to the Scene, refresh the view to see it."
<< G4endl;
}
else G4cout << "There are no ghosts for "<<newValues<<G4endl;
}
}