1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00
occt/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx
rkv a2f76b15f1 0027567: VIS - possible memory leaks due to use of plain pointers: Fix also the VIS guide. Add the test v3d/ivtk/bug27567. Add a draw command "ivtkremove".
0027734: Configuration - TKIVtkDraw build fails with TBB: Remove unnecessary define statement (windows specific).

Small correction of test case for issue CR27567
2016-09-22 12:14:30 +03:00

254 lines
9.6 KiB
C++

// Created on: 2012-04-02
// Copyright (c) 2012-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <IVtkDraw_HighlightAndSelectionPipeline.hxx>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkAppendPolyData.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <IVtkOCC_Shape.hxx>
#include <IVtkTools_DisplayModeFilter.hxx>
#include <IVtkTools_ShapeDataSource.hxx>
#include <IVtkTools_ShapeObject.hxx>
IMPLEMENT_STANDARD_RTTIEXT(IVtkDraw_HighlightAndSelectionPipeline,Standard_Transient)
//===========================================================
// Function : Constructor
// Purpose :
//===========================================================
IVtkDraw_HighlightAndSelectionPipeline::IVtkDraw_HighlightAndSelectionPipeline (const TopoDS_Shape& theShape,
const Standard_Integer theShapeID)
: Standard_Transient()
{
/* ===========================
* Allocate involved filters
* =========================== */
myFilterMap.Bind (Filter_DM_Shape, vtkSmartPointer<IVtkTools_DisplayModeFilter>::New());
myFilterMap.Bind (Filter_DM_Hili, vtkSmartPointer<IVtkTools_DisplayModeFilter>::New());
myFilterMap.Bind (Filter_DM_Sel, vtkSmartPointer<IVtkTools_DisplayModeFilter>::New());
myFilterMap.Bind (Filter_SUB_Hili, vtkSmartPointer<IVtkTools_SubPolyDataFilter>::New());
myFilterMap.Bind (Filter_SUB_Sel, vtkSmartPointer<IVtkTools_SubPolyDataFilter>::New());
/* ========================
* Build primary pipeline
* ======================== */
myActor = vtkSmartPointer<vtkActor>::New();
IVtkOCC_Shape::Handle anIVtkShape = new IVtkOCC_Shape (theShape);
anIVtkShape->SetId (theShapeID);
vtkSmartPointer<IVtkTools_ShapeDataSource> aDataSource = vtkSmartPointer<IVtkTools_ShapeDataSource>::New();
aDataSource->SetShape (anIVtkShape);
IVtkTools_DisplayModeFilter*
aDMFilter = IVtkTools_DisplayModeFilter::SafeDownCast (myFilterMap.Find(Filter_DM_Shape));
aDMFilter->AddInputConnection (aDataSource->GetOutputPort());
aDMFilter->SetDisplayMode (DM_Wireframe);
myMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
myMapper->AddInputConnection(aDMFilter->GetOutputPort());
myActor->SetMapper(myMapper);
IVtkTools_ShapeObject::SetShapeSource (aDataSource, myActor);
myMapper->ScalarVisibilityOn();
myMapper->SetScalarModeToUseCellFieldData();
IVtkTools::InitShapeMapper (myMapper);
myMapper->Update();
/* =================================
* Build pipeline for highlighting
* ================================= */
IVtkTools_DisplayModeFilter*
aDMFilterH = IVtkTools_DisplayModeFilter::SafeDownCast (myFilterMap.Find(Filter_DM_Hili) );
IVtkTools_SubPolyDataFilter*
aSUBFilterH = IVtkTools_SubPolyDataFilter::SafeDownCast (myFilterMap.Find(Filter_SUB_Hili) );
// No highligthing exists initially
aSUBFilterH->SetInputConnection (aDataSource->GetOutputPort() );
aDMFilterH->SetInputConnection(aSUBFilterH->GetOutputPort());
myHiliMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
myHiliMapper->SetInputConnection (aDMFilterH->GetOutputPort() );
// Create non-pickable actor
myHiliActor = vtkSmartPointer<vtkActor>::New();
myHiliActor->SetPickable(0);
myHiliActor->SetVisibility(1);
myHiliActor->GetProperty()->SetColor(0, 1, 1);
myHiliActor->GetProperty()->SetOpacity(1);
myHiliActor->GetProperty()->SetPointSize (myHiliActor->GetProperty()->GetPointSize() + 4 );
myHiliActor->GetProperty()->SetLineWidth (myHiliActor->GetProperty()->GetLineWidth() + 2 );
// Set maper for actor
myHiliActor->SetMapper (myHiliMapper);
myHiliMapper->ScalarVisibilityOff();
/* ==============================
* Build pipeline for selection
* ============================== */
IVtkTools_DisplayModeFilter*
aDMFilterS = IVtkTools_DisplayModeFilter::SafeDownCast (myFilterMap.Find(Filter_DM_Sel) );
IVtkTools_SubPolyDataFilter*
aSUBFilterS = IVtkTools_SubPolyDataFilter::SafeDownCast (myFilterMap.Find(Filter_SUB_Sel) );
// No highligthing exists initially
aSUBFilterS->SetInputConnection (aDataSource->GetOutputPort() );
aDMFilterS->SetInputConnection(aSUBFilterS->GetOutputPort());
mySelMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mySelMapper->SetInputConnection (aDMFilterS->GetOutputPort() );
// Create non-pickable actor
mySelActor = vtkSmartPointer<vtkActor>::New();
mySelActor->SetPickable (0);
mySelActor->SetVisibility (1);
mySelActor->GetProperty()->SetColor (1, 1, 1);
mySelActor->GetProperty()->SetOpacity (1);
mySelActor->GetProperty()->SetPointSize (myHiliActor->GetProperty()->GetPointSize() + 4 );
mySelActor->GetProperty()->SetLineWidth (myHiliActor->GetProperty()->GetLineWidth() + 2 );
// Set maper for actor
mySelActor->SetMapper (mySelMapper);
mySelMapper->ScalarVisibilityOff();
}
//===========================================================
// Function : AddToRenderer
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::AddToRenderer (vtkRenderer* theRenderer)
{
theRenderer->AddActor (myActor);
theRenderer->AddActor (myHiliActor);
theRenderer->AddActor (mySelActor);
}
//===========================================================
// Function : RemoveFromRenderer
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::RemoveFromRenderer (vtkRenderer* theRenderer)
{
theRenderer->RemoveActor (myActor);
theRenderer->RemoveActor (myHiliActor);
theRenderer->RemoveActor (mySelActor);
vtkSmartPointer<vtkRenderWindow> aWin = theRenderer->GetRenderWindow();
if (aWin != NULL)
{
myActor->ReleaseGraphicsResources(aWin);
myHiliActor->ReleaseGraphicsResources(aWin);
mySelActor->ReleaseGraphicsResources(aWin);
}
}
//===========================================================
// Function : ClearHighlightFilters
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::ClearHighlightFilters()
{
this->GetHighlightFilter()->Clear();
this->GetHighlightFilter()->SetDoFiltering (true);
this->GetHighlightFilter()->Modified();
}
//===========================================================
// Function : ClearSelectionFilters
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::ClearSelectionFilters()
{
this->GetSelectionFilter()->Clear();
this->GetSelectionFilter()->SetDoFiltering (true);
this->GetSelectionFilter()->Modified();
}
//===========================================================
// Function : GetDisplayModeFilter
// Purpose :
//===========================================================
IVtkTools_DisplayModeFilter* IVtkDraw_HighlightAndSelectionPipeline::GetDisplayModeFilter()
{
return IVtkTools_DisplayModeFilter::SafeDownCast(myFilterMap.Find(Filter_DM_Shape));
}
//===========================================================
// Function : GetHighlightFilter
// Purpose :
//===========================================================
IVtkTools_SubPolyDataFilter* IVtkDraw_HighlightAndSelectionPipeline::GetHighlightFilter()
{
return IVtkTools_SubPolyDataFilter::SafeDownCast(myFilterMap.Find(Filter_SUB_Hili));
}
//===========================================================
// Function : GetSelectionFilter
// Purpose :
//===========================================================
IVtkTools_SubPolyDataFilter* IVtkDraw_HighlightAndSelectionPipeline::GetSelectionFilter()
{
return IVtkTools_SubPolyDataFilter::SafeDownCast(myFilterMap.Find(Filter_SUB_Sel));
}
//===========================================================
// Function : GetHighlightDMFilter
// Purpose :
//===========================================================
IVtkTools_DisplayModeFilter* IVtkDraw_HighlightAndSelectionPipeline::GetHighlightDMFilter()
{
return IVtkTools_DisplayModeFilter::SafeDownCast(myFilterMap.Find(Filter_DM_Hili));
}
//===========================================================
// Function : GetSelectionDMFilter
// Purpose :
//===========================================================
IVtkTools_DisplayModeFilter* IVtkDraw_HighlightAndSelectionPipeline::GetSelectionDMFilter()
{
return IVtkTools_DisplayModeFilter::SafeDownCast(myFilterMap.Find(Filter_DM_Sel));
}
//===========================================================
// Function : SharedVerticesSelectionOn
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::SharedVerticesSelectionOn()
{
this->GetHighlightDMFilter()->SetDisplaySharedVertices (Standard_True);
this->GetSelectionDMFilter()->SetDisplaySharedVertices (Standard_True);
}
//===========================================================
// Function : SharedVerticesSelectionOff
// Purpose :
//===========================================================
void IVtkDraw_HighlightAndSelectionPipeline::SharedVerticesSelectionOff()
{
this->GetHighlightDMFilter()->SetDisplaySharedVertices (Standard_False);
this->GetSelectionDMFilter()->SetDisplaySharedVertices (Standard_False);
}