diff --git a/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H b/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H index d3851dbd76..b3aa5dc32a 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H +++ b/applications/utilities/surface/surfaceBooleanFeatures/CGAL3DKernel.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2015 OpenFOAM Foundation + Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -27,6 +28,7 @@ Typedefs CGAL3DKernel Description + A typedef for selecting inexact (faster) or exact (slower) 3D model. \*---------------------------------------------------------------------------*/ @@ -38,13 +40,13 @@ Description #ifdef CGAL_INEXACT // Fast kernel using a double as the storage type - #include "CGAL/Exact_predicates_inexact_constructions_kernel.h" + #include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; #else // Very robust but expensive kernel - #include "CGAL/Exact_predicates_exact_constructions_kernel.h" + #include typedef CGAL::Exact_predicates_exact_constructions_kernel K; #endif diff --git a/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H b/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H index 2cb79393d6..3ed79edb25 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H +++ b/applications/utilities/surface/surfaceBooleanFeatures/CGALIndexedPolyhedron.H @@ -65,6 +65,7 @@ struct IndexedFace Foam::label index; Foam::label region; }; + struct My_items : public CGAL::Polyhedron_items_3 diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options index 8ed525de9f..144ee830b9 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options +++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/Make/options @@ -20,4 +20,5 @@ EXE_INC = \ LIB_LIBS = \ -L$(CGAL_ARCH_PATH)/lib \ -L$(CGAL_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \ + -lsurfMesh \ -lmeshTools diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C index 5ca1bab640..771e8f808a 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C +++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.C @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2015 OpenFOAM Foundation + Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -27,14 +28,50 @@ License #include "PolyhedronReader.H" +// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // + +template +void Foam::PolyhedronReader::Build_triangle::operator()(HDS& hds) +{ + // Postcondition: hds is a valid polyhedral surface. + CGAL::Polyhedron_incremental_builder_3 B(hds, true); + + B.begin_surface(s_.nPoints(), s_.size()); + + typedef typename HDS::Vertex Vertex; + typedef typename Vertex::Point Point; + + for (const auto& pt : s_.points()) + { + B.add_vertex(Point(pt.x(), pt.y(), pt.z())); + } + + for (const auto& f : s_) + { + B.begin_facet(); + + for (const label verti : f) + { + B.add_vertex_to_facet(verti); + } + + B.end_facet(); + } + + B.end_surface(); +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::PolyhedronReader::PolyhedronReader(const triSurface& s, Polyhedron& p) { Build_triangle triangle(s); p.delegate(triangle); + // Populate index and region Foam::label nTris = 0; + for ( Facet_iterator fi = p.facets_begin(); @@ -42,8 +79,10 @@ Foam::PolyhedronReader::PolyhedronReader(const triSurface& s, Polyhedron& p) ++fi ) { - fi->index = nTris++; - fi->region = s[fi->index].region(); + fi->index = nTris; + fi->region = s[nTris].region(); + + ++nTris; } } diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H index 2968fb34c6..1c0a6b5ca2 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H +++ b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReader.H @@ -61,28 +61,21 @@ class PolyhedronReader public: - Build_triangle(const triSurface& s); + Build_triangle(const triSurface& s) + : + s_(s) + {} void operator()(HDS& hds); }; - // Private Member Functions - - //- No copy construct - PolyhedronReader(const PolyhedronReader&) = delete; - - //- No copy assignment - void operator=(const PolyhedronReader&) = delete; - - public: // Constructors //- Populate polyhedron from surface PolyhedronReader(const triSurface& s, Polyhedron& p); - }; @@ -92,12 +85,6 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -#ifdef NoRepository -# include "PolyhedronReaderTemplates.C" -#endif - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - #endif // ************************************************************************* // diff --git a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C b/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C deleted file mode 100644 index ac5e90ed3c..0000000000 --- a/applications/utilities/surface/surfaceBooleanFeatures/PolyhedronReader/PolyhedronReaderTemplates.C +++ /dev/null @@ -1,74 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | www.openfoam.com - \\/ M anipulation | -------------------------------------------------------------------------------- - Copyright (C) 2015 OpenFOAM Foundation -------------------------------------------------------------------------------- -License - This file is part of OpenFOAM. - - OpenFOAM is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - OpenFOAM is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with OpenFOAM. If not, see . - -\*---------------------------------------------------------------------------*/ - -#include "PolyhedronReader.H" - -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // - -template -Foam::PolyhedronReader::Build_triangle::Build_triangle -( - const triSurface& s -) -: - s_(s) -{} - - -// * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * * // - -template -void Foam::PolyhedronReader::Build_triangle::operator()(HDS& hds) -{ - // Postcondition: hds is a valid polyhedral surface. - CGAL::Polyhedron_incremental_builder_3 B(hds, true); - - B.begin_surface(s_.nPoints(), s_.size()); - - typedef typename HDS::Vertex Vertex; - typedef typename Vertex::Point Point; - - const Foam::pointField& pts = s_.points(); - forAll(pts, i) - { - const Foam::point& pt = pts[i]; - B.add_vertex(Point(pt.x(), pt.y(), pt.z())); - } - forAll(s_, i) - { - const Foam::labelledTri& t = s_[i]; - B.begin_facet(); - B.add_vertex_to_facet(t[0]); - B.add_vertex_to_facet(t[1]); - B.add_vertex_to_facet(t[2]); - B.end_facet(); - } - B.end_surface(); -} - - -// ************************************************************************* // diff --git a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C index c1278a58ec..8e6d169357 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C +++ b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2016 OpenCFD Ltd. + Copyright (C) 2016-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -102,8 +102,10 @@ typedef CGAL::AABB_face_graph_triangle_primitive typedef CGAL::AABB_traits Traits; typedef CGAL::AABB_tree Tree; -typedef boost::optional::Type> -Segment_intersection; +typedef boost::optional +< + Tree::Intersection_and_primitive_id::Type +> Segment_intersection; #endif // NO_CGAL @@ -633,17 +635,14 @@ labelPair edgeIntersectionsCGAL segments.clear(); tree.all_intersections(segment_query, std::back_inserter(segments)); - for - ( - std::vector::const_iterator iter = - segments.begin(), - end = segments.end(); - iter != end; - ++iter - ) + + for (const Segment_intersection& intersect : segments) { // Get intersection object - if (const Point* ptPtr = boost::get(&((*iter)->first))) + if + ( + const Point* ptPtr = boost::get(&(intersect->first)) + ) { point pt ( @@ -652,7 +651,12 @@ labelPair edgeIntersectionsCGAL CGAL::to_double(ptPtr->z()) ); - Polyhedron::Face_handle f = (*iter)->second; + #if defined (CGAL_VERSION_NR) && (CGAL_VERSION_NR < 1041400000) + Polyhedron::Face_handle f = (intersect->second); + #else + // 1.14 and later + Polyhedron::Face_handle f = (intersect->second).first; + #endif intersections[edgeI].append ( @@ -665,18 +669,24 @@ labelPair edgeIntersectionsCGAL ); // Intersection on edge interior classifications[edgeI].append(-1); - nPoints++; + ++nPoints; } else if ( - const Segment* sPtr = boost::get(&((*iter)->first)) + const Segment* sPtr = boost::get(&(intersect->first)) ) { + #if defined (CGAL_VERSION_NR) && (CGAL_VERSION_NR < 1041400000) + Polyhedron::Face_handle f = (intersect->second); + #else + // 1.14 and later + Polyhedron::Face_handle f = (intersect->second).first; + #endif + //std::cout // << "intersection object is a segment:" << sPtr->source() // << " " << sPtr->target() << std::endl; - Polyhedron::Face_handle f = (*iter)->second; //std::cout<< "triangle:" << f->index // << " region:" << f->region << std::endl; @@ -706,7 +716,7 @@ labelPair edgeIntersectionsCGAL ); // Intersection aligned with face. Tbd: enums classifications[edgeI].append(2); - nSegments++; + ++nSegments; } } } diff --git a/wmake/rules/General/no-cgal b/wmake/rules/General/no-cgal new file mode 100644 index 0000000000..7ad0714e80 --- /dev/null +++ b/wmake/rules/General/no-cgal @@ -0,0 +1,6 @@ +# Empty flags for not compiling/linking with CGAL + +CGAL_INC = +CGAL_LIBS = + +#------------------------------------------------------------------------------