[vtkusers] Changing PolyData

Dominik Szczerba domi at vision.ee.ethz.ch
Wed Jan 3 17:25:30 EST 2007


So what is the problem?
By a superficial inspection of your code you might be missing
dataSet->Update()
-DS

Ricardo Seco VTK wrote:
> Is it possible to change the polydata in a callback command? I have a
> callback for cell picking and after getting the picked cell id i want to
> eleminate that cell...
> 
> Best Regards
> Ricardo Seco
> 
> // Editor 3D para manipulação de nuvem de pontos e modelos triangulados
> 
> #include "stdio.h"
> 
> #include "vtkActor.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindowInteractor.h"
> 
> #include "vtkProperty.h"
> #include "vtkPointPicker.h"
> #include "vtkCellPicker.h"
> #include "vtkOpenGLActor.h"
> #include "vtkCommand.h"
> #include "vtkSphereSource.h"
> #include "vtkPoints.h"
> #include "vtkPointData.h"
> #include "vtkPolyData.h"
> #include "vtkCellArray.h"
> #include "vtkPolyDataMapper.h"
> 
> /* IMPLEMENTAÇÂO DO OBSERVER PARA O CELL PICKER */
> 
> class vtkMyCallback : public vtkCommand
> {
> public:
>              vtkPolyData *dataSet;
>              vtkMyCallback::vtkMyCallback() { m_pvtkActorSelection =
> NULL; };
>        static vtkMyCallback *New() { return new vtkMyCallback; }
>        void SetSelectionActor(vtkActor* pvtkActorSelection) {
> m_pvtkActorSelection = pvtkActorSelection; };
>        virtual void Execute(vtkObject *caller, unsigned long, void*)
>        {
>                vtkRenderWindowInteractor *iren =
> reinterpret_cast<vtkRenderWindowInteractor*>(caller);
>                double coords[3] = { 0, 0, 0 };
>                int pId;
>                vtkCellPicker *picker = (vtkCellPicker *)iren->GetPicker();
>                picker->GetPickPosition(coords);
>                printf("Coords: x:%f y:%f z:%f \n
> ",coords[0],coords[1],coords[2] );
>                printf("Point ID: %d \n",picker->GetCellId());
>                pId = picker->GetCellId();
>                dataSet->DeleteCell(pId);                             
> //iren->Render();
>                //if (picker->GetPointId() != -1)
>                //{
>                //        if (m_pvtkActorSelection)
>                    //          m_pvtkActorSelection->SetPosition(coords);
>                    //    iren->Render();
>                //}
>        }
> private:
>        vtkActor* m_pvtkActorSelection;
> };
>      
> int main()
> {
>    // Inicializações
>    int numPoints;
>    int intData[4];
>    FILE *fp;
>    float fltData1,fltData2,fltData3;
>    bool readinVerts;
>    char str[100];
>    vtkPoints *Points = vtkPoints::New();
>    vtkCellArray *Vertices = vtkCellArray::New();
>    vtkPolyData *dataSet = vtkPolyData::New();
>    numPoints = 0;
>    readinVerts = false;
> 
>    // Leitura dos dados do ficheiro
>    if ((fp = fopen("ASCII_Pontos_Guimaraes.txt","r")) != NULL )
>    {
>        while (!feof(fp) && (!readinVerts))
>        {
>            if(fscanf(fp,"%f %f %f",&fltData1,&fltData2,&fltData3) == 0)
>            {
>                fscanf(fp,"%c",&str);
>                readinVerts = true;
>                printf("Leu o V!");
>            }
>            else
>            {
>                Points->InsertNextPoint(fltData1,fltData2,fltData3);
>                Points->InsertPoint(numPoints,fltData1,fltData2,fltData3);
>                Vertices->InsertNextCell(1,&numPoints);
>                numPoints++;
>            }
>        }
>        /*if (readinVerts)
>        {
>            Vertices->Initialize();
>            Vertices->InitTraversal();
>            while (!feof(fp))
>            {
>                fscanf(fp,"%d %d %d
> %d",&intData[0],&intData[1],&intData[2],&intData[3]);
>                Vertices->InsertNextCell(3);
>                Vertices->InsertCellPoint(intData[0]);
>                Vertices->InsertCellPoint(intData[1]);
>                Vertices->InsertCellPoint(intData[2]);
>                printf("%d, %d, %d\n", intData[0], intData[1], intData[2]);
>            }
>        }*/
>    }
> 
>    fclose(fp);
> 
>    // Definição da esfera utilizada no Picking para assinalar a célula
> escolhida
>    vtkSphereSource *sphere=vtkSphereSource::New();
>    sphere->SetThetaResolution(8);
>    sphere->SetPhiResolution(8);
>    sphere->SetRadius(5);
>    vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New();
>    sphereMapper->SetInput(sphere->GetOutput());
> 
>    // Estabelecimento da esfera como sendo do tipo de actor
>    vtkOpenGLActor *myPicker=vtkOpenGLActor::New();
>    myPicker->GetProperty()->SetColor(1.0,0.0,0.0);
>    myPicker->SetMapper(sphereMapper);
> 
>    // Transfere a informação dos pontos para o array de dados PolyData
>    dataSet->SetPoints(Points);
>    dataSet->SetVerts(Vertices);
>      // Mapper and actor
>    vtkPolyDataMapper *polyMapper = vtkPolyDataMapper::New();
>    polyMapper->SetInput(dataSet);
> 
>    vtkActor *polyActor = vtkActor::New();
>    polyActor->SetMapper(polyMapper);
> 
>    // Criaçao do renderer, render window, e interactor.
>    vtkRenderer *ren1 = vtkRenderer::New();
>    vtkRenderWindow *renWin = vtkRenderWindow::New();
>    renWin->AddRenderer(ren1);
> 
>    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
> 
>    ren1->SetBackground(0,0,0);
>    ren1->AddActor(polyActor);
>        // Início da interacção
>    iren->SetRenderWindow(renWin);
>    renWin->SetSize(800,600);
>      /* Definicao de um Cell Picker */
>    vtkCellPicker *picker=vtkCellPicker::New();
>    picker->SetTolerance(0.05);
>    iren->SetPicker(picker);
>    iren->Initialize();
> 
>    // Código de atribuição do Observer
>    vtkMyCallback *callback = vtkMyCallback::New();
>    callback->SetSelectionActor(myPicker);
>    iren->AddObserver(vtkCommand::EndPickEvent, callback);
> 
>    iren->Start();
>      Points->Delete();
>    Vertices->Delete();
>    dataSet->Delete();
>    polyMapper->Delete();
>    polyActor->Delete();
> 
>    return 0;
> 
> }
> _______________________________________________
> This is the private VTK discussion list. Please keep messages on-topic.
> Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers



More information about the vtkusers mailing list