// 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); } } }