OCCT
OCCT copied to clipboard
OCC+VTK:The program crashed in debug mode
Description
I compiled both the debug and release versions of VTK9.4.2 on Windows. Similarly, I also compiled the debug and release versions of OCC7.9.0. I wrote a program using Qt to display the OCC model with VTK. However, the program runs normally in the release version but crashes in the debug version. The minimal case to reproduce the problem is as follows
Expected Behavior
The occ+vtk program can run normally in debug mode.
Actual Behavior
The occ+vtk program crashes when running in debug mode.
Sample Code or DRAW Tcl Script
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(DMesh)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_PREFIX_PATH
"D:/LangEnv/VTK_MSVC/debug/lib/cmake/vtk-9.4"
${CMAKE_PREFIX_PATH}
)
set(CMAKE_PREFIX_PATH
"D:/LangEnv/OCC_MSVC/debug/cmake"
${CMAKE_PREFIX_PATH}
)
else()
set(CMAKE_PREFIX_PATH
"D:/LangEnv/VTK_MSVC/release/lib/cmake/vtk-9.4"
${CMAKE_PREFIX_PATH}
)
set(CMAKE_PREFIX_PATH
"D:/LangEnv/OCC_MSVC/release/cmake"
${CMAKE_PREFIX_PATH}
)
endif()
find_package(VTK REQUIRED)
find_package(OpenCASCADE REQUIRED)
include_directories(${OpenCASCADE_INCLUDE_DIR})
link_directories(${OpenCASCADE_BINARY_DIR})
include_directories(${VTK_INCLUDE_DIR})
link_directories(${VTK_BINARY_DIR})
# Find Qt6
find_package(Qt6 REQUIRED COMPONENTS Core Widgets OpenGL OpenGLWidgets)
set(GUI_LIB_LISTS
TKernel
TKMeshVS
TKOpenGl
TKPrim
TKService
TKTopAlgo
TKV3d
TKIVtk
)
file(GLOB GUI_SOURCE_LISTS "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
file(GLOB GUI_INCLUDE_LISTS "${CMAKE_CURRENT_SOURCE_DIR}/*.h**")
add_executable(DMesh main.cpp ${GUI_SOURCE_LISTS} ${GUI_INCLUDE_LISTS})
target_link_libraries(DMesh PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::OpenGL
Qt6::OpenGLWidgets
${VTK_LIBRARIES}
${GUI_LIB_LISTS}
)
vtk_module_autoinit(
TARGETS DMesh
MODULES ${VTK_LIBRARIES}
)
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QVBoxLayout>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <QVTKOpenGLNativeWidget.h>
#include <BRepPrimAPI_MakeBox.hxx>
#include <IVtkTools_ShapeDataSource.hxx>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
setWindowTitle("VTK Qt example");
resize(800, 600);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
BRepPrimAPI_MakeBox box(2, 2, 2);
const TopoDS_Shape& shape = box.Shape();
vtkNew<IVtkTools_ShapeDataSource> occSource;
occSource->SetShape(new IVtkOCC_Shape(shape));
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(occSource->GetOutputPort()); // The program crashed here
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
QVTKOpenGLNativeWidget* m_vtkWidget = new QVTKOpenGLNativeWidget(this);
layout->addWidget(m_vtkWidget);
m_vtkWidget->renderWindow()->AddRenderer(renderer);
m_vtkWidget->renderWindow()->Render();
renderer->ResetCamera();
}
MainWindow::~MainWindow()
{
}
Operating System
Windows
Compiler
MSVC
Bitness
64-bit
OCCT Version
7.9
Additional Files
No response
The only OCCT related code in your example is:
BRepPrimAPI_MakeBox box(2, 2, 2);
const TopoDS_Shape& shape = box.Shape();
So, this is not an occt issue. This should be VTK's bug. Report it to VTK.