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.