From 1b5ca5ce2b78dfcac1d39339efec2a6be23a2f1f Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Wed, 3 Mar 2021 13:22:50 +0100 Subject: [PATCH] Remove completely the demo --- .../demo/Surface_mesher/CMakeLists.txt | 155 -- Surface_mesher/demo/Surface_mesher/File_XT.h | 211 --- .../demo/Surface_mesher/Raw_image_dialog.cpp | 28 - .../demo/Surface_mesher/Raw_image_dialog.h | 19 - .../demo/Surface_mesher/Surface_mesher.cpp | 23 - .../demo/Surface_mesher/binary_image.h | 190 -- .../demo/Surface_mesher/colorlisteditor.cpp | 69 - .../demo/Surface_mesher/colorlisteditor.h | 63 - .../Surface_mesher/get_polyhedral_surface.h | 8 - .../demo/Surface_mesher/icons/bbox-red.png | Bin 5268 -> 0 bytes .../demo/Surface_mesher/icons/bbox-red.svg | 209 --- .../demo/Surface_mesher/icons/bbox.png | Bin 4098 -> 0 bytes .../demo/Surface_mesher/icons/bbox.svg | 167 -- .../demo/Surface_mesher/icons/cgal_logo.xpm | 24 - .../demo/Surface_mesher/icons/fileopen.png | Bin 7317 -> 0 bytes .../demo/Surface_mesher/icons/filesave.png | Bin 11659 -> 0 bytes .../demo/Surface_mesher/icons/flip.png | Bin 8608 -> 0 bytes .../demo/Surface_mesher/icons/flip.svg | 207 --- .../demo/Surface_mesher/icons/minus.png | Bin 250 -> 0 bytes .../demo/Surface_mesher/icons/plus.png | Bin 462 -> 0 bytes .../demo/Surface_mesher/icons/resize.png | Bin 8105 -> 0 bytes .../demo/Surface_mesher/icons/resize.svg | 297 --- .../demo/Surface_mesher/icons/surface.png | Bin 12658 -> 0 bytes .../demo/Surface_mesher/icons/surface.svg | 166 -- .../demo/Surface_mesher/icons/twosides.png | Bin 8011 -> 0 bytes .../demo/Surface_mesher/icons/twosides.svg | 169 -- .../demo/Surface_mesher/mainwindow.cpp | 179 -- .../demo/Surface_mesher/mainwindow.h | 42 - .../Surface_mesher/polyhedral_surface.cpp | 407 ----- .../demo/Surface_mesher/polyhedral_surface.h | 102 -- Surface_mesher/demo/Surface_mesher/surface.h | 37 - .../demo/Surface_mesher/surface_mesher.qrc | 13 - .../demo/Surface_mesher/ui/mainwindow.ui | 808 --------- .../demo/Surface_mesher/ui/optionsdialog.ui | 128 -- .../demo/Surface_mesher/ui/raw_image.ui | 454 ----- .../demo/Surface_mesher/ui/values_list.ui | 118 -- .../demo/Surface_mesher/values_list.cpp | 280 --- .../demo/Surface_mesher/values_list.h | 79 - .../demo/Surface_mesher/values_list.qrc | 6 - Surface_mesher/demo/Surface_mesher/viewer.cpp | 66 - Surface_mesher/demo/Surface_mesher/viewer.h | 30 - Surface_mesher/demo/Surface_mesher/volume.cpp | 1616 ----------------- Surface_mesher/demo/Surface_mesher/volume.h | 392 ---- 43 files changed, 6762 deletions(-) delete mode 100644 Surface_mesher/demo/Surface_mesher/CMakeLists.txt delete mode 100644 Surface_mesher/demo/Surface_mesher/File_XT.h delete mode 100644 Surface_mesher/demo/Surface_mesher/Raw_image_dialog.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h delete mode 100644 Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/binary_image.h delete mode 100644 Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/colorlisteditor.h delete mode 100644 Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/bbox-red.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/bbox-red.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/bbox.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/bbox.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/fileopen.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/filesave.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/flip.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/flip.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/minus.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/plus.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/resize.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/resize.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/surface.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/surface.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/twosides.png delete mode 100644 Surface_mesher/demo/Surface_mesher/icons/twosides.svg delete mode 100644 Surface_mesher/demo/Surface_mesher/mainwindow.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/mainwindow.h delete mode 100644 Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/polyhedral_surface.h delete mode 100644 Surface_mesher/demo/Surface_mesher/surface.h delete mode 100644 Surface_mesher/demo/Surface_mesher/surface_mesher.qrc delete mode 100644 Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui delete mode 100644 Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui delete mode 100644 Surface_mesher/demo/Surface_mesher/ui/raw_image.ui delete mode 100644 Surface_mesher/demo/Surface_mesher/ui/values_list.ui delete mode 100644 Surface_mesher/demo/Surface_mesher/values_list.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/values_list.h delete mode 100644 Surface_mesher/demo/Surface_mesher/values_list.qrc delete mode 100644 Surface_mesher/demo/Surface_mesher/viewer.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/viewer.h delete mode 100644 Surface_mesher/demo/Surface_mesher/volume.cpp delete mode 100644 Surface_mesher/demo/Surface_mesher/volume.h diff --git a/Surface_mesher/demo/Surface_mesher/CMakeLists.txt b/Surface_mesher/demo/Surface_mesher/CMakeLists.txt deleted file mode 100644 index 96e3edb9472..00000000000 --- a/Surface_mesher/demo/Surface_mesher/CMakeLists.txt +++ /dev/null @@ -1,155 +0,0 @@ -set(prj Surface_mesher) - -cmake_minimum_required(VERSION 3.1...3.15) -project(Surface_mesher_Demo) - -if(NOT POLICY CMP0070 AND POLICY CMP0053) - # Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning. - cmake_policy(SET CMP0053 OLD) -endif() - -# Find includes in corresponding build directories -set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. -set(CMAKE_AUTOMOC ON) - -if(POLICY CMP0071) - cmake_policy(SET CMP0071 NEW) -endif() -if(POLICY CMP0072) - # About the use of OpenGL - cmake_policy(SET CMP0072 NEW) -endif() - -if(POLICY CMP0074) - cmake_policy(SET CMP0074 NEW) -endif() - -set(PACKAGE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) - -# Add several CGAL packages to the include and link paths, -# if they lie in ${PACKAGE_ROOT}/. - -foreach(LIB_DIR ${PACKAGE_ROOT}/../CGAL_ImageIO/src/CGAL_ImageIO - ${PACKAGE_ROOT}/../GraphicsView/src/CGALQt5) - if(EXISTS ${LIB_DIR}) - link_directories(${LIB_DIR}) - endif() -endforeach() - -include_directories(./) - -# QGLViewer needs Qt5 configured with QtOpenGL - -find_package(CGAL REQUIRED COMPONENTS ImageIO Qt5) -if(CGAL_Qt5_FOUND AND CGAL_ImageIO_FOUND) - - add_definitions(-DQT_NO_KEYWORDS) - - find_package(Qt5 QUIET COMPONENTS OpenGL Svg) - find_package(OpenGL) - - if(Qt5_FOUND - AND OPENGL_FOUND - AND OPENGL_GLU_FOUND) - - set(sources - Raw_image_dialog.cpp - colorlisteditor.cpp - values_list.cpp - mainwindow.cpp - Surface_mesher.cpp - viewer.cpp - volume.cpp) - - if(EXISTS ${PACKAGE_ROOT}/../Marching_cube) - option(SURFACE_MESH_DEMO_USE_MARCHING_CUBE - "Embed a marching cube implementation in the Surface Mesh demo." - ON) - mark_as_advanced(SURFACE_MESH_DEMO_USE_MARCHING_CUBE) - endif() - - if(EXISTS ${PACKAGE_ROOT}/include/CGAL/Polyhedral_surface_3.h) - option(SURFACE_MESH_DEMO_WITH_POLYHEDRAL_SURFACE - "Compile the support for polyhedral surfaces." OFF) - mark_as_advanced(SURFACE_MESH_DEMO_WITH_POLYHEDRAL_SURFACE) - endif() - - option( - SURFACE_MESH_DEMO_VERBOSE - "Set this option if you want the Surface Mesh demo to display messages on standard output." - OFF) - mark_as_advanced(SURFACE_MESH_DEMO_VERBOSE) - - if(SURFACE_MESH_DEMO_VERBOSE) - add_definitions(-DCGAL_SURFACE_MESHER_VERBOSE) - endif() - - if(SURFACE_MESH_DEMO_WITH_POLYHEDRAL_SURFACE) - set(sources ${sources} polyhedral_surface.cpp) - else(SURFACE_MESH_DEMO_WITH_POLYHEDRAL_SURFACE) - add_definitions(-DCGAL_DO_NOT_USE_POLYHEDRAL_SURFACE) - endif(SURFACE_MESH_DEMO_WITH_POLYHEDRAL_SURFACE) - - if(SURFACE_MESH_DEMO_USE_MARCHING_CUBE) - set(sources ${sources} ${PACKAGE_ROOT}/../Marching_cube/src/mc/ply.c) - add_definitions(-DCGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE) - endif() - - qt5_generate_moc("surface.h" "${CMAKE_CURRENT_BINARY_DIR}/moc_surface.cpp") - - set(sources ${sources} moc_surface.cpp) - - qt5_wrap_ui(uis ui/values_list.ui ui/mainwindow.ui ui/optionsdialog.ui - ui/raw_image.ui) - - qt5_add_resources(CGAL_Qt5_RESOURCE_FILES values_list.qrc - surface_mesher.qrc) - - add_executable(${prj} ${sources} ${uis} ${CGAL_Qt5_RESOURCE_FILES} - ${CGAL_Qt5_MOC_FILES}) - - add_to_cached_list(CGAL_EXECUTABLE_TARGETS ${prj}) - - find_package(VTK QUIET COMPONENTS vtkImagingGeneral vtkIOImage NO_MODULE) - if(VTK_FOUND) - if(VTK_USE_FILE) - include(${VTK_USE_FILE}) - endif() - if("${VTK_VERSION_MAJOR}" GREATER "5" OR VTK_VERSION VERSION_GREATER 5) - message(STATUS "VTK found") - add_definitions(-DCGAL_USE_VTK) - if(TARGET VTK::IOImage) - set(VTK_LIBRARIES VTK::IOImage VTK::ImagingGeneral) - endif() - else() - message(STATUS "Vtk must be at least Rel 6") - endif() - else() - message(STATUS "For reading Dicom files install VTK first") - endif() - - target_link_libraries( - ${prj} PRIVATE CGAL::CGAL CGAL::CGAL_Qt5 CGAL::CGAL_ImageIO - ${OPENGL_LIBRARIES} ${VTK_LIBRARIES}) - - include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) - cgal_add_compilation_test(${prj}) - - include(${CGAL_MODULES_DIR}/CGAL_add_test.cmake) - cgal_add_compilation_test(${prj}) - endif( - Qt5_FOUND - AND OPENGL_FOUND - AND OPENGL_GLU_FOUND) -else( - CGAL_Qt5_FOUND - AND CGAL_ImageIO_FOUND) - if(RUNNING_CGAL_AUTO_TEST) - # Just to avoid a warning from CMake if that variable is set on the command line... - endif() - - message(STATUS "NOTICE: This demo needs Qt5, and will not be compiled.") -endif( - CGAL_Qt5_FOUND - AND CGAL_ImageIO_FOUND) diff --git a/Surface_mesher/demo/Surface_mesher/File_XT.h b/Surface_mesher/demo/Surface_mesher/File_XT.h deleted file mode 100644 index 0b723bba749..00000000000 --- a/Surface_mesher/demo/Surface_mesher/File_XT.h +++ /dev/null @@ -1,211 +0,0 @@ -/********************************************************************* -* 25 - 02 - 97 -* gestion des fichiers image ELF -* -*********************************************************************/ - -#ifndef CGAL_FILE_XT_H -#define CGAL_FILE_XT_H - -#include -#include - -#include - -namespace CGAL { -namespace Total { -namespace internal { - -//To avoid "fopen may be unsafe" on Visual. -bool open_file(FILE **fin, const char* filename) -{ -#if defined(BOOST_MSVC) - return (fopen_s(fin, filename, "rw") == 0); -#else - *fin = fopen(filename, "rw"); - return (fin != NULL); -#endif -} - -} // namespace internal - -void permuteLong(char *a) -{ - char tmp; - -#ifdef CGAL_LITTLE_ENDIAN -tmp=a[0]; a[0]=a[3]; a[3]=tmp; -tmp=a[1]; a[1]=a[2]; a[2]=tmp; -#endif -} - -void permuteLongTab(long *a,int nb) -{ - int i; - -#ifdef CGAL_LITTLE_ENDIAN -for(i=0;isetNum((int)image_word_size() * - dim_x->value() * - dim_y->value() * - dim_z->value()); -} - -unsigned int Raw_image_dialog::image_word_size() const { - if(short_bt->isChecked()) - return 2; - if(int_bt->isChecked()) - return 4; - else if(float_bt->isChecked()) - return 4; - else if(double_bt->isChecked()) - return 8; - else - return 1; -} - diff --git a/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h b/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h deleted file mode 100644 index 7f191fecaf6..00000000000 --- a/Surface_mesher/demo/Surface_mesher/Raw_image_dialog.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RAW_IMAGE_DIALOG_H -#define RAW_IMAGE_DIALOG_H - -#include "ui_raw_image.h" - -class Raw_image_dialog : public QDialog, public Ui::Raw_image_dialog -{ - Q_OBJECT - -public: - Raw_image_dialog(QWidget* parent = 0); - - unsigned int image_word_size() const; - -private Q_SLOTS: - void update_image_size(); -}; - -#endif // RAW_IMAGE_DIALOG diff --git a/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp b/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp deleted file mode 100644 index b6c18695ab5..00000000000 --- a/Surface_mesher/demo/Surface_mesher/Surface_mesher.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "mainwindow.h" -#include -#include -#include - -int main(int argc, char** argv) -{ - QApplication application(argc,argv); - - application.setOrganizationDomain("geometryfactory.com"); - application.setOrganizationName("GeometryFactory"); - application.setApplicationName("Surface mesher Qt5 demo"); - - MainWindow w; - - if(argc>1) - w.surface_open(argv[1]); - - w.show(); - std::setlocale(LC_ALL, "C"); - return application.exec(); - std::cerr << "Exit\n"; -} diff --git a/Surface_mesher/demo/Surface_mesher/binary_image.h b/Surface_mesher/demo/Surface_mesher/binary_image.h deleted file mode 100644 index 591e6159744..00000000000 --- a/Surface_mesher/demo/Surface_mesher/binary_image.h +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright (c) 2005-2008 INRIA Sophia-Antipolis (France). -// Copyright (c) 2008 GeometryFactory (France) -// All rights reserved. -// -// This file is part of CGAL (www.cgal.org). -// -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial -// -// Author(s) : Laurent RINEAU, Pierre ALLIEZ - -#ifndef BINARY_IMAGE_3 -#define BINARY_IMAGE_3 - -#include - -#include -#include -#include - -#include -#include - -#include - -#include - -template -class CBinary_image_3 : public CGAL::Image_3 -{ - bool interpolate_; - bool labellized_; - -public: - double min_value; - double max_value; - - typedef FT_ FT; - -public: - CBinary_image_3() - : Image_3(), interpolate_(true) - { - } - - CBinary_image_3(const Image_3& bi) - : Image_3(bi), interpolate_(true) - { - } - - - CBinary_image_3(const CBinary_image_3& bi) - : Image_3(bi), interpolate_(bi.interpolate_),labellized_(bi.labellized_) - { - std::cerr << "CBinary_image_3::copy_constructor\n"; - min_value = bi.min_value; - max_value = bi.max_value; - } - - - void finish_open() { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - Word *min; Word *max; - (boost::tie(min, max)) = - (CGAL::min_max_element((Word*)(data()), - (Word*)(data()) + - xdim() * ydim() * zdim())); - min_value = *min; - max_value = *max;) - } - - float xmax() const - { - return (float)(((image_ptr->xdim) - 1.0)*(image_ptr->vx)); - } - - float ymax() const - { - return (float)(((image_ptr->ydim) - 1.0)*(image_ptr->vy)); - } - - float zmax() const - { - return (float)(((image_ptr->zdim) - 1.0)*(image_ptr->vz)); - } - - Point center() - { - FT cx = 0.5 * xmax(); - FT cy = 0.5 * ymax(); - FT cz = 0.5 * zmax(); - return Point(cx,cy,cz); - } - - FT radius() - { - return (std::max)((std::max)(xmax(),ymax()),zmax()); - } - - Point point(const std::size_t i, - const std::size_t j, - const std::size_t k) const - { - return Point(i * (image_ptr->vx), - j * (image_ptr->vy), - k * (image_ptr->vz)); - } - -public: - bool inside(const float x, - const float y, - const float z) const - { - return ( x >= 0.0f && - y >= 0.0f && - z >= 0.0f && - x <= xmax() && - y <= ymax() && - z <= zmax() ); - } - - float rand_x() { return (float)rand() / (float)RAND_MAX * xmax(); } - float rand_y() { return (float)rand() / (float)RAND_MAX * ymax(); } - float rand_z() { return (float)rand() / (float)RAND_MAX * zmax(); } - - void set_interpolation(const bool b) - { - interpolate_ = b; - } - - bool interpolation() const { - return interpolate_; - } - - void set_labellized(const bool b) - { - labellized_ = b; - } - - bool labellized() const { - return labellized_; - } - - FT operator()(Point p) const - { - const float x = static_cast(CGAL::to_double(p.x())); - const float y = static_cast(CGAL::to_double(p.y())); - const float z = static_cast(CGAL::to_double(p.z())); - - if(interpolation()) { - if(labellized()) { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - return (this->labellized_trilinear_interpolation(x, y, z, min_value));) - } - else { - CGAL_IMAGE_IO_CASE(image_ptr.get(), - return (this->trilinear_interpolation(x, y, z, min_value));) - } - } - else { - const std::ptrdiff_t i = static_cast(x/image()->vx + 0.5f); - const std::ptrdiff_t j = static_cast(y/image()->vy + 0.5f); - const std::ptrdiff_t k = static_cast(z/image()->vz + 0.5f); - if( i < 0 || - j < 0 || - k < 0 ) - { - return 0; - } - else - { - const std::size_t ui = static_cast(i); - const std::size_t uj = static_cast(j); - const std::size_t uk = static_cast(k); - if( ui >= image()->xdim || - uj >= image()->ydim || - uk >= image()->zdim ) - { - return 0; - } - else - { - return this->value(ui, uj, uk); - } - } - } - return FT(); - } -}; // end CBinary_image_3 - -#endif // BINARY_IMAGE_3 diff --git a/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp b/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp deleted file mode 100644 index 508b532c090..00000000000 --- a/Surface_mesher/demo/Surface_mesher/colorlisteditor.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved. -** -** This file is part of the example classes of the Qt Toolkit. -** -** This file may be used under the terms of the GNU General Public -** License version 2.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of -** this file. Please review the following information to ensure GNU -** General Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/ -** -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** In addition, as a special exception, Trolltech gives you certain -** additional rights. These rights are described in the Trolltech GPL -** Exception version 1.0, which can be found at -** http://www.trolltech.com/products/qt/gplexception/ and in the file -** GPL_EXCEPTION.txt in this package. -** -** In addition, as a special exception, Trolltech, as the sole copyright -** holder for Qt Designer, grants users of the Qt/Eclipse Integration -** plug-in the right for the Qt/Eclipse Integration to link to -** functionality provided by Qt Designer and its related libraries. -** -** Trolltech reserves all rights not expressly granted herein. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** SPDX-License-Identifier: LGPL-2.0-only -** -****************************************************************************/ - -#include - -#include "colorlisteditor.h" - -ColorListEditor::ColorListEditor(QWidget *widget) : QComboBox(widget) -{ - populateList(); -} - -QColor ColorListEditor::color() const -{ - return itemData(currentIndex(), Qt::DecorationRole).value(); -} - -void ColorListEditor::setColor(QColor color) -{ - setCurrentIndex(findData(color, int(Qt::DecorationRole))); -} - -void ColorListEditor::populateList() -{ - QStringList colorNames = QColor::colorNames(); - - for (int i = 0; i < colorNames.size(); ++i) { - QColor color(colorNames[i]); - - insertItem(i, colorNames[i]); - setItemData(i, color, Qt::DecorationRole); - } -} - diff --git a/Surface_mesher/demo/Surface_mesher/colorlisteditor.h b/Surface_mesher/demo/Surface_mesher/colorlisteditor.h deleted file mode 100644 index 4763d52b3b0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/colorlisteditor.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved. -** -** This file is part of the example classes of the Qt Toolkit. -** -** This file may be used under the terms of the GNU General Public -** License version 2.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of -** this file. Please review the following information to ensure GNU -** General Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/ -** -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** In addition, as a special exception, Trolltech gives you certain -** additional rights. These rights are described in the Trolltech GPL -** Exception version 1.0, which can be found at -** http://www.trolltech.com/products/qt/gplexception/ and in the file -** GPL_EXCEPTION.txt in this package. -** -** In addition, as a special exception, Trolltech, as the sole copyright -** holder for Qt Designer, grants users of the Qt/Eclipse Integration -** plug-in the right for the Qt/Eclipse Integration to link to -** functionality provided by Qt Designer and its related libraries. -** -** Trolltech reserves all rights not expressly granted herein. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** SPDX-License-Identifier: LGPL-2.0-only -** -****************************************************************************/ - -#ifndef COLORLISTEDITOR_H -#define COLORLISTEDITOR_H - -#include - -class QColor; -class QWidget; - -class ColorListEditor : public QComboBox -{ - Q_OBJECT - Q_PROPERTY(QColor color READ color WRITE setColor USER true) - -public: - ColorListEditor(QWidget *widget = 0); - -public: - QColor color() const; - void setColor(QColor c); - -private: - void populateList(); -}; - -#endif diff --git a/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h b/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h deleted file mode 100644 index 51ebed3272d..00000000000 --- a/Surface_mesher/demo/Surface_mesher/get_polyhedral_surface.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _GET_POLYHEDRAL_SURFACE_H -#define _GET_POLYHEDRAL_SURFACE_H - -#include "surface.h" - -Surface* get_polyhedral_surface(QObject*, double, double); - -#endif // _GET_POLYHEDRAL_SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox-red.png b/Surface_mesher/demo/Surface_mesher/icons/bbox-red.png deleted file mode 100644 index 0da5c8fdde31e7fd99b73ce301b71f8e342f824b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5268 zcmaJ_cTf{dun)cWCWr!2dT)wK3nWTYYD9rR5D=+>AWecK6bT>_K&prc2oj`77b!tN zLebEB6N2<&=>74%f8WfznZ2FeyPNsV?%m$*#+W_0$Hpwg3;+Pw3=O~*7aaW`G16bm zt=f*=7mU_V&(MnTVxSnEu@^FvkHKR<0DyYuKcYgHe1Tpl1)oD6J-0+WeIDqDbO8hg z1}eCDd-ypy`nV_{kgo4GG=%^FUM@p0$SNpn{e9S5-l3EZo!Y0DUXr?UsK8cjVCCFm zN#sKwQ#&Us&FeyZN%6%UABq(WpKH~RIjcu&onh~3z3BM~OVG)c$ec}Z;mQTKIXs4q zh~%ULXp8}2XaX}(=#|KT|9--XH{PM~1$1a&N_Ajr#_wr;vG-7D?M&ll)A2^gu8~!W zgphzef~6O{nd=5%ds9HArjbeCJNryXHzM!wFvuKwKCU??`2@gqizz6zfKnX8 zRFmB34FDqPw`}3hF7_-wLfjcE2IXM0STq4uZFUumb#(#UyB;R=8-Q1By@8_-_A;rk zMAlgcDqp+3415#pTH=vBm@F4w@7etVQTCh)NO7871gD&PD`E%A#DHml1TN^=J-3ar zZx`p}3Gw{>!n6N`;{IDZr=8TdN+_dB$p2%mO2f%z3f`bE{fY~tGoe9NCl%`GQ%};L z4C>hfQ1R*7GvNCdxZUVpGM&Unp#-)_%pwyAg(R5rMk+@irt&!RV2SpebmV&Vc%+q)Mf=O-eX{8um=oM0`IGL zm)7d!TnSPxP$;Xl3#;_~6?dZvx(xvKQ=PDD{1iPTEZ|?5R(F-a=7S13{u`Ggew zQ6)0ix*Y&^W(6rB>p=9Lb z>3DpZRc=<8PdiO|Izj} z6`kx7tlxE+a&Tp^_gurD3=z^~i%_4@7v3nMm2aLBEunv7J@iRSKF?efm`2qsmN^m@ zt$SE33wxTtstYcl^24;yy9r__s!Vb~9nQpB{jmLAaMKwr*SA#B45t;c3$PVQ6rmAJ_cA$$lmNpn5t;~zALmP4Vn-07px=A!v&<}q(&5jVi)|Lt7O22v5k^Yi z-%~{@$<(5gSNhN1v=y90V^r})D5=&9drJ7+>HBt4$Y^s`$cHQ55CcYF&S}qv^_r4J z9fx6Fw=4pwg021U_SR7y2d6hAx0ZX<`V5MUEW8 zh& `ca4%s1gewe4Y=YU=-Vl5IXVWtKGB47p{2& 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox.png b/Surface_mesher/demo/Surface_mesher/icons/bbox.png deleted file mode 100644 index 28c0d50c6b3b9a0b3e481d8fc3504e10845452e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4098 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 AhX4Qo diff --git a/Surface_mesher/demo/Surface_mesher/icons/bbox.svg b/Surface_mesher/demo/Surface_mesher/icons/bbox.svg deleted file mode 100644 index e23b746c510..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/bbox.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm b/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm deleted file mode 100644 index 6a69b3d67e1..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/cgal_logo.xpm +++ /dev/null @@ -1,24 +0,0 @@ -/* XPM */ -const char * demoicon_xpm[] = { -/* columns rows colors chars-per-pixel */ -"16 16 3 1", -" c None", -". c #FFFF00", -"+ c #000000", -/* pixels */ -"................", -"...++++...++++..", -"..+....+.+....+.", -"..+......+......", -"..+......+..+++.", -"..+......+....+.", -"..+....+.+....+.", -"...++++...++++..", -"................", -"...++++...+.....", -"..+....+..+.....", -"..+....+..+.....", -"..++++++..+.....", -"..+....+..+.....", -"..+....+..+++++.", -"................"}; diff --git a/Surface_mesher/demo/Surface_mesher/icons/fileopen.png b/Surface_mesher/demo/Surface_mesher/icons/fileopen.png deleted file mode 100644 index 82b79b7242bd1d6ef9f3c2107a652c5f6f71e0c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7317 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 V%pPX{nDAE-P*>Jbs!*^B`9F`E+5i9m diff --git a/Surface_mesher/demo/Surface_mesher/icons/filesave.png b/Surface_mesher/demo/Surface_mesher/icons/filesave.png deleted file mode 100644 index 0c5a242bc58735273237c1beb888459d73c2cb24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11659 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 diff --git a/Surface_mesher/demo/Surface_mesher/icons/flip.png b/Surface_mesher/demo/Surface_mesher/icons/flip.png deleted file mode 100644 index 3d28392a0f5367fc6b4b1abddcedf0538c7f1daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8608 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 mb9$k7^BkJK+4I6(9Qc32ki7}{w(dRv0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Next - - - go - next - right - arrow - pointer - > - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/minus.png b/Surface_mesher/demo/Surface_mesher/icons/minus.png deleted file mode 100644 index d6f233d7399c4c07c6c66775f7806acac84b1870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6P60k4u0Wb3;FYqWamwl0TmSYg zzPEV)f9L4=uDMg50*&A=3GxeOV9U{Bm1EIh)b!)dNY8G|=4l2>MR>Y6hE&9zJ@3ia zpuppBkxMsqLg3#2p{{ow4y^sCTR&@AtNcZ-!c0XiUIF(fS@*p4-Mvkxubuwr)McGB zHm7G5zmh%w<-tAQYwQ=f{_Q#i|$63?4Gdn(WDhGy5?S*zvKV>UH^L*-tUX z$Jv{I&ffC7bM{5Qj4e}Ezbj}vVjnSc;_|19_y1onFfAQuu24ykUoZnB3o9G9teS?7 zt9NpGMrLu#@0UVzfU@^IT^vIy;%X<}%xf{=arHKHYQL~@ZfotgwYUG*$MH^!I&%2V z@)sJL`rl4pesV%`$+ja*^=&3!b{Hmgs`72G$lh?~sgSmhV3T|L)#5pvnp5W$R3F&x zq^-&N)%9FO2FOm@bA*rKR&a{^p(h(SexKRzobg)f!S5Tb z0(ReeejodN_$Ob%pPGvI-{X5McZ=;}w|{;sE!Zmj;a8K;+WTSWrcUlO+qsq1zw`F> zL$~g{I69@}|MDjqpAy@zuKLv`b1gzCeQUnq?;S;@b8|k;l-+S#KOj|nW)fHH0-#SB NJYD@<);T3K0RYVY#HauO diff --git a/Surface_mesher/demo/Surface_mesher/icons/resize.png b/Surface_mesher/demo/Surface_mesher/icons/resize.png deleted file mode 100644 index b3d930f1d7b6d13cba4ba39cb91241934c85310e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8105 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 hYrhEpzf;!lL3}2rtm@Hd7hG8#pr)h^t$vA!_&8 diff --git a/Surface_mesher/demo/Surface_mesher/icons/resize.svg b/Surface_mesher/demo/Surface_mesher/icons/resize.svg deleted file mode 100644 index ed30359a802..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/resize.svg +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/surface.png b/Surface_mesher/demo/Surface_mesher/icons/surface.png deleted file mode 100644 index e3585c5d8166ebb83b698eddce41068cffd11c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12658 zcmW-nby!qi6UWce-Jpnc2-3BHu!Jt%A(GM|wMa zhX;N9@vI}D-}tUdhVB4h9Q}8}(B)-Mp+9Lov8+A+Sr4^0-qgY{Sm&xXn_uYY2qkvrp5@u}A{uV<%2 zoC5LR&)aSs3bs#(H?Bq+H!}RTX#|BezW083-MQB>riNT&&i$39*n7N6f;o&^l^P+f ziCpg78;Z-J1e}_l;2Y)_x()`G3lj1vQnzdp?o1%-Q^I?8X&KENr4;a}%mV}b zE+zp=N9}AS#4^~*&7cUlU{u9LWO3xmht73A$^Y+JGytnn7k}93N3pS6=_dWZeKt-< z7#TVrJZH+SLweAY_lM3eg#Le7VgTY64?q^i%mrGo(-nZ7#E3^Nxw>v zuKr3C2OSQ(N=cm|nl~T#9?6v>l8F!4`uwnpSzu(p1NwZhvBt9FxoxFN^fQl@<%+Lq zlzbV{c&iQoMLuTB(zI)@%0vG&Q(|C~2QYOu_fUw$l8aM^blw;=Ad^FNpX-;7e0h2# z5|D-Un;j6Dv!Km7RCt!$YT1%C0JIh%2)REW&u`E4>G*u+XUrO1jW+)96`ZMd&U34Z zLbV;IYDR-c)c@y#y)`!G3rH(3&mX3dI}z(^+SeJuP1=n>L{tJj@MJdkU^<^->j0FzI6YYMr5cAM*A z1vU+fu6~S*AptxbP{mzYF$@_HQ0SQwsQDWer<~)IoF(y{PWTh=Wdf^BR(z=W{YYezX-3Ydg;~ z;}$M*`G#jIh8#$uyTBWaGiG!E@<^BEp63@_KMX*^lG{@?-o%5e=__$qo?i2ekH=cL zJk9sa2$1EihO%K(ROp5e)-v}^WyS~n0$G3!~MwCDOV!gap(as zrzDRAdl*2j!rxSnuGwV6>yBNe0M8@~-G|`ed+075^YKq%$t-r*WsKCOkr7Cg%0bL^ z`c8ILB67tUT}7jB`R5@hjohSWX*$!QRDA$qKN$lxY<%VXgIe4}Q94)5P-BBWTNTmc ztWub4>=ROgco}Vj>416HM`^G8fGmsZavXPl$C;xt!EP~+RmH(i~Urt1O+ArMe^_~%Gojue1x0%0A)Upd`0v@j;j%YwzI$H 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 diff --git a/Surface_mesher/demo/Surface_mesher/icons/surface.svg b/Surface_mesher/demo/Surface_mesher/icons/surface.svg deleted file mode 100644 index b3ce5b253a7..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/surface.svg +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/icons/twosides.png b/Surface_mesher/demo/Surface_mesher/icons/twosides.png deleted file mode 100644 index a2da1eb1b39fd03cc220a2091b63525e65cfcd33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8011 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 F{tu0~30eRE diff --git a/Surface_mesher/demo/Surface_mesher/icons/twosides.svg b/Surface_mesher/demo/Surface_mesher/icons/twosides.svg deleted file mode 100644 index e1effe1d026..00000000000 --- a/Surface_mesher/demo/Surface_mesher/icons/twosides.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - Jakub Steiner - - - http://jimmac.musichall.cz - - Go Next - - - go - next - right - arrow - pointer - > - - - - - - - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/mainwindow.cpp b/Surface_mesher/demo/Surface_mesher/mainwindow.cpp deleted file mode 100644 index ebb1260a693..00000000000 --- a/Surface_mesher/demo/Surface_mesher/mainwindow.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include "mainwindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include // std::max -#include // std::sqrt -#include - -#include "ui_mainwindow.h" -#include "volume.h" -#ifndef CGAL_DO_NOT_USE_POLYHEDRAL_SURFACE -# include "polyhedral_surface.h" -#endif - -MainWindow::MainWindow(MainWindow* other_window /* = 0 */) : - CGAL::Qt::DemosMainWindow(), - surface(0) -{ - setupUi(this); - setAcceptDrops(true); - - if(other_window != 0) - { - viewer->setCamera(other_window->viewer->camera()); - connect(other_window, SIGNAL(destroyed()), - this, SLOT(close())); - } - - this->addAboutCGAL(); - this->addRecentFiles(this->menu_File, - this->action_Quit); - connect(this, SIGNAL(openRecentFile(QString)), - this, SLOT(surface_open(QString))); - - this->readState(); - - show_only(""); -} - -void MainWindow::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasFormat("text/uri-list")) - event->acceptProposedAction(); -} - -void MainWindow::dropEvent(QDropEvent *event) -{ - QString filename = event->mimeData()->urls().at(0).toLocalFile(); - surface_open(filename); - event->acceptProposedAction(); -} - -void MainWindow::surface_open(const QString& filename) -{ - if(surface != 0) { - delete surface; - surface = 0; - } -#ifndef CGAL_DO_NOT_USE_POLYHEDRAL_SURFACE - surface = new Polyhedral_surface(this); - if(surface->open(filename)) { - this->addToRecentFiles(filename); - return; - } - delete surface; - surface = 0; -#endif - surface = new Volume(this); - if(surface->open(filename)) { - this->addToRecentFiles(filename); - } -} - -void MainWindow::show_only(QString tag) -{ -#if 0 - QTextStream err(stderr); -#else - QString dummy; - QTextStream err(&dummy); -#endif - err << "** Show only in \"" << tag << "\"\n"; - Q_FOREACH(QObject* object, - this->findChildren()) - { - QStringList show_only_in = object->property("show_only_in").toStringList(); - if(!show_only_in.isEmpty()) - { - err << object->metaObject()->className() - << " \"" << object->objectName() << "\" only in: "; - Q_FOREACH(QString s, show_only_in) - err << s << " "; - const bool visible = show_only_in.contains(tag); - err << (visible ? "(enabled)\n" : "(disabled)\n"); - if(QMenu* menu = qobject_cast(object)) { - menu->menuAction()->setVisible(visible); - } - else { - object->setProperty("visible", QVariant::fromValue(visible)); - } - } - } -} - -void MainWindow::on_action_Open_triggered() -{ - QSettings settings; - QString directory = settings.value("Open directory", - QDir::current().dirName()).toString(); - QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), - directory, - tr("all Files (*.*)")); - if(!filename.isEmpty()) { - QFileInfo fileinfo(filename); - if(fileinfo.isFile() && fileinfo.isReadable()) { - settings.setValue("Open directory", - fileinfo.absoluteDir().absolutePath()); - surface_open(filename); - } - } -} - -void MainWindow::on_action_OpenDirectory_triggered() -{ - QSettings settings; - QString start_dir = settings.value("Open directory", - QDir::current().dirName()).toString(); - QString dir = - QFileDialog::getExistingDirectory(this, - tr("Open directory"), - start_dir, - QFileDialog::ShowDirsOnly - | QFileDialog::DontResolveSymlinks); - - if (!dir.isEmpty()) { - QFileInfo fileinfo(dir); - if (fileinfo.isDir() && fileinfo.isReadable()) - { - settings.setValue("Open directory", - fileinfo.absoluteDir().absolutePath()); - surface_open(dir); - } - } -} - -void MainWindow::on_action_Quit_triggered() -{ - this->writeState(); - qApp->exit(); -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - this->writeState(); - event->accept(); -} - -void MainWindow::on_action_Clone_triggered() -{ - MainWindow* other = new MainWindow(this); - other->show(); -} - diff --git a/Surface_mesher/demo/Surface_mesher/mainwindow.h b/Surface_mesher/demo/Surface_mesher/mainwindow.h deleted file mode 100644 index 36aa2db2138..00000000000 --- a/Surface_mesher/demo/Surface_mesher/mainwindow.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _MAINWINDOW_H -#define _MAINWINDOW_H - -#include -#include "ui_mainwindow.h" -#include - -class QDragEnterEvent; -class QDropEvent; -class Surface; -class QDoubleSpinBox; -class QCloseEvent; - -namespace CGAL{ -class QGLViewer; -} - -class MainWindow : public CGAL::Qt::DemosMainWindow, public Ui::MainWindow -{ - Q_OBJECT -public: - MainWindow(MainWindow* other_window = 0); - void dragEnterEvent(QDragEnterEvent *); - void dropEvent(QDropEvent *event); - -public Q_SLOTS: - void show_only(QString); - void surface_open(const QString& filename); - -private Q_SLOTS: - void on_action_Open_triggered(); - void on_action_OpenDirectory_triggered(); - void on_action_Quit_triggered(); - void on_action_Clone_triggered(); - -private: - void closeEvent(QCloseEvent *event); - Surface* surface; -}; - - -#endif // _MAINWINDOW_H diff --git a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp b/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp deleted file mode 100644 index 2ac24c2b2c4..00000000000 --- a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.cpp +++ /dev/null @@ -1,407 +0,0 @@ -#include "polyhedral_surface.h" -#include "get_polyhedral_surface.h" - -#include -#include -#include -#include -#include -#include -#include "ui_optionsdialog.h" -#include -#include -#include -#include -#include "mainwindow.h" - -typedef CGAL_polyhedral_surface::Polyhedron Polyhedron; - -Polyhedral_surface::Polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound, - double sharp_edges_angle_upper_bound) - : Surface(parent), - m_inverse_normals(false), - surface_ptr(0), - parent(parent), - display_octree(false), - display_edges_octree(false), - display_surface(true), - display_all_edges(true), - display_control_edges(false), - sharp_edges_angle_lower_bound(sharp_edges_angle_lower_bound), - sharp_edges_angle_upper_bound(sharp_edges_angle_upper_bound), - is_octree_initialized(false), - selected_edge(-1), - selected_facet(-1), - is_dirty(true), - list_id(0) -{ - connection_map["actionDisplay_octree"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_octree(bool))); - - connection_map["actionDisplay_edges_octree"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_edges_octree(bool))); - - connection_map["actionDisplay_surface"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_surface(bool))); - - connection_map["actionDisplay_all_edges"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_all_edges(bool))); - - connection_map["actionDisplay_control_edges"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(toggle_display_control_edges(bool))); - - connection_map["actionInverse_normals"] = - std::make_pair(SIGNAL(toggled(bool)), - SLOT(set_inverse_normals(bool))); - - connection_map["actionSubdivision"] = - std::make_pair(SIGNAL(triggered()), - SLOT(make_one_subdivision_step())); - connection_map["action_Options"] = - std::make_pair(SIGNAL(triggered()), - SLOT(on_action_Options_triggered())); -} - -Polyhedral_surface::~Polyhedral_surface() -{ - clear(); - delete surface_ptr; -} - -void Polyhedral_surface::on_action_Options_triggered() -{ - QDialog *options_dialog = new QDialog(qobject_cast(parent)); - Ui::OptionDialog ui; - ui.setupUi(options_dialog); - - QDoubleSpinBox* sb_upper = options_dialog->findChild("angle_upper_bound"); - QDoubleSpinBox* sb_lower = options_dialog->findChild("angle_lower_bound"); - - if(!sb_lower || !sb_upper) - return; - - sb_lower->setValue(sharp_edges_angle_lower_bound); - sb_upper->setValue(sharp_edges_angle_upper_bound); - if(options_dialog->exec() == QDialog::Accepted) - { - sharp_edges_angle_upper_bound = sb_upper->value(); - sharp_edges_angle_lower_bound = sb_lower->value(); - set_sharp_edges_angle_bounds(sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound); - } -} - -void Polyhedral_surface::clear() { - for(Connection_map::const_iterator - it = connection_map.begin(), - end = connection_map.end(); - it != end; - ++it) - { - QAction* action = parent->findChild(it->first); - action->setVisible(false); - } -} - -void Polyhedral_surface::connect_actions() -{ - for(Connection_map::const_iterator - it = connection_map.begin(), - end = connection_map.end(); - it != end; - ++it) - { - QAction* action = parent->findChild(it->first); - action->setVisible(true); - if(action) - connect(action, it->second.first, - this, it->second.second); - } - MainWindow* mw = qobject_cast(parent); - if(mw) { -// mw->fix_menus_visibility(); - mw->show_only("polyhedral"); - } - - - connect(this, SIGNAL(changed()), this, SLOT(display_nb_elements_in_status_bar())); -} - -void Polyhedral_surface::display_nb_elements_in_status_bar() const -{ - QMainWindow* mw = qobject_cast(parent); - if(surface_ptr && mw) - { - mw->statusBar()->showMessage(QString("%1 vertices. %2 edges. %3 facets.") - .arg(surface_ptr->size_of_vertices()) - .arg(surface_ptr->size_of_halfedges()/2) - .arg(surface_ptr->size_of_facets())); - } -} - -void Polyhedral_surface::set_dirty() -{ - is_dirty = true; - Q_EMIT changed(); -} - -void Polyhedral_surface::busy() const -{ - QMainWindow* mw = qobject_cast(parent); - if(mw) - { - mw->statusBar()->showMessage(QString("Constructing octree...")); - } - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); -} - -void Polyhedral_surface::not_busy() const -{ - QApplication::restoreOverrideCursor(); - QMainWindow* mw = qobject_cast(parent); - if(mw) - { - mw->statusBar()->clearMessage(); - } -} - -void Polyhedral_surface::set_sharp_edges_angle_bounds(const double lower_bound, - const double upper_bound) -{ - sharp_edges_angle_lower_bound = lower_bound; - sharp_edges_angle_upper_bound = upper_bound; - if(surface_ptr) { - surface_ptr->set_sharp_edges_angle_bounds(lower_bound, upper_bound); - surface_ptr->set_sharp_vertices_angle_bounds(lower_bound, upper_bound); - update_data_structures(); - Q_EMIT set_dirty(); - } -} - -void Polyhedral_surface::update_data_structures() -{ - surface_ptr->compute_sharp_edges_incidence_graph(); - if(display_octree || display_edges_octree) { - construct_octree(); - is_octree_initialized = true; - } - else - is_octree_initialized = false; -} - -void Polyhedral_surface::construct_octree() -{ - busy(); - surface_ptr->construct_octree(); - not_busy(); -} - -void Polyhedral_surface::toggle_display_octree(bool b) -{ - if(surface_ptr && b && !is_octree_initialized) { - is_octree_initialized = true; - construct_octree(); - } - display_octree = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_edges_octree(bool b) -{ - if(surface_ptr && b && !is_octree_initialized) { - is_octree_initialized = true; - construct_octree(); - } - display_edges_octree = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_surface(bool b) -{ - display_surface = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_all_edges(bool b) -{ - display_all_edges = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::toggle_display_control_edges(bool b) -{ - display_control_edges = b; - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::make_one_subdivision_step() -{ - if(surface_ptr) - { - Polyhedron output; - CSubdivider_loop pw_loop_subdiviser; - - pw_loop_subdiviser.subdivide(*surface_ptr, output); - static_cast(*surface_ptr) = output; - surface_ptr->compute_normals(); - surface_ptr->compute_type(); - update_data_structures(); - Q_EMIT set_dirty(); - } -} - -bool Polyhedral_surface::open(const QString& filename) -{ - clear(); - - std::cerr << "Opening file \"" << qPrintable(filename) << "\"..."; - std::ifstream in(filename.toUtf8()); - if(!in) return false; - - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - - if(surface_ptr) - delete surface_ptr; - surface_ptr = new CGAL_polyhedral_surface(in, - sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound, - false /*do not construct - octree*/); - if(!in) { - QApplication::restoreOverrideCursor(); - return false; - } - is_octree_initialized = false; - selected_facet = selected_edge = -1; - update_data_structures(); - - connect_actions(); - std::cerr << " Done.\n"; - QApplication::restoreOverrideCursor(); - float xmin, ymin, zmin, xmax, ymax, zmax; - get_bbox(xmin, ymin, zmin, xmax, ymax, zmax); - const float xcenter = (xmin + xmax) / 2; - const float ycenter = (ymin + ymax) / 2; - const float zcenter = (zmin + zmax) / 2; - const float xdelta = (-xmin + xmax); - const float ydelta = (-ymin + ymax); - const float zdelta = (-zmin + zmax); -// const float radius = std::max(std::max(xdelta, ydelta), zdelta) * std::sqrt(3.)/ 2.; - std::cerr << boost::format("Bounding box: xmin=%1%, ymin=%2%, zmin=%3%\n" - " xmax=%4%, ymax=%5%, zmax=%6%\n" - " center=(%7%, %8%, %9%)\n") - % xmin % ymin % zmin % xmax % ymax % zmax - % xcenter % ycenter % zcenter - << boost::format(" span=(%1%,%2%,%3%)\n") - % xdelta % ydelta % zdelta; - viewer->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(xmin, ymin, zmin), - CGAL::qglviewer::Vec(xmax, ymax, zmax)); - viewer->setBackgroundColor(Qt::white); - viewer->showEntireScene(); - - QAction* actionInverse_normals = qFindChild(this, "actionInverse_normals"); - if(actionInverse_normals) actionInverse_normals->setChecked(false); - Q_EMIT set_dirty(); - return true; -} - -void Polyhedral_surface::close() -{ - delete surface_ptr; - surface_ptr = 0; -} - -void Polyhedral_surface::draw() { - draw(false); -} - -void Polyhedral_surface::drawWithNames() { - draw(true); -} - -void Polyhedral_surface::postSelection(const QPoint&) -{ - if(!surface_ptr) return; - - selected_facet = selected_edge = -1; - - const int nb_vertices = surface_ptr->incidence_graph.vertices.size(); - const int nb_edges = surface_ptr->incidence_graph.edges.size(); - if(viewer->selectedName() >= nb_edges + nb_vertices) - selected_facet = viewer->selectedName() - nb_edges - nb_vertices; - else if(viewer->selectedName() >= nb_vertices) - selected_edge = viewer->selectedName() - nb_vertices; - - std::cerr << boost::format("post-selection.\n" - "selectedName()=%1%\n" - "selected edge=%2%\n" - "selected facet=%3%\n") - % viewer->selectedName() % selected_edge % selected_facet; - - Q_EMIT set_dirty(); -} - -void Polyhedral_surface::draw(bool with_names) -{ - if(!list_id) - { - std::cerr << "Generating OpenGL display list ID: "; - std::cerr << (list_id = ::glGenLists(1)) << "\n"; - } - if(!with_names) - { - if(is_dirty) - ::glNewList(list_id, GL_COMPILE_AND_EXECUTE); - else if(::glIsList(list_id)) - { - ::glCallList(list_id); - return; - } - else - std::cerr << "Call list (" << list_id << ")failed.\n"; - } -} -void Polyhedral_surface::get_bbox(float& xmin, float& ymin, float& zmin, - float& xmax, float& ymax, float& zmax) -{ - if(surface_ptr) { - xmin=surface_ptr->bbox().xmin(); - ymin=surface_ptr->bbox().ymin(); - ymin=surface_ptr->bbox().zmin(); - xmax=surface_ptr->bbox().xmax(); - ymax=surface_ptr->bbox().ymax(); - zmax=surface_ptr->bbox().zmax(); - } - else - { - xmin = ymin = zmin = 0.f; - xmax = ymax = zmax = 1.f; - } -} - -void Polyhedral_surface::set_inverse_normals(const bool b) { - m_inverse_normals = b; - set_dirty(); -} - -bool Polyhedral_surface::inverse_normals() const { - return m_inverse_normals; -} - - -Surface* get_polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound, - double sharp_edges_angle_upper_bound = 180.) -{ - return new Polyhedral_surface(parent, - sharp_edges_angle_lower_bound, - sharp_edges_angle_upper_bound); -} - -#include "polyhedral_surface.moc" diff --git a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h b/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h deleted file mode 100644 index 001eaee5fd6..00000000000 --- a/Surface_mesher/demo/Surface_mesher/polyhedral_surface.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _POLYHEDRAL_SURFACE_H -#define _POLYHEDRAL_SURFACE_H - -#define CGAL_SURFACE_MESHER_DEBUG_POLYHEDRAL_SURFACE_CONSTRUCTION - -#include "surface.h" -#include "viewer.h" - -#include -#include - -typedef std::pair Signal_slot_pair; -typedef std::map Connection_map; - -// CGAL -#include - -// kernel -#include - -// surface -#include - -// piece-wise loop subdivision -#include - -typedef CGAL::Exact_predicates_inexact_constructions_kernel Poly_kernel; -typedef Poly_kernel::FT FT; -typedef Poly_kernel::Point_3 Poly_point; -typedef Poly_kernel::Sphere_3 Sphere; -typedef Poly_kernel::Vector_3 Vector; -typedef Poly_kernel::Triangle_3 Triangle_3; - -typedef CGAL::Polyhedral_surface_3 CGAL_polyhedral_surface; - - -class Polyhedral_surface : public Surface -{ - Q_OBJECT; - -public: - Polyhedral_surface(QObject* parent, - double sharp_edges_angle_lower_bound = 90, - double sharp_edges_angle_upper_bound = 120); - - ~Polyhedral_surface(); -public Q_SLOTS: - void clear(); - void connect_actions(); - void display_nb_elements_in_status_bar() const; - void set_dirty(); - void busy() const; - void not_busy() const; - void set_sharp_edges_angle_bounds(const double lower_bound, - const double upper_bound); - void update_data_structures(); - void construct_octree(); - void toggle_display_octree(bool b); - void toggle_display_edges_octree(bool b); - void toggle_display_surface(bool b); - void toggle_display_all_edges(bool b); - void toggle_display_control_edges(bool b); - void make_one_subdivision_step(); - void on_action_Options_triggered(); - -public: - bool open(const QString& filename); - void close(); - void draw(); - void drawWithNames(); - void postSelection(const QPoint&); - void draw(bool with_names); - void get_bbox(float& xmin, float& ymin, float& zmin, - float& xmax, float& ymax, float& zmax); - -public Q_SLOTS: - void set_inverse_normals(const bool b); - -public: - bool inverse_normals() const; - -protected: - bool m_inverse_normals; - CGAL_polyhedral_surface* surface_ptr; - QObject* parent; - bool display_octree; - bool display_edges_octree; - bool display_surface; - bool display_all_edges; - bool display_control_edges; - double sharp_edges_angle_lower_bound; - double sharp_edges_angle_upper_bound; - bool is_octree_initialized; - int selected_edge; - int selected_facet; - bool is_dirty; - GLint list_id; - Connection_map connection_map; -}; - -#endif // _POLYHEDRAL_SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/surface.h b/Surface_mesher/demo/Surface_mesher/surface.h deleted file mode 100644 index 62e4b597a24..00000000000 --- a/Surface_mesher/demo/Surface_mesher/surface.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _SURFACE_H -#define _SURFACE_H - -#include -#include -#include - -#include "viewer.h" - -class Surface : public QObject -{ - Q_OBJECT -protected: - Surface(QObject* parent) - { - viewer = parent->findChild("viewer"); - - if(viewer) - connect(this, SIGNAL(changed()), viewer, SLOT(updateGL())); - viewer->set_surface(this); - } -public Q_SLOTS: - virtual bool open(const QString& filename) = 0; - virtual void close() = 0; - virtual void draw() = 0; - virtual void get_bbox(float&, float&, float&, - float&, float&, float&) = 0; - virtual void drawWithNames() {}; - virtual void postSelection(const QPoint&) {}; -Q_SIGNALS: - void changed(); - -protected: - Viewer* viewer; -}; - -#endif // _SURFACE_H diff --git a/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc b/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc deleted file mode 100644 index 9592cad50a0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/surface_mesher.qrc +++ /dev/null @@ -1,13 +0,0 @@ - - - icons/bbox-red.png - icons/bbox.png - icons/cgal_logo.xpm - icons/fileopen.png - icons/filesave.png - icons/flip.png - icons/resize.png - icons/surface.png - icons/twosides.png - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui b/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui deleted file mode 100644 index 65b8a528fa8..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/mainwindow.ui +++ /dev/null @@ -1,808 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1147 - 648 - - - - CGAL Surface mesh generator - - - - :/icons/cgal_logo.xpm:/icons/cgal_logo.xpm - - - true - - - - - - - - 1 - 0 - - - - - - - - - - 0 - 0 - 1147 - 21 - - - - - &File - - - - - - - - - - - &Options - - - - volume - polyhedral - - - - - - - - - - - - - - - - - - - &Edit - - - - polyhedral - - - - - - - - - - - - Actions toolbar - - - Qt::AllToolBarAreas - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - true - - - Meshing toolbar - - - - volume - - - - TopToolBarArea - - - false - - - - - - - Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea - - - Images options - - - - volume - - - - 1 - - - - - - - - - - 0 - 0 - - - - &Image type - - - - volume - - - - - - - - 0 - 0 - - - - Grayscale image - - - true - - - - - - - - 0 - 0 - - - - Segmented image - - - - - - - - - - &Operations - - - - - - Trilinear interpolation - - - true - - - - - - - Search for seeds - - - true - - - - - - - - - - - 0 - 0 - - - - C&riteria - - - - volume - - - - - - - Manifold - - - - - - - Facets vertices have same index - - - - - - - - - &Sizing bound: - - - spinBox_radius_bound - - - - - - - 5 - - - 9999.989999999999782 - - - - - - - &Distance bound: - - - spinBox_distance_bound - - - - - - - 5 - - - 9999.989999999999782 - - - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 0 - - - - - - - - - - - 0 - 0 - - - - Image sub-domaines - - - - volume - - - - 1 - - - - - 10 - 10 - - - - - - - - 0 - 5 - - - - - volume - - - - - - - - - - - :/icons/fileopen.png:/icons/fileopen.png - - - &Open... - - - Ctrl+O - - - - - &Quit - - - Ctrl+Q - - - QAction::QuitRole - - - - - true - - - - :/icons/flip.png:/icons/flip.png - - - &Inverse normals - - - Flip - - - Ctrl+I - - - - volume - polyhedral - - - - - - true - - - - :/icons/bbox.png:/icons/bbox.png - - - Display oc&tree - - - Ctrl+T - - - - polyhedral - - - - - - true - - - true - - - - :/icons/surface.png:/icons/surface.png - - - Display &surface - - - - polyhedral - - - - - - &Options... - - - - polyhedral - - - - - - Piecewise-smooth &subdivision - - - Ctrl+S - - - - polyhedral - - - - - - true - - - true - - - Display &all edges - - - Ctrl+A - - - - polyhedral - - - - - - true - - - false - - - Display &control edges - - - Ctrl+C - - - - polyhedral - - - - - - true - - - - :/icons/bbox-red.png:/icons/bbox-red.png - - - Display edges octree - - - - polyhedral - - - - - - Marching &cubes - - - Marching &cubes - - - - volume - - - - - - Surface &mesher - - - Surface &mesher - - - - volume - - - - - - true - - - true - - - - :/icons/twosides.png:/icons/twosides.png - - - Display facets with &front and back - - - Two-sides - - - Ctrl+F - - - - volume - polyhedral - - - - - - Clone - - - - - true - - - false - - - - :/icons/resize.png:/icons/resize.png - - - Auto-&resize - - - Auto-&resize - - - Automaticaly zoom in or out when the object change. - - - Ctrl+S - - - - volume - polyhedral - - - - - - true - - - true - - - Draw triangles &edges - - - Draw triangles &edges - - - Ctrl+E - - - - volume - - - - - - true - - - false - - - Use &Gouraud shading (marching cube only) - - - Use &Gouraud shading - - - Use Gouraud shading to display the marching cubes. - - - Ctrl+G - - - - volume - - - - - - true - - - Show the whole &triangulation (surface mesher only) - - - Ctrl+T - - - - volume - - - - - - Choose the triangulation edges &color... - - - - volume - - - - - - - :/icons/filesave.png:/icons/filesave.png - - - Export surface mesh to OFF... - - - - volume - - - - - - true - - - true - - - - :/icons/bbox.png:/icons/bbox.png - - - Show the image &bounding box - - - Ctrl+B - - - - volume - - - - - - - :/icons/filesave.png:/icons/filesave.png - - - Save the image as Inrimage... - - - - - - :/icons/fileopen.png:/icons/fileopen.png - - - Open directory... - - - - - - Values_list - QWidget -
values_list.h
- 1 -
- - Viewer - QWidget -
viewer.h
-
-
- - viewer - grayLevelRadioButton - labellizedRadioButton - manifoldCheckBox - sameIndexCheckBox - spinBox_radius_bound - spinBox_distance_bound - - - - - - - labellizedRadioButton - toggled(bool) - sameIndexCheckBox - setDisabled(bool) - - - 130 - 172 - - - 139 - 414 - - - - -
diff --git a/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui b/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui deleted file mode 100644 index 2ea13d120e1..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/optionsdialog.ui +++ /dev/null @@ -1,128 +0,0 @@ - - OptionDialog - - - - 0 - 0 - 210 - 167 - - - - Set options - - - :/icons/cgal_logo.xpm - - - - - - Sharp edges angle bounds - - - - - - - - &Lower bound - - - angle_lower_bound - - - - - - - 180.000000000000000 - - - - - - - &Upper bound - - - angle_upper_bound - - - - - - - 180.000000000000000 - - - - - - - - - - - - Qt::Vertical - - - - 20 - 0 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok - - - - - - - - - - - buttonBox - accepted() - OptionDialog - accept() - - - 227 - 215 - - - 157 - 90 - - - - - buttonBox - rejected() - OptionDialog - reject() - - - 243 - 221 - - - 252 - 90 - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui b/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui deleted file mode 100644 index e270d1de917..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/raw_image.ui +++ /dev/null @@ -1,454 +0,0 @@ - - Raw_image_dialog - - - - 0 - 0 - 585 - 342 - - - - Open raw image - - - - - - Image &value type - - - - - - Short (16 bits) - - - - - - - Float - - - - - - - Int (32 bits) - - - - - - - Double - - - - - - - Signed - - - - - - - char (8 bits) - - - - - - - - - - Image dimensions - - - - - - - - &Dimensions: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - dim_x - - - - - - - &Spacing: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - spacing_x - - - - - - - x: - - - 100000000 - - - - - - - y: - - - 100000000 - - - - - - - z: - - - 100000000 - - - - - - - vx: - - - 5 - - - 1.000000000000000 - - - - - - - vy: - - - 5 - - - 1.000000000000000 - - - - - - - vz: - - - 5 - - - 1.000000000000000 - - - - - - - &Offset: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - offset - - - - - - - bytes - - - 999999999 - - - - - - - Image size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0 - - - - - - - File size: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - 0 - - - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Open - - - - - - - int_bt - short_bt - signed_bt - float_bt - double_bt - dim_x - dim_y - dim_z - spacing_x - spacing_y - spacing_z - offset - buttonBox - - - - - float_bt - toggled(bool) - signed_bt - setDisabled(bool) - - - 47 - 112 - - - 553 - 94 - - - - - double_bt - toggled(bool) - signed_bt - setDisabled(bool) - - - 564 - 127 - - - 564 - 94 - - - - - buttonBox - accepted() - Raw_image_dialog - accept() - - - 191 - 316 - - - 183 - 313 - - - - - buttonBox - rejected() - Raw_image_dialog - reject() - - - 253 - 319 - - - 252 - 312 - - - - - dim_x - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 178 - 187 - - - 99 - 141 - - - - - dim_z - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 473 - 178 - - - 441 - 142 - - - - - char_bt - clicked() - Raw_image_dialog - update_image_size() - - - 71 - 52 - - - 137 - 3 - - - - - short_bt - clicked() - Raw_image_dialog - update_image_size() - - - 117 - 81 - - - 49 - 6 - - - - - float_bt - clicked() - Raw_image_dialog - update_image_size() - - - 137 - 111 - - - 67 - -5 - - - - - int_bt - clicked() - Raw_image_dialog - update_image_size() - - - 358 - 49 - - - 584 - 52 - - - - - dim_y - valueChanged(int) - Raw_image_dialog - update_image_size() - - - 332 - 186 - - - 271 - 142 - - - - - double_bt - clicked() - Raw_image_dialog - update_image_size() - - - 514 - 119 - - - 581 - 116 - - - - - - update_image_size() - - diff --git a/Surface_mesher/demo/Surface_mesher/ui/values_list.ui b/Surface_mesher/demo/Surface_mesher/ui/values_list.ui deleted file mode 100644 index 9e7e4372813..00000000000 --- a/Surface_mesher/demo/Surface_mesher/ui/values_list.ui +++ /dev/null @@ -1,118 +0,0 @@ - - Values_list - - - - 0 - 0 - 429 - 632 - - - - Form - - - - - - QFrame::StyledPanel - - - 1 - - - QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::NoEditTriggers|QAbstractItemView::SelectedClicked - - - true - - - QAbstractItemView::ExtendedSelection - - - 0 - - - false - - - true - - - false - - - true - - - false - - - 3 - - - - Iso-value - - - - - Color - - - - - Name - - - - - - - - - - ... - - - :/values/plus.png - - - - - - - ... - - - :/values/minus.png - - - Del - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.cpp b/Surface_mesher/demo/Surface_mesher/values_list.cpp deleted file mode 100644 index b2e8a41e86f..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.cpp +++ /dev/null @@ -1,280 +0,0 @@ -#include "values_list.h" -#include "ui_values_list.h" -#include "colorlisteditor.h" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) -#include -#endif - -Values_delegate::Values_delegate(QWidget* parent) : QItemDelegate(parent) {} -void Values_delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const -{ - switch(index.column()) - { - case Values_list::Color: { - painter->fillRect(option.rect, index.data().value()); - drawFocus(painter, option, option.rect); - break; - } - default: - QItemDelegate::paint(painter, option, index); - } -} - -QWidget *Values_delegate::createEditor(QWidget *parent, - const QStyleOptionViewItem & option, - const QModelIndex & index) const -{ - if(index.column() == Values_list::Color) - { - return new ColorListEditor(parent); - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = new QLineEdit(parent); - lineedit->setAutoFillBackground(true); - lineedit->setValidator(new QDoubleValidator(lineedit)); - return lineedit; - } - else return QItemDelegate::createEditor(parent, option, index); -} - -void Values_delegate::setEditorData(QWidget *editor, - const QModelIndex &index) const -{ - if(index.column() == Values_list::Color) - { - ColorListEditor* coloreditor = qobject_cast(editor); - if(coloreditor) - coloreditor->setColor(index.data().value()); - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = qobject_cast(editor); - if(lineedit) - lineedit->setText(index.data().toString()); - } - else QItemDelegate::setEditorData(editor, index); -} -void Values_delegate::setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const -{ - if(index.column() == Values_list::Color) - { - ColorListEditor* coloreditor = qobject_cast(editor); - if(coloreditor) - { - model->setData(index, coloreditor->color()); - Q_EMIT new_color(index); - } - } - else if(index.column() == Values_list::Value) - { - QLineEdit* lineedit = qobject_cast(editor); - if(lineedit) - { - model->setData(index, lineedit->text().toDouble()); - Q_EMIT new_value(index); - } - } - else QItemDelegate::setModelData(editor, model, index); -} - -const double Values_list::default_value = 0.0; - -Values_list::Values_list(QWidget* parent): - QWidget(parent) -{ - Ui::Values_list().setupUi(this); - - treeWidget = parent->findChild("treeWidget"); - Q_ASSERT_X(treeWidget, "Values_list constructor", "cannot find widget \"treeWidget\""); - - treeWidget->sortByColumn(Value, Qt::AscendingOrder); - - treeWidget->header()->setSectionsClickable(false); - - - Values_delegate* values_delegate = new Values_delegate(parent); - - treeWidget->setItemDelegate(values_delegate); - connect(values_delegate, SIGNAL(new_value(const QModelIndex&)), - this, SIGNAL(values_changed())); - connect(values_delegate, SIGNAL(new_color(const QModelIndex&)), - this, SIGNAL(colors_changed())); - connect(this->treeWidget->model(), - SIGNAL(dataChanged (const QModelIndex &, const QModelIndex &)), - this, SIGNAL(changed())); - - connect(this, SIGNAL(changed()), - this, SLOT(update_items_cache())); -} - -QColor Values_list::color(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return QColor(); - else - return treeWidget->topLevelItem(i)->data(Color, Qt::DisplayRole).value(); -} - -QColor Values_list::color(const QTreeWidgetItem* item) const -{ - return item->data(Color, Qt::DisplayRole).value(); -} - -int Values_list::numberOfValues() const -{ - return treeWidget->topLevelItemCount(); -} - -double Values_list::value(const int i) const -{ - if(i < 0 || i > numberOfValues()) - return 0.; - else - return treeWidget->topLevelItem(i)->data(Value, Qt::DisplayRole).toDouble(); -} - -QString Values_list::name(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return QString(); - else - return treeWidget->topLevelItem(i)->data(Name, Qt::DisplayRole).toString(); -} - -bool Values_list::enabled(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return false; - else - return treeWidget->topLevelItem(i)->data(Value, Qt::CheckStateRole).toInt() > 0; -} - -bool Values_list::enabled(const QTreeWidgetItem* item) const -{ - return item->data(Value, Qt::CheckStateRole).toInt() > 0; -} - -const QTreeWidgetItem* Values_list::item(const int i) const -{ - if(i < 0 || i > treeWidget->topLevelItemCount()) - return 0; - else - return treeWidget->topLevelItem(i); -} - -void Values_list::save_values(QString filename) const -{ - QSettings settings; - - settings.beginGroup(QUrl::toPercentEncoding(filename)); - settings.beginWriteArray("values"); - for (int i = 0; i < numberOfValues(); ++i) { - settings.setArrayIndex(i); - settings.setValue("value", value(i)); - settings.setValue("color", color(i)); - settings.setValue("name", name(i)); - settings.setValue("enabled", enabled(i)); - } - settings.endArray(); - settings.endGroup(); -} - -void Values_list::load_values(QString filename) -{ - QSettings settings; - - treeWidget->clear(); - settings.beginGroup(QUrl::toPercentEncoding(filename)); - int nb = settings.beginReadArray("values"); - for (int i = 0; i < nb; ++i) { - settings.setArrayIndex(i); - QTreeWidgetItem *newItem = new QTreeWidgetItem(treeWidget); - newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - newItem->setData(Value, Qt::CheckStateRole, settings.value("enabled").toBool() ? Qt::Checked : Qt::Unchecked); - newItem->setData(Value, Qt::DisplayRole, settings.value("value").toDouble()); - newItem->setData(Color, Qt::DisplayRole, settings.value("color").value()); - newItem->setData(Name, Qt::DisplayRole, settings.value("name").toString()); - } - settings.endArray(); - settings.endGroup(); - update_items_cache(); -} - -void Values_list::on_minusButton_clicked() -{ - Q_FOREACH(QTreeWidgetItem* item, treeWidget->selectedItems()) - { - // treeWidget->invisibleRootItem()->removeChild(item); - delete item; - } - Q_EMIT values_changed(); -} - -void Values_list::on_plusButton_clicked() -{ - addValue(); -} - -void Values_list::addValue(const double i) -{ - QTreeWidgetItem *newItem = new QTreeWidgetItem(treeWidget); - newItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - newItem->setData(Value, Qt::CheckStateRole, Qt::Checked); - newItem->setData(Value, Qt::DisplayRole, i); - QStringList colors = QColor::colorNames(); -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) - const int color_index = qrand() % colors.size(); -#else -const int color_index = QRandomGenerator::global()->generate() % colors.size(); -#endif - - QColor color = QColor(colors[color_index]); - newItem->setData(Color, Qt::DisplayRole, color); - newItem->setData(Name, Qt::DisplayRole, ""); - Q_EMIT values_changed(); -} - -void Values_list::update_items_cache() { - items_cache.clear(); - for(int i = 0, nb = numberOfValues(); i < nb; ++i) { - items_cache.insert(std::make_pair(value(i), item(i))); - } -} - -const QTreeWidgetItem* Values_list::search(const double value) const -{ - Items_cache::const_iterator it = items_cache.find(value); - if(it != items_cache.end()) { - return it->second; - } - else { - return 0; - } -} - -void Values_list::setHeaderTitle(QString title) -{ - treeWidget->headerItem()->setText(0, title); -} - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.h b/Surface_mesher/demo/Surface_mesher/values_list.h deleted file mode 100644 index 03649fea0f0..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef _VALUES_LIST_H -#define _VALUES_LIST_H - -#include -#include -#include -#include -#include - -class QTreeWidget; -class QTreeWidgetItem; - -class Values_delegate : public QItemDelegate -{ - Q_OBJECT -public: - Values_delegate(QWidget* parent); - -Q_SIGNALS: - void new_color(const QModelIndex&) const; - void new_value(const QModelIndex&) const; - -protected: - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; - QWidget *createEditor(QWidget *parent, - const QStyleOptionViewItem & option, - const QModelIndex & index) const; - void setEditorData(QWidget *editor, - const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const; -}; - -class Values_list : public QWidget -{ - Q_OBJECT -public: - enum Field { Value = 0 , Color = 1, Name = 2}; - Values_list(QWidget* parent); - - // const accessors - int numberOfValues() const; - QColor color(const int i) const; - QColor color(const QTreeWidgetItem* i) const; - double value(const int i) const; - QString name(const int i) const; - bool enabled(const int i) const; - bool enabled(const QTreeWidgetItem* i) const; - const QTreeWidgetItem* item(const int i) const; - const QTreeWidgetItem* search(const double value) const; - -public Q_SLOTS: - void save_values(QString) const; - void load_values(QString); - void on_plusButton_clicked(); - void on_minusButton_clicked(); - - // setters - void addValue(const double v = Values_list::default_value); - - void setHeaderTitle(QString); - -private Q_SLOTS: - void update_items_cache(); - -Q_SIGNALS: - void changed(); - void colors_changed(); - void values_changed(); -private: - QTreeWidget* treeWidget; - typedef std::map Items_cache; - Items_cache items_cache; - - static const double default_value; -}; - -#endif // _VALUES_LIST_H - diff --git a/Surface_mesher/demo/Surface_mesher/values_list.qrc b/Surface_mesher/demo/Surface_mesher/values_list.qrc deleted file mode 100644 index 8a78bb1688a..00000000000 --- a/Surface_mesher/demo/Surface_mesher/values_list.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/minus.png - icons/plus.png - - diff --git a/Surface_mesher/demo/Surface_mesher/viewer.cpp b/Surface_mesher/demo/Surface_mesher/viewer.cpp deleted file mode 100644 index 0cde258c258..00000000000 --- a/Surface_mesher/demo/Surface_mesher/viewer.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "viewer.h" -#include "surface.h" -#include -#include - -Viewer::Viewer(QWidget* parent) - : CGAL::QGLViewer(parent), surface(nullptr) -{ -} - -void Viewer::init() -{ - setBackgroundColor(Qt::white); - glLineStipple(5, 0xaaaa); - glDisable(GL_LINE_STIPPLE); - - // anti-aliasing - glEnable(GL_BLEND); - glEnable(GL_LINE_SMOOTH); - glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -} - -QString Viewer::helpString() const -{ - return "" - "

Surface mesher demo

\n" - "

No help availlable for now.

"; -} - -void Viewer::interpolateToFitBoundingBox(double xmin, double ymin, double zmin, - double xmax, double ymax, double zmax) -{ - QAction* auto_resize = parent()->parent()->findChild("actionAuto_resize"); - Q_ASSERT_X(auto_resize, "Viewer::interpolateToFitBoundingBox", "cannot find action \"actionAuto_resize\""); - if(auto_resize && auto_resize->isChecked()) - { - CGAL::qglviewer::Camera new_camera = *(camera ()); - new_camera.fitBoundingBox(CGAL::qglviewer::Vec(xmin, ymin, zmin), - CGAL::qglviewer::Vec(xmax, ymax, zmax)); - camera()->interpolateTo(*new_camera.frame(), 1.); - } -} - -void Viewer::draw() -{ - if(surface) - surface->draw(); -} - -void Viewer::drawWithNames() -{ - if(surface) - surface->drawWithNames(); -} -void Viewer::postSelection(const QPoint& p) -{ - if(surface) - surface->postSelection(p); -} - -void Viewer::set_surface(Surface* s) -{ - surface = s; -} - diff --git a/Surface_mesher/demo/Surface_mesher/viewer.h b/Surface_mesher/demo/Surface_mesher/viewer.h deleted file mode 100644 index 8c40a6a6612..00000000000 --- a/Surface_mesher/demo/Surface_mesher/viewer.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _VIEWER_H -#define _VIEWER_H - -#include -#include - -class Surface; - -class Viewer : public CGAL::QGLViewer -{ - Q_OBJECT -public: - Viewer(QWidget* parent); - - void set_surface(Surface*); - -public Q_SLOTS: - void interpolateToFitBoundingBox(double, double, double, double, double, double); - -protected : - virtual void init(); - virtual void draw(); - virtual void drawWithNames(); - virtual void postSelection(const QPoint&); - virtual QString helpString() const; - - Surface* surface; -}; - -#endif // _VIEWER_H diff --git a/Surface_mesher/demo/Surface_mesher/volume.cpp b/Surface_mesher/demo/Surface_mesher/volume.cpp deleted file mode 100644 index 3ccb01681c5..00000000000 --- a/Surface_mesher/demo/Surface_mesher/volume.cpp +++ /dev/null @@ -1,1616 +0,0 @@ -#ifdef __APPLE__ -#define GL_SILENCE_DEPRECATION -#endif -#include - -#include "volume.h" - -#include // std::sort -#include -#include - -#include - -#include "viewer.h" -#include "mainwindow.h" -#include "values_list.h" - -#include "File_XT.h" // format XT from Total/ELF - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "Raw_image_dialog.h" -#include -// #include -#include -#include -#include -#include -#include - -struct Threshold : public CGAL::cpp98::unary_function { - double isovalue; - bool is_identity; - - Threshold(double isovalue) : isovalue(isovalue), is_identity(false) {} - - result_type operator()(FT value) - { - if(is_identity) - return static_cast(value); - else if(value >= isovalue) - return 1; - else - return 0; - } -}; - -class Classify_from_isovalue_list : - public CGAL::cpp98::unary_function -{ - typedef std::pair Isovalue; - typedef std::vector Isovalues; - boost::shared_ptr isovalues; - bool is_identity; - - struct Sort_isovalues : CGAL::cpp98::binary_function - { - bool operator()(const Isovalue& isoval1, const Isovalue& isoval2) - { - return isoval1.first < isoval2.first; - } - }; -public: - Classify_from_isovalue_list(Values_list * list) - : is_identity(false) - { - isovalues = boost::shared_ptr(new Isovalues(list->numberOfValues())); - for(int i = 0, nbs = list->numberOfValues(); i < nbs; ++i ) - (*isovalues)[i] = std::make_pair(list->value(i), i); - std::sort(isovalues->begin(), isovalues->end(), Sort_isovalues()); - } - - void set_identity(bool b) { - is_identity = b; - } - - result_type operator()(FT value) - { - if(is_identity) { - return static_cast(value); - } - result_type result = 0; -// std::cerr << "isovalues: "; - for(result_type i = 1, end = static_cast(isovalues->size()); i <= end; ++i) - { -// std::cerr << (*isovalues)[i-1] << ", "; - if(value >= (*isovalues)[i-1].first && - i >= result) - { - result = i; - } - } -// if(result>1) -// std::cerr << "result = " << (int)result << "/" << list->numberOfValues() << std::endl; -// else -// std::cerr << std::endl; - if(result>0) - return (*isovalues)[result-1].second + 1; - else - return 0; - } -}; - -class Generate_surface_identifiers : - public CGAL::cpp98::binary_function -{ - Values_list* list; - bool labellized; - -public: - Generate_surface_identifiers(Values_list* list) - : list(list), labellized(false) {}; - - void set_labellized_image(bool b) - { - labellized = b; - } - - result_type operator()(const Classify_from_isovalue_list::result_type& a, - const Classify_from_isovalue_list::result_type& b) - { - if(labellized) - return list->search((std::max)(a, b)); - else - return list->item((std::min)(a, b)); - } -}; - -// class Classify_from_isovalue_list : -// public CGAL::cpp98::unary_function -// { -// typedef std::pair Isovalue; -// typedef std::vector Isovalues; -// boost::shared_ptr isovalues; - -// struct Sort_isovalues : CGAL::cpp98::binary_function -// { -// bool operator()(const Isovalue& isoval1, const Isovalue& isoval2) -// { -// return isoval1.first < isoval2.first; -// } -// }; -// public: -// Classify_from_isovalue_list(Isovalues_list * list) -// { -// isovalues = boost::shared_ptr(new Isovalues(list->numberOfIsoValues())); -// for(int i = 0, nbs = list->numberOfIsoValues(); i < nbs; ++i ) -// (*isovalues)[i] = std::make_pair(list->isovalue(i), list->item(i)); -// std::sort(isovalues->begin(), isovalues->end(), Sort_isovalues()); -// } - -// result_type operator()(FT value) -// { -// int result = 0; -// // std::cerr << "isovalues: "; -// for(int i = 1, end = isovalues->size(); i <= end; ++i) -// { -// // std::cerr << (*isovalues)[i-1] << ", "; -// if(value >= (*isovalues)[i-1].first && -// i >= result) -// { -// result = i; -// } -// } -// if(result>1) -// std::cerr << boost::format("result = %1%/%2%\n") % result % isovalues->size(); -// if(result>0) -// return (*isovalues)[result-1].second; -// else -// return 0; -// } -// }; -Volume::Volume(MainWindow* mw) : - Surface(mw), - m_sm_angle(30), - m_sm_radius(0), - m_sm_distance(0), - m_relative_precision(0.000000001), - m_view_surface(false), - m_triangulation_color(QColor(Qt::green)), - m_inverse_normals(false), - two_sides(false), - del(), - c2t3(del), - mw(mw), - lists_draw_surface(), - lists_draw_surface_is_valid(false), -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - list_draw_marching_cube(0), - list_draw_marching_cube_is_valid(false), - lists_draw_surface_mc(), -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - m_view_mc(false) -{ - spinBox_radius_bound = mw->findChild("spinBox_radius_bound"); - spinBox_distance_bound = mw->findChild("spinBox_distance_bound"); - Q_ASSERT_X(spinBox_radius_bound && spinBox_distance_bound, - "Volume::Volume()", "Cannot find spinboxes!"); - - values_list = mw->values; - - connect(spinBox_radius_bound, SIGNAL(valueChanged(double)), - this, SLOT(set_radius_bound(double))); - connect(spinBox_distance_bound, SIGNAL(valueChanged(double)), - this, SLOT(set_distance_bound(double))); - - connect(mw->actionSurface_mesher, SIGNAL(triggered()), - this, SLOT(display_surface_mesher_result())); - - connect(mw->actionInverse_normals, SIGNAL(toggled(bool)), - this, SLOT(set_inverse_normals(bool))); - m_inverse_normals = mw->actionInverse_normals->isChecked(); - - connect(mw->actionDisplay_front_and_back, SIGNAL(toggled(bool)), - this, SLOT(set_two_sides(bool))); - two_sides = mw->actionDisplay_front_and_back->isChecked(); - - connect(mw->actionDraw_triangles_edges, SIGNAL(toggled(bool)), - this, SLOT(set_draw_triangles_edges(bool))); - draw_triangles_edges = mw->actionDraw_triangles_edges->isChecked(); - - connect(mw->actionUse_Gouraud_shading, SIGNAL(toggled(bool)), - this, SLOT(set_use_gouraud(bool))); - use_gouraud = mw->actionUse_Gouraud_shading->isChecked(); - - connect(mw->actionShow_the_image_bounding_box, SIGNAL(toggled(bool)), - this, SLOT(set_show_bbox(bool))); - show_bbox = mw->actionShow_the_image_bounding_box->isChecked(); - - connect(mw->actionShow_triangulation, SIGNAL(toggled(bool)), - this, SLOT(set_draw_triangulation(bool))); - m_draw_triangulation = mw->actionShow_triangulation->isChecked(); - - connect(mw->actionTriangulation_edges_color, SIGNAL(triggered()), - this, SLOT(set_triangulation_edges_color())); - - connect(this, SIGNAL(new_bounding_box(double, double, double, double, double, double)), - mw->viewer, SLOT(interpolateToFitBoundingBox(double, double, double, double, double, double))); - - connect(values_list, SIGNAL(values_changed()), - this, SLOT(changed_parameters())); - connect(values_list, SIGNAL(changed()), - mw->viewer, SLOT(updateGL())); - connect(this, SIGNAL(changed()), - this, SLOT(check_can_export_off())); - - connect(mw->labellizedRadioButton, SIGNAL(toggled(bool)), - this, SLOT(labellizedToogled(bool))); - - mw->actionExport_surface_mesh_to_OFF->setEnabled(false); - connect(mw->actionExport_surface_mesh_to_OFF, SIGNAL(triggered()), - this, SLOT(export_off())); - - connect(mw->actionSave, SIGNAL(triggered()), - this, SLOT(save_image_to_inr())); - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - connect(mw->actionMarching_cubes, SIGNAL(triggered()), - this, SLOT(display_marchin_cube())); -#endif -} - -void Volume::set_inverse_normals(const bool b) { - m_inverse_normals = b; - - list_draw_marching_cube = 0; // Invalidate the display list for the - // marching cube. See gl_draw_marchingcube() - // for an explanation. - - Q_EMIT changed(); -} - -void Volume::set_two_sides(const bool b) { - two_sides = b; - Q_EMIT changed(); -} - -void Volume::set_draw_triangles_edges(const bool b) { - draw_triangles_edges = b; - Q_EMIT changed(); -} - -void Volume::set_draw_triangulation(const bool b) { - m_draw_triangulation = b; - Q_EMIT changed(); -} - -void Volume::set_triangulation_edges_color() { - const QColor color = QColorDialog::getColor(m_triangulation_color, mw); - if (color.isValid()) { - m_triangulation_color = color; - Q_EMIT changed(); - } -} - -void Volume::set_use_gouraud(const bool b) { - use_gouraud = b; - Q_EMIT changed(); -} - -void Volume::set_show_bbox(const bool b) { - show_bbox = b; - Q_EMIT changed(); -} - -void Volume::only_in() -{ - mw->show_only("volume"); -#ifndef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - mw->actionMarching_cubes->setVisible(false); -#endif -} - -#ifdef CGAL_USE_VTK - -#include - -#include -#include -#include -#include -#include - -Volume::~Volume() -{ - if(vtk_reader) vtk_reader->Delete(); - if(vtk_image) vtk_image->Delete(); - if(dicom_reader) dicom_reader->Delete(); - if(executive) executive->Delete(); - if(smoother) smoother->Delete(); -} - -bool Volume::opendir(const QString& dirname) -{ - bool result = true; - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read directory %1!").arg(dirname)); - status_message(tr("Opening of directory %1 failed!").arg(dirname)); - result = false; - } - else - { - dicom_reader = vtkDICOMImageReader::New(); - dicom_reader->SetDirectoryName(dirname.toUtf8()); - - executive = - vtkDemandDrivenPipeline::SafeDownCast(dicom_reader->GetExecutive()); - if (executive) - { - executive->SetReleaseDataFlag(0, 0); // where 0 is the port index - } - - smoother = vtkImageGaussianSmooth::New(); - smoother->SetStandardDeviations(1., 1., 1.); - smoother->SetInputConnection(dicom_reader->GetOutputPort()); - smoother->Update(); - vtk_image = smoother->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() == 0) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1/:\nunknown file format!").arg(dirname)); - status_message(tr("Opening of file %1/ failed!").arg(dirname)); - result = false; - } - else - { - status_message(tr("File %1/ successfully opened.").arg(dirname)); - finish_open(); - result = true; - } - // if(executive) executive->Delete(); - // dicom_reader->Delete(); - // smoother->Delete(); - } - return result; -} - -bool Volume::open_vtk(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return opendir(filename); - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - vtk_reader = vtkImageReader::New(); - vtk_reader->SetFileName(filename.toUtf8()); - vtk_reader->SetDataScalarTypeToUnsignedChar(); - vtk_reader->SetDataExtent(0, 249, 0, 249, 0, 124); - vtk_reader->SetDataSpacing(1., 1., 1.); - vtk_reader->SetFileDimensionality(3); - vtk_reader->Update(); - vtk_reader->Print(std::cerr); - vtk_image = vtk_reader->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() == NULL) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\nunknown file format!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - } -} - -// Total 3D images (XT format, that is the old Inrimage format, 1994. -bool Volume::open_xt(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return false; - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - long dimx, dimy, dimz; - long word_dim; - long header_size; - const char* filename_stl = qPrintable(filename); - CGAL::Total::lire_longueur_entete(filename_stl, &header_size); - CGAL::Total::lire_nb_octet(filename_stl, &word_dim); - CGAL::Total::lire_longueur_trace(filename_stl, &dimx); - CGAL::Total::lire_nb_trace(filename_stl, &dimy); - CGAL::Total::lire_nb_plan(filename_stl, &dimz); - - vtkImageReader* vtk_reader = vtkImageReader::New(); - vtk_reader->SetFileName(filename_stl); - switch(word_dim) { - case 8: - vtk_reader->SetDataScalarTypeToUnsignedChar(); - break; - case 16: - vtk_reader->SetDataScalarTypeToUnsignedShort(); - break; - default: - return false; - } - vtk_reader->SetHeaderSize(header_size); - vtk_reader->SetDataExtent(1, int(dimx), 1, int(dimy), 1, int(dimz)); - vtk_reader->SetDataSpacing(1., 1., 1.); - vtk_reader->SetFileDimensionality(3); - vtk_reader->Update(); - vtk_reader->Print(std::cerr); - vtkImageData* vtk_image = vtk_reader->GetOutput(); - vtk_image->Print(std::cerr); - m_image = CGAL::read_vtk_image_data(vtk_image); - if(m_image.image() != NULL) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\nunknown file format!").arg(filename)); - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; - } - else - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - } - return true; - } -} - -#else // CGAL_USE_VTK -Volume::~Volume() -{ -} - -bool Volume::opendir(const QString&) -{ - return false; -} - -bool Volume::open_xt(const QString&) -{ - return false; -} -#endif // CGAL_USE_VTK - -bool Volume::open(const QString& filename) -{ - only_in(); - - fileinfo.setFile(filename); - - if(fileinfo.isDir()) - { - return opendir(filename); - } - - if(!fileinfo.isReadable()) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Cannot read file %1!").arg(filename)); - } - else - { - if(m_image.read(filename.toStdString().c_str())) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - else if(open_xt(filename)) { - return true; - } - else - { - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(fileinfo.absoluteFilePath())); - if( settings.value("is_raw").toBool() && - m_image.read_raw(filename.toStdString().c_str(), - settings.value("dim_x").toInt(), - settings.value("dim_y").toInt(), - settings.value("dim_z").toInt(), - settings.value("spacing_x").toDouble(), - settings.value("spacing_y").toDouble(), - settings.value("spacing_z").toDouble(), - settings.value("offset").toInt()) ) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - finish_open(); - return true; - } - else if(QMessageBox::warning(mw, mw->windowTitle(), - tr("Error with file %1:\n" - "unknown file format!\n" - "\n" - "Open it as a raw image?").arg(filename), - QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes) - { - Raw_image_dialog raw_dialog; - raw_dialog.label_file_size->setText(QString("%1 B").arg(fileinfo.size())); - if( raw_dialog.exec() && - m_image.read_raw(filename.toStdString().c_str(), - raw_dialog.dim_x->value(), - raw_dialog.dim_y->value(), - raw_dialog.dim_z->value(), - raw_dialog.spacing_x->value(), - raw_dialog.spacing_y->value(), - raw_dialog.spacing_z->value(), - raw_dialog.offset->value()) ) - { - status_message(tr("File %1 successfully opened.").arg(filename)); - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(fileinfo.absoluteFilePath())); - settings.setValue("is_raw", true); - settings.setValue("dim_x", raw_dialog.dim_x->value()); - settings.setValue("dim_y", raw_dialog.dim_y->value()); - settings.setValue("dim_z", raw_dialog.dim_z->value()); - settings.setValue("spacing_x", raw_dialog.spacing_x->value()); - settings.setValue("spacing_y", raw_dialog.spacing_y->value()); - settings.setValue("spacing_z", raw_dialog.spacing_z->value()); - settings.setValue("offset", raw_dialog.offset->value()); - settings.endGroup(); - finish_open(); - return true; - } - } - } - } - status_message(tr("Opening of file %1 failed!").arg(filename)); - return false; -} - -void Volume::finish_open() -{ - m_image.finish_open(); - mw->viewer->camera()->setSceneBoundingBox(CGAL::qglviewer::Vec(0, 0, 0), - CGAL::qglviewer::Vec(m_image.xmax(), - m_image.ymax(), - m_image.zmax())); - - mw->viewer->showEntireScene(); - values_list->load_values(fileinfo.absoluteFilePath()); - load_image_settings(fileinfo.absoluteFilePath()); - changed_parameters(); - Q_EMIT changed(); -} - -void Volume::export_off() -{ - QFileDialog filedialog(mw, tr("Export surface to file")); - filedialog.setFileMode(QFileDialog::AnyFile); - - filedialog.setNameFilter(tr("OFF files (*.off);;" - "All files (*)")); - - filedialog.setAcceptMode(QFileDialog::AcceptSave); - filedialog.setDefaultSuffix("off"); - if(filedialog.exec()) - { - const QString filename = filedialog.selectedFiles().front(); - std::cerr << "Saving to file \"" << filename.toLocal8Bit().data() << "\"..."; - std::ofstream out(filename.toUtf8()); - CGAL::output_surface_facets_to_off(out, c2t3); - if(!out) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Export to the OFF file %1 failed!").arg(filename)); - status_message(tr("Export to the OFF file %1 failed!").arg(filename)); - std::cerr << " failed!\n"; - } - else - { - std::cerr << " done.\n"; - status_message(tr("Successfull export to the OFF file %1.").arg(filename)); - } - } -} - -void Volume::save_image_to_inr() -{ - QFileDialog filedialog(mw, tr("Export image to Inrimage format")); - filedialog.setFileMode(QFileDialog::AnyFile); - - filedialog.setNameFilter(tr("Inrimage files (*.inr);;" - "Compressed Inrimage files (*.inr.gz)")); - - - filedialog.setAcceptMode(QFileDialog::AcceptSave); - filedialog.setDefaultSuffix("inr.gz"); - if(filedialog.exec()) - { - const QString filename = filedialog.selectedFiles().front(); - std::cerr << "Saving image to file \"" << filename.toLocal8Bit().data() << "\"..."; - const int result = ::_writeImage(m_image.image(), filename.toUtf8()); - if(result != ImageIO_NO_ERROR) - { - QMessageBox::warning(mw, mw->windowTitle(), - tr("Export to the Inrimage file %1 failed!").arg(filename)); - status_message(tr("Export to the Inrimage file %1 failed!").arg(filename)); - std::cerr << " failed!\n"; - } - else - { - std::cerr << " done.\n"; - status_message(tr("Successfull export to the Inrimage file %1.").arg(filename)); - } - } -} - -void Volume::check_can_export_off() -{ - mw->actionExport_surface_mesh_to_OFF->setEnabled(m_view_surface);// || m_view_mc); -} - -void Volume::status_message(QString string) -{ - std::cerr << qPrintable(string) << std::endl; - mw->statusBar()->showMessage(string); -} - -void Volume::busy() const -{ - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); -} - -void Volume::not_busy() const -{ - QApplication::restoreOverrideCursor(); -} - -void Volume::display_marchin_cube() -{ -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - if(m_surface_mc.empty()) - { - QElapsedTimer total_time; - total_time.start(); - - values_list->save_values(fileinfo.absoluteFilePath()); - - unsigned int nx = m_image.xdim(); - unsigned int ny = m_image.ydim(); - unsigned int nz = m_image.zdim(); - if(nx * ny * nz == 0) - { - status_message("No volume loaded."); - return; - } - - mc_timer.reset(); - busy(); - status_message("Marching cubes..."); - - mc_timer.start(); - m_surface_mc.clear(); - - if(mc.ntrigs()!=0) - mc.clean_all(); - mc.set_resolution(nx,ny,nz); - mc.init_all(); - mc.set_ext_data(static_cast(m_image.image()->data)); - - nbs_of_mc_triangles.resize(values_list->numberOfValues()); - - for(int value_id = 0; - value_id < values_list->numberOfValues(); - ++value_id) - { - status_message(tr("Marching cubes, isovalue #%1...").arg(value_id)); - - // set data -// for(unsigned int i=0;i 0) - mc.init_temps(); - mc.run(values_list->value(value_id), - m_image.vx(), - m_image.vy(), - m_image.vz()); - mc.clean_temps(); - - std::vector facets; - mc.get_facets(facets); - - mc_timer.stop(); - const unsigned int begin = value_id == 0 ? 0 : nbs_of_mc_triangles[value_id-1]; - const unsigned int nbt = facets.size() / 9; - for(unsigned int i=begin;iitem(value_id))); - } - nbs_of_mc_triangles[value_id]=m_surface_mc.size(); - mc_timer.start(); - } - mc_timer.stop(); - not_busy(); - mc_total_time = total_time.elapsed(); - - // invalidate the display list - lists_draw_surface_mc_is_valid = false; - list_draw_marching_cube_is_valid = false; - } - CGAL::Bbox_3 bbox(0,0,0,0,0,0); - for(std::vector::const_iterator - it = m_surface_mc.begin(), end = m_surface_mc.end(); - it != end; ++it) - { - bbox = bbox + it->get<0>().bbox(); - } - - m_view_mc = true; - m_view_surface = false; - Q_EMIT changed(); - if(!m_surface_mc.empty()) - { - Q_EMIT new_bounding_box(bbox.xmin(), - bbox.ymin(), - bbox.zmin(), - bbox.xmax(), - bbox.ymax(), - bbox.zmax()); - } - status_message(tr("Marching cubes done. %2 facets in %1s (CPU time), total time is %3s.") - .arg(mc_timer.time()) - .arg(m_surface_mc.size()) - .arg(mc_total_time/1000.)); - - save_image_settings(fileinfo.absoluteFilePath()); -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -} - -void Volume::display_surface_mesher_result() -{ - if(m_surface.empty() || // Either the surface is not computed. - m_view_surface) // Or it is computed and displayed, and one want - // to recompute it. - { - QElapsedTimer total_time; - total_time.start(); - - values_list->save_values(fileinfo.absoluteFilePath()); - - std::size_t nx = m_image.xdim(); - std::size_t ny = m_image.ydim(); - std::size_t nz = m_image.zdim(); - if(nx * ny * nz == 0) - { - status_message("No volume loaded."); - return; - } - - m_surface.clear(); - sm_timer.reset(); - busy(); - - status_message("Surface meshing..."); - - sm_timer.start(); - - c2t3.clear(); - del.clear(); - Sphere bounding_sphere(m_image.center(),m_image.radius()*m_image.radius()); - - Classify_from_isovalue_list classify(values_list); - Generate_surface_identifiers generate_ids(values_list); - - m_image.set_interpolation(mw->interpolationCheckBox->isChecked()); - if(mw->labellizedRadioButton->isChecked()) { - std::cerr << "Labellized image\n"; - } - m_image.set_labellized(mw->labellizedRadioButton->isChecked()); - classify.set_identity(mw->labellizedRadioButton->isChecked()); - generate_ids.set_labellized_image(mw->labellizedRadioButton->isChecked()); - - // definition of the surface - Surface_3 surface(m_image, bounding_sphere, m_relative_precision); -// Threshold threshold(m_image.isovalue()); - - // surface mesh traits class - typedef CGAL::Surface_mesher::Implicit_surface_oracle_3 Oracle; - Oracle oracle(classify, generate_ids); - - if(mw->searchSeedsCheckBox->isChecked()) - { - typedef std::vector > Seeds; - Seeds seeds; - { - std::cerr << "Search seeds...\n"; - std::set domains; - search_for_connected_components(std::back_inserter(seeds), - CGAL::inserter(domains), - classify); - std::cerr << "Found " << seeds.size() << " seed(s).\n"; - - if(mw->labellizedRadioButton->isChecked() && - values_list->numberOfValues() == 0) - { - Q_FOREACH(unsigned char label, domains) { - if(label != 0) { - values_list->addValue(label); - } - } - } - } - std::ofstream seeds_out("seeds.off"); - std::ofstream segments_out("segments.txt"); - seeds_out.precision(18); - seeds_out << "OFF\n" << seeds.size() << " 0 0\n"; - segments_out.precision(18); - for(Seeds::const_iterator it = seeds.begin(), end = seeds.end(); - it != end; ++it) - { - seeds_out << it->first << std::endl; - CGAL::Random_points_on_sphere_3 random_points_on_sphere_3(it->second); - Oracle::Intersect_3 intersect = oracle.intersect_3_object(); - for(int i = 0; i < 20; ++i) - { - const Point_3 test = it->first + (*random_points_on_sphere_3++ - CGAL::ORIGIN); - CGAL::Object o = intersect(surface, Segment_3(it->first, test)); - if (const Point_3* intersection = CGAL::object_cast(&o)) { - segments_out << "2 " << it->first << " " << *intersection << std::endl; - del.insert(*intersection); - } - else - { - std::cerr << - boost::format("Error. Segment (%1%, %2%) does not intersect the surface! values=(%3%, %4%)\n") - % it->first % test - % surface(it->first) % surface(test); - } - } - } - } - else { - oracle.construct_initial_points_object()(surface, - CGAL::inserter(c2t3.triangulation()), - 20); - } - - std::ofstream points_out("initial-points.off"); - points_out.precision(18); - points_out << "OFF\n" << c2t3.triangulation().number_of_vertices() << " 0 0\n"; - for(const Tr::Vertex& v : - CGAL::make_range(c2t3.triangulation().vertices_begin(), - c2t3.triangulation().vertices_end())) - { - points_out << v.point() << std::endl; - } - - std::cerr << boost::format("Number of initial points: %1%\n") % del.number_of_vertices(); - - // defining meshing criteria - typedef CGAL::Surface_mesher::Refine_criterion Criterion; - CGAL::Surface_mesher::Curvature_size_criterion - curvature_size_criterion (m_sm_distance); - CGAL::Surface_mesher::Uniform_size_criterion - uniform_size_criterion (m_sm_radius); - CGAL::Surface_mesher::Aspect_ratio_criterion - aspect_ratio_criterion (m_sm_angle); - CGAL::Surface_mesher::Vertices_on_the_same_psc_element_criterion - vertices_on_the_same_psc_element_criterion(surface); - - std::vector criterion_vector; - criterion_vector.push_back(&aspect_ratio_criterion); - criterion_vector.push_back(&uniform_size_criterion); - criterion_vector.push_back(&curvature_size_criterion); - if(mw->sameIndexCheckBox->isChecked()) { - criterion_vector.push_back(&vertices_on_the_same_psc_element_criterion); - std::cerr << "vertices_on_the_same_psc_element_criterion is activated.\n"; - } - - typedef CGAL::Surface_mesher::Standard_criteria Criteria; - Criteria criteria(criterion_vector); - std::cerr << "Surface_mesher... angle=" << m_sm_angle << ", radius= " << m_sm_radius - << ", distance=" << m_sm_distance << "\n"; - - typedef CGAL::Surface_mesher_generator::type Surface_mesher_manifold; - - typedef CGAL::Surface_mesher_generator::type Surface_mesher_non_manifold; - - if(mw->manifoldCheckBox->isChecked()) { - // meshing surface - std::cerr << "manifold criteria is activated.\n"; -// make_surface_mesh(c2t3, surface, oracle, criteria, -// CGAL::Manifold_tag(), 0); - Surface_mesher_manifold manifold_mesher(c2t3, surface, oracle, criteria); - manifold_mesher.refine_mesh(); - } - else { -// m_view_surface = true; - Surface_mesher_non_manifold non_manifold_mesher(c2t3, surface, oracle, criteria); -#if 0 - int nb_steps = 0; -// direct_draw = true; - non_manifold_mesher.init(); - while(!non_manifold_mesher.is_algorithm_done()) { - CGAL::Null_mesh_visitor null_visitor; - non_manifold_mesher.one_step(null_visitor); - if(++nb_steps % 1000 == 0) { - CGAL::Timer timer; - std::cerr << "(process events..."; - timer.start(); - list_draw_marching_cube_is_valid = false; - lists_draw_surface_is_valid = false; - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), - end = del.finite_cells_end(); - cit != end; ++cit) - { - cit->info() = classify(surface(cit->circumcenter())); - } -// Q_EMIT changed(); - qApp->processEvents(); - timer.stop(); - std::cerr << timer.time() << " secondes)\n"; - } - } -#else - non_manifold_mesher.refine_mesh(); -#endif - } - sm_timer.stop(); - not_busy(); - direct_draw = false; - - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), - end = del.finite_cells_end(); - cit != end; ++cit) - { - cit->info() = classify(surface(cit->circumcenter())); - } - // get output surface - for(C2t3::Facet_iterator - fit = c2t3.facets_begin(), end = c2t3.facets_end(); - fit != end; ++fit) - { - const Tr::Cell_handle& cell = fit->first; - const int index = fit->second; - - // here "left" means nothing - const Point_3 left_circumcenter = cell->circumcenter(); - const Point_3 right_circumcenter = cell->neighbor(index)->circumcenter(); - - const Triangle_3 t = - Triangle_3(cell->vertex(del.vertex_triple_index(index, 0))->point(), - cell->vertex(del.vertex_triple_index(index, 1))->point(), - cell->vertex(del.vertex_triple_index(index, 2))->point()); - const Vector u = t[1] - t[0]; - const Vector v = t[2] - t[0]; - Vector n = CGAL::cross_product(u,v); - n = n / std::sqrt(n*n); - if(mw->labellizedRadioButton->isChecked()) - { - m_surface.push_back(Facet_(t, - n, - values_list->search((std::max)(surface(left_circumcenter), - surface(right_circumcenter))))); - } - else { - m_surface.push_back(Facet_(t,n,cell->vertex(del.vertex_triple_index(index, 0))->point().element_index())); - } - } - - // invalidate the display list - lists_draw_surface_is_valid = false; - sm_total_time = total_time.elapsed(); - } - - CGAL::Bbox_3 bbox(0,0,0,0,0,0); - for(std::vector::const_iterator - it = m_surface.begin(), end = m_surface.end(); - it != end; ++it) - { - bbox = bbox + it->get<0>().bbox(); - } - - // toggle visualization - m_view_mc = false; - m_view_surface = true; - Q_EMIT changed(); - if(!m_surface.empty()) - { - Q_EMIT new_bounding_box(bbox.xmin(), - bbox.ymin(), - bbox.zmin(), - bbox.xmax(), - bbox.ymax(), - bbox.zmax()); - } - status_message(tr("Surface meshing done. %1 facets in %2s (CPU time), total time is %3s.") - .arg(m_surface.size()) - .arg(sm_timer.time()) - .arg(sm_total_time/1000.)); - save_image_settings(fileinfo.absoluteFilePath()); -} - -void Volume::gl_draw_image_bbox(const float line_width, - const unsigned char red, - const unsigned char green, - const unsigned char blue) -{ - const _image* image_ptr = m_image.image(); - if(image_ptr == NULL) - return; - - glLineWidth(line_width); - glColor3ub(red,green,blue); - glBegin(GL_LINES); - - const double xmax = (image_ptr->xdim - 1.0)*(image_ptr->vx); - const double ymax = (image_ptr->ydim - 1.0)*(image_ptr->vy); - const double zmax = (image_ptr->zdim - 1.0)*(image_ptr->vz); - - glVertex3d(0.0,0.0,0.0); - glVertex3d(0.0,ymax,0.0); - - glVertex3d(0.0,ymax,0.0); - glVertex3d(0.0,ymax,zmax); - - glVertex3d(0.0,ymax,zmax); - glVertex3d(0.0,0.0,zmax); - - glVertex3d(0.0,0.0,zmax); - glVertex3d(0.0,0.0,0.0); - - glVertex3d(xmax,0.0,0.0); - glVertex3d(xmax,ymax,0.0); - - glVertex3d(xmax,ymax,0.0); - glVertex3d(xmax,ymax,zmax); - - glVertex3d(xmax,ymax,zmax); - glVertex3d(xmax,0.0,zmax); - - glVertex3d(xmax,0.0,zmax); - glVertex3d(xmax,0.0,0.0); - - glVertex3d(0.0,0.0,0.0); - glVertex3d(xmax,0.0,0.0); - - glVertex3d(0.0,0.0,zmax); - glVertex3d(xmax,0.0,zmax); - - glVertex3d(0.0,ymax,zmax); - glVertex3d(xmax,ymax,zmax); - - glVertex3d(0.0,ymax,0.0); - glVertex3d(xmax,ymax,0.0); - - glEnd(); -} - -void Volume::draw() -{ - float ambient[] = { 0.25f, - 0.20725f, - 0.20725f, - 0.922f }; - float diffuse[] = { 1.0f, - 0.829f, - 0.829f, - 0.922f }; - - float specular[] = { 0.296648f, - 0.296648f, - 0.296648f, - 0.522f }; - - float emission[] = { 0.3f, - 0.3f, - 0.3f, - 1.0f }; - float shininess[] = { 11.264f }; - - // apply - ::glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, ambient); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, specular); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_SHININESS, shininess); - ::glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, emission); - - ::glEnable(GL_LINE_SMOOTH); - - if(two_sides) - ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); - else - ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); // default - - // draw surface mesh - if(m_view_surface) - { - ::glEnable(GL_LIGHTING); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - ::glColor3f(0.2f, 0.2f, 1.f); - ::glEnable(GL_POLYGON_OFFSET_FILL); - ::glPolygonOffset(3.0f,-3.0f); - gl_draw_surface(); - - if(draw_triangles_edges) - { - ::glDisable(GL_LIGHTING); - ::glLineWidth(1.); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - ::glColor3ub(0,0,0); - ::glDisable(GL_POLYGON_OFFSET_FILL); - gl_draw_surface(); - } - } - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - // draw MC surface mesh - if(m_view_mc) - { - ::glEnable(GL_LIGHTING); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - ::glColor3f(0.2f, 0.2f, 1.f); - ::glEnable(GL_POLYGON_OFFSET_FILL); - ::glPolygonOffset(3.0f,-3.0f); - gl_draw_surface_mc(); - - if(draw_triangles_edges) - { - ::glDisable(GL_LIGHTING); - ::glLineWidth(1.); - ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - ::glColor3ub(0,0,0); - ::glDisable(GL_POLYGON_OFFSET_FILL); - gl_draw_surface_mc(); - } - } -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - - if(show_bbox) { - ::glDisable(GL_LIGHTING); - gl_draw_image_bbox(3.0f,0,0,0); - } - - if(!m_view_mc && m_draw_triangulation) - { - // draw the triangualtion - ::glColor3d(m_triangulation_color.redF(), - m_triangulation_color.greenF(), - m_triangulation_color.blueF()); - ::glLineWidth(1.0); - ::glBegin(GL_LINES); - for(Tr::Finite_edges_iterator - eit = del.finite_edges_begin(), - end = del.finite_edges_end(); - eit != end; ++eit) - { - const Point_3 p1 = eit->first->vertex(eit->second)->point(); - const Point_3 p2 = eit->first->vertex(eit->third)->point(); - ::glVertex3d(p1.x(),p1.y(),p1.z()); - ::glVertex3d(p2.x(),p2.y(),p2.z()); - } - ::glEnd(); - } -} - -void Volume::set_radius_bound(double d) -{ - m_sm_radius = FT(d); - changed_parameters(); -} - -void Volume::set_distance_bound(double d) -{ - m_sm_distance = FT(d); - changed_parameters(); -} - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -void Volume::gl_draw_surface_mc() -{ - if(use_gouraud) - { - gl_draw_marchingcube(); - return; - } - - if(lists_draw_surface_mc_is_valid) - { - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(values_list->enabled(i)) - { - mw->viewer->qglColor(values_list->color(i)); - ::glCallList(lists_draw_surface_mc[i]); - } - } - } - else - { - lists_draw_surface_mc.resize(values_list->numberOfValues(), 0); - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(!lists_draw_surface_mc[i]) - { - lists_draw_surface_mc[i] = ::glGenLists(1); - } - - std::cerr << boost::format("(Re-)Generating list #%1% for marching cube surface #%2%" - " in gl_draw_surface(), ()\n") - % lists_draw_surface_mc[i] - % i; - - mw->viewer->qglColor(values_list->color(i)); - - if(lists_draw_surface_mc[i]) // If - ::glNewList(lists_draw_surface_mc[i], // lists_draw_surface[i]==0 then something - values_list->enabled(i) // got wrong in the list generation. - ? GL_COMPILE_AND_EXECUTE - : GL_COMPILE); - - - gl_draw_surface(m_surface_mc.begin(), - m_surface_mc.end(), - values_list->item(i)); - - if(lists_draw_surface_mc[i]) // If lists_draw_surface[i]==0 then - { // something got wrong in the list - ::glEndList(); // generation. - } - } - lists_draw_surface_mc_is_valid = (::glGetError() == GL_NO_ERROR); - } -} -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - -void Volume::gl_draw_surface() -{ -// if(mw->labellizedRadioButton->isChecked()) { -// mw->viewer->qglColor(::Qt::blue); -// gl_draw_surface(m_surface.begin(), -// m_surface.end(), -// 0); -// } -// else - if(direct_draw) { - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(Tr::Finite_cells_iterator - cit = del.finite_cells_begin(), end = del.finite_cells_end(); - cit != end; ++cit) - { - for(int facet_index = 0; facet_index < 4; ++facet_index) - { - const Tr::Cell_handle& facet_cell = cit; - if(c2t3.face_status(facet_cell, facet_index) == C2t3::NOT_IN_COMPLEX) { - continue; - } - const Point_3& a = facet_cell->vertex(del.vertex_triple_index(facet_index, 0))->point(); - const Point_3& b = facet_cell->vertex(del.vertex_triple_index(facet_index, 1))->point(); - const Point_3& c = facet_cell->vertex(del.vertex_triple_index(facet_index, 2))->point(); - Vector n = CGAL::cross_product(b-a,c-a); - n = n / std::sqrt(n*n); // unit normal - if(m_inverse_normals) { - ::glNormal3d(-n.x(),-n.y(),-n.z()); - } else { - ::glNormal3d(n.x(),n.y(),n.z()); - } - ::glColor3d(values_list->color(values_list->search(facet_cell->info())).redF(), - values_list->color(values_list->search(facet_cell->info())).greenF(), - values_list->color(values_list->search(facet_cell->info())).blueF()); - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - } - return; - } - if(!direct_draw && lists_draw_surface_is_valid) - { - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(values_list->enabled(i)) - { - ::glColor3d(values_list->color(i).redF(), - values_list->color(i).greenF(), - values_list->color(i).blueF()); - ::glCallList(lists_draw_surface[i]); - } - } - } - else - { - lists_draw_surface.resize(values_list->numberOfValues(), 0); - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i ) - { - if(!lists_draw_surface[i]) - { - lists_draw_surface[i] = ::glGenLists(1); - } - - std::cerr << boost::format("(Re-)Generating list #%1% for surface #%2%" - " in gl_draw_surface(), ()\n") - % lists_draw_surface[i] - % i; - - ::glColor3d(values_list->color(i).redF(), - values_list->color(i).greenF(), - values_list->color(i).blueF()); - - if(!direct_draw && lists_draw_surface[i]) // If - ::glNewList(lists_draw_surface[i], // lists_draw_surface[i]==0 - values_list->enabled(i) // then something got wrong - ? GL_COMPILE_AND_EXECUTE // in the list generation. - : GL_COMPILE); - - if(!mw->labellizedRadioButton->isChecked()) - { - gl_draw_surface(m_surface.begin(), - m_surface.end(), - values_list->item(i)); - } - else - { - const auto volume_index = static_cast(values_list->value(i)); - - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(C2t3::Facet_iterator - fit = c2t3.facets_begin(), end = c2t3.facets_end(); - fit != end; ++fit) - { - Tr::Cell_handle facet_cell = fit->first; - int facet_index = fit->second; - Tr::Cell_handle opposite_cell = facet_cell->neighbor(facet_index); - int opposite_index = opposite_cell->index(facet_cell); - - if( facet_cell->info() != volume_index ) { - if( opposite_cell->info() == volume_index ) { - std::swap(facet_cell, opposite_cell); - std::swap(facet_index, opposite_index); - } - else - continue; // go to next facet - } - const Point_3& a = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 0))->point(); - const Point_3& b = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 1))->point(); - const Point_3& c = opposite_cell->vertex(del.vertex_triple_index(opposite_index, 2))->point(); - Vector n = CGAL::cross_product(b-a,c-a); - n = n / std::sqrt(n*n); // unit normal - if(m_inverse_normals) { - ::glNormal3d(-n.x(),-n.y(),-n.z()); - } else { - ::glNormal3d(n.x(),n.y(),n.z()); - } - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - std::cerr << boost::format("(c2t3) number of facets: %1%\n") - % counter; - } - - if(!direct_draw && lists_draw_surface[i]) - // If lists_draw_surface[i]==0 then - { // something got wrong in the list - ::glEndList(); // generation. - } - } - lists_draw_surface_is_valid = (::glGetError() == GL_NO_ERROR); - } -} - -template -void Volume::gl_draw_surface(Iterator begin, Iterator end, const QTreeWidgetItem* i) -{ - ::glBegin(GL_TRIANGLES); - unsigned int counter = 0; - for(Iterator it = begin; it != end; ++it) - { - const Facet_& f = *it; - - if(f.get<2>() != i) continue; - - const Vector& n = f.get<1>(); - - if(m_inverse_normals) - ::glNormal3d(-n.x(),-n.y(),-n.z()); - else - ::glNormal3d(n.x(),n.y(),n.z()); - - const Triangle_3& t = f.get<0>(); - const Point_3& a = t[0]; - const Point_3& b = t[1]; - const Point_3& c = t[2]; - - ::glVertex3d(a.x(),a.y(),a.z()); - ::glVertex3d(b.x(),b.y(),b.z()); - ::glVertex3d(c.x(),c.y(),c.z()); - ++counter; - } - ::glEnd(); - std::cerr << boost::format("number of facets: %1%\n") - % counter; -} - -void Volume::changed_parameters() -{ - m_surface.clear(); -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - m_surface_mc.clear(); -#endif - list_draw_marching_cube_is_valid = false; - lists_draw_surface_is_valid = false; - c2t3.clear(); - del.clear(); - m_view_mc = m_view_surface = false; - Q_EMIT changed(); -} - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -void Volume::gl_draw_one_marching_cube_vertex(int i) -{ - if(!m_inverse_normals) - glArrayElement(i); - else - { - const Vertex* const vertex = mc.vert(i); - ::glNormal3d(-vertex->nx, -vertex->ny, -vertex->nz); - ::glVertex3d(vertex->x, vertex->y, vertex->z); - } -} - -void Volume::gl_draw_marchingcube() -{ - if(list_draw_marching_cube_is_valid) - ::glCallList(list_draw_marching_cube); - else - { - if(!list_draw_marching_cube) - list_draw_marching_cube = ::glGenLists(1); - std::cerr << boost::format("(Re-)Generating list #%1% for" - " gl_draw_marchingcube()\n") - % list_draw_marching_cube; - - if(list_draw_marching_cube) // If list_draw_marching_cube==0 then - ::glNewList(list_draw_marching_cube, // something got wrong in the list - GL_COMPILE_AND_EXECUTE); // generation. - - ::glVertexPointer(3, GL_DOUBLE, sizeof(Vertex), mc.vertices()); - ::glNormalPointer(GL_DOUBLE, sizeof(Vertex), &(mc.vertices()->nx)); - ::glEnableClientState(GL_VERTEX_ARRAY); - - // because of that conditionnal, the display list has to be - // reconstructed each time m_inverse_normals is toggled. - if(!m_inverse_normals) - ::glEnableClientState(GL_NORMAL_ARRAY); - - for(int i = 0, nbs = values_list->numberOfValues(); i < nbs; ++i) - { - const int begin = i == 0 ? 0 : nbs_of_mc_triangles[i-1]; - const int end = nbs_of_mc_triangles[i]; - mw->viewer->qglColor(values_list->color(i)); - ::glBegin(GL_TRIANGLES); - for(int i = begin; i < end; ++i) - { - const MC_Triangle* const trig = mc.trig(i); - gl_draw_one_marching_cube_vertex(trig->v1); - gl_draw_one_marching_cube_vertex(trig->v2); - gl_draw_one_marching_cube_vertex(trig->v3); - } - ::glEnd(); - } - if(list_draw_marching_cube > 0) // If list_draw_marching_cube==0 then - { // something got wrong in the list - ::glEndList(); // generation. - list_draw_marching_cube_is_valid = (::glGetError() == GL_NO_ERROR); - } - if(!list_draw_marching_cube_is_valid) - { - CGAL::Qt::opengl_check_errors(); - } - } -} -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - -void Volume::save_image_settings(QString filename) -{ - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(filename)); - settings.setValue("labellized", mw->labellizedRadioButton->isChecked()); - settings.endGroup(); -} - -void Volume::load_image_settings(QString filename) -{ - QSettings settings; - settings.beginGroup(QUrl::toPercentEncoding(filename)); - mw->labellizedRadioButton->setChecked(settings.value("labellized").toBool()); - settings.endGroup(); -} - -void Volume::labellizedToogled(bool toggled) -{ - if(toggled) { - values_list->setHeaderTitle(tr("Label")); - } - else { - values_list->setHeaderTitle(tr("Iso-Value")); - } -} - diff --git a/Surface_mesher/demo/Surface_mesher/volume.h b/Surface_mesher/demo/Surface_mesher/volume.h deleted file mode 100644 index 09195f02d07..00000000000 --- a/Surface_mesher/demo/Surface_mesher/volume.h +++ /dev/null @@ -1,392 +0,0 @@ -#ifndef _VOLUME_H -#define _VOLUME_H - -#include -#include -#include - - -#include "surface.h" -#include "binary_image.h" - -#include -#include -#include -#include - -#include -#include -#include // std::back_inserter - -#include -#include - -#ifdef CGAL_USE_VTK -class vtkImageReader; -class vtkImageData; -class vtkDICOMImageReader; -class vtkDemandDrivenPipeline; -class vtkImageGaussianSmooth; -#endif // CGAL_USE_VTK - -class QTreeWidgetItem; - -// kernel -// #include -#include -typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel1; - -#include -struct Kernel : public Kernel1 { - typedef CGAL::Point_with_psc_localisation Point_3; -}; - -typedef Kernel::FT FT; -typedef Kernel::Point_3 Point_3; -typedef Kernel::Sphere_3 Sphere; -typedef Kernel::Vector_3 Vector; -typedef Kernel::Triangle_3 Triangle_3; -typedef Kernel::Segment_3 Segment_3; - -// typedef CGAL::Triple Facet; - -typedef boost::tuple Facet_; - - -typedef CBinary_image_3 Binary_image; - -class QTreeWidgetItem; - -// surface mesher -// #define CGAL_MESHES_NO_OUTPUT -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef CGAL::Surface_mesh_vertex_base_3 Vb; -typedef CGAL::Triangulation_cell_base_with_info_3 Cb1; -typedef CGAL::Delaunay_triangulation_cell_base_3 Cb2; -typedef CGAL::Delaunay_triangulation_cell_base_with_circumcenter_3 Cb3; -typedef CGAL::Surface_mesh_cell_base_3 Cb; -typedef CGAL::Triangulation_data_structure_3 Tds; -typedef CGAL::Delaunay_triangulation_3 Tr; -typedef CGAL::Surface_mesh_complex_2_in_triangulation_3 C2t3; -typedef CGAL::Implicit_surface_3 Surface_3; - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE -#include -#endif - -class MainWindow; -class QDoubleSpinBox; -class Viewer; -class Values_list; - -class Volume : public Surface -{ - Q_OBJECT -public: - Volume(MainWindow* mw); - ~Volume(); - -private: - Binary_image m_image; - - // options - FT m_sm_angle; - FT m_sm_radius; - FT m_sm_distance; - double m_relative_precision; - - // visualization - bool m_view_surface; - bool m_draw_triangulation; - QColor m_triangulation_color; - bool m_inverse_normals; - bool two_sides; - bool draw_triangles_edges; - bool use_gouraud; - bool show_bbox; - - std::vector m_surface; - Tr del; // 3D-Delaunay triangulation - C2t3 c2t3; // 2D complex in 3D triangulation - - MainWindow* mw; - QFileInfo fileinfo; - Values_list* values_list; - QDoubleSpinBox* spinBox_radius_bound; - QDoubleSpinBox* spinBox_distance_bound; - - bool direct_draw; // do not use display lists - std::vector lists_draw_surface; - bool lists_draw_surface_is_valid; - GLint list_draw_marching_cube; - bool list_draw_marching_cube_is_valid; - - CGAL::Timer sm_timer; - int sm_total_time; - -#ifdef CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - std::vector m_surface_mc; - MarchingCubes mc ; - std::vector nbs_of_mc_triangles; - std::vector lists_draw_surface_mc; - bool lists_draw_surface_mc_is_valid; - CGAL::Timer mc_timer; - int mc_total_time; -public: - void gl_draw_surface_mc(); - void gl_draw_marchingcube(); -private: - void gl_draw_one_marching_cube_vertex(int); - -#endif // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - - bool m_view_mc; // that boolean is here even with if - // CGAL_SURFACE_MESH_DEMO_USE_MARCHING_CUBE - // is not defined. - -#ifdef CGAL_USE_VTK - vtkImageReader* vtk_reader; - vtkImageData* vtk_image; - vtkDICOMImageReader* dicom_reader; - vtkDemandDrivenPipeline* executive; - vtkImageGaussianSmooth* smoother; -#endif // CGAL_USE_VTK - -public Q_SLOTS: -void display_marchin_cube(); - -private: - template - void gl_draw_surface(Iterator begin, Iterator end, const QTreeWidgetItem* = 0); - void gl_draw_image_bbox(const float line_width, - const unsigned char red, - const unsigned char green, - const unsigned char blue); - - template - void search_for_connected_components(PointsOutputIterator, - DomainsOutputIterator, - TransformOperator); - -public: - void gl_draw_surface(); - -Q_SIGNALS: - - void new_bounding_box(double, double, double, double, double, double); - -public Q_SLOTS: - void only_in(); - void set_inverse_normals(const bool); - void set_two_sides(const bool); - void set_draw_triangles_edges(const bool); - void set_triangulation_edges_color(); - void set_draw_triangulation(const bool); - void set_use_gouraud(const bool); - void set_show_bbox(const bool); - bool open(const QString& filename); -#ifdef CGAL_USE_VTK - bool open_vtk(const QString& filename); -#endif - bool open_xt(const QString& filename); - bool opendir(const QString& dirname); - void finish_open(); - void export_off(); - void save_image_to_inr(); - void check_can_export_off(); - void draw(); - void get_bbox(float& /*xmin*/, float& /*ymin*/, float& /*zmin*/, - float& /*xmax*/, float& /*ymax*/, float& /*zmax*/) {} - void close() {} - void display_surface_mesher_result(); - void set_radius_bound(double); - void set_distance_bound(double); - void changed_parameters(); - - void labellizedToogled(bool); - - void save_image_settings(QString); - void load_image_settings(QString); -private: - void status_message(QString); - void busy() const; - void not_busy() const; -}; - -template -void Volume::search_for_connected_components(PointsOutputIterator it, - DomainsOutputIterator dom_it, - TransformOperator transform) -{ - const std::size_t nx = m_image.xdim(); - const std::size_t ny = m_image.ydim(); - const std::size_t nz = m_image.zdim(); - - const double max_v = (std::max)((std::max)(m_image.vx(), - m_image.vy()), - m_image.vz()); - - typedef unsigned char Marker; - typedef typename TransformOperator::result_type Label; - - boost::multi_array visited(boost::extents[nx][ny][nz]); - typedef boost::tuple - Indices; - typedef std::queue Indices_queue; - typedef std::vector Border_vector; - - int number_of_connected_components = 0; - for(std::size_t i=0; i0) - continue; - const Label current_label = transform(m_image.value(i, j, k)); - *dom_it++ = current_label; - if(current_label == Label()) { - visited[i][j][k] = 3; - continue; - } - - // if we reach here, (i, j, k) is a new connected component - ++number_of_connected_components; - std::cerr << boost::format("Found new connected component (#%5%) " - "at voxel (%1%, %2%, %3%), value=%4%, volume id=%6%\n") - % i % j % k - % m_image.value(i, j, k) - % number_of_connected_components - % (int)current_label; - - int nb_voxels = 0; - - Indices_queue queue; - Indices indices(i, j ,k, 0); - queue.push(indices); - - Border_vector border; - - /* - * First pass is a BFS to retrieve all the connected component, and - * its border. - * Second pass is a BFS initialized with all voxel of the border. - * The last voxel of that BFS is used as the seed. - */ - Marker pass = 1; // pass will be equal to 2 in second pass - - Indices bbox_min = indices; - Indices bbox_max = indices; - - while(!queue.empty()) // walk through the connected component - { - Indices indices = queue.front(); - queue.pop(); - - // warning: those indices i, j and k are local to the while loop - const std::size_t i = boost::get<0>(indices); - const std::size_t j = boost::get<1>(indices); - const std::size_t k = boost::get<2>(indices); - const std::size_t depth = boost::get<3>(indices); - - if(visited[i][j][k] < pass) - { - visited[i][j][k] = pass; - if(pass == 1 ) - { - ++nb_voxels; - boost::get<0>(bbox_min) = (std::min)(i, boost::get<0>(bbox_min)); - boost::get<0>(bbox_max) = (std::max)(i, boost::get<0>(bbox_max)); - boost::get<1>(bbox_min) = (std::min)(j, boost::get<1>(bbox_min)); - boost::get<1>(bbox_max) = (std::max)(j, boost::get<1>(bbox_max)); - boost::get<2>(bbox_min) = (std::min)(k, boost::get<2>(bbox_min)); - boost::get<2>(bbox_max) = (std::max)(k, boost::get<2>(bbox_max)); - } - - static const int neighbors_offset[6][3] = { { +1, 0, 0 }, - { -1, 0, 0 }, - { 0, +1, 0 }, - { 0, -1, 0 }, - { 0, 0, +1 }, - { 0, 0, -1 } }; - bool voxel_is_on_border = false; - - // Visit neighbors. - // (i_n, j_n, k_n) are indices of neighbors. - for(int n = 0; n < 6; ++n) - { - const ptrdiff_t i_n = i + neighbors_offset[n][0]; - const ptrdiff_t j_n = j + neighbors_offset[n][1]; - const ptrdiff_t k_n = k + neighbors_offset[n][2]; - if(i_n < 0 || i_n >= static_cast(nx) || - j_n < 0 || j_n >= static_cast(ny) || - k_n < 0 || k_n >= static_cast(nz)) - { - voxel_is_on_border = true; - continue; - } - else - { - if(transform(m_image.value(i_n, j_n, k_n)) == current_label) - { - if(visited[i_n][j_n][k_n] < pass) { - Indices indices(i_n, j_n, k_n, depth+1); - queue.push(indices); - } - } - else - voxel_is_on_border = true; - } - } // end for neighbors - - if(pass == 1 && voxel_is_on_border) - border.push_back(indices); - } // end if voxel not already visited - - if(queue.empty()) { - if(pass == 1) - { // End of first pass. Begin second pass with the voxels of - // the border. - for(typename Border_vector::const_iterator - border_it = border.begin(), border_end = border.end(); - border_it != border_end; ++border_it) - queue.push(*border_it); - pass = 2; - } - else // end of second pass, return the last visited voxel - { -// if(nb_voxels >= 100) - { - *it++ = std::make_pair(m_image.point(i, j, k), (depth+1)*max_v); - std::cerr << boost::format("Found seed %5%, which is voxel (%1%, %2%, %3%), value=%4%\n") - % i % j % k % m_image.value(i, j, k) % m_image.point(i, j, k); - } - } - } // end if queue.empty() - } // end while !queue.empty() (with local indices i, j, k) - - std::cerr << boost::format("There was %1% voxel(s) in that component.\n" - "The bounding box is (%2% %3% %4%, %5% %6% %7%).\n" - "%8% voxel(s) on border\n") - % nb_voxels - % boost::get<0>(bbox_min) % boost::get<1>(bbox_min) % boost::get<2>(bbox_min) - % boost::get<0>(bbox_max) % boost::get<1>(bbox_max) % boost::get<2>(bbox_max) - % border.size(); - } // end for i,j,k -} // end function Volume::search_for_connected_components() - -#endif // _VOLUME_H