Files
geant4/source/visualization/RayTracer/src/G4RTMessenger.cc
T
2016-06-08 16:18:25 +02:00

194 lines
7.8 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: G4RTMessenger.cc,v 1.5 2001/07/11 10:09:03 gunter Exp $
// GEANT4 tag $Name: geant4-04-00 $
//
//
//
#include "G4RTMessenger.hh"
#include "G4UIdirectory.hh"
#include "G4UIcmdWithABool.hh"
#include "G4UIcmdWith3Vector.hh"
#include "G4UIcmdWith3VectorAndUnit.hh"
#include "G4UIcmdWithADoubleAndUnit.hh"
#include "G4UIcmdWithAnInteger.hh"
#include "G4UIcmdWithAString.hh"
#include "G4RayTracer.hh"
#include "G4RTSteppingAction.hh"
#include "G4ThreeVector.hh"
G4RTMessenger::G4RTMessenger(G4RayTracer* p1,G4RTSteppingAction* p2)
{
theTracer = p1;
theSteppingAction = p2;
rayDirectory = new G4UIdirectory("/vis/rayTracer/");
rayDirectory->SetGuidance("RayTracer commands.");
fileCmd = new G4UIcmdWithAString("/vis/rayTracer/trace",this);
fileCmd->SetGuidance("Start the ray tracing.");
fileCmd->SetGuidance("Define the name of output JPEG file.");
fileCmd->SetParameterName("fileName",true);
fileCmd->SetDefaultValue("g4RayTracer.jpeg");
fileCmd->AvailableForStates(Idle);
columnCmd = new G4UIcmdWithAnInteger("/vis/rayTracer/column",this);
columnCmd->SetGuidance("Define the number of horizontal pixels.");
columnCmd->SetParameterName("nPixel",false);
columnCmd->SetRange("nPixel > 0");
rowCmd = new G4UIcmdWithAnInteger("/vis/rayTracer/row",this);
rowCmd->SetGuidance("Define the number of virtical pixels.");
rowCmd->SetParameterName("nPixel",false);
rowCmd->SetRange("nPixel > 0");
targetCmd = new G4UIcmdWith3VectorAndUnit("/vis/rayTracer/target",this);
targetCmd->SetGuidance("Define the center position of the target.");
targetCmd->SetParameterName("X","Y","Z",true);
targetCmd->SetDefaultValue(G4ThreeVector(0.,0.,0.));
targetCmd->SetDefaultUnit("m");
eyePosCmd = new G4UIcmdWith3VectorAndUnit("/vis/rayTracer/eyePosition",this);
eyePosCmd->SetGuidance("Define the eye position.");
eyePosCmd->SetGuidance("Eye direction is calsurated from (target - eyePosition).");
eyePosCmd->SetParameterName("X","Y","Z",true);
eyePosCmd->SetDefaultValue(G4ThreeVector(0.,0.,0.));
eyePosCmd->SetDefaultUnit("m");
lightCmd = new G4UIcmdWith3Vector("/vis/rayTracer/lightDirection",this);
lightCmd->SetGuidance("Define the direction of illumination light.");
lightCmd->SetGuidance("The vector needs not to be a unit vector, but it must not be a zero vector.");
lightCmd->SetParameterName("Px","Py","Pz",true);
lightCmd->SetDefaultValue(G4ThreeVector(0.1,0.2,0.3));
lightCmd->SetRange("Px != 0 || Py != 0 || Pz != 0");
spanXCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/span",this);
spanXCmd->SetGuidance("Define the angle per 100 pixels.");
spanXCmd->SetParameterName("span",true);
spanXCmd->SetDefaultValue(50.);
spanXCmd->SetDefaultUnit("deg");
spanXCmd->SetRange("span>0.");
headCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/headAngle",this);
headCmd->SetGuidance("Define the head direction.");
headCmd->SetParameterName("headAngle",true);
headCmd->SetDefaultValue(270.);
headCmd->SetDefaultUnit("deg");
headCmd->SetRange("headAngle>=0. && headAngle<360.");
attCmd = new G4UIcmdWithADoubleAndUnit("/vis/rayTracer/attenuation",this);
attCmd->SetGuidance("Define the attenuation length for transparent material.");
attCmd->SetGuidance("Note that this value is independent to the attenuation length for the optical photon processes.");
attCmd->SetParameterName("Length",true);
attCmd->SetDefaultValue(1.0);
attCmd->SetDefaultUnit("m");
attCmd->SetRange("Length > 0.");
distCmd = new G4UIcmdWithABool("/vis/rayTracer/distortion",this);
distCmd->SetGuidance("Distortion effect of the fish eye lens.");
distCmd->SetParameterName("flag",true);
distCmd->SetDefaultValue(false);
transCmd = new G4UIcmdWithABool("/vis/rayTracer/ignoreTransparency",this);
transCmd->SetGuidance("Ignore transparency even if the alpha of G4Colour < 1.");
transCmd->SetParameterName("flag",true);
transCmd->SetDefaultValue(false);
}
G4RTMessenger::~G4RTMessenger()
{
delete columnCmd;
delete rowCmd;
delete targetCmd;
delete eyePosCmd;
delete lightCmd;
delete spanXCmd;
delete headCmd;
delete attCmd;
delete distCmd;
delete transCmd;
delete fileCmd;
delete rayDirectory;
}
G4String G4RTMessenger::GetCurrentValue(G4UIcommand * command)
{
G4String currentValue;
if(command==columnCmd)
{ currentValue = columnCmd->ConvertToString(theTracer->GetNColumn()); }
else if(command==rowCmd)
{ currentValue = rowCmd->ConvertToString(theTracer->GetNRow()); }
else if(command==targetCmd)
{ currentValue = targetCmd->ConvertToString(theTracer->GetTargetPosition(),"m"); }
else if(command==eyePosCmd)
{ currentValue = eyePosCmd->ConvertToString(theTracer->GetEyePosition(),"m"); }
else if(command==lightCmd)
{ currentValue = lightCmd->ConvertToString(theTracer->GetLightDirection()); }
else if(command==spanXCmd)
{ currentValue = spanXCmd->ConvertToString(theTracer->GetViewSpan(),"deg"); }
else if(command==headCmd)
{ currentValue = headCmd->ConvertToString(theTracer->GetHeadAngle(),"deg"); }
else if(command==attCmd)
{ currentValue = attCmd->ConvertToString(theTracer->GetAttenuationLength(),"m");}
else if(command==distCmd)
{ currentValue = distCmd->ConvertToString(theTracer->GetDistortion()); }
else if(command==transCmd)
{ currentValue = transCmd->ConvertToString(theSteppingAction->GetIgnoreTransparency()); }
return currentValue;
}
void G4RTMessenger::SetNewValue(G4UIcommand * command,G4String newValue)
{
if(command==columnCmd)
{ theTracer->SetNColumn(columnCmd->GetNewIntValue(newValue)); }
else if(command==rowCmd)
{ theTracer->SetNRow(rowCmd->GetNewIntValue(newValue)); }
else if(command==targetCmd)
{ theTracer->SetTargetPosition(targetCmd->GetNew3VectorValue(newValue)); }
else if(command==eyePosCmd)
{ theTracer->SetEyePosition(eyePosCmd->GetNew3VectorValue(newValue)); }
else if(command==lightCmd)
{ theTracer->SetLightDirection(lightCmd->GetNew3VectorValue(newValue)); }
else if(command==spanXCmd)
{ theTracer->SetViewSpan(spanXCmd->GetNewDoubleValue(newValue)); }
else if(command==headCmd)
{ theTracer->SetHeadAngle(headCmd->GetNewDoubleValue(newValue)); }
else if(command==attCmd)
{ theTracer->SetAttenuationLength(attCmd->GetNewDoubleValue(newValue)); }
else if(command==distCmd)
{ theTracer->SetDistortion(distCmd->GetNewBoolValue(newValue)); }
else if(command==transCmd)
{ theSteppingAction->SetIgnoreTransparency(transCmd->GetNewBoolValue(newValue)); }
else if(command==fileCmd)
{ theTracer->Trace(newValue); }
}