Update a vtkCutter with a qslider - c++

Hi I am fairly new to VTK and trying to push it as much as I can. I am trying to update the cuttling plane value with a qslider.

I have a slice on a vtk in a QVTKOpenGLNativeWidget setup as

exmVTK::exmVTK(QWidget* parent) : QMainWindow(parent), ui(new Ui::exmVTK)
{
ui->setupUi(this);

ui->frameSlider->setTickInterval(10);
ui->frameSlider->setSingleStep(1);
ui->frameSlider->setMinimum(0);
ui->frameSlider->setMaximum(99);
ui->frameSlider->setTracking(false);

vtkNew<vtkNamedColors> colors;

vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
ui->qvtkWidget->setRenderWindow(renderWindow);

vtkNew<vtkEventQtSlotConnect> slotConnector;
this->Connections = slotConnector;

//read all the data from the file
std::string filename = "C:\\VTK\\geo500.vtu";

vtkNew<vtkXMLUnstructuredGridReader> reader;
reader->SetFileName(filename.c_str());
reader->Update();

vtkNew<vtkRenderer> renderer;

//SLICE
double sliceNorm[3] = { 1.0, 0.0, 0.0 };
double sliceOrigin[3] = { 0, 0, 0 };

vtkNew<vtkPlane> plane;
plane->SetOrigin(sliceOrigin);
plane->SetNormal(sliceNorm);

// Create cutter
vtkNew<vtkCutter> cutter;
cutter->SetCutFunction(plane);
cutter->SetInputData(reader->GetOutput());
cutter->Update();

vtkNew<vtkPolyDataMapper> cutterMapper;
cutterMapper->SetInputConnection(cutter->GetOutputPort());
cutterMapper->SetResolveCoincidentTopologyToPolygonOffset();
cutterMapper->ScalarVisibilityOn();
cutterMapper->SetScalarModeToUsePointFieldData();
cutterMapper->ColorByArrayComponent("total(p)", 0);

// Create plane actor
vtkNew<vtkActor> cutterActor;
cutterActor->SetMapper(cutterMapper);
renderer->AddActor(cutterActor);

ui->qvtkWidget->renderWindow()->AddRenderer(renderer);

this->Connections->Connect(
	ui->qvtkWidget->renderWindow()->GetInteractor(),
	vtkCommand::LeftButtonPressEvent, this,
	SLOT(slot_clicked(vtkObject*, unsigned long, void*, void*)));

}

I also have a qslider updating the x value of the cutting plane.

void exmVTK::on_frameSlider_valueChanged(int value)
{
connect(ui->frameSlider, SIGNAL(valueChanged(int)), this, SLOT(setFrame(int)));
qDebug() << "Slider value changed: " << value;
}

void exmF1VTK::setFrame(int value)
{
double max = 5.0;
double min = -1.0;
int sliderMin = 0;
int sliderMax = 99;
double frameX = 0;
frameX = ((max - min) * (value - sliderMin) / (sliderMax - sliderMin) + min);
ui->valueLabel->setText(“Value: " + QString::number(frameX, ‘f’, 2) + " mm”);

qDebug() << "set Frame: " << value;

}

How can I update the created plane x position when moving the slider? Any help would be greatly appreciated.

Thanks

Hello, friend

I’d add a call plane->SetOrigin(sliceOrigin); to your setFrame() slot, after changing the values in sliceOrigin to suit your need. All these followed by a cutter->Update();. Of course that would require promoting plane, sliceOrigin and cutter to member, global or static variables.

all the best,

Paulo

Thanks Paulo for the very quick reply. I had thought about global variables but somehow Visual Studio complained when compiling. Member variables worked a treat though.