Hello,
I’m trying to create a box from two cube sources that have nearly the same center and one cube is slightly smaller than the other. By applying a difference operation using vtkBooleanOperationPolyDataFilter
I want to carve out some space of the bigger box creating a box. This the code I wrote:
double wall_thickness = 10.0; //mm
double outer_x = 600.0 + 2.0 * wall_thickness;
double outer_y = 400.0 + 2.0 * wall_thickness;
double outer_z = 320.0 + wall_thickness; // Bottom wall only
// Bigger outer box
vtkSmartPointer<vtkCubeSource> outer_box = vtkSmartPointer<vtkCubeSource>::New();
outer_box->SetXLength(outer_x);
outer_box->SetYLength(outer_y);
outer_box->SetZLength(outer_z);
outer_box->SetCenter(600.0/2.0, 400.0/2.0, outer_z/2.0);
// Smaller inner box (the cavity)
vtkSmartPointer<vtkCubeSource> inner_box = vtkSmartPointer<vtkCubeSource>::New();
inner_box->SetXLength(600.0);
inner_box->SetYLength(400.0);
inner_box->SetZLength(320.0 + 1.0); // Slightly taller for box opening
inner_box->SetCenter(600.0/2.0, 400.0/2.0, wall_thickness + (320.0 + 10.0)/2.0);
outer_box->Update();
inner_box->Update();
vtkSmartPointer<vtkPolyData> outer_box_polydata = outer_box->GetOutput();
vtkSmartPointer<vtkPolyData> inner_box_polydata = inner_box->GetOutput();
// Substract inner box from outer box
vtkSmartPointer<vtkBooleanOperationPolyDataFilter> boolean_filter = vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
boolean_filter->SetOperationToDifference();
boolean_filter->SetInputData(0, outer_box_polydata);
boolean_filter->SetInputData(1, inner_box_polydata);
boolean_filter->Update();
vtkSmartPointer<vtkRenderer> preview_renderer = vtkSmartPointer<vtkRenderer>::New();
preview_renderer->SetBackground(1.0, 1.0, 1.0); // White background
vtkSmartPointer<vtkRenderWindow> render_window = vtkSmartPointer<vtkRenderWindow>::New();
render_window->AddRenderer(preview_renderer);
render_window->SetSize(1280, 720);
vtkSmartPointer<vtkRenderWindowInteractor> render_window_interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
render_window_interactor->SetRenderWindow(render_window);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> interactor_style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
render_window_interactor->SetInteractorStyle(interactor_style);
vtkSmartPointer<vtkPolyDataMapper> boolean_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
boolean_mapper->SetInputConnection(boolean_filter->GetOutputPort());
vtkSmartPointer<vtkActor> boolean_actor = vtkSmartPointer<vtkActor>::New();
boolean_actor->SetMapper(boolean_mapper);
preview_renderer->AddActor(boolean_actor);
render_window->Render();
render_window_interactor->Start()
When I start the program, the rendering window is empty and these errors are printed:
2025-05-29 11:07:31.010 ( 0.008s) [ 2EC43E00] vtkPointLocator.cxx:845 ERR| vtkPointLocator (0x558a383da990): No points to subdivide
2025-05-29 11:07:31.010 ( 0.008s) [ 2EC43E00]vtkIntersectionPolyData:2410 WARN| No Intersection between objects
2025-05-29 11:07:31.011 ( 0.009s) [ 2EC43E00]vtkDistancePolyDataFilt:81 ERR| vtkDistancePolyDataFilter (0x558a383ccd70): No points/cells to operate on
2025-05-29 11:07:31.011 ( 0.009s) [ 2EC43E00]vtkDistancePolyDataFilt:81 ERR| vtkDistancePolyDataFilter (0x558a383ccd70): No points/cells to operate on
But it cannot be that there is no intersection between the objects because when I create seperate actors with opacity for the boxes one can see that they overlap:
So my question is what do I have to change in order to create the box with the boolean difference operation?
Thanks in advance!