X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_CellLabelActor.cxx;fp=src%2FOBJECT%2FSMESH_CellLabelActor.cxx;h=399bc869f78ebb824c0305ce75e71a9e4a7efc67;hb=6b6e2ef015461eed2549ab12d22da1b3e594a903;hp=0000000000000000000000000000000000000000;hpb=e5dee335729a15bd0c3009a466df3dc8c6224981;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_CellLabelActor.cxx b/src/OBJECT/SMESH_CellLabelActor.cxx new file mode 100644 index 000000000..399bc869f --- /dev/null +++ b/src/OBJECT/SMESH_CellLabelActor.cxx @@ -0,0 +1,185 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESH_CellLabelActor.cxx +// Author : Roman NIKOLAEV +// Module : SMESH +// +#include "SMESH_CellLabelActor.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +vtkStandardNewMacro(SMESH_CellLabelActor); + +/*! + Constructor. +*/ +SMESH_CellLabelActor::SMESH_CellLabelActor() { + //Definition of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet = vtkPolyData::New(); + + myCellCenters = VTKViewer_CellCenters::New(); + myCellCenters->SetInput(myCellsNumDataSet); + + myClsMaskPoints = vtkMaskPoints::New(); + myClsMaskPoints->SetInput(myCellCenters->GetOutput()); + myClsMaskPoints->SetOnRatio(1); + + myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); + myClsSelectVisiblePoints->SelectInvisibleOff(); + myClsSelectVisiblePoints->SetTolerance(0.1); + + myClsLabeledDataMapper = vtkLabeledDataMapper::New(); + myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); + + myClsLabeledDataMapper->SetLabelFormat("%d"); + myClsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aClsTextProp = vtkTextProperty::New(); + aClsTextProp->SetFontFamilyToTimes(); + static int aCellsFontSize = 12; + aClsTextProp->SetFontSize(aCellsFontSize); + aClsTextProp->SetBold(1); + aClsTextProp->SetItalic(0); + aClsTextProp->SetShadow(0); + myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); + aClsTextProp->Delete(); + + myIsCellsLabeled = false; + + myCellsLabels = vtkActor2D::New(); + myCellsLabels->SetMapper(myClsLabeledDataMapper); + myCellsLabels->GetProperty()->SetColor(0,1,0); + myCellsLabels->SetVisibility(myIsCellsLabeled); + + vtkCallbackCommand* callBackCommand = vtkCallbackCommand::New(); + callBackCommand->SetClientData(this); + callBackCommand->SetCallback(SMESH_CellLabelActor::ProcessEvents); + + myTransformFilter->AddObserver("VTKViewer_TransformFilter::TransformationFinished", + callBackCommand); + callBackCommand->Delete(); +} + + +/*! + Destructor. +*/ +SMESH_CellLabelActor::~SMESH_CellLabelActor() { + //Deleting of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet->Delete(); + + myClsLabeledDataMapper->RemoveAllInputs(); + myClsLabeledDataMapper->Delete(); + + // commented: porting to vtk 5.0 + // myClsSelectVisiblePoints->UnRegisterAllOutputs(); + myClsSelectVisiblePoints->Delete(); + + // commented: porting to vtk 5.0 + // myClsMaskPoints->UnRegisterAllOutputs(); + myClsMaskPoints->Delete(); + + // commented: porting to vtk 5.0 + // myCellCenters->UnRegisterAllOutputs(); + myCellCenters->Delete(); + + myCellsLabels->Delete(); +} + + +void SMESH_CellLabelActor::SetCellsLabeled(bool theIsCellsLabeled) { + myTransformFilter->Update(); + vtkPolyData* aGrid = vtkPolyData::SafeDownCast(myTransformFilter->GetOutput()); + if(!aGrid) + return; + + myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); + if(myIsCellsLabeled){ + myCellsNumDataSet->ShallowCopy(aGrid); + vtkDataSet *aDataSet = myCellsNumDataSet; + int aNbElem = aDataSet->GetNumberOfCells(); + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues(aNbElem); + for(int anId = 0; anId < aNbElem; anId++){ + int aSMDSId = GetElemObjId(anId); + anArray->SetValue(anId,aSMDSId); + } + aDataSet->GetCellData()->SetScalars(anArray); + myCellCenters->SetInput(aDataSet); + myCellsLabels->SetVisibility(GetVisibility()); + }else{ + myCellsLabels->SetVisibility(false); + } +} + +void SMESH_CellLabelActor::SetVisibility(int theMode) +{ + SMESH_DeviceActor::SetVisibility(theMode); + myCellsLabels->VisibilityOff(); + if(myIsCellsLabeled && theMode) + myCellsLabels->VisibilityOn(); +} + +void SMESH_CellLabelActor::AddToRender(vtkRenderer* theRenderer) +{ + SMESH_DeviceActor::AddToRender(theRenderer); + myClsSelectVisiblePoints->SetRenderer(theRenderer); + theRenderer->AddActor2D(myCellsLabels); +} + +void SMESH_CellLabelActor::RemoveFromRender(vtkRenderer* theRenderer) +{ + theRenderer->RemoveActor(myCellsLabels); + SMESH_DeviceActor::RemoveFromRender(theRenderer); +} + +void SMESH_CellLabelActor::UpdateLabels() { + if(myIsCellsLabeled) + SetCellsLabeled(myIsCellsLabeled); +} + + +void SMESH_CellLabelActor::ProcessEvents(vtkObject* vtkNotUsed(theObject), + unsigned long theEvent, + void* theClientData, + void* vtkNotUsed(theCallData)) { + SMESH_CellLabelActor* self = reinterpret_cast(theClientData); + if(self) + self->UpdateLabels(); +}