Commit 3fad1d7a authored by Andrew Heather's avatar Andrew Heather

ENH: Run time post-processing updates and bug fixing.

Fixes #99 #121 #127 #128 #138

* -case argument support and nFrames > 1 warning for static mode
* viewAngle reset in static camera mode
parent d830bbca
......@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
......@@ -453,31 +453,32 @@ Foam::fieldVisualisationBase::fieldVisualisationBase
{
case cbColour:
{
scalarBar_.visible_ = false;
break;
}
case cbField:
{
dict.lookup("range") >> range_;
if (dict.found("colourMap"))
{
colourMap_ = colourMapTypeNames.read(dict.lookup("colourMap"));
}
const dictionary& sbarDict = dict.subDict("scalarBar");
sbarDict.lookup("visible") >> scalarBar_.visible_;
if (scalarBar_.visible_)
{
sbarDict.lookup("vertical") >> scalarBar_.vertical_;
sbarDict.lookup("position") >> scalarBar_.position_;
sbarDict.lookup("title") >> scalarBar_.title_;
sbarDict.lookup("fontSize") >> scalarBar_.fontSize_;
sbarDict.lookup("labelFormat") >> scalarBar_.labelFormat_;
sbarDict.lookup("numberOfLabels") >> scalarBar_.numberOfLabels_;
}
break;
}
}
if (dict.found("colourMap"))
{
colourMap_ = colourMapTypeNames.read(dict.lookup("colourMap"));
}
const dictionary& sbarDict = dict.subDict("scalarBar");
sbarDict.lookup("visible") >> scalarBar_.visible_;
if (scalarBar_.visible_)
{
sbarDict.lookup("vertical") >> scalarBar_.vertical_;
sbarDict.lookup("position") >> scalarBar_.position_;
sbarDict.lookup("title") >> scalarBar_.title_;
sbarDict.lookup("fontSize") >> scalarBar_.fontSize_;
sbarDict.lookup("labelFormat") >> scalarBar_.labelFormat_;
sbarDict.lookup("numberOfLabels") >> scalarBar_.numberOfLabels_;
}
}
......
......@@ -177,14 +177,20 @@ void Foam::runTimePostProcessing::write()
surfaces_[i].addGeometryToScene(0, renderer);
}
// Add the text
forAll(text_, i)
{
text_[i].addGeometryToScene(0, renderer);
}
while (scene_.loop(renderer))
{
scalar position = scene_.position();
// Add the text
// Update the text
forAll(text_, i)
{
text_[i].addGeometryToScene(position, renderer);
text_[i].updateActors(position);
}
// Update the points
......
......@@ -67,14 +67,18 @@ void Foam::scene::readCamera(const dictionary& dict)
}
}
if (dict.readIfPresent("startPosition", position_))
if (dict.readIfPresent("startPosition", startPosition_))
{
if ((position_ < 0) || (position_ > 1))
if ((startPosition_ < 0) || (startPosition_ > 1))
{
FatalIOErrorInFunction(dict)
<< "startPosition must be in the range 0-1"
<< exit(FatalIOError);
}
else
{
position_ = startPosition_;
}
}
......@@ -89,7 +93,7 @@ void Foam::scene::readCamera(const dictionary& dict)
<< "endPosition must be in the range 0-1"
<< exit(FatalIOError);
}
dPosition_ = (endPosition - position_)/scalar(nFrameTotal_ - 1);
dPosition_ = (endPosition - startPosition_)/scalar(nFrameTotal_ - 1);
}
mode_ = modeTypeNames_.read(dict.lookup("mode"));
......@@ -114,6 +118,12 @@ void Foam::scene::readCamera(const dictionary& dict)
);
const vector up(coeffs.lookup("up"));
cameraUp_.reset(new Function1Types::Constant<point>("up", up));
if (nFrameTotal_ > 1)
{
WarningInFunction
<< "Static mode with nFrames > 1 - please check your setup"
<< endl;
}
break;
}
case mtFlightPath:
......@@ -174,11 +184,12 @@ void Foam::scene::readColours(const dictionary& dict)
void Foam::scene::initialise(vtkRenderer* renderer, const word& outputName)
{
currentFrameI_ = 0;
position_ = startPosition_;
outputName_ = outputName;
// Set the background
const vector backgroundColour = colours_["background"]->value(position());
const vector backgroundColour = colours_["background"]->value(position_);
renderer->SetBackground
(
backgroundColour.x(),
......@@ -190,7 +201,7 @@ void Foam::scene::initialise(vtkRenderer* renderer, const word& outputName)
if (colours_.found("background2"))
{
renderer->GradientBackgroundOn();
vector backgroundColour2 = colours_["background2"]->value(position());
vector backgroundColour2 = colours_["background2"]->value(position_);
renderer->SetBackground2
(
......@@ -210,9 +221,24 @@ void Foam::scene::initialise(vtkRenderer* renderer, const word& outputName)
camera->SetParallelProjection(parallelProjection_);
renderer->SetActiveCamera(camera);
setCamera(renderer, true);
// Initialise the extents
// Initialise the camera
const vector up = cameraUp_->value(position_);
const vector pos = cameraPosition_->value(position_);
const point focalPoint = cameraFocalPoint_->value(position_);
camera->SetViewUp(up.x(), up.y(), up.z());
camera->SetPosition(pos.x(), pos.y(), pos.z());
camera->SetFocalPoint(focalPoint.x(), focalPoint.y(), focalPoint.z());
camera->Modified();
// Add the lights
vtkSmartPointer<vtkLightKit> lightKit = vtkSmartPointer<vtkLightKit>::New();
lightKit->AddLightsToRenderer(renderer);
// For static mode initialise the clip box
if (mode_ == mtStatic)
{
const point& min = clipBox_.min();
......@@ -234,39 +260,38 @@ void Foam::scene::initialise(vtkRenderer* renderer, const word& outputName)
vtkSmartPointer<vtkActor> clipActor = vtkSmartPointer<vtkActor>::New();
clipActor->SetMapper(clipMapper);
clipActor->VisibilityOn();
clipActor->VisibilityOff();
renderer->AddActor(clipActor);
// Call resetCamera to fit clip box in view
clipActor->VisibilityOn();
renderer->ResetCamera();
clipActor->VisibilityOff();
}
}
void Foam::scene::setCamera(vtkRenderer* renderer, const bool override) const
void Foam::scene::setCamera(vtkRenderer* renderer) const
{
if (mode_ == mtFlightPath || override)
if (mode_ == mtFlightPath)
{
vtkCamera* camera = renderer->GetActiveCamera();
if (!parallelProjection_)
{
camera->SetViewAngle(cameraViewAngle_->value(position()));
}
const vector up = cameraUp_->value(position());
const vector pos = cameraPosition_->value(position());
const point focalPoint = cameraFocalPoint_->value(position());
const vector up = cameraUp_->value(position_);
const vector pos = cameraPosition_->value(position_);
const point focalPoint = cameraFocalPoint_->value(position_);
vtkCamera* camera = renderer->GetActiveCamera();
camera->SetViewUp(up.x(), up.y(), up.z());
camera->SetPosition(pos.x(), pos.y(), pos.z());
camera->SetFocalPoint(focalPoint.x(), focalPoint.y(), focalPoint.z());
camera->Modified();
}
vtkSmartPointer<vtkLightKit> lightKit =
vtkSmartPointer<vtkLightKit>::New();
lightKit->AddLightsToRenderer(renderer);
if (!parallelProjection_)
{
// Restore viewAngle (it might be reset by clipping)
vtkCamera* camera = renderer->GetActiveCamera();
camera->SetViewAngle(cameraViewAngle_->value(position_));
camera->Modified();
}
}
......@@ -291,11 +316,11 @@ Foam::scene::scene(const objectRegistry& obr, const word& name)
cameraPosition_(NULL),
cameraFocalPoint_(NULL),
cameraUp_(NULL),
cameraZoom_(NULL),
cameraViewAngle_(NULL),
clipBox_(),
parallelProjection_(true),
nFrameTotal_(1),
startPosition_(0),
position_(0),
dPosition_(0),
currentFrameI_(0),
......@@ -340,8 +365,7 @@ void Foam::scene::read(const dictionary& dict)
bool Foam::scene::loop(vtkRenderer* renderer)
{
static bool initialised = false;
setCamera(renderer, false);
setCamera(renderer);
if (!initialised)
{
......@@ -349,19 +373,16 @@ bool Foam::scene::loop(vtkRenderer* renderer)
return true;
}
// Ensure that all objects can be seen without clipping
// Note: can only be done after all objects have been added!
renderer->ResetCameraClippingRange();
// Save image from last iteration
saveImage(renderer->GetRenderWindow());
currentFrameI_++;
if (position_ > (1 + 0.5*dPosition_))
{
WarningInFunction
<< "Current position exceeded 1 - please check your setup"
<< endl;
}
position_ += dPosition_;
position_ = startPosition_ + currentFrameI_*dPosition_;
if (currentFrameI_ < nFrameTotal_)
{
......@@ -369,6 +390,7 @@ bool Foam::scene::loop(vtkRenderer* renderer)
}
else
{
initialised = false;
return false;
}
}
......@@ -381,7 +403,12 @@ void Foam::scene::saveImage(vtkRenderWindow* renderWindow) const
return;
}
fileName prefix("postProcessing"/name_/obr_.time().timeName());
const Time& runTime = obr_.time();
fileName prefix(Pstream::parRun() ?
runTime.path()/".."/"postProcessing"/name_/obr_.time().timeName() :
runTime.path()/"postProcessing"/name_/obr_.time().timeName());
mkDir(prefix);
renderWindow->Render();
......
......@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2015-2016 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
......@@ -22,7 +22,7 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::camera
Foam::scene
Description
......@@ -134,6 +134,9 @@ protected:
//- Number of frames
label nFrameTotal_;
//- Start position [0-1]
scalar startPosition_;
//- Position [0-1]
scalar position_;
......@@ -149,7 +152,7 @@ protected:
// Protected Member Functions
void setCamera(vtkRenderer* renderer, const bool override) const;
void setCamera(vtkRenderer* renderer) const;
string frameIndexStr() const;
......
......@@ -47,7 +47,8 @@ Foam::text::text
position_(dict.lookup("position")),
size_(readScalar(dict.lookup("size"))),
colour_(NULL),
bold_(readBool(dict.lookup("bold")))
bold_(readBool(dict.lookup("bold"))),
timeStamp_(dict.lookupOrDefault<bool>("timeStamp", false))
{
if (dict.found("colour"))
{
......@@ -81,7 +82,13 @@ void Foam::text::addGeometryToScene
vtkSmartPointer<vtkTextActor> actor = vtkSmartPointer<vtkTextActor>::New();
actor->SetInput(string_.c_str());
// Concatenate string with timeStamp if true
string textAndTime = string_;
if (timeStamp_)
{
textAndTime = textAndTime + " " + geometryBase::parent_.obr().time().timeName();
}
actor->SetInput(textAndTime.c_str());
actor->GetTextProperty()->SetFontFamilyToArial();
actor->GetTextProperty()->SetFontSize(size_);
actor->GetTextProperty()->SetJustificationToLeft();
......
......@@ -25,6 +25,23 @@ Class
Foam::text
Description
Example of text object specification:
\verbatim
text1
{
string "text to display";
position (0.1 0.05);
size 18;
bold yes;
visible yes;
// Optionally override default colour
// colour (0 1 1);
// Optional entry
timeStamp yes; //Append solution time to string
}
\endverbatim
SourceFiles
text.C
......@@ -82,6 +99,9 @@ protected:
//- Bold flag
bool bold_;
//- Time stamp flag
bool timeStamp_;
public:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment