mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-09-13 14:27:08 +03:00
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
This commit is contained in:
@@ -51,7 +51,6 @@
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define _WIN32_WINNT 0x0400 // for TrackMouseEvent support requires Win95 with IE 3.0 or greater.
|
||||
#include <windows.h>
|
||||
#include <WNT_WClass.hxx>
|
||||
#include <WNT_Window.hxx>
|
||||
@@ -451,7 +450,7 @@ static Standard_Integer VtkDisplay (Draw_Interpretor& theDI,
|
||||
|
||||
TCollection_AsciiString aName;
|
||||
TopoDS_Shape anOldShape, aNewShape;
|
||||
vtkSmartPointer<vtkRenderer> aRenderer = GetRenderer();
|
||||
vtkSmartPointer<vtkRenderer>& aRenderer = GetRenderer();
|
||||
for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex)
|
||||
{
|
||||
// Get name of shape
|
||||
@@ -494,12 +493,13 @@ static Standard_Integer VtkDisplay (Draw_Interpretor& theDI,
|
||||
{
|
||||
if (aNewShape.IsNull()) continue;
|
||||
// Create actor from DRAW shape
|
||||
vtkActor* anActor = CreateActor (GenerateId(), aNewShape);
|
||||
Standard_Integer anId = GenerateId();
|
||||
vtkSmartPointer<vtkActor> anActor = CreateActor (anId, aNewShape);
|
||||
// Update maps
|
||||
GetMapOfShapes().Bind (aNewShape, aName);
|
||||
GetMapOfActors().Bind (anActor, aName);
|
||||
// Display actor
|
||||
PipelineByActorName (aName)->AddToRenderer (aRenderer);
|
||||
GetPipeline(anId)->AddToRenderer(aRenderer);
|
||||
|
||||
// Compute selection for displayed actors
|
||||
GetPicker()->SetSelectionMode (SM_Shape, Standard_True);
|
||||
@@ -559,6 +559,89 @@ static Standard_Integer VtkErase (Draw_Interpretor& theDI,
|
||||
return 0;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : VtkRemove
|
||||
// Purpose : Remove the actor from memory.
|
||||
//================================================================
|
||||
static Standard_Integer VtkRemove(Draw_Interpretor& theDI,
|
||||
Standard_Integer theArgNum,
|
||||
const char** theArgs)
|
||||
{
|
||||
// Check viewer
|
||||
if (!GetInteractor()->IsEnabled())
|
||||
{
|
||||
theDI << theArgs[0] << " error : call ivtkinit before\n";
|
||||
return 1; // TCL_ERROR
|
||||
}
|
||||
|
||||
vtkSmartPointer<vtkRenderer> aRenderer = GetRenderer();
|
||||
|
||||
// Remove all objects
|
||||
if (theArgNum == 1)
|
||||
{
|
||||
// Remove all actors from the renderer
|
||||
DoubleMapOfActorsAndNames::Iterator anIterator(GetMapOfActors());
|
||||
while (anIterator.More())
|
||||
{
|
||||
vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc =
|
||||
IVtkTools_ShapeObject::GetShapeSource(anIterator.Key1());
|
||||
if (aSrc.GetPointer() != NULL && !(aSrc->GetShape().IsNull()))
|
||||
{
|
||||
GetPicker()->RemoveSelectableObject(aSrc->GetShape());
|
||||
}
|
||||
else
|
||||
{
|
||||
aRenderer->RemoveActor(anIterator.Key1());
|
||||
}
|
||||
anIterator.Next();
|
||||
}
|
||||
// Remove all pipelines from the renderer
|
||||
for (ShapePipelineMap::Iterator anIt(*GetPipelines()); anIt.More(); anIt.Next())
|
||||
{
|
||||
anIt.Value()->RemoveFromRenderer(aRenderer);
|
||||
}
|
||||
// Clear maps and remove all TopoDS_Shapes, actors and pipelines
|
||||
GetMapOfShapes().Clear();
|
||||
GetMapOfActors().Clear();
|
||||
GetPipelines()->Clear();
|
||||
}
|
||||
// Remove named objects
|
||||
else
|
||||
{
|
||||
TCollection_AsciiString aName;
|
||||
for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex)
|
||||
{
|
||||
aName = theArgs[anIndex];
|
||||
if (GetMapOfActors().IsBound2(aName))
|
||||
{
|
||||
// Remove the actor and its pipeline (if found) from the renderer
|
||||
vtkSmartPointer<vtkActor> anActor = GetMapOfActors().Find2(aName);
|
||||
vtkSmartPointer<IVtkTools_ShapeDataSource> aSrc =
|
||||
IVtkTools_ShapeObject::GetShapeSource(anActor);
|
||||
if (aSrc.GetPointer() != NULL && !(aSrc->GetShape().IsNull()))
|
||||
{
|
||||
IVtk_IdType aShapeID = aSrc->GetShape()->GetId();
|
||||
GetPicker()->RemoveSelectableObject(aSrc->GetShape());
|
||||
GetPipeline(aSrc->GetShape()->GetId())->RemoveFromRenderer(aRenderer);
|
||||
GetPipelines()->UnBind(aShapeID); // Remove a pipepline
|
||||
}
|
||||
else
|
||||
{
|
||||
aRenderer->RemoveActor(anActor);
|
||||
}
|
||||
// Remove the TopoDS_Shape and the actor
|
||||
GetMapOfShapes().UnBind2(aName); // Remove a TopoDS shape
|
||||
GetMapOfActors().UnBind2(aName); // Remove an actor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redraw window
|
||||
aRenderer->ResetCamera();
|
||||
GetInteractor()->GetRenderWindow()->Render();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : VtkSetDisplayMode
|
||||
// Purpose :
|
||||
@@ -841,7 +924,7 @@ static Standard_Integer VtkSelect (Draw_Interpretor& theDI,
|
||||
return 1; // TCL_ERROR
|
||||
}
|
||||
|
||||
Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[1]) - 1;
|
||||
Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1;
|
||||
GetInteractor()->MoveTo (atoi (theArgs[1]), anY);
|
||||
GetInteractor()->OnSelection();
|
||||
return 0;
|
||||
@@ -1097,6 +1180,12 @@ void IVtkDraw::Commands (Draw_Interpretor& theCommands)
|
||||
"\n\t\t: Removes from renderer named objects or all objects.",
|
||||
__FILE__, VtkErase, group);
|
||||
|
||||
theCommands.Add("ivtkremove",
|
||||
"ivtkremove usage:\n"
|
||||
"ivtkremove [name1 name2 ...]"
|
||||
"\n\t\t: Removes from renderer and from memory named objects or all objects.",
|
||||
__FILE__, VtkRemove, group);
|
||||
|
||||
theCommands.Add("ivtksetdispmode",
|
||||
"ivtksetdispmode usage:\n"
|
||||
"ivtksetdispmode [name] mode (0,1)"
|
||||
|
Reference in New Issue
Block a user