[vtkusers] unhandled exception in program using MouseInteraction
David Doria
daviddoria at gmail.com
Sun Sep 2 16:58:09 EDT 2012
On Sun, Sep 2, 2012 at 4:40 PM, cerina <cerine-baratelli at hotmail.fr> wrote:
> Hi, I'm using vtkOctree to segment my Mesh to 8 regions. I tried to pick
> on the mesh in order to get the picked point's coordinates, but i got an
> unhandled exception. The program is using the vtk Octree, here is my code: #include
> ** #include "vtkOctree.h" #include "RenderWindow.h" #include ** #include *
> * #include ** #include ** #include ** #include ** #include ** // Catch
> mouse events class MouseInteractorStyle : public
> vtkInteractorStyleTrackballCamera { public: static MouseInteractorStyle*
> New(); vtkSurface* Mesh2; vtkIntArray *lesNodes; virtual void
> OnLeftButtonDown() { // Get the location of the click (in window
> coordinates) int* pos = this->GetInteractor()->GetEventPosition();
> vtkSmartPointer** picker = vtkSmartPointer**::New(); // Pick from this
> location. picker->Pick(pos[0], pos[1], pos[2], this->GetDefaultRenderer());
> double* worldPosition = picker->GetPickPosition(); vtkIdType
> c=picker->GetPointId(); cout<<" the PointId is : "<**GetPointId()<<endl;
> cout<<" point coordinates are: "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<endl;
> Mesh2->GetPoint(c); cout<<"nombre des sommets : "<<
> Mesh2->GetNumberOfPoints()<<endl;
> this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
> // Forward events vtkInteractorStyleTrackballCamera::OnLeftButtonDown(); };
> // vtkSmartPointer** Data; vtkSmartPointer** selectedMapper;
> vtkSmartPointer** selectedActor; };
> vtkStandardNewMacro(MouseInteractorStyle); void
> vtkOctree::Decompose(vtkSurface *Mesh1) { // vtkSurface
> *Edges=vtkSurface::New(); RenderWindow *Window=RenderWindow::New();
> Window->SetInput(this->Input); vtkIntArray *PointsNode=vtkIntArray::New();
> PointsNode->SetNumberOfValues(this->Input->GetNumberOfPoints()); std::vector
> ** Nodes; Node Node1; double Bounds[6];
> this->Input->GetPoints()->ComputeBounds();
> this->Input->GetPoints()->GetBounds(Bounds); // Create Root Node and push
> it into the array of nodes
> Node1.NumberOfPoints=this->Input->GetNumberOfPoints(); // subdivide the
> Mesh to 8 areas for (int i=0;i<3;i++) {
> Node1.Center[i]=0.5*(Bounds[2*i+1]+Bounds[2*i]);
> Node1.Radius[i]=0.5*(Bounds[2*i+1]-Bounds[2*i]); } Nodes.push_back(Node1);
> // Assign all points to root node for (int i=0;i**Input->GetNumberOfPoints();i++)
> PointsNode->SetValue(i,0); int NumberOfSplitNodes; int Level=0; for(int
> h=0;h<2; h++) { cout<<"Level "<<Level++<<endl; NumberOfSplitNodes=0; for
> (int i=0;i<this->Input->GetNumberOfPoints();i++) { int
> NodeId=PointsNode->GetValue(i); if (Nodes[NodeId].NeedsSplit()) { if
> (!Nodes[NodeId].HasChildren()) { NumberOfSplitNodes++; // we need to create
> 8 sub-nodes (one for each octant) int Coordinates[3]; for
> (Coordinates[0]=0;Coordinates[0]<2;Coordinates[0]++) { for
> (Coordinates[1]=0;Coordinates[1]<2;Coordinates[1]++) { for
> (Coordinates[2]=0;Coordinates[2]<2;Coordinates[2]++) { Node1.Reset(); //
> Create one child node for (int j=0;j<3;j++) {
> Node1.Center[j]=Nodes[NodeId].Center[j]+ ((double)
> Coordinates[j]-0.5)*Nodes[NodeId].Radius[j];
> Node1.Radius[j]=0.5*Nodes[NodeId].Radius[j]; }
> Nodes[NodeId].Children[Coordinates[0]][Coordinates[1]][Coordinates[2]]=
> Nodes.size(); Nodes.push_back(Node1); } } } } double Point[3];
> this->Input->GetPoint(i,Point); int Coordinates[3]; for (int j=0;j<3;j++) {
> if (Point[j]<Nodes[NodeId].Center[j]) Coordinates[j]=0; else
> Coordinates[j]=1; } int
> Child=Nodes[NodeId].Children[Coordinates[0]][Coordinates[1]][Coordinates[2]];
> PointsNode->SetValue(i,Child); Nodes[Child].NumberOfPoints++; } } h++; };
> // create polydata for visualization cout<<NumberOfSplitNodes<<" Nodes
> split"<<endl; Window->DisplayVerticesColors(PointsNode); Window->Render(); //here
> i initialize the interaction vtkRenderWindowInteractor
> *interactor=vtkRenderWindowInteractor::New();
> interactor->SetRenderWindow(Window->GetvtkRenderWindow());
> interactor->Initialize(); vtkSmartPointer** style = vtkSmartPointer**::New();
> style->Mesh2=Mesh1; style->lesNodes=PointsNode;
> interactor->SetInteractorStyle(style);
> Window->GetvtkRenderWindow()->SetInteractor(interactor);
> interactor->Start(); Window->Interact(); Window->Delete();
> PointsNode->Delete(); } and this is the main file: #include
> "vtkSurface.h" #include "RenderWindow.h" #include "vtkOctree.h" int main(
> int argc, char *argv[] ) { // Parse command line arguments if(argc != 2) {
> std::cout << "Usage: " << argv[0] << " Filename(.ply)" << std::endl; return
> EXIT_FAILURE; } vtkSurface *Mesh; // Load the mesh and create the
> vtkSurface data structure Mesh=vtkSurface::New(); cout <<"load :
> "<<argv[1]<<endl; Mesh->CreateFromFile(argv[1]); // prints to standard
> output the mesh caracteristics Mesh->DisplayMeshProperties(); vtkOctree
> *Octree=vtkOctree::New(); Octree->SetInput(Mesh); Octree->Decompose(Mesh);
> return (0); }
>
Please ensure your code formatting remains when composing your message to
the mailing list. This is impossible to read.
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120902/2f26e0ff/attachment.htm>
More information about the vtkusers
mailing list