Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ClientServerCore/Rendering/vtkTextSourceRepresentation.cxx

218 lines
7.1 KiB
C++

/*=========================================================================
Program: ParaView
Module: vtkTextSourceRepresentation.cxx
Copyright (c) Kitware, Inc.
All rights reserved.
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkTextSourceRepresentation.h"
#include "vtk3DWidgetRepresentation.h"
#include "vtkAbstractArray.h"
#include "vtkAbstractWidget.h"
#include "vtkAlgorithmOutput.h"
#include "vtkDataSetAttributes.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkPointSource.h"
#include "vtkPolyData.h"
#include "vtkPVCacheKeeper.h"
#include "vtkPVRenderView.h"
#include "vtkTable.h"
#include "vtkTextRepresentation.h"
#include "vtkVariant.h"
namespace
{
std::string vtkExtractString(vtkDataObject* data)
{
std::string text;
vtkFieldData* fieldData = data->GetFieldData();
vtkAbstractArray* array = fieldData->GetAbstractArray(0);
if (array && array->GetNumberOfTuples() > 0)
{
text = array->GetVariantValue(0).ToString();
}
return text;
}
}
vtkStandardNewMacro(vtkTextSourceRepresentation);
vtkCxxSetObjectMacro(vtkTextSourceRepresentation, TextWidgetRepresentation,
vtk3DWidgetRepresentation);
//----------------------------------------------------------------------------
vtkTextSourceRepresentation::vtkTextSourceRepresentation()
{
this->TextWidgetRepresentation = 0;
this->CacheKeeper = vtkPVCacheKeeper::New();
vtkPointSource* source = vtkPointSource::New();
source->SetNumberOfPoints(1);
source->Update();
this->DummyPolyData = vtkPolyData::New();
this->DummyPolyData->ShallowCopy(source->GetOutputDataObject(0));
source->Delete();
this->CacheKeeper->SetInputData(this->DummyPolyData);
}
//----------------------------------------------------------------------------
vtkTextSourceRepresentation::~vtkTextSourceRepresentation()
{
this->SetTextWidgetRepresentation(0);
this->DummyPolyData->Delete();
this->CacheKeeper->Delete();
}
//----------------------------------------------------------------------------
void vtkTextSourceRepresentation::SetVisibility(bool val)
{
this->Superclass::SetVisibility(val);
if (this->TextWidgetRepresentation &&
this->TextWidgetRepresentation->GetRepresentation())
{
this->TextWidgetRepresentation->GetRepresentation()->SetVisibility(val);
this->TextWidgetRepresentation->SetEnabled(val);
}
}
//----------------------------------------------------------------------------
void vtkTextSourceRepresentation::SetInteractivity(bool val)
{
if (this->TextWidgetRepresentation &&
this->TextWidgetRepresentation->GetWidget())
{
this->TextWidgetRepresentation->GetWidget()->SetProcessEvents(val);
}
}
//----------------------------------------------------------------------------
int vtkTextSourceRepresentation::FillInputPortInformation(int, vtkInformation* info)
{
info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkTable");
info->Set(vtkAlgorithm::INPUT_IS_OPTIONAL(), 1);
return 1;
}
//----------------------------------------------------------------------------
bool vtkTextSourceRepresentation::AddToView(vtkView* view)
{
if (this->TextWidgetRepresentation)
{
view->AddRepresentation(this->TextWidgetRepresentation);
}
return this->Superclass::AddToView(view);
}
//----------------------------------------------------------------------------
bool vtkTextSourceRepresentation::RemoveFromView(vtkView* view)
{
if (this->TextWidgetRepresentation)
{
view->RemoveRepresentation(this->TextWidgetRepresentation);
}
return this->Superclass::RemoveFromView(view);
}
//----------------------------------------------------------------------------
void vtkTextSourceRepresentation::MarkModified()
{
if (!this->GetUseCache())
{
// Cleanup caches when not using cache.
this->CacheKeeper->RemoveAllCaches();
}
this->Superclass::MarkModified();
}
//----------------------------------------------------------------------------
bool vtkTextSourceRepresentation::IsCached(double cache_key)
{
return this->CacheKeeper->IsCached(cache_key);
}
//----------------------------------------------------------------------------
int vtkTextSourceRepresentation::RequestData(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector)
{
// Pass caching information to the cache keeper.
this->CacheKeeper->SetCachingEnabled(this->GetUseCache());
this->CacheKeeper->SetCacheTime(this->GetCacheKey());
if (inputVector[0]->GetNumberOfInformationObjects()==1)
{
vtkTable* input = vtkTable::GetData(inputVector[0], 0);
if (input->GetNumberOfRows() > 0 && input->GetNumberOfColumns() > 0)
{
this->DummyPolyData->GetFieldData()->ShallowCopy(input->GetRowData());
}
}
this->DummyPolyData->Modified();
this->CacheKeeper->Update();
// It is tempting to try to do the data delivery in RequestData() itself.
// However, whenever a representation updates, ParaView GUI may have some
// GatherInformation() requests that happen. That messes up with any
// data-delivery code placed here. So we leave the data delivery to the
// REQUEST_PREPARE_FOR_RENDER() pass.
return this->Superclass::RequestData(request, inputVector, outputVector);
}
//----------------------------------------------------------------------------
int vtkTextSourceRepresentation::ProcessViewRequest(
vtkInformationRequestKey* request_type,
vtkInformation* inInfo, vtkInformation* outInfo)
{
if (!this->Superclass::ProcessViewRequest(request_type, inInfo, outInfo))
{
// i.e. this->GetVisibility() == false, hence nothing to do.
return 0;
}
if (request_type == vtkPVView::REQUEST_UPDATE())
{
vtkPVRenderView::SetPiece(inInfo, this,
this->CacheKeeper->GetOutputDataObject(0));
vtkPVRenderView::SetDeliverToClientAndRenderingProcesses(inInfo, this,
/*deliver_to_client=*/ true, /*gather_before_delivery=*/ false);
}
else if (request_type == vtkPVView::REQUEST_RENDER())
{
vtkAlgorithmOutput* producerPort = vtkPVRenderView::GetPieceProducer(inInfo, this);
// since there's no direct connection between the mapper and the collector,
// we don't put an update-suppressor in the pipeline.
std::string text = vtkExtractString(
producerPort->GetProducer()->GetOutputDataObject(
producerPort->GetIndex()));
vtkTextRepresentation* repr = vtkTextRepresentation::SafeDownCast(
this->TextWidgetRepresentation?
this->TextWidgetRepresentation->GetRepresentation() : NULL);
if (repr)
{
repr->SetText(text.c_str());
repr->SetVisibility(text.empty()? 0: 1);
}
}
return 1;
}
//----------------------------------------------------------------------------
void vtkTextSourceRepresentation::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
}