diff --git a/ChangeLog.md b/ChangeLog.md index c58cb6d794..657b3c7337 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,7 @@ - Distributed computation of persistent homology! - New backend for TrackingFromFields (critical point based) - Fast planar Rips filtration persistence computation +- Migration to ParaView 6 - CI updates ### 1.3.0 diff --git a/paraview/patch/headless.yml b/paraview/patch/headless.yml index afadafd563..b4db908520 100644 --- a/paraview/patch/headless.yml +++ b/paraview/patch/headless.yml @@ -17,7 +17,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04] + os: [ubuntu-22.04, ubuntu-24.04] steps: - uses: actions/checkout@v4 name: Checkout TTK-ParaView source code @@ -41,6 +41,7 @@ jobs: -DCMAKE_INSTALL_PREFIX=/usr \ -DPARAVIEW_PYTHON_SITE_PACKAGES_SUFFIX=lib/python3/dist-packages \ -DPARAVIEW_USE_MPI=ON \ + -DPARAVIEW_USE_PYTHON=ON \ -DPARAVIEW_USE_QT=OFF \ -DVTK_USE_X=OFF \ -DVTK_OPENGL_HAS_OSMESA=ON \ @@ -82,20 +83,13 @@ jobs: - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: '3.13' - name: Install macOS dependencies run: | # ParaView dependencies brew install --cask xquartz - brew install llvm lld ninja open-mpi - - - name: Set compilers as environment variables - run: | - echo "CC=$(brew --prefix llvm)/bin/clang" >> $GITHUB_ENV - echo "CXX=$(brew --prefix llvm)/bin/clang++" >> $GITHUB_ENV - echo "CPPFLAGS=$(brew --prefix llvm)/include" >> $GITHUB_ENV - echo "LDFLAGS=-L$(brew --prefix llvm)/lib/c++ -L$(brew --prefix llvm)/lib/unwind -lunwind" >> $GITHUB_ENV + brew install ninja open-mpi - name: Create & configure ParaView build directory run: | @@ -122,14 +116,14 @@ jobs: cd build sudo cmake --build . --target install # pvpython does not embed the correct PYTHONPATH - echo "PYTHONPATH=/usr/local/lib/python3.12/site-packages:$PYTHONPATH" >> $GITHUB_ENV + echo "PYTHONPATH=/usr/local/lib/python3.13/site-packages:$PYTHONPATH" >> $GITHUB_ENV - name: Test Python imports run: | - python3 -m vtk - python3 -m paraview.simple - pvpython -m vtk - pvpython -m paraview.simple + echo "import vtk" | python3 + echo "from paraview.simple import *" | python3 + echo "import vtk" | pvpython + echo "from paraview.simple import *" | pvpython env: DYLD_LIBRARY_PATH: /usr/local/lib @@ -237,14 +231,6 @@ jobs: - name: Fetch all uploaded artifacts uses: actions/download-artifact@v4 - - name: Upload Ubuntu Focal .deb as Release Asset - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - file: ttk-paraview-headless-ubuntu-20.04/ttk-paraview.deb - asset_name: ttk-paraview-headless-ubuntu-20.04.deb - - name: Upload Ubuntu Jammy .deb as Release Asset uses: svenstaro/upload-release-action@v2 with: diff --git a/paraview/patch/package.yml b/paraview/patch/package.yml index c2690b29a5..c37c9f49b3 100644 --- a/paraview/patch/package.yml +++ b/paraview/patch/package.yml @@ -18,7 +18,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04] + os: [ubuntu-22.04, ubuntu-24.04] steps: - uses: actions/checkout@v4 name: Checkout TTK-ParaView source code @@ -85,20 +85,13 @@ jobs: - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: '3.13' - name: Install macOS dependencies run: | # ParaView dependencies brew install --cask xquartz - brew install llvm lld mesa glew qt@5 ninja - - - name: Set compilers as environment variables - run: | - echo "CC=$(brew --prefix llvm)/bin/clang" >> $GITHUB_ENV - echo "CXX=$(brew --prefix llvm)/bin/clang++" >> $GITHUB_ENV - echo "CPPFLAGS=$(brew --prefix llvm)/include" >> $GITHUB_ENV - echo "LDFLAGS=-L$(brew --prefix llvm)/lib/c++ -L$(brew --prefix llvm)/lib/unwind -lunwind" >> $GITHUB_ENV + brew install mesa glew qt@5 ninja - name: Create & configure ParaView build directory run: | @@ -124,14 +117,14 @@ jobs: cd build sudo cmake --build . --target install # pvpython does not embed the correct PYTHONPATH - echo "PYTHONPATH=/usr/local/lib/python3.12/site-packages:$PYTHONPATH" >> $GITHUB_ENV + echo "PYTHONPATH=/usr/local/lib/python3.13/site-packages:$PYTHONPATH" >> $GITHUB_ENV - name: Test Python imports run: | - python3 -m vtk - python3 -m paraview.simple - pvpython -m vtk - pvpython -m paraview.simple + echo "import vtk" | python3 + echo "from paraview.simple import *" | python3 + echo "import vtk" | pvpython + echo "from paraview.simple import *" | pvpython env: DYLD_LIBRARY_PATH: /usr/local/lib @@ -238,14 +231,6 @@ jobs: - name: Fetch all uploaded artifacts uses: actions/download-artifact@v4 - - name: Upload Ubuntu Focal .deb as Release Asset - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - tag: ${{ github.ref }} - file: ttk-paraview-ubuntu-20.04/ttk-paraview.deb - asset_name: ttk-paraview-$tag-ubuntu-20.04.deb - - name: Upload Ubuntu Jammy .deb as Release Asset uses: svenstaro/upload-release-action@v2 with: diff --git a/paraview/patch/paraview-6.0.1.patch b/paraview/patch/paraview-6.0.1.patch new file mode 100644 index 0000000000..9e8e9358c1 --- /dev/null +++ b/paraview/patch/paraview-6.0.1.patch @@ -0,0 +1,1232 @@ +diff '--color=auto' -ur a/Clients/ParaView/CMakeLists.txt b/Clients/ParaView/CMakeLists.txt +--- a/Clients/ParaView/CMakeLists.txt 2025-10-09 09:10:11.713545694 +0200 ++++ b/Clients/ParaView/CMakeLists.txt 2025-10-06 07:17:36.629116142 +0200 +@@ -16,9 +16,9 @@ + endif () + + if (DEFINED PARAVIEW_VERSION_NICKNAME) +- set(paraview_version "${PARAVIEW_VERSION_NICKNAME}") ++ set(paraview_version "[TTK 1.3.0] ${PARAVIEW_VERSION_NICKNAME}") + else () +- set(paraview_version "${PARAVIEW_VERSION_FULL}") ++ set(paraview_version "[TTK 1.3.0] ${PARAVIEW_VERSION_FULL}") + endif () + set(paraview_title "ParaView ${paraview_version}") + if (PARAVIEW_BRANCH) +@@ -72,7 +72,7 @@ + EXPORT "ParaViewClient" + APPLICATION_NAME "ParaView" + TITLE "${paraview_title}" +- ORGANIZATION "ParaView" ++ ORGANIZATION "TTK" + VERSION "${PARAVIEW_VERSION_MAJOR}.${PARAVIEW_VERSION_MINOR}.${PARAVIEW_VERSION_PATCH}" + ${style_args} + MAIN_WINDOW_CLASS "ParaViewMainWindow" +diff '--color=auto' -ur a/CMake/ParaViewOptions.cmake b/CMake/ParaViewOptions.cmake +--- a/CMake/ParaViewOptions.cmake 2025-10-09 09:10:11.706879028 +0200 ++++ b/CMake/ParaViewOptions.cmake 2025-10-06 07:17:36.625782808 +0200 +@@ -131,7 +131,7 @@ + unset(_has_fortran) + endif() + +-vtk_deprecated_setting(python_default PARAVIEW_USE_PYTHON PARAVIEW_ENABLE_PYTHON OFF) ++vtk_deprecated_setting(python_default PARAVIEW_USE_PYTHON PARAVIEW_ENABLE_PYTHON ON) + option(PARAVIEW_USE_PYTHON "Enable/Disable Python scripting support" "${python_default}") + + option(PARAVIEW_USE_SERIALIZATION "Enable/Disable Serialization support" OFF) +diff '--color=auto' -ur a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt 2025-10-09 09:10:11.703545694 +0200 ++++ b/CMakeLists.txt 2025-10-06 07:17:36.625782808 +0200 +@@ -27,8 +27,8 @@ + get_property(generator_is_multi_config GLOBAL + PROPERTY GENERATOR_IS_MULTI_CONFIG) + if (NOT CMAKE_BUILD_TYPE AND NOT generator_is_multi_config) +- message(STATUS "Setting build type to 'Debug' as none was specified.") +- set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE) ++ message(STATUS "Setting build type to 'Release' as none was specified.") ++ set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE + PROPERTY +@@ -1253,3 +1253,47 @@ + if (PARAVIEW_ENABLE_EXAMPLES) + add_subdirectory(Examples) + endif () ++ ++#----------------------------------------------------------------------------- ++# Install TTK example data ++install(FILES ${ParaView_SOURCE_DIR}/TTK/Data/Example1.vti ++ DESTINATION share/paraview${paraview_version_suffix}/examples/ ++ COMPONENT development) ++ ++install(FILES ${ParaView_SOURCE_DIR}/TTK/Data/Example2.vti ++ DESTINATION share/paraview${paraview_version_suffix}/examples/ ++ COMPONENT development) ++ ++install(FILES ${ParaView_SOURCE_DIR}/TTK/Data/Example3.vti ++ DESTINATION share/paraview${paraview_version_suffix}/examples/ ++ COMPONENT development) ++ ++#----------------------------------------------------------------------------- ++# Generate a .deb package ++set(CPACK_PACKAGE_NAME "TTK-ParaView") ++set(CPACK_PACKAGE_FILE_NAME "ttk-paraview") ++set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "ParaView built with TTK patches") ++set(CPACK_PACKAGE_CONTACT "Julien Tierny ") ++set(CPACK_PACKAGE_VENDOR "CNRS, Sorbonne University and contributors") ++set(CPACK_PACKAGE_HOMEPAGE_URL "https://topology-tool-kit.github.io/") ++ ++option(TTK_PARAVIEW_HEADLESS_DEPS "Use headless TTK-ParaView dependencies for .deb packages" OFF) ++set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3-dev") ++if(TTK_PARAVIEW_HEADLESS_DEPS) ++ set(CPACK_DEBIAN_PACKAGE_DEPENDS "libopenmpi-dev, libosmesa-dev, ${CPACK_DEBIAN_PACKAGE_DEPENDS}") ++else() ++ set(CPACK_DEBIAN_PACKAGE_DEPENDS ++ "qtbase5-dev, qtchooser, qt5-qmake, qtbase5-dev-tools, qttools5-dev, libqt5x11extras5-dev, qtxmlpatterns5-dev-tools, libqt5svg5-dev, libxt-dev, ${CPACK_DEBIAN_PACKAGE_DEPENDS}" ++ ) ++endif() ++ ++set(CPACK_PACKAGE_VERSION_MAJOR ${PARAVIEW_VERSION_MAJOR}) ++set(CPACK_PACKAGE_VERSION_MINOR ${PARAVIEW_VERSION_MINOR}) ++set(CPACK_PACKAGE_VERSION_PATCH ${PARAVIEW_VERSION_PATCH}) ++# autogenerate dependency information ++set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) ++# package will be installed under %ProgramFiles%\${CPACK_PACKAGE_INSTALL_DIRECTORY} on Windows ++set(CPACK_PACKAGE_INSTALL_DIRECTORY "TTK-ParaView") ++# let the installer uninstall previous installations on Windows ++set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) ++include(CPack) +diff '--color=auto' -ur a/Qt/ApplicationComponents/pqExampleVisualizationsDialog.cxx b/Qt/ApplicationComponents/pqExampleVisualizationsDialog.cxx +--- a/Qt/ApplicationComponents/pqExampleVisualizationsDialog.cxx 2025-10-09 09:10:11.880212361 +0200 ++++ b/Qt/ApplicationComponents/pqExampleVisualizationsDialog.cxx 2025-10-06 07:17:36.929116143 +0200 +@@ -5,16 +5,13 @@ + + #include "pqActiveObjects.h" + #include "pqApplicationCore.h" +-#include "pqCoreUtilities.h" + #include "pqEventDispatcher.h" + #include "pqLoadStateReaction.h" + #include "vtkPVFileInformation.h" + + #include + #include +-#include + #include +-#include + + #include + +@@ -28,23 +25,11 @@ + this->setWindowFlags(this->windowFlags().setFlag(Qt::WindowContextHelpButtonHint, false)); + + QObject::connect( +- this->ui->CanExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->DiskOutRefExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->HeadSQExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->HotGasAnalysisExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->TosExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->WaveletExampleButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->RectilinearGridTimestepsButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->UnstructuredGridParallelButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); +- QObject::connect( +- this->ui->MandelbrotButton, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); ++ this->ui->Example1Button, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); ++ QObject::connect( ++ this->ui->Example2Button, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); ++ QObject::connect( ++ this->ui->Example3Button, SIGNAL(clicked(bool)), this, SLOT(onButtonPressed())); + } + + //----------------------------------------------------------------------------- +@@ -62,49 +47,19 @@ + { + const char* stateFile = nullptr; + bool needsData = false; +- if (button == this->ui->CanExampleButton) ++ if (button == this->ui->Example1Button) + { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/CanExample.pvsm"; ++ stateFile = ":/pqApplicationComponents/ExampleVisualizations/Example1.pvsm"; + needsData = true; + } +- else if (button == this->ui->DiskOutRefExampleButton) ++ else if (button == this->ui->Example2Button) + { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/DiskOutRefExample.pvsm"; ++ stateFile = ":/pqApplicationComponents/ExampleVisualizations/Example2.pvsm"; + needsData = true; + } +- else if (button == this->ui->WaveletExampleButton) ++ else if (button == this->ui->Example3Button) + { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/WaveletExample.pvsm"; +- needsData = false; +- } +- else if (button == this->ui->HotGasAnalysisExampleButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/HotGasAnalysisExample.pvsm"; +- needsData = true; +- } +- else if (button == this->ui->HeadSQExampleButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/HeadSQExample.pvsm"; +- needsData = true; +- } +- else if (button == this->ui->TosExampleButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/TosExample.pvsm"; +- needsData = true; +- } +- else if (button == this->ui->RectilinearGridTimestepsButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/RectilinearGrid.pvsm"; +- needsData = true; +- } +- else if (button == this->ui->UnstructuredGridParallelButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/UnstructuredGridParallel.pvsm"; +- needsData = true; +- } +- else if (button == this->ui->MandelbrotButton) +- { +- stateFile = ":/pqApplicationComponents/ExampleVisualizations/Mandelbrot.pvsm"; ++ stateFile = ":/pqApplicationComponents/ExampleVisualizations/Example3.pvsm"; + needsData = false; + } + else +@@ -136,11 +91,13 @@ + QFile qfile(stateFile); + if (qfile.open(QIODevice::ReadOnly | QIODevice::Text)) + { +- QMainWindow* mainWindow = qobject_cast(pqCoreUtilities::mainWidget()); +- if (mainWindow) +- { +- mainWindow->statusBar()->showMessage(tr("Loading example visualization."), 2000); +- } ++ QMessageBox box(this); ++ box.setText(tr("Loading example visualization, please wait ...")); ++ box.setStandardButtons(QMessageBox::NoButton); ++ box.show(); ++ ++ // without this, the message box doesn't paint properly. ++ pqEventDispatcher::processEventsAndWait(100); + + QString xmldata(qfile.readAll()); + xmldata.replace("$PARAVIEW_EXAMPLES_DATA", dataPath); +diff '--color=auto' -ur a/Qt/ApplicationComponents/Resources/pqApplicationComponents.qrc b/Qt/ApplicationComponents/Resources/pqApplicationComponents.qrc +--- a/Qt/ApplicationComponents/Resources/pqApplicationComponents.qrc 2025-10-09 09:10:11.876879028 +0200 ++++ b/Qt/ApplicationComponents/Resources/pqApplicationComponents.qrc 2024-09-10 10:41:08.900033687 +0200 +@@ -2,23 +2,11 @@ + + + +- Thumbnails/Mandelbrot.png +- Thumbnails/RectilinearGridTimesteps.png +- Thumbnails/UnstructuredGridParallel.png +- ExampleVisualizations/Mandelbrot.pvsm +- ExampleVisualizations/RectilinearGrid.pvsm +- ExampleVisualizations/UnstructuredGridParallel.pvsm +- ExampleVisualizations/CanExample.pvsm +- ExampleVisualizations/DiskOutRefExample.pvsm +- ExampleVisualizations/HeadSQExample.pvsm +- ExampleVisualizations/HotGasAnalysisExample.pvsm +- ExampleVisualizations/TosExample.pvsm +- ExampleVisualizations/WaveletExample.pvsm +- Thumbnails/CanExample.png +- Thumbnails/DiskOutRefExample.png +- Thumbnails/HeadSQExample.png +- Thumbnails/HotGasAnalysisExample.png +- Thumbnails/TosExample.png +- Thumbnails/WaveletExample.png ++ ExampleVisualizations/Example1.pvsm ++ ExampleVisualizations/Example2.pvsm ++ ExampleVisualizations/Example3.pvsm ++ Thumbnails/Example1.png ++ Thumbnails/Example2.png ++ Thumbnails/Example3.png + + +diff '--color=auto' -ur a/Qt/ApplicationComponents/Resources/UI/pqExampleVisualizationsDialog.ui b/Qt/ApplicationComponents/Resources/UI/pqExampleVisualizationsDialog.ui +--- a/Qt/ApplicationComponents/Resources/UI/pqExampleVisualizationsDialog.ui 2025-10-09 09:10:11.876879028 +0200 ++++ b/Qt/ApplicationComponents/Resources/UI/pqExampleVisualizationsDialog.ui 2025-10-06 07:17:36.922449477 +0200 +@@ -8,587 +8,167 @@ + + 0 + 0 +- 939 +- 830 ++ 996 ++ 420 + + +- +- +- 0 +- 0 +- +- + + ParaView Example Visualizations + +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- +- +- +- 0 +- 0 +- ++ ++ ++ ++ ++ <html><head/><body><p align="center">Click on one of thumbnails below to load an example visualization</p></body></html> ++ ++ ++ ++ ++ ++ ++ ++ 20 ++ false ++ false ++ false ++ ++ ++ ++ TTK Example Visualizations ++ ++ ++ Qt::AlignCenter ++ ++ ++ ++ ++ ++ ++ Scalar data example ++ ++ ++ Qt::AlignHCenter|Qt::AlignTop + +- +- Qt::ScrollBarPolicy::ScrollBarAsNeeded ++ ++ true ++ ++ ++ ++ ++ ++ ++ Qt::Horizontal ++ ++ ++ QDialogButtonBox::Close ++ ++ ++ ++ ++ ++ ++ Bivariate scalar data example + +- +- QAbstractScrollArea::SizeAdjustPolicy::AdjustToContentsOnFirstShow ++ ++ Qt::AlignHCenter|Qt::AlignTop + +- ++ + true + ++ ++ ++ ++ ++ ++ Uncertain data example ++ + +- Qt::AlignmentFlag::AlignCenter ++ Qt::AlignHCenter|Qt::AlignTop ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ :/pqApplicationComponents/Thumbnails/Example1.png ++ ++ ++ ++ ++ 300 ++ 225 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ :/pqApplicationComponents/Thumbnails/Example2.png ++ ++ ++ ++ ++ 300 ++ 225 ++ ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ :/pqApplicationComponents/Thumbnails/Example3.png ++ ++ ++ ++ ++ 300 ++ 225 ++ ++ ++ ++ true + +- +- +- +- 0 +- 0 +- 937 +- 818 +- +- +- +- +- 0 +- 0 +- +- +- +- +- QLayout::SizeConstraint::SetDefaultConstraint +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- 0 +- +- +- +- +- +- 0 +- 0 +- +- +- +- Data analysis of hot gas from Exodus II file +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/Mandelbrot.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/DiskOutRefExample.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Unstructured grid, parallel files with two timesteps +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- +- 16 +- +- +- +- <html><head/><body><p align="center">Click on one of thumbnails below to load an example visualization</p></body></html> +- +- +- Qt::AlignmentFlag::AlignCenter +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Rectilinear grid with timesteps +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Contouring CT scan of a head +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/TosExample.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- <html><head/><body><p>Sea surface temperatures<br/></p></body></html> +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/WaveletExample.png:/pqApplicationComponents/Thumbnails/WaveletExample.png +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Wavelet with volume rendering and contours +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/HeadSQExample.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Mandelbrot source showing different color maps +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/UnstructuredGridParallel.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Exodus II file with timesteps, Clip filter +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- -1 +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- Qt::Orientation::Horizontal +- +- +- QDialogButtonBox::StandardButton::Close +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- <html><head/><body><p>Exodus II file, Clip filter, Stream Tracer filter,<br/>Tube filter, Glyph filter</p></body></html> +- +- +- Qt::AlignmentFlag::AlignHCenter|Qt::AlignmentFlag::AlignTop +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/RectilinearGridTimesteps.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- +- +- true +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/CanExample.png +- +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- false +- +- +- true +- +- +- +- +- +- +- +- 0 +- 0 +- +- +- +- padding: 1px; +- +- +- +- +- +- +- :/pqApplicationComponents/Thumbnails/HotGasAnalysisExample.png:/pqApplicationComponents/Thumbnails/HotGasAnalysisExample.png +- +- +- +- 300 +- 225 +- +- +- +- true +- +- +- +- +- + + ++ ++ ++ ++ Qt::Vertical ++ ++ ++ ++ 20 ++ 40 ++ ++ ++ ++ + + + ++ Example1Button ++ Example2Button ++ Example3Button + buttonBox + + +diff '--color=auto' -ur a/Qt/Components/Resources/UI/pqAboutDialog.ui b/Qt/Components/Resources/UI/pqAboutDialog.ui +--- a/Qt/Components/Resources/UI/pqAboutDialog.ui 2025-10-09 09:10:11.893545695 +0200 ++++ b/Qt/Components/Resources/UI/pqAboutDialog.ui 2024-09-10 09:17:31.966677369 +0200 +@@ -26,7 +26,7 @@ + + + +- About ParaView ++ About TTK ParaView + + + true +diff '--color=auto' -ur a/Remoting/Core/vtkPVFileInformation.cxx b/Remoting/Core/vtkPVFileInformation.cxx +--- a/Remoting/Core/vtkPVFileInformation.cxx 2025-10-09 09:10:11.920212361 +0200 ++++ b/Remoting/Core/vtkPVFileInformation.cxx 2024-09-12 16:30:12.767206171 +0200 +@@ -47,8 +47,6 @@ + + vtkStandardNewMacro(vtkPVFileInformation); + +-namespace +-{ + inline void vtkPVFileInformationAddTerminatingSlash(std::string& name) + { + if (!name.empty()) +@@ -64,7 +62,6 @@ + } + } + } +-} + + #if defined(_WIN32) + +@@ -328,8 +325,6 @@ + } + #endif + +-namespace +-{ + std::string MakeAbsolutePath(const std::string& path, const std::string& working_dir) + { + std::string ret = path; +@@ -341,7 +336,6 @@ + } + return ret; + } +-} + + //----------------------------------------------------------------------------- + class vtkPVFileInformationSet : public std::set> +@@ -758,7 +752,7 @@ + + // Search for all files in the given directory. + std::string prefix = this->FullPath; +- ::vtkPVFileInformationAddTerminatingSlash(prefix); ++ vtkPVFileInformationAddTerminatingSlash(prefix); + std::wstring pattern = vtksys::Encoding::ToWide(prefix) + L"*"; + WIN32_FIND_DATAW data; + HANDLE handle = FindFirstFileW(pattern.c_str(), &data); +@@ -882,7 +876,7 @@ + + vtkPVFileInformationSet info_set; + std::string prefix = this->FullPath; +- ::vtkPVFileInformationAddTerminatingSlash(prefix); ++ vtkPVFileInformationAddTerminatingSlash(prefix); + + // Open the directory and make sure it exists. + DIR* dir = opendir(this->FullPath); +@@ -1057,7 +1051,7 @@ + MapOfStringToInfo fileGroups; + + std::string prefix = this->FullPath; +- ::vtkPVFileInformationAddTerminatingSlash(prefix); ++ vtkPVFileInformationAddTerminatingSlash(prefix); + + if (this->GroupFileSequences) + { +@@ -1267,6 +1261,11 @@ + resource_dir = vtksys::SystemTools::CollapseFullPath(resource_dir); + } + ++ vtkProcessModule* pm = vtkProcessModule::GetProcessModule(); ++ ++ if((pm)&&(prefixes.size())) ++ resource_dir = pm->GetSelfDir() + "/../" + prefixes[0]; ++ + return resource_dir; + } + +diff '--color=auto' -ur a/VTK/IO/Export/vtkVRMLExporter.cxx b/VTK/IO/Export/vtkVRMLExporter.cxx +--- a/VTK/IO/Export/vtkVRMLExporter.cxx 2025-10-09 09:10:12.213545696 +0200 ++++ b/VTK/IO/Export/vtkVRMLExporter.cxx 2025-10-06 07:17:37.462449479 +0200 +@@ -37,6 +37,8 @@ + + vtkStandardNewMacro(vtkVRMLExporter); + ++vtkPolyData *exportPolyData_ = NULL; ++ + vtkVRMLExporter::vtkVRMLExporter() + { + this->Speed = 4.0; +@@ -64,8 +66,8 @@ + vtkActor *anActor, *aPart; + vtkLightCollection* lc; + vtkLight* aLight; +- vtkCamera* cam; +- double* tempd; ++ // vtkCamera* cam; ++ // double* tempd; + FILE* fp; + + // make sure the user specified a FileName or FilePointer +@@ -120,31 +122,31 @@ + // End of Background + + // do the camera +- cam = ren->GetActiveCamera(); +- fprintf(fp, " Viewpoint\n {\n fieldOfView %f\n", +- cam->GetViewAngle() * vtkMath::Pi() / 180.0); +- fprintf(fp, " position %f %f %f\n", cam->GetPosition()[0], cam->GetPosition()[1], +- cam->GetPosition()[2]); +- fprintf(fp, " description \"Default View\"\n"); +- tempd = cam->GetOrientationWXYZ(); +- fprintf(fp, " orientation %.*g %.*g %.*g %.*g\n }\n", max_double_digits, tempd[1], +- max_double_digits, tempd[2], max_double_digits, tempd[3], max_double_digits, +- tempd[0] * vtkMath::Pi() / 180.0); ++ // cam = ren->GetActiveCamera(); ++ // fprintf(fp, " Viewpoint\n {\n fieldOfView %f\n", ++ // cam->GetViewAngle() * vtkMath::Pi() / 180.0); ++ // fprintf(fp, " position %f %f %f\n", cam->GetPosition()[0], cam->GetPosition()[1], ++ // cam->GetPosition()[2]); ++ // fprintf(fp, " description \"Default View\"\n"); ++ // tempd = cam->GetOrientationWXYZ(); ++ // fprintf(fp, " orientation %.*g %.*g %.*g %.*g\n }\n", max_double_digits, tempd[1], ++ // max_double_digits, tempd[2], max_double_digits, tempd[3], max_double_digits, ++ // tempd[0] * vtkMath::Pi() / 180.0); + + // do the lights first the ambient then the others +- fprintf( +- fp, " NavigationInfo {\n type [\"EXAMINE\",\"FLY\"]\n speed %f\n", this->Speed); +- if (ren->GetLights()->GetNumberOfItems() == 0) +- { +- fprintf(fp, " headlight TRUE}\n\n"); +- } +- else +- { +- fprintf(fp, " headlight FALSE}\n\n"); +- } +- fprintf(fp, " DirectionalLight { ambientIntensity 1 intensity 0 # ambient light\n"); +- fprintf(fp, " color %f %f %f }\n\n", ren->GetAmbient()[0], ren->GetAmbient()[1], +- ren->GetAmbient()[2]); ++ // fprintf( ++ // fp, " NavigationInfo {\n type [\"EXAMINE\",\"FLY\"]\n speed %f\n", this->Speed); ++ // if (ren->GetLights()->GetNumberOfItems() == 0) ++ // { ++ // fprintf(fp, " headlight TRUE}\n\n"); ++ // } ++ // else ++ // { ++ // fprintf(fp, " headlight FALSE}\n\n"); ++ // } ++ // fprintf(fp, " DirectionalLight { ambientIntensity 1 intensity 0 # ambient light\n"); ++ // fprintf(fp, " color %f %f %f }\n\n", ren->GetAmbient()[0], ren->GetAmbient()[1], ++ // ren->GetAmbient()[2]); + + // make sure we have a default light + // if we don't then use a headlight +@@ -225,6 +227,9 @@ + + void vtkVRMLExporter::WriteAnActor(vtkActor* anActor, FILE* fp) + { ++ ++ printf("[vtkVRMLExporter] Using TTK fix for VRML export...\n"); ++ + vtkSmartPointer pd; + vtkPointData* pntData; + vtkPoints* points; +@@ -306,6 +311,14 @@ + fprintf(fp, " children [\n"); + trans->Delete(); + ++ // BUG fix ++ exportPolyData_ = static_cast(pd); ++ // end of BUG fix ++ ++ // BUG fix ++ exportPolyData_ = static_cast(pd); ++ // end of BUG fix ++ + pm = vtkPolyDataMapper::New(); + pm->SetInputData(pd); + pm->SetScalarRange(anActor->GetMapper()->GetScalarRange()); +@@ -714,6 +727,40 @@ + fprintf(fp, " }\n"); + } + ++ // BUG fix here. ++ if(exportPolyData_){ ++ fprintf(fp," texCoordIndex[\n"); ++ vtkCellArray *cells = exportPolyData_->GetPolys(); ++ vtkIdType npts = 0; ++ vtkIdType const *indx = NULL; ++ for(cells->InitTraversal(); cells->GetNextCell(npts, indx);){ ++ fprintf(fp," "); ++ for(int i = 0; i < npts; i++){ ++ fprintf(fp, "%i, ", static_cast(indx[i])); ++ } ++ fprintf(fp, "-1,\n"); ++ } ++ fprintf(fp," ]\n"); ++ } ++ // end of BUG fix here. ++ ++ // BUG fix here. ++ if(exportPolyData_){ ++ fprintf(fp," texCoordIndex[\n"); ++ vtkCellArray *cells = exportPolyData_->GetPolys(); ++ vtkIdType npts = 0; ++ vtkIdType const *indx = NULL; ++ for(cells->InitTraversal(); cells->GetNextCell(npts, indx);){ ++ fprintf(fp," "); ++ for(int i = 0; i < npts; i++){ ++ fprintf(fp, "%i, ", static_cast(indx[i])); ++ } ++ fprintf(fp, "-1,\n"); ++ } ++ fprintf(fp," ]\n"); ++ } ++ // end of BUG fix here. ++ + // write out the point data + if (colors) + { +diff '--color=auto' -ur a/VTK/ThirdParty/libproj/vtklibproj/data/CMakeLists.txt b/VTK/ThirdParty/libproj/vtklibproj/data/CMakeLists.txt +--- a/VTK/ThirdParty/libproj/vtklibproj/data/CMakeLists.txt 2025-10-09 09:10:12.576879031 +0200 ++++ b/VTK/ThirdParty/libproj/vtklibproj/data/CMakeLists.txt 2025-10-06 07:17:38.292449483 +0200 +@@ -118,5 +118,5 @@ + install( + FILES ${ALL_DATA_FILE} + DESTINATION ${DATADIR} +- COMPONENT "libproj-data" ++ COMPONENT "libproj_data" + ) diff --git a/paraview/patch/patch-paraview-6.0.1.sh b/paraview/patch/patch-paraview-6.0.1.sh new file mode 100755 index 0000000000..273c51c093 --- /dev/null +++ b/paraview/patch/patch-paraview-6.0.1.sh @@ -0,0 +1,81 @@ +#!/bin/bash +# Copyright (C) Julien Tierny +PATCH_BIN=$(command -v patch 2> /dev/null) + +if [ -z "$PATCH_BIN" ]; then + echo "Error: Please install the 'patch' package." + exit 1 +fi + +if [ -z "$1" ] ||[ ! -d "$1" ]; then + echo "Error: Missing ParaView source tree path." + echo "Usage:" + echo " ./patch.sh " + exit 2 +fi + +PATCH_DIR=$(pwd) + +if [ ! -f ${PATCH_DIR}/paraview-5.8.0-CMakeLists.txt.patch ]; then + echo "You should run this script directly from the paraview/patch folder" + exit 3 +fi + +cd "$1" || exit 3 +$PATCH_BIN -p1 < "${PATCH_DIR}/paraview-6.0.1.patch" +cp "${PATCH_DIR}/splash.png" Clients/ParaView/PVSplashScreen.png +cp "${PATCH_DIR}/icon128.png" Clients/ParaView/pvIcon.png +cp "${PATCH_DIR}/icon512.png" Clients/ParaView/pvIcon-512x512.png +cp "${PATCH_DIR}/icon96.png" Clients/ParaView/pvIcon-96x96.png +cp "${PATCH_DIR}/icon64.png" Clients/ParaView/pvIcon-64x64.png +cp "${PATCH_DIR}/icon32.png" Clients/ParaView/pvIcon-32x32.png +cp "${PATCH_DIR}/icon22.png" Clients/ParaView/pvIcon-22x22.png +cp "${PATCH_DIR}/icon16.png" Clients/ParaView/pvIcon-16x16.png +cp "${PATCH_DIR}/icon.ico" Clients/ParaView/WinIcon.ico +cp "${PATCH_DIR}/icon.ico" Clients/ParaView/pvIcon.ico + +cp "${PATCH_DIR}/splash.png" \ + Qt/Components/Resources/Icons/PVSplashScreen.png +cp "${PATCH_DIR}/icon.ico" \ + Qt/Components/Resources/Icons/paraqlogo.ico +cp "${PATCH_DIR}/icon16.png" \ + Qt/Components/Resources/Icons/pqAppIcon16.png +cp "${PATCH_DIR}/icon22.png" \ + Qt/Components/Resources/Icons/pqAppIcon22.png +cp "${PATCH_DIR}/icon32.png" \ + Qt/Components/Resources/Icons/pqAppIcon32.png +cp "${PATCH_DIR}/icon64.png" \ + Qt/Components/Resources/Icons/pqAppIcon64.png +cp "${PATCH_DIR}/icon512.png" \ + Qt/Components/Resources/Icons/pvIcon512.png +cp "${PATCH_DIR}/icon96.png" \ + Qt/Components/Resources/Icons/pvIcon96.png +cp "${PATCH_DIR}/icon64.png" \ + Qt/Components/Resources/Icons/pvIcon64.png +cp "${PATCH_DIR}/icon32.png" \ + Qt/Components/Resources/Icons/pvIcon32.png +cp "${PATCH_DIR}/icon22.png" \ + Qt/Components/Resources/Icons/pvIcon22.png +cp "${PATCH_DIR}/icon16.png" \ + Qt/Components/Resources/Icons/pvIcon16.png + +## processing example data-sets +mkdir -p TTK/Data/ +cp ${PATCH_DIR}/data/* TTK/Data/ +cp TTK/Data/*pvsm Qt/ApplicationComponents/Resources/ExampleVisualizations/ +cp TTK/Data/*png Qt/ApplicationComponents/Resources/Thumbnails/ + +## Remove README.md that points to ParaView sources & build +## instructions instead of TTK ones +rm README.md + +## Build options: Release, Python support +mkdir -p .github/workflows/ +cp ${PATCH_DIR}/package.yml .github/workflows +cp ${PATCH_DIR}/headless.yml .github/workflows +# gitignore +cp ${PATCH_DIR}/pv_gitignore .gitignore + +echo "Finished patching." + +cd "$PATCH_DIR" || exit 4