Files
geant4/source/visualization/management/src/G4VisManMessExpert.cc
T
2016-06-08 15:55:53 +02:00

435 lines
15 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: G4VisManMessExpert.cc,v 1.4 1999/12/15 14:54:27 gunter Exp $
// GEANT4 tag $Name: geant4-03-00 $
//
//
// GEANT4 Visualization Manager Messenger - John Allison 22nd July 1996.
// Expert sub-menu.
#include "G4VisManMessenger.hh"
#include "G4VisManager.hh"
#include "G4Polyline.hh"
#include "G4Square.hh"
#include "G4Circle.hh"
#include "G4Text.hh"
#include "G4Polymarker.hh"
#include "G4VisAttributes.hh"
#include "G4Colour.hh"
#include "Randomize.hh"
#include "G4Vector3D.hh"
#include "G4Point3D.hh"
#include "G4LogicalVolume.hh"
#include "G4VPhysicalVolume.hh"
#include "G4UImanager.hh"
#include "G4UIcommand.hh"
#include "G4UIparameter.hh"
#include "G4ios.hh"
void G4VisManMessenger::AddCommandExpert () {
G4UIcommand* command;
G4UIparameter* param;
//////////////////////////////////////////////////// /vis~/expert/... ////
//vis \hline
//vis /vis~/expert/ &&
//vis ...menu of expert commands. \\%
command = new G4UIcommand ("/vis~/expert/", this);
command -> SetGuidance
(
"...menu of expert commands."
);
fCommandList.append (command);
//////////////////////////////////////// /vis~/expert/draw_circle ////
//expert \hline
//expert /vis~/expert/draw\_circle & $x$, $y$, $z$, $size$ &
//expert Specify coordinates and world size. \\%
command = new G4UIcommand ("/vis~/expert/draw_circle", this);
command -> SetGuidance ("Specify coordinates x, y, z and world size");
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 ("size", 'd', true);
param -> SetDefaultValue (10.);
command -> SetParameter (param);
fCommandList.append (command);
//////////////////////////////////////// /vis~/expert/draw_line ////
//expert \hline
//expert /vis~/expert/draw\_line & $x_0$, $y_0$, $z_0$, $x_1$, $y_1$, $z_1$ &
//expert Specify coordinates of start and end. \\%
command = new G4UIcommand ("/vis~/expert/draw_line", this);
command -> SetGuidance ("Specify coordinates x0, y0, z0, x1, y1 and z1");
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 ("x1", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("y1", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
param = new G4UIparameter ("z1", 'd', true);
param -> SetDefaultValue (0.);
command -> SetParameter (param);
fCommandList.append (command);
//////////////////////////////////// /vis~/expert/draw_marks_and_show ////
//expert \hline
//expert /vis~/expert/ draw\_marks\_and\_show & $x$, $y$, $z$, $size$ &
//expert Specify coordinates and world size. \\%
command = new G4UIcommand ("/vis~/expert/draw_marks_and_show", this);
command -> SetGuidance ("Specify coordinates x, y, z and world size");
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 ("size", 'd', true);
param -> SetDefaultValue (10.);
command -> SetParameter (param);
fCommandList.append (command);
/***************************************
//////////////////////////////////// /vis~/expert/draw_physical_volume ////
//expert \hline
//expert /vis~/expert/ draw\_physical\_volume &&
//expert A test of
//expert {\tt G4VisManager::Draw (const G4VPhysicalVolume\&},... \\%
command = new G4UIcommand ("/vis~/expert/draw_physical_volume", this);
command -> SetGuidance
(
"A test of G4VisManager::Draw (const G4VPhysicalVolume&,..."
);
fCommandList.append (command);
**************************************/
//////////////////////////////////////// /vis~/expert/draw_polymarkers ////
//expert \hline
//expert /vis~/expert/draw\_polymarkers & $N_\mathrm{spirals}$ &
//expert Draws {\tt G4Polymarker}s in the form of coloured spirals. \\%
command = new G4UIcommand ("/vis~/expert/draw_polymarkers", this);
command -> SetGuidance ("Takes 2 parameters: no. of random sets, type");
param = new G4UIparameter ("no. of polymarker sets", 'i', true);
param -> SetDefaultValue (1);
command -> SetParameter (param);
param = new G4UIparameter ("marker type", 'i', true);
param -> SetGuidance ("0/1/2/3 = line/dots/circles/squares");
param -> SetDefaultValue (0);
command -> SetParameter (param);
fCommandList.append (command);
//////////////////////////////////////// /vis~/expert/draw_spiral ////
//expert \hline
//expert /vis~/expert/draw\_spiral &&
//expert Draws a {\tt G4Polyline} in the form of a spiral. \\%
command = new G4UIcommand ("/vis~/expert/draw_spiral", this);
command -> SetGuidance
(
"Draws a G4Polyline in the form of a spiral."
);
fCommandList.append (command);
//////////////////////////////////////// /vis~/expert/draw_spirals ////
//expert \hline
//expert /vis~/expert/draw\_spirals & $N_\mathrm{spirals}$ &
//expert Draws {\tt G4Polyline}s in the form of coloured spirals. \\%
command = new G4UIcommand ("/vis~/expert/draw_spirals", this);
command -> SetGuidance
(
"Draws G4Polylines in the form of coloured spirals."
);
param = new G4UIparameter ("no. of spirals", 'i', true);
param -> SetDefaultValue (1);
command -> SetParameter (param);
fCommandList.append (command);
//////////////////////////////////////// /vis~/expert/draw_square ////
//expert \hline
//expert /vis~/expert/draw\_square & $x$, $y$, $z$, $size$ &
//expert Specify coordinates and world size. \\%
command = new G4UIcommand ("/vis~/expert/draw_square", this);
command -> SetGuidance ("Specify coordinates x, y, z and world size");
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 ("size", 'd', true);
param -> SetDefaultValue (10.);
command -> SetParameter (param);
fCommandList.append (command);
}
void G4VisManMessenger::DoCommandExpert (const G4String& commandPath,
G4String& newValues) {
/////////////////////////////////////// /vis~/expert/draw_circle ////
if (commandPath == "/vis~/expert/draw_circle") {
if (ViewValid ()) {
G4double x, y, z, worldSize;
const char* aString = newValues;
G4std::istrstream is((char*) aString); is >> x >> y >> z >> worldSize;
G4Circle circle = G4Circle(G4Point3D(x,y,z));
circle.SetWorldSize (worldSize);
G4Colour c(0.0, 1.0, 1.0 );
G4VisAttributes a(c);
circle.SetVisAttributes(&a);
fpVMan->Draw (circle);
}
}
/////////////////////////////////////// /vis~/expert/draw_line ////
if (commandPath == "/vis~/expert/draw_line") {
if (ViewValid ()) {
G4double x0, y0, z0;
G4double x1, y1, z1;
const char* aString = newValues;
G4std::istrstream is((char*) aString); is >> x0 >> y0 >> z0 >> x1 >> y1 >> z1 ;
G4Polyline line;
G4Colour c(1.0, 0.0, 0.0);
G4VisAttributes a(c);
line.SetVisAttributes(&a);
line.append (G4Point3D (x0,y0,z0));
line.append (G4Point3D (x1,y1,z1));
fpVMan -> Draw (line);
line.clear ();
}
}
//////////////////////////////////// /vis~/expert/draw_marks_and_show ////
if (commandPath == "/vis~/expert/draw_marks_and_show") {
const G4int num_each_marks = 100 ;
const G4double mark_step = 1000.0 ;
G4int i ;
G4double xx, yy, zz ;
if (ViewValid ()) {
G4double x, y, z, worldSize;
const char* aString = newValues;
G4std::istrstream is((char*) aString); is >> x >> y >> z >> worldSize;
// Draw squares
xx = x ; yy = y; zz = z ;
for( i = 0 ; i < num_each_marks ; i++ ) {
G4Square Square = G4Square(G4Point3D(xx,yy,zz));
Square.SetWorldSize (worldSize);
G4Colour c(1.0, 0.0, 0.0 );
G4VisAttributes a(c);
Square.SetVisAttributes(&a);
fpVMan->Draw (Square);
xx += mark_step ;
yy = y ; zz = z ;
} // for
// Draw circles
xx = x ; yy = y; zz = z ;
for( i = 0 ; i < num_each_marks ; i++ ) {
G4Circle circle = G4Circle (G4Point3D(xx,yy,zz));
circle.SetWorldSize (worldSize);
G4Colour c(0.0, 1.0, 1.0 );
G4VisAttributes a(c);
circle.SetVisAttributes(&a);
fpVMan->Draw (circle);
yy += mark_step ;
xx = x ; zz = z ;
} // for
// show
fpVMan -> Show ();
} // if
}
/****************************************
////////////////////////////////// /vis~/expert/draw_physical_volume ////
if (commandPath == "/vis~/expert/draw_physical_volume") {
if (ViewValid ()) {
// Given a physical volume...
G4VPhysicalVolume* pPhysVol =
fpVMan -> GetCurrentScene ().GetPhysicalVolume ();
// Given its transformation (normally, this would be known from
// the hits or digis information)...
HepRotation m;
Hep3Vector axis (G4UniformRand(), G4UniformRand(), G4UniformRand());
m.rotate (twopi * G4UniformRand(), axis);
G4double scale = 1000. * G4UniformRand();
Hep3Vector v (scale * G4UniformRand(),
scale * G4UniformRand(),
scale * G4UniformRand());
G4Transform3D transform (m, v);
// Change attributes - begin snippet.
// pPhysVol is the pointer to the physical volume.
// transform is the required G4Transform3D in the world
// coordinate system.
// Find the corresponding logical volume...
G4LogicalVolume* pLV = pPhysVol -> GetLogicalVolume ();
// Copy its visualization attributes into local variable...
const G4VisAttributes* pVA = pLV -> GetVisAttributes ();
G4VisAttributes attribs; // Default vis attributes.
if (pVA) attribs = *pVA; // Set to those of logical volume if any.
// Modify the visualization attributes...
G4double red = G4UniformRand();
G4double green = G4UniformRand();
G4double blue = G4UniformRand();
G4Colour c (red, green, blue);
attribs.SetColour (c);
attribs.SetForceSolid (true);
// Draw it...
fpVMan -> Draw (*pPhysVol, attribs, transform);
// Change attributes - end snippet.
}
}
***********************************/
/////////////////////////////////////// /vis~/expert/draw_polymarkers ////
if (commandPath == "/vis~/expert/draw_polymarkers") {
if (ViewValid ()) {
int nPolyMarkers, type;
const char* aString = newValues;
G4std::istrstream is((char*) aString) ;is >> nPolyMarkers >> type;
G4Polymarker::MarkerType realType;
switch (type) {
default:
case 0: realType = G4Polymarker::line; break;
case 1: realType = G4Polymarker::dots; break;
case 2: realType = G4Polymarker::circles; break;
case 3: realType = G4Polymarker::squares; break;
}
G4int i;
G4double a, fa, z, dz, t, dt = M_PI / 20.;
for (int iPolyMarker = 0; iPolyMarker < nPolyMarkers; iPolyMarker++) {
G4double x0 = 2000. * (G4UniformRand() - 0.5);
G4double y0 = 2000. * (G4UniformRand() - 0.5);
G4double z0 = 2000. * (G4UniformRand() - 0.5);
a = 1000. * G4UniformRand();
fa = 0.99 + 0.01 * G4UniformRand();
z = 500. * (G4UniformRand() - 0.5);
dz = 50. * (G4UniformRand() - 0.5);
G4Polymarker polymarker;
G4int nPoints = G4int (100 * G4UniformRand());
G4double tStart = twopi * G4UniformRand();
for (i = 0, t = tStart; i < nPoints; t += dt, a *= fa, z += dz, i++) {
polymarker.append (G4Point3D (x0 + a * cos (t),
y0 + a * sin (t), z0 + z));
}
G4double red = G4UniformRand();
G4double green = G4UniformRand();
G4double blue = G4UniformRand();
G4Colour c (red, green, blue);
G4VisAttributes a(c);
polymarker.SetVisAttributes(&a);
polymarker.SetMarkerType (realType);
fpVMan -> Draw (polymarker);
}
}
}
/////////////////////////////////////// /vis~/expert/draw_spiral ////
if (commandPath == "/vis~/expert/draw_spiral") {
if (ViewValid ()) {
G4Polyline line;
G4double t = 0., dt = M_PI / 50.;
G4double a = 2000., fa = 0.999;
G4double z = -500., dz = 1.;
for (int i = 0; i < 1000; t += dt, a *= fa, z += dz, i++) {
line.append (G4Point3D (a * cos (t), a * sin (t), z));
}
fpVMan -> Draw (line);
}
}
/////////////////////////////////////// /vis~/expert/draw_spirals ////
if (commandPath == "/vis~/expert/draw_spirals") {
if (ViewValid ()) {
int nSpirals;
const char* aString = newValues;
G4std::istrstream is((char*) aString) ; is >> nSpirals;
G4int i;
G4double a, fa, z, dz, t, dt = M_PI / 50.;
G4Polyline line;
for (int iSpiral = 0; iSpiral < nSpirals; iSpiral++) {
G4double x0 = 2000. * (G4UniformRand() - 0.5);
G4double y0 = 2000. * (G4UniformRand() - 0.5);
G4double z0 = 2000. * (G4UniformRand() - 0.5);
a = 1000. * G4UniformRand();
fa = 0.9985 + 0.001 * G4UniformRand();
z = 500. * (G4UniformRand() - 0.5);
dz = 5. * (G4UniformRand() - 0.5);
G4int nPoints = G4int (1000 * G4UniformRand());
G4double tStart = twopi * G4UniformRand();
for (i = 0, t = tStart; i < nPoints; t += dt, a *= fa, z += dz, i++) {
line.append (G4Point3D (x0 + a * cos (t), y0 + a * sin (t), z0 + z));
}
G4Colour c (G4UniformRand(), G4UniformRand(), G4UniformRand());
G4VisAttributes a(c);
line.SetVisAttributes(&a);
fpVMan -> Draw (line);
line.clear ();
}
}
}
/////////////////////////////////////// /vis~/expert/draw_square ////
if (commandPath == "/vis~/expert/draw_square") {
if (ViewValid ()) {
G4double x, y, z, worldSize;
const char* aString = newValues;
G4std::istrstream is((char*) aString); is >> x >> y >> z >> worldSize;
G4Square Square = G4Square (G4Point3D (x, y, z));
// Set attributes - begin snippet.
Square.SetWorldSize (worldSize);
G4Colour c (1.0, 0.0, 0.0 );
G4VisAttributes a(c);
Square.SetVisAttributes(&a);
// Set attributes - end snippet.
fpVMan->Draw (Square);
}
}
}