OCCT icon indicating copy to clipboard operation
OCCT copied to clipboard

OCC+VTK:The program crashed in debug mode

Open YoHen-Fu opened this issue 6 months ago • 1 comments

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

YoHen-Fu avatar May 28 '25 01:05 YoHen-Fu

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.

xuzhongxing avatar Jun 03 '25 01:06 xuzhongxing