Thu, 06/15/2023 - 17:32
Hi everyone!
I'm using opencascade to load a step file, then display it with VTK, and now I need to be able to select part on the step file but it doesn't work the way I'd like to...
I don't know what am I doing wrong, so I need your help :)
I use OpenCascade 7.7.0 and VTK 9.2.6
So, first I load the step file:
STEPCAFControl_Reader cafReader; cafReader.SetColorMode(true); IFSelect_ReturnStatus error = cafReader.ReadFile("myFile.step"); STEPControl_Reader stepReader = cafReader.Reader(); if (error != IFSelect_RetDone) return -1; stepReader.TransferRoots(); TopoDS_Shape oShape = stepReader.OneShape(); if (oShape.IsNull()) return -1; vtkNew<IVtkTools_ShapeDataSource> occSource; occSource->SetShape(new IVtkOCC_Shape(oShape));
Then I create a mapper and an actor:
vtkNew<vtkPolyDataMapper> mapper; mapper->SetInputConnection(occSource->GetOutputPort()); mapper->ScalarVisibilityOff(); vtkNew<vtkActor> actor; actor->GetProperty()->SetPointSize(5); actor->GetProperty()->SetDiffuseColor(colors->GetColor3d("SeaGreen").GetData()); actor->GetProperty()->EdgeVisibilityOn(); actor->SetMapper(mapper);
Then I had my actor to my render view.
Here everything seems to be ok: I have my step file displayed on my view.
I've tried to add my picker:
// vtkRenderWindow* renderWindow = get my render window vtkNew<StepElementPicker> picker; picker->Init(renderWindow->GetRenderers()->GetFirstRenderer(), occSource); vtkRenderWindowInteractor* renderWindowInteractor = renderWindow->GetInteractor(); renderWindowInteractor->SetInteractorStyle(picker);
In my class StepElementPicker
inherit from vtkInteractorStyleTrackballCamera
I have my init function :
void Init(vtkRenderer* renderer, IVtkTools_ShapeDataSource* sDS) { vtkInteractorStyleTrackballCamera::SetDefaultRenderer(renderer); m_DS = sDS; }
I overload the void vtkInteractorStyleTrackballCamera::OnLeftButtonDown()
:
void OnLeftButtonDown() override { // Get the location of the click (in window coordinates) int* pos = this->GetInteractor()->GetEventPosition(); std::cout << "Pick position : " << pos[0] << "; " << pos[1] << std::endl; vtkNew<IVtkTools_ShapePicker> picker; picker->SetRenderer(this->GetDefaultRenderer()); picker->SetTolerance(0.0005); picker->SetSelectionMode(SM_Edge); // Pick from this location. int nb = picker->Pick(pos[0], pos[1], 0); IVtk_ShapeIdList ids = picker->GetPickedShapesIds(true); std::cout << "ids.Size: " << ids.Size() << std::endl; }
In this function my picker (picker->Pick(pos[0], pos[1], 0)
) always return 0 and the ids.Size()
always return 0 so I cannot get anything from my picker.
Thank you all for any replies and suggestions!
Best regards.