diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 8b8737b945..105076054a 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -186,7 +186,7 @@ #include #include "MeasureClient.h" - +#include namespace Part { extern PyObject* initModule(); @@ -562,6 +562,11 @@ PyMOD_INIT_FUNC(Part) OCAF::ImportExportSettings::initialize(); Part::MeasureClient::initialize(); + + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/Part/Boolean"); + + Part::FuzzyHelper::setBooleanFuzzy(hGrp->GetFloat("BooleanFuzzy",10.0)); PyMOD_Return(partModule); } diff --git a/src/Mod/Part/App/CMakeLists.txt b/src/Mod/Part/App/CMakeLists.txt index a5532bd617..ecd2760d8d 100644 --- a/src/Mod/Part/App/CMakeLists.txt +++ b/src/Mod/Part/App/CMakeLists.txt @@ -234,6 +234,20 @@ SET(Properties_SRCS ) SOURCE_GROUP("Properties" FILES ${Properties_SRCS}) +SET(FCBRepAlgoAPI_SRCS + FCBRepAlgoAPI_BooleanOperation.cpp + FCBRepAlgoAPI_BooleanOperation.h + FCBRepAlgoAPI_Common.cpp + FCBRepAlgoAPI_Common.h + FCBRepAlgoAPI_Fuse.cpp + FCBRepAlgoAPI_Fuse.h + FCBRepAlgoAPI_Cut.cpp + FCBRepAlgoAPI_Cut.h + FCBRepAlgoAPI_Section.cpp + FCBRepAlgoAPI_Section.h +) +SOURCE_GROUP("FCBRepAlgoAPI-wrapper" FILES ${FCBRepAlgoAPI_SRCS}) + SET(Python_SRCS ArcPy.xml ArcPyImp.cpp @@ -515,6 +529,8 @@ SET(Part_SRCS CrossSection.h ExtrusionHelper.cpp ExtrusionHelper.h + FuzzyHelper.cpp + FuzzyHelper.h GeometryExtension.cpp GeometryExtension.h GeometryDefaultExtension.cpp @@ -580,7 +596,7 @@ if(EIGEN3_NO_DEPRECATED_COPY) PROPERTIES COMPILE_FLAGS ${EIGEN3_NO_DEPRECATED_COPY}) endif() -add_library(Part SHARED ${Part_SRCS}) +add_library(Part SHARED ${Part_SRCS} ${FCBRepAlgoAPI_SRCS}) target_link_libraries(Part ${Part_LIBS}) if (FREECAD_WARN_ERROR) target_compile_warn_error(Part) diff --git a/src/Mod/Part/App/CrossSection.cpp b/src/Mod/Part/App/CrossSection.cpp index 3671934178..eb0ba3b0f8 100644 --- a/src/Mod/Part/App/CrossSection.cpp +++ b/src/Mod/Part/App/CrossSection.cpp @@ -24,9 +24,9 @@ #ifndef _PreComp_ # include # include -# include -# include -# include +# include +# include +# include # include # include # include @@ -109,7 +109,7 @@ std::list CrossSection::removeDuplicates(const std::list& wires) const { - BRepAlgoAPI_Section cs(shape, gp_Pln(a,b,c,-d)); + FCBRepAlgoAPI_Section cs(shape, gp_Pln(a,b,c,-d)); if (cs.IsDone()) { std::list edges; TopExp_Explorer xp; @@ -134,7 +134,7 @@ void CrossSection::sliceSolid(double d, const TopoDS_Shape& shape, std::list& wires) const { - BRepAlgoAPI_Section cs(shape.getShape(), gp_Pln(a, b, c, -d)); + FCBRepAlgoAPI_Section cs(shape.getShape(), gp_Pln(a, b, c, -d)); if (cs.IsDone()) { std::string prefix(op); prefix += Data::indexSuffix(idx); @@ -296,7 +296,7 @@ void TopoCrossSection::sliceSolid(int idx, std::string prefix(op); prefix += Data::indexSuffix(idx); solid.makeElementShape(mkSolid, face, prefix.c_str()); - BRepAlgoAPI_Cut mkCut(shape.getShape(), solid.getShape()); + FCBRepAlgoAPI_Cut mkCut(shape.getShape(), solid.getShape()); if (mkCut.IsDone()) { TopoShape res(shape.Tag, shape.Hasher); diff --git a/src/Mod/Part/App/ExtrusionHelper.cpp b/src/Mod/Part/App/ExtrusionHelper.cpp index bc99d7ccd4..64af79e8b6 100644 --- a/src/Mod/Part/App/ExtrusionHelper.cpp +++ b/src/Mod/Part/App/ExtrusionHelper.cpp @@ -22,7 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include @@ -266,7 +266,7 @@ void ExtrusionHelper::makeDraft(const TopoDS_Shape& shape, // get MomentOfInertia of first shape BRepGProp::VolumeProperties(*itOuter, tempProperties); momentOfInertiaInitial = tempProperties.MomentOfInertia(gp_Ax1(gp_Pnt(), direction)); - BRepAlgoAPI_Cut mkCut(*itOuter, *itInner); + FCBRepAlgoAPI_Cut mkCut(*itOuter, *itInner); if (!mkCut.IsDone()) Standard_Failure::Raise("Extrusion: Final cut out failed"); BRepGProp::VolumeProperties(mkCut.Shape(), tempProperties); @@ -346,7 +346,7 @@ void ExtrusionHelper::checkInnerWires(std::vector& isInnerWire, const gp_D // get MomentOfInertia of first shape BRepGProp::VolumeProperties(*itInner, tempProperties); momentOfInertiaInitial = tempProperties.MomentOfInertia(gp_Ax1(gp_Pnt(), direction)); - BRepAlgoAPI_Cut mkCut(*itInner, *itOuter); + FCBRepAlgoAPI_Cut mkCut(*itInner, *itOuter); if (!mkCut.IsDone()) Standard_Failure::Raise("Extrusion: Cut out failed"); BRepGProp::VolumeProperties(mkCut.Shape(), tempProperties); diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.cpp b/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.cpp new file mode 100644 index 0000000000..96af048107 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.cpp @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#include +#include +#include +#include +#include +#include +#include + +FCBRepAlgoAPI_BooleanOperation::FCBRepAlgoAPI_BooleanOperation() +{ + SetRunParallel(Standard_True); + SetNonDestructive(Standard_True); +} + + +FCBRepAlgoAPI_BooleanOperation::FCBRepAlgoAPI_BooleanOperation(const TopoDS_Shape& theS1, + const TopoDS_Shape& theS2, + const BOPAlgo_Operation theOperation) +: BRepAlgoAPI_BooleanOperation(theS1, theS2, theOperation) +{ + if (!BRepCheck_Analyzer(theS1).IsValid()){ + Standard_ConstructionError::Raise("Base shape is not valid for boolean operation"); + } + if (! BRepCheck_Analyzer(theS2).IsValid()){ + Standard_ConstructionError::Raise("Tool shape is not valid for boolean operation"); + } + setAutoFuzzy(); + SetRunParallel(Standard_True); + SetNonDestructive(Standard_True); +} + +void FCBRepAlgoAPI_BooleanOperation::setAutoFuzzy() +{ + FCBRepAlgoAPIHelper::setAutoFuzzy(this); +} + + +void FCBRepAlgoAPIHelper::setAutoFuzzy(BRepAlgoAPI_BooleanOperation* op) { + Bnd_Box bounds; + for (TopTools_ListOfShape::Iterator it(op->Arguments()); it.More(); it.Next()) + BRepBndLib::Add(it.Value(), bounds); + for (TopTools_ListOfShape::Iterator it(op->Tools()); it.More(); it.Next()) + BRepBndLib::Add(it.Value(), bounds); + op->SetFuzzyValue(Part::FuzzyHelper::getBooleanFuzzy() * sqrt(bounds.SquareExtent()) * Precision::Confusion()); +} + +void FCBRepAlgoAPIHelper::setAutoFuzzy(BRepAlgoAPI_BuilderAlgo* op) { + Bnd_Box bounds; + for (TopTools_ListOfShape::Iterator it(op->Arguments()); it.More(); it.Next()) + BRepBndLib::Add(it.Value(), bounds); + op->SetFuzzyValue(Part::FuzzyHelper::getBooleanFuzzy() * sqrt(bounds.SquareExtent()) * Precision::Confusion()); +} diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.h b/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.h new file mode 100644 index 0000000000..dcd3451e14 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_BooleanOperation.h @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#ifndef FCREPALGOAPIBOOLEANOPERATION_H +#define FCREPALGOAPIBOOLEANOPERATION_H +#include + +class FCBRepAlgoAPIHelper +{ +public: + static void setAutoFuzzy(BRepAlgoAPI_BooleanOperation* op); + static void setAutoFuzzy(BRepAlgoAPI_BuilderAlgo* op); +}; + +class FCBRepAlgoAPI_BooleanOperation : public BRepAlgoAPI_BooleanOperation +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Empty constructor + Standard_EXPORT FCBRepAlgoAPI_BooleanOperation(); + + // set fuzzyness based on size + void setAutoFuzzy(); + +protected: //! @name Constructors + + //! Constructor to perform Boolean operation on only two arguments. + //! Obsolete + Standard_EXPORT FCBRepAlgoAPI_BooleanOperation(const TopoDS_Shape& theS1, + const TopoDS_Shape& theS2, + const BOPAlgo_Operation theOperation); + +}; +#endif diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Common.cpp b/src/Mod/Part/App/FCBRepAlgoAPI_Common.cpp new file mode 100644 index 0000000000..dfeec78f07 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Common.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#include +#include + +FCBRepAlgoAPI_Common::FCBRepAlgoAPI_Common() +{ + myOperation=BOPAlgo_COMMON; +} + +FCBRepAlgoAPI_Common::FCBRepAlgoAPI_Common(const TopoDS_Shape& S1, + const TopoDS_Shape& S2) +: FCBRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_COMMON) +{ + Build(); +} diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Common.h b/src/Mod/Part/App/FCBRepAlgoAPI_Common.h new file mode 100644 index 0000000000..38c5e3dc7f --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Common.h @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#ifndef FCREPALGOAPICOMMON_H +#define FCREPALGOAPICOMMON_H +#include +#include + + +class FCBRepAlgoAPI_Common : public FCBRepAlgoAPI_BooleanOperation +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Empty constructor + Standard_EXPORT FCBRepAlgoAPI_Common(); + + //! Constructor with two shapes + //! -argument + //! -tool + //! - the type of the operation + Standard_EXPORT FCBRepAlgoAPI_Common(const TopoDS_Shape& S1, + const TopoDS_Shape& S2); + +}; +#endif diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Cut.cpp b/src/Mod/Part/App/FCBRepAlgoAPI_Cut.cpp new file mode 100644 index 0000000000..04ce957704 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Cut.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#include +#include + +FCBRepAlgoAPI_Cut::FCBRepAlgoAPI_Cut() +{ + myOperation=BOPAlgo_CUT; +} + +FCBRepAlgoAPI_Cut::FCBRepAlgoAPI_Cut(const TopoDS_Shape& S1, + const TopoDS_Shape& S2) +: FCBRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_CUT) +{ + Build(); +} diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Cut.h b/src/Mod/Part/App/FCBRepAlgoAPI_Cut.h new file mode 100644 index 0000000000..ba021a5668 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Cut.h @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#ifndef FCREPALGOAPICUT_H +#define FCREPALGOAPICUT_H +#include +#include + + +class FCBRepAlgoAPI_Cut : public FCBRepAlgoAPI_BooleanOperation +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Empty constructor + Standard_EXPORT FCBRepAlgoAPI_Cut(); + + //! Constructor with two shapes + //! -argument + //! -tool + //! - the type of the operation + Standard_EXPORT FCBRepAlgoAPI_Cut(const TopoDS_Shape& S1, + const TopoDS_Shape& S2); + +}; +#endif diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.cpp b/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.cpp new file mode 100644 index 0000000000..80e2967fbe --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.cpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#include +#include + +FCBRepAlgoAPI_Fuse::FCBRepAlgoAPI_Fuse() +{ + myOperation=BOPAlgo_FUSE; +} + +FCBRepAlgoAPI_Fuse::FCBRepAlgoAPI_Fuse(const TopoDS_Shape& S1, + const TopoDS_Shape& S2) +: FCBRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_FUSE) +{ + Build(); +} diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.h b/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.h new file mode 100644 index 0000000000..ffd233fb5b --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Fuse.h @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#ifndef FCREPALGOAPIFUSE_H +#define FCREPALGOAPIFUSE_H +#include +#include + + +class FCBRepAlgoAPI_Fuse : public FCBRepAlgoAPI_BooleanOperation +{ +public: + + DEFINE_STANDARD_ALLOC + + + //! Empty constructor + Standard_EXPORT FCBRepAlgoAPI_Fuse(); + + //! Constructor with two shapes + //! -argument + //! -tool + //! - the type of the operation + Standard_EXPORT FCBRepAlgoAPI_Fuse(const TopoDS_Shape& S1, + const TopoDS_Shape& S2); + +}; +#endif diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Section.cpp b/src/Mod/Part/App/FCBRepAlgoAPI_Section.cpp new file mode 100644 index 0000000000..3c32870874 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Section.cpp @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#include +#include +#include +#include +#include +#include +#include + +FCBRepAlgoAPI_Section::FCBRepAlgoAPI_Section() +{ + SetRunParallel(Standard_True); + SetNonDestructive(Standard_True); +} + +FCBRepAlgoAPI_Section::FCBRepAlgoAPI_Section(const TopoDS_Shape& S1, const TopoDS_Shape& S2, const Standard_Boolean PerformNow) +: BRepAlgoAPI_Section(S1,S2,false) +{ + if (!BRepCheck_Analyzer(S1).IsValid()){ + Standard_ConstructionError::Raise("Base shape is not valid for boolean operation"); + } + if (! BRepCheck_Analyzer(S2).IsValid()){ + Standard_ConstructionError::Raise("Tool shape is not valid for boolean operation"); + } + setAutoFuzzy(); + SetRunParallel(Standard_True); + SetNonDestructive(Standard_True); + if (PerformNow) Build(); +} + +FCBRepAlgoAPI_Section::FCBRepAlgoAPI_Section +(const TopoDS_Shape& Sh, +const gp_Pln& Pl, +const Standard_Boolean PerformNow) +: +BRepAlgoAPI_Section(Sh,Pl,false) +{ + if (!BRepCheck_Analyzer(Sh).IsValid()){ + Standard_ConstructionError::Raise("Base shape is not valid for boolean operation"); + } + setAutoFuzzy(); + SetRunParallel(Standard_True); + if (PerformNow) Build(); +} + + +void FCBRepAlgoAPI_Section::setAutoFuzzy() +{ + FCBRepAlgoAPIHelper::setAutoFuzzy(this); +} diff --git a/src/Mod/Part/App/FCBRepAlgoAPI_Section.h b/src/Mod/Part/App/FCBRepAlgoAPI_Section.h new file mode 100644 index 0000000000..5951cbaa16 --- /dev/null +++ b/src/Mod/Part/App/FCBRepAlgoAPI_Section.h @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +/** + * FCBRepAlgoAPI provides a wrapper for various OCCT functions. + */ + +#ifndef FCREPALGOAPISECTION_H +#define FCREPALGOAPISECTION_H +#include +#include +#include + + +class FCBRepAlgoAPI_Section : public BRepAlgoAPI_Section +{ +public: + + DEFINE_STANDARD_ALLOC + + + //! Empty constructor + Standard_EXPORT FCBRepAlgoAPI_Section(); + + //! Constructor with two shapes + //! -argument + //! -tool + //! - the flag: + //! if =True - the algorithm is performed immediately + //! Obsolete + Standard_EXPORT FCBRepAlgoAPI_Section(const TopoDS_Shape& S1, const TopoDS_Shape& S2, const Standard_Boolean PerformNow = Standard_True); + + //! Constructor with two shapes + //! - argument + //! - tool + //! - the flag: + //! if =True - the algorithm is performed immediately + //! Obsolete + Standard_EXPORT FCBRepAlgoAPI_Section(const TopoDS_Shape& S1, const gp_Pln& Pl, const Standard_Boolean PerformNow = Standard_True); + + // set fuzzyness based on size + void setAutoFuzzy(); +}; +#endif diff --git a/src/Mod/Part/App/FeaturePartBoolean.cpp b/src/Mod/Part/App/FeaturePartBoolean.cpp index 8a94de194f..96a22f1115 100644 --- a/src/Mod/Part/App/FeaturePartBoolean.cpp +++ b/src/Mod/Part/App/FeaturePartBoolean.cpp @@ -24,7 +24,7 @@ #ifndef _PreComp_ # include -# include +# include # include # include #endif diff --git a/src/Mod/Part/App/FeaturePartBoolean.h b/src/Mod/Part/App/FeaturePartBoolean.h index 230e18c130..5c0d28950e 100644 --- a/src/Mod/Part/App/FeaturePartBoolean.h +++ b/src/Mod/Part/App/FeaturePartBoolean.h @@ -27,7 +27,7 @@ #include #include "PartFeature.h" -class BRepAlgoAPI_BooleanOperation; +class FCBRepAlgoAPI_BooleanOperation; namespace Part { diff --git a/src/Mod/Part/App/FeaturePartCommon.cpp b/src/Mod/Part/App/FeaturePartCommon.cpp index 9119aeb6e7..cd72d54b68 100644 --- a/src/Mod/Part/App/FeaturePartCommon.cpp +++ b/src/Mod/Part/App/FeaturePartCommon.cpp @@ -22,7 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include @@ -53,7 +53,7 @@ const char *Common::opCode() const BRepAlgoAPI_BooleanOperation* Common::makeOperation(const TopoDS_Shape& base, const TopoDS_Shape& tool) const { // Let's call algorithm computing a section operation: - return new BRepAlgoAPI_Common(base, tool); + return new FCBRepAlgoAPI_Common(base, tool); } // ---------------------------------------------------- diff --git a/src/Mod/Part/App/FeaturePartCut.cpp b/src/Mod/Part/App/FeaturePartCut.cpp index b559d76a79..8f5523131b 100644 --- a/src/Mod/Part/App/FeaturePartCut.cpp +++ b/src/Mod/Part/App/FeaturePartCut.cpp @@ -22,7 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include #endif #include "FeaturePartCut.h" @@ -43,5 +43,5 @@ const char *Cut::opCode() const BRepAlgoAPI_BooleanOperation* Cut::makeOperation(const TopoDS_Shape& base, const TopoDS_Shape& tool) const { // Let's call algorithm computing a cut operation: - return new BRepAlgoAPI_Cut(base, tool); + return new FCBRepAlgoAPI_Cut(base, tool); } diff --git a/src/Mod/Part/App/FeaturePartFuse.cpp b/src/Mod/Part/App/FeaturePartFuse.cpp index f8bfcbdb23..690944cd8b 100644 --- a/src/Mod/Part/App/FeaturePartFuse.cpp +++ b/src/Mod/Part/App/FeaturePartFuse.cpp @@ -22,7 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include @@ -51,7 +51,7 @@ Fuse::Fuse() = default; BRepAlgoAPI_BooleanOperation* Fuse::makeOperation(const TopoDS_Shape& base, const TopoDS_Shape& tool) const { // Let's call algorithm computing a fuse operation: - return new BRepAlgoAPI_Fuse(base, tool); + return new FCBRepAlgoAPI_Fuse(base, tool); } const char *Fuse::opCode() const @@ -114,7 +114,7 @@ App::DocumentObjectExecReturn *MultiFuse::execute() if (shapes.size() >= 2) { try { std::vector history; - BRepAlgoAPI_Fuse mkFuse; + FCBRepAlgoAPI_Fuse mkFuse; TopTools_ListOfShape shapeArguments, shapeTools; const TopoShape& shape = shapes.front(); if (shape.isNull()) { @@ -131,6 +131,7 @@ App::DocumentObjectExecReturn *MultiFuse::execute() mkFuse.SetArguments(shapeArguments); mkFuse.SetTools(shapeTools); + mkFuse.setAutoFuzzy(); mkFuse.Build(); if (!mkFuse.IsDone()) { diff --git a/src/Mod/Part/App/FeaturePartSection.cpp b/src/Mod/Part/App/FeaturePartSection.cpp index 42c6ef697b..deddc79454 100644 --- a/src/Mod/Part/App/FeaturePartSection.cpp +++ b/src/Mod/Part/App/FeaturePartSection.cpp @@ -22,7 +22,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include #endif @@ -57,10 +57,11 @@ BRepAlgoAPI_BooleanOperation* Section::makeOperation(const TopoDS_Shape& base, c // Let's call algorithm computing a section operation: bool approx = Approximation.getValue(); - std::unique_ptr mkSection(new BRepAlgoAPI_Section()); + std::unique_ptr mkSection(new FCBRepAlgoAPI_Section()); mkSection->Init1(base); mkSection->Init2(tool); mkSection->Approximation(approx); + mkSection->setAutoFuzzy(); mkSection->Build(); if (!mkSection->IsDone()) throw Base::RuntimeError("Section failed"); diff --git a/src/Mod/Part/App/FuzzyHelper.cpp b/src/Mod/Part/App/FuzzyHelper.cpp new file mode 100644 index 0000000000..de192700cd --- /dev/null +++ b/src/Mod/Part/App/FuzzyHelper.cpp @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#include "PreCompiled.h" +#include + +using namespace Part; + +double FuzzyHelper::BooleanFuzzy = 1.0; + +double FuzzyHelper::getBooleanFuzzy() { + return BooleanFuzzy; +} +void FuzzyHelper::setBooleanFuzzy(const double fuzzy) { + BooleanFuzzy = fuzzy; +} + diff --git a/src/Mod/Part/App/FuzzyHelper.h b/src/Mod/Part/App/FuzzyHelper.h new file mode 100644 index 0000000000..153676771a --- /dev/null +++ b/src/Mod/Part/App/FuzzyHelper.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Eric Price (CorvusCorax) * + * * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef PART_FUZZYHELPER_H +#define PART_FUZZYHELPER_H + +#include + +namespace Part +{ + +/** + * @brief The FuzzyHelper class provides a static helper function to determine fuzzy value for a boolean operation + */ +class PartExport FuzzyHelper +{ +public: + static double getBooleanFuzzy(); + static void setBooleanFuzzy(const double base); +private: + static double BooleanFuzzy; +}; + + +} + +#endif // PART_FUZZYHELPER_H diff --git a/src/Mod/Part/App/OpenCascadeAll.h b/src/Mod/Part/App/OpenCascadeAll.h index dcae1c7925..7cbc243c96 100644 --- a/src/Mod/Part/App/OpenCascadeAll.h +++ b/src/Mod/Part/App/OpenCascadeAll.h @@ -115,12 +115,17 @@ #include #include -#include -#include -#include +//#include +#include +//#include +#include +//#include +#include # include -#include -#include +//#include +#include +//#include +#include #include diff --git a/src/Mod/Part/App/PartFeature.cpp b/src/Mod/Part/App/PartFeature.cpp index 17ab7a9a21..48b43585b3 100644 --- a/src/Mod/Part/App/PartFeature.cpp +++ b/src/Mod/Part/App/PartFeature.cpp @@ -26,8 +26,8 @@ # include # include # include -# include -# include +# include +# include # include # include # include @@ -1921,7 +1921,7 @@ bool Part::checkIntersection(const TopoDS_Shape& first, const TopoDS_Shape& seco if (touch_is_intersection) { // If both shapes fuse to a single solid, then they intersect - BRepAlgoAPI_Fuse mkFuse(first, second); + FCBRepAlgoAPI_Fuse mkFuse(first, second); if (!mkFuse.IsDone()) return false; if (mkFuse.Shape().IsNull()) @@ -1939,7 +1939,7 @@ bool Part::checkIntersection(const TopoDS_Shape& first, const TopoDS_Shape& seco } } else { // If both shapes have common material, then they intersect - BRepAlgoAPI_Common mkCommon(first, second); + FCBRepAlgoAPI_Common mkCommon(first, second); if (!mkCommon.IsDone()) return false; if (mkCommon.Shape().IsNull()) diff --git a/src/Mod/Part/App/PartFeature.h b/src/Mod/Part/App/PartFeature.h index 8060a8e2fc..c865f0ab4c 100644 --- a/src/Mod/Part/App/PartFeature.h +++ b/src/Mod/Part/App/PartFeature.h @@ -187,7 +187,7 @@ protected: /** * Build a history of changes - * MakeShape: The operation that created the changes, e.g. BRepAlgoAPI_Common + * MakeShape: The operation that created the changes, e.g. FCBRepAlgoAPI_Common * type: The type of object we are interested in, e.g. TopAbs_FACE * newS: The new shape that was created by the operation * oldS: The original shape prior to the operation diff --git a/src/Mod/Part/App/PropertyTopoShape.h b/src/Mod/Part/App/PropertyTopoShape.h index fc49cb794c..8234da4cf3 100644 --- a/src/Mod/Part/App/PropertyTopoShape.h +++ b/src/Mod/Part/App/PropertyTopoShape.h @@ -131,7 +131,7 @@ struct PartExport ShapeHistory { ShapeHistory() {} /** * Build a history of changes - * MakeShape: The operation that created the changes, e.g. BRepAlgoAPI_Common + * MakeShape: The operation that created the changes, e.g. FCBRepAlgoAPI_Common * type: The type of object we are interested in, e.g. TopAbs_FACE * newS: The new shape that was created by the operation * oldS: The original shape prior to the operation diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index 92e8b17276..389d4d4c23 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -36,12 +36,12 @@ # include # include # include -# include +# include # include # include -# include -# include -# include +# include +# include +# include # include # include # include @@ -1698,7 +1698,7 @@ TopoDS_Shape TopoShape::cut(TopoDS_Shape shape) const return this->_Shape; if (shape.IsNull()) return this->_Shape; - BRepAlgoAPI_Cut mkCut(this->_Shape, shape); + FCBRepAlgoAPI_Cut mkCut(this->_Shape, shape); return makeShell(mkCut.Shape()); } @@ -1706,24 +1706,23 @@ TopoDS_Shape TopoShape::cut(const std::vector& shapes, Standard_Re { if (this->_Shape.IsNull()) return this->_Shape; - BRepAlgoAPI_Cut mkCut; + FCBRepAlgoAPI_Cut mkCut; mkCut.SetRunParallel(true); TopTools_ListOfShape shapeArguments,shapeTools; shapeArguments.Append(this->_Shape); for (const auto & shape : shapes) { if (shape.IsNull()) throw Base::ValueError("Tool shape is null"); - if (tolerance > 0.0) - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - shapeTools.Append(BRepBuilderAPI_Copy(shape).Shape()); - else - shapeTools.Append(shape); + shapeTools.Append(shape); } mkCut.SetArguments(shapeArguments); mkCut.SetTools(shapeTools); - if (tolerance > 0.0) + if (tolerance > 0.0) { mkCut.SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + mkCut.setAutoFuzzy(); + } mkCut.Build(); if (!mkCut.IsDone()) throw Base::RuntimeError("Multi cut failed"); @@ -1738,7 +1737,7 @@ TopoDS_Shape TopoShape::common(TopoDS_Shape shape) const return this->_Shape; if (shape.IsNull()) return shape; - BRepAlgoAPI_Common mkCommon(this->_Shape, shape); + FCBRepAlgoAPI_Common mkCommon(this->_Shape, shape); return makeShell(mkCommon.Shape()); } @@ -1746,24 +1745,23 @@ TopoDS_Shape TopoShape::common(const std::vector& shapes, Standard { if (this->_Shape.IsNull()) return this->_Shape; - BRepAlgoAPI_Common mkCommon; + FCBRepAlgoAPI_Common mkCommon; mkCommon.SetRunParallel(true); TopTools_ListOfShape shapeArguments,shapeTools; shapeArguments.Append(this->_Shape); for (const auto & shape : shapes) { if (shape.IsNull()) throw Base::ValueError("Tool shape is null"); - if (tolerance > 0.0) - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - shapeTools.Append(BRepBuilderAPI_Copy(shape).Shape()); - else - shapeTools.Append(shape); + shapeTools.Append(shape); } mkCommon.SetArguments(shapeArguments); mkCommon.SetTools(shapeTools); - if (tolerance > 0.0) + if (tolerance > 0.0) { mkCommon.SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + mkCommon.setAutoFuzzy(); + } mkCommon.Build(); if (!mkCommon.IsDone()) throw Base::RuntimeError("Multi common failed"); @@ -1778,7 +1776,7 @@ TopoDS_Shape TopoShape::fuse(TopoDS_Shape shape) const return shape; if (shape.IsNull()) return this->_Shape; - BRepAlgoAPI_Fuse mkFuse(this->_Shape, shape); + FCBRepAlgoAPI_Fuse mkFuse(this->_Shape, shape); return makeShell(mkFuse.Shape()); } @@ -1787,23 +1785,22 @@ TopoDS_Shape TopoShape::fuse(const std::vector& shapes, Standard_R if (this->_Shape.IsNull()) Standard_Failure::Raise("Base shape is null"); - BRepAlgoAPI_Fuse mkFuse; + FCBRepAlgoAPI_Fuse mkFuse; mkFuse.SetRunParallel(true); TopTools_ListOfShape shapeArguments,shapeTools; shapeArguments.Append(this->_Shape); for (const auto & shape : shapes) { if (shape.IsNull()) throw NullShapeException("Tool shape is null"); - if (tolerance > 0.0) - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - shapeTools.Append(BRepBuilderAPI_Copy(shape).Shape()); - else - shapeTools.Append(shape); + shapeTools.Append(shape); } mkFuse.SetArguments(shapeArguments); mkFuse.SetTools(shapeTools); - if (tolerance > 0.0) + if (tolerance > 0.0) { mkFuse.SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + mkFuse.setAutoFuzzy(); + } mkFuse.Build(); if (!mkFuse.IsDone()) throw Base::RuntimeError("Multi fuse failed"); @@ -1828,7 +1825,7 @@ TopoDS_Shape TopoShape::section(TopoDS_Shape shape, Standard_Boolean approximate Standard_Failure::Raise("Base shape is null"); if (shape.IsNull()) Standard_Failure::Raise("Tool shape is null"); - BRepAlgoAPI_Section mkSection; + FCBRepAlgoAPI_Section mkSection; mkSection.Init1(this->_Shape); mkSection.Init2(shape); mkSection.Approximation(approximate); @@ -1845,7 +1842,7 @@ TopoDS_Shape TopoShape::section(const std::vector& shapes, if (this->_Shape.IsNull()) Standard_Failure::Raise("Base shape is null"); - BRepAlgoAPI_Section mkSection; + FCBRepAlgoAPI_Section mkSection; mkSection.SetRunParallel(true); mkSection.Approximation(approximate); TopTools_ListOfShape shapeArguments,shapeTools; @@ -1853,17 +1850,16 @@ TopoDS_Shape TopoShape::section(const std::vector& shapes, for (const auto & shape : shapes) { if (shape.IsNull()) throw Base::ValueError("Tool shape is null"); - if (tolerance > 0.0) - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - shapeTools.Append(BRepBuilderAPI_Copy(shape).Shape()); - else - shapeTools.Append(shape); + shapeTools.Append(shape); } mkSection.SetArguments(shapeArguments); mkSection.SetTools(shapeTools); - if (tolerance > 0.0) + if (tolerance > 0.0) { mkSection.SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + mkSection.setAutoFuzzy(); + } mkSection.Build(); if (!mkSection.IsDone()) throw Base::RuntimeError("Multi section failed"); @@ -1915,15 +1911,14 @@ TopoDS_Shape TopoShape::generalFuse(const std::vector &sOthers, St for (const TopoDS_Shape &it: sOthers) { if (it.IsNull()) throw NullShapeException("Tool shape is null"); - if (tolerance > 0.0) - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - GFAArguments.Append(BRepBuilderAPI_Copy(it).Shape()); - else GFAArguments.Append(it); } mkGFA.SetArguments(GFAArguments); - if (tolerance > 0.0) + if (tolerance > 0.0) { mkGFA.SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + FCBRepAlgoAPIHelper::setAutoFuzzy(&mkGFA); + } mkGFA.SetNonDestructive(Standard_True); mkGFA.Build(); if (!mkGFA.IsDone()) diff --git a/src/Mod/Part/App/TopoShape.h b/src/Mod/Part/App/TopoShape.h index d7c8902b15..0263d94b4d 100644 --- a/src/Mod/Part/App/TopoShape.h +++ b/src/Mod/Part/App/TopoShape.h @@ -500,15 +500,15 @@ public: /** @name Boolean operation*/ //@{ TopoDS_Shape cut(TopoDS_Shape) const; - TopoDS_Shape cut(const std::vector&, Standard_Real tolerance = 0.0) const; + TopoDS_Shape cut(const std::vector&, Standard_Real tolerance = -1.0) const; TopoDS_Shape common(TopoDS_Shape) const; - TopoDS_Shape common(const std::vector&, Standard_Real tolerance = 0.0) const; + TopoDS_Shape common(const std::vector&, Standard_Real tolerance = -1.0) const; TopoDS_Shape fuse(TopoDS_Shape) const; - TopoDS_Shape fuse(const std::vector&, Standard_Real tolerance = 0.0) const; + TopoDS_Shape fuse(const std::vector&, Standard_Real tolerance = -1.0) const; TopoDS_Shape oldFuse(TopoDS_Shape) const; TopoDS_Shape section(TopoDS_Shape, Standard_Boolean approximate = Standard_False) const; TopoDS_Shape section(const std::vector&, - Standard_Real tolerance = 0.0, + Standard_Real tolerance = -1.0, Standard_Boolean approximate = Standard_False) const; std::list slice(const Base::Vector3d&, double) const; TopoDS_Compound slices(const Base::Vector3d&, const std::vector&) const; @@ -1356,7 +1356,7 @@ public: */ TopoShape& makeElementGeneralFuse(const std::vector& sources, std::vector>& modified, - double tol = 0, + double tol = -1.0, const char* op = nullptr); /** Make a fusion of input shapes @@ -1373,7 +1373,7 @@ public: */ TopoShape& makeElementFuse(const std::vector& sources, const char* op = nullptr, - double tol = 0); + double tol = -1.0); /** Make a fusion of this shape and an input shape * * @param source: the source shape @@ -1384,7 +1384,7 @@ public: * @return Return the new shape. The TopoShape itself is not modified. */ TopoShape - makeElementFuse(const TopoShape& source, const char* op = nullptr, double tol = 0) const + makeElementFuse(const TopoShape& source, const char* op = nullptr, double tol = -1.0) const { return TopoShape(0, Hasher).makeElementFuse({*this, source}, op, tol); } @@ -1402,7 +1402,7 @@ public: * for the same shape in the same line of code. */ TopoShape& - makeElementCut(const std::vector& sources, const char* op = nullptr, double tol = 0); + makeElementCut(const std::vector& sources, const char* op = nullptr, double tol = -1.0); /** Make a boolean cut of this shape with an input shape * * @param source: the source shape @@ -1413,7 +1413,7 @@ public: * @return Return the new shape. The TopoShape itself is not modified. */ TopoShape - makeElementCut(const TopoShape& source, const char* op = nullptr, double tol = 0) const + makeElementCut(const TopoShape& source, const char* op = nullptr, double tol = -1.0) const { return TopoShape(0, Hasher).makeElementCut({*this, source}, op, tol); } @@ -1875,7 +1875,7 @@ public: TopoShape& makeElementBoolean(const char* maker, const std::vector& sources, const char* op = nullptr, - double tol = 0.0); + double tol = -1.0); /** Generalized shape making with mapped element name from shape history * * @param maker: op code from TopoShapeOpCodes @@ -1893,7 +1893,7 @@ public: TopoShape& makeElementBoolean(const char* maker, const TopoShape& source, const char* op = nullptr, - double tol = 0.0); + double tol = -1.0); /** Generalized shape making with mapped element name from shape history * @@ -1907,7 +1907,7 @@ public: * is not modified. */ TopoShape - makeElementBoolean(const char* maker, const char* op = nullptr, double tol = 0.0) const + makeElementBoolean(const char* maker, const char* op = nullptr, double tol = -1.0) const { return TopoShape(0, Hasher).makeElementBoolean(maker, *this, op, tol); } diff --git a/src/Mod/Part/App/TopoShapeExpansion.cpp b/src/Mod/Part/App/TopoShapeExpansion.cpp index 3fdc9425ea..fe023a314c 100644 --- a/src/Mod/Part/App/TopoShapeExpansion.cpp +++ b/src/Mod/Part/App/TopoShapeExpansion.cpp @@ -41,11 +41,11 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include @@ -4055,15 +4055,13 @@ TopoShape& TopoShape::makeElementGeneralFuse(const std::vector& _shap if (shape.isNull()) { FC_THROWM(NullShapeException, "Null input shape"); } - if (tol > 0.0) { - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - shape = shape.makeElementCopy(); - } GFAArguments.Append(shape.getShape()); } mkGFA.SetArguments(GFAArguments); if (tol > 0.0) { mkGFA.SetFuzzyValue(tol); + } else if (tol < 0.0) { + FCBRepAlgoAPIHelper::setAutoFuzzy(&mkGFA); } mkGFA.SetNonDestructive(Standard_True); mkGFA.Build(); @@ -5666,7 +5664,7 @@ TopoShape& TopoShape::makeElementBoolean(const char* maker, } } - if (tolerance > 0.0 && _shapes.empty()) { + if (tolerance != 0.0 && _shapes.empty()) { _shapes = shapes; } @@ -5686,16 +5684,16 @@ TopoShape& TopoShape::makeElementBoolean(const char* maker, std::unique_ptr mk; if (strcmp(maker, Part::OpCodes::Fuse) == 0) { - mk.reset(new BRepAlgoAPI_Fuse); + mk.reset(new FCBRepAlgoAPI_Fuse); } else if (strcmp(maker, Part::OpCodes::Cut) == 0) { - mk.reset(new BRepAlgoAPI_Cut); + mk.reset(new FCBRepAlgoAPI_Cut); } else if (strcmp(maker, Part::OpCodes::Common) == 0) { - mk.reset(new BRepAlgoAPI_Common); + mk.reset(new FCBRepAlgoAPI_Common); } else if (strcmp(maker, Part::OpCodes::Section) == 0) { - mk.reset(new BRepAlgoAPI_Section); + mk.reset(new FCBRepAlgoAPI_Section); buildShell = false; } else { @@ -5712,12 +5710,6 @@ TopoShape& TopoShape::makeElementBoolean(const char* maker, if (++i == 0) { shapeArguments.Append(shape.getShape()); } - else if (tolerance > 0.0) { - auto& s = _shapes[i]; - // workaround for http://dev.opencascade.org/index.php?q=node/1056#comment-520 - s.setShape(BRepBuilderAPI_Copy(s.getShape()).Shape(), false); - shapeTools.Append(s.getShape()); - } else { shapeTools.Append(shape.getShape()); } @@ -5739,6 +5731,8 @@ TopoShape& TopoShape::makeElementBoolean(const char* maker, mk->SetTools(shapeTools); if (tolerance > 0.0) { mk->SetFuzzyValue(tolerance); + } else if (tolerance < 0.0) { + FCBRepAlgoAPIHelper::setAutoFuzzy(mk.get()); } mk->Build(); makeElementShape(*mk, inputs, op); diff --git a/src/Mod/Part/Gui/DlgSettingsGeneral.cpp b/src/Mod/Part/Gui/DlgSettingsGeneral.cpp index 3df5ca1cd0..df3ba13e04 100644 --- a/src/Mod/Part/Gui/DlgSettingsGeneral.cpp +++ b/src/Mod/Part/Gui/DlgSettingsGeneral.cpp @@ -30,6 +30,7 @@ #endif #include +#include #include #include #include diff --git a/src/Mod/Part/Gui/DlgSettingsGeneral.ui b/src/Mod/Part/Gui/DlgSettingsGeneral.ui index 9dad3c5675..c764b3d896 100644 --- a/src/Mod/Part/Gui/DlgSettingsGeneral.ui +++ b/src/Mod/Part/Gui/DlgSettingsGeneral.ui @@ -158,6 +158,11 @@ QCheckBox
Gui/PrefWidgets.h
+ + Gui::PrefDoubleSpinBox + QDoubleSpinBox +
Gui/PrefWidgets.h
+
diff --git a/src/Mod/PartDesign/App/FeatureBoolean.cpp b/src/Mod/PartDesign/App/FeatureBoolean.cpp index 2a0de63fbf..59d0f617bf 100644 --- a/src/Mod/PartDesign/App/FeatureBoolean.cpp +++ b/src/Mod/PartDesign/App/FeatureBoolean.cpp @@ -23,9 +23,9 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include -# include -# include +# include +# include +# include # include #endif diff --git a/src/Mod/PartDesign/App/FeatureExtrude.cpp b/src/Mod/PartDesign/App/FeatureExtrude.cpp index db941b6f39..4cbd066df0 100644 --- a/src/Mod/PartDesign/App/FeatureExtrude.cpp +++ b/src/Mod/PartDesign/App/FeatureExtrude.cpp @@ -24,7 +24,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include @@ -275,7 +275,7 @@ void FeatureExtrude::generatePrism(TopoDS_Shape& prism, throw Base::RuntimeError("ProfileBased: Up to face: Could not extrude the sketch!"); auto onePrism = PrismMaker.Shape(); - BRepAlgoAPI_Fuse fuse(prism, onePrism); + FCBRepAlgoAPI_Fuse fuse(prism, onePrism); prism = fuse.Shape(); } } diff --git a/src/Mod/PartDesign/App/FeatureGroove.cpp b/src/Mod/PartDesign/App/FeatureGroove.cpp index 3888e76efa..5eef93221d 100644 --- a/src/Mod/PartDesign/App/FeatureGroove.cpp +++ b/src/Mod/PartDesign/App/FeatureGroove.cpp @@ -23,7 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include diff --git a/src/Mod/PartDesign/App/FeatureHelix.cpp b/src/Mod/PartDesign/App/FeatureHelix.cpp index 72650f2bec..fa0e82139b 100644 --- a/src/Mod/PartDesign/App/FeatureHelix.cpp +++ b/src/Mod/PartDesign/App/FeatureHelix.cpp @@ -24,9 +24,9 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include -# include -# include -# include +# include +# include +# include # include # include # include @@ -256,7 +256,7 @@ App::DocumentObjectExecReturn* Helix::execute() if (getAddSubType() == FeatureAddSub::Additive) { - BRepAlgoAPI_Fuse mkFuse(base.getShape(), result); + FCBRepAlgoAPI_Fuse mkFuse(base.getShape(), result); if (!mkFuse.IsDone()){ return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Error: Adding the helix failed")); } @@ -280,14 +280,14 @@ App::DocumentObjectExecReturn* Helix::execute() TopoShape boolOp; if (Outside.getValue()) { // are we subtracting the inside or the outside of the profile. - BRepAlgoAPI_Common mkCom(result, base.getShape()); + FCBRepAlgoAPI_Common mkCom(result, base.getShape()); if (!mkCom.IsDone()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Error: Intersecting the helix failed")); boolOp = this->getSolid(mkCom.Shape()); } else { - BRepAlgoAPI_Cut mkCut(base.getShape(), result); + FCBRepAlgoAPI_Cut mkCut(base.getShape(), result); if (!mkCut.IsDone()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Error: Subtracting the helix failed")); boolOp = this->getSolid(mkCut.Shape()); diff --git a/src/Mod/PartDesign/App/FeatureHole.cpp b/src/Mod/PartDesign/App/FeatureHole.cpp index 2af49ea716..b2b9054698 100644 --- a/src/Mod/PartDesign/App/FeatureHole.cpp +++ b/src/Mod/PartDesign/App/FeatureHole.cpp @@ -25,8 +25,8 @@ #ifndef _PreComp_ # include # include -# include -# include +# include +# include # include # include # include @@ -1879,7 +1879,7 @@ App::DocumentObjectExecReturn* Hole::execute() TopoDS_Shape protoThread = makeThread(xDir, zDir, length); // fuse the thread to the hole - BRepAlgoAPI_Fuse mkFuse(protoHole, protoThread); + FCBRepAlgoAPI_Fuse mkFuse(protoHole, protoThread); if (!mkFuse.IsDone()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Error: Adding the thread failed")); diff --git a/src/Mod/PartDesign/App/FeaturePad.cpp b/src/Mod/PartDesign/App/FeaturePad.cpp index 5e080fceb8..644458adc0 100644 --- a/src/Mod/PartDesign/App/FeaturePad.cpp +++ b/src/Mod/PartDesign/App/FeaturePad.cpp @@ -23,7 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include diff --git a/src/Mod/PartDesign/App/FeaturePipe.cpp b/src/Mod/PartDesign/App/FeaturePipe.cpp index 7310de1a97..215317b94b 100644 --- a/src/Mod/PartDesign/App/FeaturePipe.cpp +++ b/src/Mod/PartDesign/App/FeaturePipe.cpp @@ -23,8 +23,8 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include -# include +# include +# include # include # include # include @@ -387,7 +387,7 @@ App::DocumentObjectExecReturn *Pipe::execute() if (getAddSubType() == FeatureAddSub::Additive) { - BRepAlgoAPI_Fuse mkFuse(base.getShape(), result); + FCBRepAlgoAPI_Fuse mkFuse(base.getShape(), result); if (!mkFuse.IsDone()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Adding the pipe failed")); // we have to get the solids (fuse sometimes creates compounds) @@ -407,7 +407,7 @@ App::DocumentObjectExecReturn *Pipe::execute() } else if (getAddSubType() == FeatureAddSub::Subtractive) { - BRepAlgoAPI_Cut mkCut(base.getShape(), result); + FCBRepAlgoAPI_Cut mkCut(base.getShape(), result); if (!mkCut.IsDone()) return new App::DocumentObjectExecReturn(QT_TRANSLATE_NOOP("Exception", "Subtracting the pipe failed")); // we have to get the solids (fuse sometimes creates compounds) diff --git a/src/Mod/PartDesign/App/FeaturePocket.cpp b/src/Mod/PartDesign/App/FeaturePocket.cpp index c3e2a3a999..efbed345c2 100644 --- a/src/Mod/PartDesign/App/FeaturePocket.cpp +++ b/src/Mod/PartDesign/App/FeaturePocket.cpp @@ -23,7 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include diff --git a/src/Mod/PartDesign/App/FeaturePrimitive.cpp b/src/Mod/PartDesign/App/FeaturePrimitive.cpp index 44c1eb1b7f..a5fd544dc3 100644 --- a/src/Mod/PartDesign/App/FeaturePrimitive.cpp +++ b/src/Mod/PartDesign/App/FeaturePrimitive.cpp @@ -24,8 +24,8 @@ #include "PreCompiled.h" #ifndef _PreComp_ # include -# include -# include +# include +# include # include # include # include diff --git a/src/Mod/PartDesign/App/FeatureRevolution.cpp b/src/Mod/PartDesign/App/FeatureRevolution.cpp index 82702799e4..3d9c15eb9a 100644 --- a/src/Mod/PartDesign/App/FeatureRevolution.cpp +++ b/src/Mod/PartDesign/App/FeatureRevolution.cpp @@ -23,7 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -# include +# include # include # include # include diff --git a/src/Mod/PartDesign/App/FeatureTransformed.cpp b/src/Mod/PartDesign/App/FeatureTransformed.cpp index df1c3f2954..bdec048135 100644 --- a/src/Mod/PartDesign/App/FeatureTransformed.cpp +++ b/src/Mod/PartDesign/App/FeatureTransformed.cpp @@ -24,8 +24,8 @@ #ifndef _PreComp_ #include #include -#include -#include +#include +#include #include #include #include diff --git a/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py b/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py index c1a0f34328..5e96c2359d 100644 --- a/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py +++ b/src/Mod/PartDesign/PartDesignTests/TestTopologicalNamingProblem.py @@ -635,7 +635,16 @@ class TestTopologicalNamingProblem(unittest.TestCase): # Assert UpToFace element map is correct self.assertEqual(self.countFacesEdgesVertexes(revolution.Shape.ElementReverseMap), (8, 18, 12)) - self.assertEqual( revolution.Shape.ElementReverseMap["Face8"].count(";"), 7) + # Assertions modified/added while reviewing PR#17119 by CalligaroV + # Previously the condition counted the number of ";" (element map operations prefix) + # If the number of operations changes then the number of ";" will change accordingly + # + # However, it is more useful to count the number of times an elemement name is + # present in the MappedName of an element (a MappedName is definined also using the + # element names - "Vertex*", "Edge*", "Face*" - used by an OCCT operation to generate + # output elements) + self.assertEqual( revolution.Shape.ElementReverseMap["Face8"].count("Face8"), 3) + self.assertEqual( revolution.Shape.ElementReverseMap["Face8"].count("Face10"), 3) def testPartDesignElementMapLoft(self): # Arrange @@ -767,10 +776,10 @@ class TestTopologicalNamingProblem(unittest.TestCase): self.Doc.recompute() # Assert self.assertEqual(len(body.Shape.childShapes()), 1) - self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 55) + self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 51) self.assertEqual(body.Shape.ElementMapSize, 51) self.assertEqual(sketch.Shape.ElementMapSize, 12) - self.assertEqual(pocket.Shape.ElementMapSize, 55) + self.assertEqual(pocket.Shape.ElementMapSize, 51) self.assertNotEqual( pocket.Shape.ElementReverseMap["Vertex1"], "Vertex1" ) # NewName, not OldName @@ -1856,7 +1865,7 @@ class TestTopologicalNamingProblem(unittest.TestCase): edges = [name for name in reverseMap.keys() if name.startswith("Edge")] vertexes = [name for name in reverseMap.keys() if name.startswith("Vertex")] self.assertEqual(len(body.Shape.childShapes()), 1) - self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 64) + self.assertEqual(body.Shape.childShapes()[0].ElementMapSize, 62) self.assertEqual(len(reverseMap), 62) self.assertEqual(len(faces), 12) self.assertEqual(len(edges), 30) diff --git a/src/Mod/Sketcher/App/PreCompiled.h b/src/Mod/Sketcher/App/PreCompiled.h index c023d39875..55de5c2ade 100644 --- a/src/Mod/Sketcher/App/PreCompiled.h +++ b/src/Mod/Sketcher/App/PreCompiled.h @@ -58,7 +58,7 @@ // OpenCasCade #include #include -#include +#include #include #include #include diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 5d1be10890..ba83358bf8 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include @@ -7671,7 +7671,7 @@ int SketchObject::addExternal(App::DocumentObject *Obj, const char* SubName, boo continue; if (intersection) { try { - BRepAlgoAPI_Section maker(subShape, sketchPlane); + FCBRepAlgoAPI_Section maker(subShape, sketchPlane); if (!maker.IsDone() || maker.Shape().IsNull()) continue; } catch (Standard_Failure &) { @@ -9025,7 +9025,7 @@ void SketchObject::rebuildExternalGeometry(bool defining, bool addIntersection) if (intersection && (refSubShape.ShapeType() == TopAbs_EDGE || refSubShape.ShapeType() == TopAbs_FACE)) { - BRepAlgoAPI_Section maker(refSubShape, sketchPlane); + FCBRepAlgoAPI_Section maker(refSubShape, sketchPlane); maker.Approximation(Standard_True); if (!maker.IsDone()) FC_THROWM(Base::CADKernelError,"Failed to get intersection"); diff --git a/src/Mod/TechDraw/App/DrawBrokenView.cpp b/src/Mod/TechDraw/App/DrawBrokenView.cpp index a22c2f480b..117510df56 100644 --- a/src/Mod/TechDraw/App/DrawBrokenView.cpp +++ b/src/Mod/TechDraw/App/DrawBrokenView.cpp @@ -43,7 +43,7 @@ #ifndef _PreComp_ #include -#include +#include #include #include #include @@ -206,7 +206,7 @@ TopoDS_Shape DrawBrokenView::apply1Break(const App::DocumentObject& breakObj, co moveDir0.Normalize(); moveDir0 = DU::closestBasisOriented(moveDir0); auto halfSpace0 = makeHalfSpace(breakPoints.first, moveDir0, breakPoints.second); - BRepAlgoAPI_Cut mkCut0(inShape, halfSpace0); + FCBRepAlgoAPI_Cut mkCut0(inShape, halfSpace0); if (!mkCut0.IsDone()) { Base::Console().Message("DBV::apply1Break - cut0 failed\n"); } @@ -218,7 +218,7 @@ TopoDS_Shape DrawBrokenView::apply1Break(const App::DocumentObject& breakObj, co moveDir1.Normalize(); moveDir1 = DU::closestBasisOriented(moveDir1); auto halfSpace1 = makeHalfSpace(breakPoints.second, moveDir1, breakPoints.first); - BRepAlgoAPI_Cut mkCut1(inShape, halfSpace1); + FCBRepAlgoAPI_Cut mkCut1(inShape, halfSpace1); if (!mkCut1.IsDone()) { Base::Console().Message("DBV::apply1Break - cut1 failed\n"); } diff --git a/src/Mod/TechDraw/App/DrawComplexSection.cpp b/src/Mod/TechDraw/App/DrawComplexSection.cpp index 28c63b76d8..9342451058 100644 --- a/src/Mod/TechDraw/App/DrawComplexSection.cpp +++ b/src/Mod/TechDraw/App/DrawComplexSection.cpp @@ -59,8 +59,8 @@ #ifndef _PreComp_ #include #include -#include -#include +#include +#include #include #include #include @@ -1176,7 +1176,7 @@ bool DrawComplexSection::boxesIntersect(TopoDS_Face& face, TopoDS_Shape& shape) TopoDS_Shape DrawComplexSection::shapeShapeIntersect(const TopoDS_Shape& shape0, const TopoDS_Shape& shape1) { - BRepAlgoAPI_Common anOp; + FCBRepAlgoAPI_Common anOp; anOp.SetFuzzyValue(EWTOLERANCE); TopTools_ListOfShape anArg1, anArg2; anArg1.Append(shape0); diff --git a/src/Mod/TechDraw/App/DrawGeomHatch.cpp b/src/Mod/TechDraw/App/DrawGeomHatch.cpp index 8713999a9d..7c11c086d1 100644 --- a/src/Mod/TechDraw/App/DrawGeomHatch.cpp +++ b/src/Mod/TechDraw/App/DrawGeomHatch.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include #include @@ -345,7 +345,7 @@ std::vector DrawGeomHatch::getTrimmedLines(DrawViewPart* source, grid = mkTransTranslate.Shape(); //Common(Compound, Face) - BRepAlgoAPI_Common mkCommon(face, grid); + FCBRepAlgoAPI_Common mkCommon(face, grid); if (!mkCommon.IsDone() || mkCommon.Shape().IsNull()) { return result; diff --git a/src/Mod/TechDraw/App/DrawProjectSplit.cpp b/src/Mod/TechDraw/App/DrawProjectSplit.cpp index 28205e8b58..dd4b1825a0 100644 --- a/src/Mod/TechDraw/App/DrawProjectSplit.cpp +++ b/src/Mod/TechDraw/App/DrawProjectSplit.cpp @@ -29,8 +29,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -645,7 +645,7 @@ int DrawProjectSplit::isSubset(const TopoDS_Edge &edge0, const TopoDS_Edge &edge } //bboxes of edges intersect - BRepAlgoAPI_Common anOp; + FCBRepAlgoAPI_Common anOp; anOp.SetFuzzyValue (FUZZYADJUST * EWTOLERANCE); TopTools_ListOfShape anArg1, anArg2; anArg1.Append (edge0); @@ -683,7 +683,7 @@ int DrawProjectSplit::isSubset(const TopoDS_Edge &edge0, const TopoDS_Edge &edge std::vector DrawProjectSplit::fuseEdges(const TopoDS_Edge &edge0, const TopoDS_Edge &edge1) { std::vector edgeList; - BRepAlgoAPI_Fuse anOp; + FCBRepAlgoAPI_Fuse anOp; anOp.SetFuzzyValue (FUZZYADJUST * EWTOLERANCE); TopTools_ListOfShape anArg1, anArg2; anArg1.Append (edge0); diff --git a/src/Mod/TechDraw/App/DrawViewDetail.cpp b/src/Mod/TechDraw/App/DrawViewDetail.cpp index 28c98b61c4..241a01f0b1 100644 --- a/src/Mod/TechDraw/App/DrawViewDetail.cpp +++ b/src/Mod/TechDraw/App/DrawViewDetail.cpp @@ -23,7 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ -#include +#include #include #include #include @@ -294,7 +294,7 @@ void DrawViewDetail::makeDetailShape(const TopoDS_Shape& shape3d, DrawViewPart* TopExp_Explorer expl1(copyShape, TopAbs_SOLID); for (; expl1.More(); expl1.Next()) { const TopoDS_Solid& s = TopoDS::Solid(expl1.Current()); - BRepAlgoAPI_Common mkCommon(s, tool); + FCBRepAlgoAPI_Common mkCommon(s, tool); if (!mkCommon.IsDone()) { continue; } @@ -313,7 +313,7 @@ void DrawViewDetail::makeDetailShape(const TopoDS_Shape& shape3d, DrawViewPart* TopExp_Explorer expl2(copyShape, TopAbs_SHELL, TopAbs_SOLID); for (; expl2.More(); expl2.Next()) { const TopoDS_Shell& s = TopoDS::Shell(expl2.Current()); - BRepAlgoAPI_Common mkCommon(s, tool); + FCBRepAlgoAPI_Common mkCommon(s, tool); if (!mkCommon.IsDone()) { continue; } @@ -333,7 +333,7 @@ void DrawViewDetail::makeDetailShape(const TopoDS_Shape& shape3d, DrawViewPart* TopExp_Explorer expl3(copyShape, TopAbs_EDGE, TopAbs_FACE); for (; expl3.More(); expl3.Next()) { const TopoDS_Edge& e = TopoDS::Edge(expl3.Current()); - BRepAlgoAPI_Common mkCommon(e, tool); + FCBRepAlgoAPI_Common mkCommon(e, tool); if (!mkCommon.IsDone()) { continue; } diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index bbfbb33d06..628d3ecc4b 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -47,7 +47,7 @@ #ifndef _PreComp_ #include -#include +#include #include #include #include @@ -510,7 +510,7 @@ void DrawViewSection::makeSectionCut(const TopoDS_Shape& baseShape) TopExp_Explorer expl(myShape, TopAbs_SOLID); for (; expl.More(); expl.Next()) { const TopoDS_Solid& s = TopoDS::Solid(expl.Current()); - BRepAlgoAPI_Cut mkCut(s, m_cuttingTool); + FCBRepAlgoAPI_Cut mkCut(s, m_cuttingTool); if (!mkCut.IsDone()) { Base::Console().Warning("DVS: Section cut has failed in %s\n", getNameInDocument()); continue; @@ -527,7 +527,7 @@ void DrawViewSection::makeSectionCut(const TopoDS_Shape& baseShape) // second cut if requested. Sometimes the first cut includes extra uncut // pieces. if (trimAfterCut()) { - BRepAlgoAPI_Cut mkCut2(cutPieces, m_cuttingTool); + FCBRepAlgoAPI_Cut mkCut2(cutPieces, m_cuttingTool); if (mkCut2.IsDone()) { m_cutPieces = mkCut2.Shape(); if (debugSection()) { diff --git a/src/Mod/TechDraw/App/Geometry.cpp b/src/Mod/TechDraw/App/Geometry.cpp index 2dc3c224cf..9b93430047 100644 --- a/src/Mod/TechDraw/App/Geometry.cpp +++ b/src/Mod/TechDraw/App/Geometry.cpp @@ -29,7 +29,7 @@ # include # include # include -# include +# include # include # include # include @@ -615,7 +615,7 @@ std::vector BaseGeom::intersection(TechDraw::BaseGeomPtr geom2) return interPoints; } - BRepAlgoAPI_Section sectionOp(edge1, edge2); + FCBRepAlgoAPI_Section sectionOp(edge1, edge2); sectionOp.SetFuzzyValue(FUZZYADJUST*EWTOLERANCE); sectionOp.SetNonDestructive(true); diff --git a/src/Mod/TechDraw/App/ShapeExtractor.cpp b/src/Mod/TechDraw/App/ShapeExtractor.cpp index 5619139724..069e34610e 100644 --- a/src/Mod/TechDraw/App/ShapeExtractor.cpp +++ b/src/Mod/TechDraw/App/ShapeExtractor.cpp @@ -25,7 +25,7 @@ #ifndef _PreComp_ # include # include -# include +# include # include # include # include @@ -354,7 +354,7 @@ TopoDS_Shape ShapeExtractor::getShapesFused(const std::vector + +#include "Mod/Part/App/FuzzyHelper.h" +#include "Mod/Part/App/FeaturePartImportBrep.h" +#include +#include +#include +#include "PartTestHelpers.h" + + +class FuzzyBooleanTest: public ::testing::Test, public PartTestHelpers::PartTestHelperClass +{ +protected: + static void SetUpTestSuite() + { + tests::initApplication(); + } + + void SetUp() override + { + createTestDoc(); + std::string testPath = App::Application::getHomePath() + "/tests/brepfiles/"; + _fuse = dynamic_cast(_doc->addObject("Part::Fuse")); + _cylinder1 = dynamic_cast(_doc->addObject("Part::ImportBrep")); + _cylinder1->FileName.setValue(testPath + "cylinder1.brep"); + _helix1 = dynamic_cast(_doc->addObject("Part::ImportBrep")); + _helix1->FileName.setValue(testPath + "helix1.brep"); + + // Load + _cylinder1->execute(); + _helix1->execute(); + + // Arrange + _fuse->Base.setValue(_cylinder1); + _fuse->Tool.setValue(_helix1); + } + + void TearDown() override + {} + + Part::Fuse* _fuse = nullptr; // NOLINT Can't be private in a test framework + Part::ImportBrep* _cylinder1 = nullptr; // NOLINT Can't be private in a test framework + Part::ImportBrep* _helix1 = nullptr; // NOLINT Can't be private in a test framework +}; + +TEST_F(FuzzyBooleanTest, testLoadedCorrectly) +{ + + EXPECT_NEAR(PartTestHelpers::getVolume(_cylinder1->Shape.getValue()), 125.6, 1.0); + EXPECT_NEAR(PartTestHelpers::getVolume(_helix1->Shape.getValue()), 33.32, 1.0); +} + +TEST_F(FuzzyBooleanTest, testDefaultFuzzy) +{ + + // Act + _fuse->execute(); + + // Verify + EXPECT_NEAR(PartTestHelpers::getVolume(_fuse->Shape.getValue()), + PartTestHelpers::getVolume(_helix1->Shape.getValue()) + + PartTestHelpers::getVolume(_cylinder1->Shape.getValue()), + 0.1); + + // Analyse + Part::TopoShape ts = _fuse->Shape.getValue(); + ASSERT_FALSE(ts.isNull()); + TopoDS_Shape BOPCopy = BRepBuilderAPI_Copy(ts.getShape()).Shape(); + BOPAlgo_ArgumentAnalyzer BOPCheck; + BOPCheck.SetShape1(BOPCopy); + BOPCheck.SelfInterMode() = Standard_True; + + BOPCheck.Perform(); + // Assert + EXPECT_FALSE(BOPCheck.HasFaulty()); +} + +TEST_F(FuzzyBooleanTest, testGoodFuzzy) +{ + + // Act + double oldFuzzy = Part::FuzzyHelper::getBooleanFuzzy(); + Part::FuzzyHelper::setBooleanFuzzy(10.0); + _fuse->execute(); + EXPECT_FLOAT_EQ(Part::FuzzyHelper::getBooleanFuzzy(), 10.0); + Part::FuzzyHelper::setBooleanFuzzy(oldFuzzy); + + // Verify + EXPECT_NEAR(PartTestHelpers::getVolume(_fuse->Shape.getValue()), + PartTestHelpers::getVolume(_helix1->Shape.getValue()) + + PartTestHelpers::getVolume(_cylinder1->Shape.getValue()), + 0.1); + + // Analyse + Part::TopoShape ts = _fuse->Shape.getValue(); + ASSERT_FALSE(ts.isNull()); + TopoDS_Shape BOPCopy = BRepBuilderAPI_Copy(ts.getShape()).Shape(); + BOPAlgo_ArgumentAnalyzer BOPCheck; + BOPCheck.SetShape1(BOPCopy); + BOPCheck.SelfInterMode() = Standard_True; + + BOPCheck.Perform(); + // Assert + int result = BOPCheck.HasFaulty(); + EXPECT_FALSE(result); +} + +TEST_F(FuzzyBooleanTest, testFailsTooSmallFuzzy) +{ + + // Act + double oldFuzzy = Part::FuzzyHelper::getBooleanFuzzy(); + Part::FuzzyHelper::setBooleanFuzzy(0.01); + _fuse->execute(); + EXPECT_FLOAT_EQ(Part::FuzzyHelper::getBooleanFuzzy(), 0.01); + Part::FuzzyHelper::setBooleanFuzzy(oldFuzzy); + + // Verify + // EXPECT_NEAR(PartTestHelpers::getVolume(_fuse->Shape.getValue()),PartTestHelpers::getVolume(_helix1->Shape.getValue())+PartTestHelpers::getVolume(_cylinder1->Shape.getValue()),0.1); + // // fails on OCCT 7.3 - ignore + + // Analyse + Part::TopoShape ts = _fuse->Shape.getValue(); + ASSERT_FALSE(ts.isNull()); + TopoDS_Shape BOPCopy = BRepBuilderAPI_Copy(ts.getShape()).Shape(); + BOPAlgo_ArgumentAnalyzer BOPCheck; + BOPCheck.SetShape1(BOPCopy); + BOPCheck.SelfInterMode() = Standard_True; + + BOPCheck.Perform(); + // Assert + int result = BOPCheck.HasFaulty(); + EXPECT_TRUE(result); +} + +TEST_F(FuzzyBooleanTest, testCompletelyFailsTooBigFuzzy) +{ + + // Act + double oldFuzzy = Part::FuzzyHelper::getBooleanFuzzy(); + Part::FuzzyHelper::setBooleanFuzzy(1e10); + int failed = 0; + Part::TopoShape ts; + try { + _fuse->execute(); + ts = _fuse->Shape.getValue(); + if (ts.isNull()) { + failed = 1; + } + else { + TopoDS_Shape BOPCopy = BRepBuilderAPI_Copy(ts.getShape()).Shape(); + BOPAlgo_ArgumentAnalyzer BOPCheck; + BOPCheck.SetShape1(BOPCopy); + BOPCheck.SelfInterMode() = Standard_True; + + BOPCheck.Perform(); + // Assert + if (BOPCheck.HasFaulty()) { + failed = 1; + } + } + } + catch (...) { + failed = 1; + } + Part::FuzzyHelper::setBooleanFuzzy(oldFuzzy); + EXPECT_EQ(failed, 1); +} diff --git a/tests/src/Mod/Part/App/TopoShapeExpansion.cpp b/tests/src/Mod/Part/App/TopoShapeExpansion.cpp index dbaa489f13..6524846570 100644 --- a/tests/src/Mod/Part/App/TopoShapeExpansion.cpp +++ b/tests/src/Mod/Part/App/TopoShapeExpansion.cpp @@ -1444,7 +1444,7 @@ TEST_F(TopoShapeExpansionTest, makeElementBooleanCut) "Edge2", "Edge2;:M;CUT;:H2:7,E", "Edge3", - "Edge3;:H2,E", + "Edge3;:M;CUT;:H2:7,E", "Edge4", "Edge4;:M;CUT;:H2:7,E", "Edge6;:G(Edge12;K-1;:H2:4,E);CUT;:H1:1b,V", @@ -1467,9 +1467,9 @@ TEST_F(TopoShapeExpansionTest, makeElementBooleanCut) "Vertex1", "Vertex2", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;CUT;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", + "Vertex4;:M;CUT;:H2:7,V", "Vertex7", "Vertex8", })); @@ -1550,13 +1550,13 @@ TEST_F(TopoShapeExpansionTest, makeElementBooleanFuse) "Vertex2", "Vertex2;:H2,V", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;FUS;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", - "Vertex5", + "Vertex4;:M;FUS;:H2:7,V", "Vertex5;:H2,V", - "Vertex6", + "Vertex5;:M;FUS;:H1:7,V", "Vertex6;:H2,V", + "Vertex6;:M;FUS;:H1:7,V", "Vertex7", "Vertex7;:H2,V", "Vertex8", @@ -2021,13 +2021,13 @@ TEST_F(TopoShapeExpansionTest, makeElementFuse) "Vertex2", "Vertex2;:H2,V", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;FUS;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", - "Vertex5", + "Vertex4;:M;FUS;:H2:7,V", "Vertex5;:H2,V", - "Vertex6", + "Vertex5;:M;FUS;:H1:7,V", "Vertex6;:H2,V", + "Vertex6;:M;FUS;:H1:7,V", "Vertex7", "Vertex7;:H2,V", "Vertex8", @@ -2065,7 +2065,7 @@ TEST_F(TopoShapeExpansionTest, makeElementCut) "Edge2", "Edge2;:M;CUT;:H2:7,E", "Edge3", - "Edge3;:H2,E", + "Edge3;:M;CUT;:H2:7,E", "Edge4", "Edge4;:M;CUT;:H2:7,E", "Edge6;:G(Edge12;K-1;:H2:4,E);CUT;:H1:1b,V", @@ -2088,9 +2088,9 @@ TEST_F(TopoShapeExpansionTest, makeElementCut) "Vertex1", "Vertex2", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;CUT;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", + "Vertex4;:M;CUT;:H2:7,V", "Vertex7", "Vertex8", })); @@ -2546,13 +2546,13 @@ TEST_F(TopoShapeExpansionTest, makeElementTransformWithMap) "Vertex2", "Vertex2;:H2,V", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;FUS;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", - "Vertex5", + "Vertex4;:M;FUS;:H2:7,V", "Vertex5;:H2,V", - "Vertex6", + "Vertex5;:M;FUS;:H1:7,V", "Vertex6;:H2,V", + "Vertex6;:M;FUS;:H1:7,V", "Vertex7", "Vertex7;:H2,V", "Vertex8", @@ -2655,13 +2655,13 @@ TEST_F(TopoShapeExpansionTest, makeElementGTransformWithMap) "Vertex2", "Vertex2;:H2,V", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;FUS;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", - "Vertex5", + "Vertex4;:M;FUS;:H2:7,V", "Vertex5;:H2,V", - "Vertex6", + "Vertex5;:M;FUS;:H1:7,V", "Vertex6;:H2,V", + "Vertex6;:M;FUS;:H1:7,V", "Vertex7", "Vertex7;:H2,V", "Vertex8", @@ -3051,7 +3051,7 @@ TEST_F(TopoShapeExpansionTest, traceElement) "Edge2", "Edge2;:M;CUT;:H2:7,E", "Edge3", - "Edge3;:H2,E", + "Edge3;:M;CUT;:H2:7,E", "Edge4", "Edge4;:M;CUT;:H2:7,E", "Edge6;:G(Edge12;K-1;:H2:4,E);CUT;:H1:1b,V", @@ -3074,9 +3074,9 @@ TEST_F(TopoShapeExpansionTest, traceElement) "Vertex1", "Vertex2", "Vertex3", - "Vertex3;:H2,V", + "Vertex3;:M;CUT;:H2:7,V", "Vertex4", - "Vertex4;:H2,V", + "Vertex4;:M;CUT;:H2:7,V", "Vertex7", "Vertex8", })); diff --git a/tests/src/Mod/Part/App/brepfiles/cylinder1.brep b/tests/src/Mod/Part/App/brepfiles/cylinder1.brep new file mode 100644 index 0000000000..3d614668de --- /dev/null +++ b/tests/src/Mod/Part/App/brepfiles/cylinder1.brep @@ -0,0 +1,137 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 2 +1 + 1 0 0 0 + 0 1 0 0 + 0 0 1 0 +2 1 -1 0 +Curve2ds 6 +1 0 10 1 0 +2 0 0 1 0 -0 1 2 +1 6.2831853071795862 -0 0 1 +1 0 -0 0 1 +1 0 0 1 0 +2 0 0 1 0 -0 1 2 +Curves 3 +2 0 0 10 0 0 1 1 0 -0 -0 1 0 2 +1 2 -4.898425415289509e-16 0 0 0 1 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 2 +Polygon3D 0 +PolygonOnTriangulations 6 +26 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 +p 0.0310985626705653 1 0 0.251327412287184 0.502654824574367 0.753982236861551 1.00530964914873 1.25663706143592 1.5079644737231 1.75929188601029 2.01061929829747 2.26194671058465 2.51327412287184 2.76460153515902 3.0159289474462 3.26725635973339 3.51858377202057 3.76991118430776 4.02123859659494 4.27256600888212 4.52389342116931 4.77522083345649 5.02654824574367 5.27787565803086 5.52920307031804 5.78053048260523 6.03185789489241 6.28318530717959 +26 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 +p 0.0310985626705653 1 0 0.251327412287184 0.502654824574367 0.753982236861551 1.00530964914873 1.25663706143592 1.5079644737231 1.75929188601029 2.01061929829747 2.26194671058465 2.51327412287184 2.76460153515902 3.0159289474462 3.26725635973339 3.51858377202057 3.76991118430776 4.02123859659494 4.27256600888212 4.52389342116931 4.77522083345649 5.02654824574367 5.27787565803086 5.52920307031804 5.78053048260523 6.03185789489241 6.28318530717959 +2 27 2 +p 0.0310985626705653 1 0 10 +2 28 1 +p 0.0310985626705653 1 0 10 +26 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 27 +p 0.0310985626705653 1 0 0.251327412287184 0.502654824574367 0.753982236861551 1.00530964914873 1.25663706143592 1.5079644737231 1.75929188601029 2.01061929829747 2.26194671058465 2.51327412287184 2.76460153515902 3.0159289474462 3.26725635973339 3.51858377202057 3.76991118430776 4.02123859659494 4.27256600888212 4.52389342116931 4.77522083345649 5.02654824574367 5.27787565803086 5.52920307031804 5.78053048260523 6.03185789489241 6.28318530717959 +26 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 +p 0.0310985626705653 1 0 0.251327412287184 0.502654824574367 0.753982236861551 1.00530964914873 1.25663706143592 1.5079644737231 1.75929188601029 2.01061929829747 2.26194671058465 2.51327412287184 2.76460153515902 3.0159289474462 3.26725635973339 3.51858377202057 3.76991118430776 4.02123859659494 4.27256600888212 4.52389342116931 4.77522083345649 5.02654824574367 5.27787565803086 5.52920307031804 5.78053048260523 6.03185789489241 6.28318530717959 +Surfaces 3 +2 0 0 0 0 0 1 1 0 -0 -0 1 0 2 +1 0 0 10 0 0 1 1 0 -0 -0 1 0 +1 0 0 0 0 0 1 1 0 -0 -0 1 0 +Triangulations 3 +52 50 1 0.0157705973710445 +2 -4.89842541528951e-16 10 2 -4.89842541528951e-16 10 1.93716632225726 0.49737977432971 10 1.75261336008773 0.963507348203431 10 1.45793725484282 1.36909421185738 10 1.07165358995799 1.68865585100403 10 0.618033988749894 1.90211303259031 10 0.125581039058625 1.99605345685654 10 -0.374762629171451 1.96457450145738 10 -0.851558583130147 1.80965410493204 10 -1.27484797949738 1.54102648555158 10 -1.6180339887499 1.17557050458494 10 -1.8595529717765 0.736249105369352 10 -1.98422940262896 0.250666467128604 10 -1.98422940262896 -0.250666467128614 10 -1.8595529717765 -0.736249105369362 10 -1.61803398874989 -1.17557050458495 10 -1.27484797949737 -1.54102648555158 10 -0.851558583130138 -1.80965410493204 10 -0.374762629171441 -1.96457450145738 10 0.125581039058636 -1.99605345685654 10 0.618033988749905 -1.9021130325903 10 1.071653589958 -1.68865585100402 10 1.45793725484283 -1.36909421185737 10 1.75261336008773 -0.96350734820342 10 1.93716632225727 -0.497379774329697 10 2 -4.89842541528951e-16 0 2 -4.89842541528951e-16 0 1.93716632225726 0.49737977432971 0 1.75261336008773 0.963507348203431 0 1.45793725484282 1.36909421185738 0 1.07165358995799 1.68865585100403 0 0.618033988749894 1.90211303259031 0 0.125581039058625 1.99605345685654 0 -0.374762629171451 1.96457450145738 0 -0.851558583130147 1.80965410493204 0 -1.27484797949738 1.54102648555158 0 -1.6180339887499 1.17557050458494 0 -1.8595529717765 0.736249105369352 0 -1.98422940262896 0.250666467128604 0 -1.98422940262896 -0.250666467128614 0 -1.8595529717765 -0.736249105369362 0 -1.61803398874989 -1.17557050458495 0 -1.27484797949737 -1.54102648555158 0 -0.851558583130138 -1.80965410493204 0 -0.374762629171441 -1.96457450145738 0 0.125581039058636 -1.99605345685654 0 0.618033988749905 -1.9021130325903 0 1.071653589958 -1.68865585100402 0 1.45793725484283 -1.36909421185737 0 1.75261336008773 -0.96350734820342 0 1.93716632225727 -0.497379774329697 0 0 10 6.28318530717959 10 0.251327412287184 10 0.502654824574367 10 0.753982236861551 10 1.00530964914873 10 1.25663706143592 10 1.5079644737231 10 1.75929188601029 10 2.01061929829747 10 2.26194671058465 10 2.51327412287184 10 2.76460153515902 10 3.0159289474462 10 3.26725635973339 10 3.51858377202057 10 3.76991118430776 10 4.02123859659494 10 4.27256600888212 10 4.52389342116931 10 4.77522083345649 10 5.02654824574367 10 5.27787565803086 10 5.52920307031804 10 5.78053048260523 10 6.03185789489241 10 6.28318530717959 0 0 0 0.251327412287184 0 0.502654824574367 0 0.753982236861551 0 1.00530964914873 0 1.25663706143592 0 1.5079644737231 0 1.75929188601029 0 2.01061929829747 0 2.26194671058465 0 2.51327412287184 0 2.76460153515902 0 3.0159289474462 0 3.26725635973339 0 3.51858377202057 0 3.76991118430776 0 4.02123859659494 0 4.27256600888212 0 4.52389342116931 0 4.77522083345649 0 5.02654824574367 0 5.27787565803086 0 5.52920307031804 0 5.78053048260523 0 6.03185789489241 0 22 21 47 22 47 48 22 48 49 23 22 49 3 28 29 3 1 28 24 23 49 24 49 50 24 50 51 4 29 30 4 3 29 25 24 51 5 30 31 26 51 52 5 4 30 26 25 51 26 52 27 2 26 27 6 31 32 6 32 33 6 5 31 7 6 33 8 33 34 8 34 35 8 7 33 9 8 35 10 35 36 10 9 35 11 36 37 11 10 36 12 37 38 12 11 37 13 38 39 13 12 38 14 13 39 14 39 40 15 14 40 15 40 41 16 15 41 16 41 42 17 16 42 17 42 43 18 17 43 18 43 44 19 18 44 19 44 45 19 45 46 20 19 46 20 46 47 21 20 47 +26 25 1 2.22044604925031e-16 +2 -4.89842541528951e-16 10 1.93716632225726 0.49737977432971 10 1.75261336008773 0.963507348203431 10 1.45793725484282 1.36909421185738 10 1.07165358995799 1.68865585100403 10 0.618033988749894 1.90211303259031 10 0.125581039058625 1.99605345685654 10 -0.374762629171451 1.96457450145738 10 -0.851558583130147 1.80965410493204 10 -1.27484797949738 1.54102648555158 10 -1.6180339887499 1.17557050458494 10 -1.8595529717765 0.736249105369352 10 -1.98422940262896 0.250666467128604 10 -1.98422940262896 -0.250666467128614 10 -1.8595529717765 -0.736249105369362 10 -1.61803398874989 -1.17557050458495 10 -1.27484797949737 -1.54102648555158 10 -0.851558583130138 -1.80965410493204 10 -0.374762629171441 -1.96457450145738 10 0.125581039058636 -1.99605345685654 10 0.618033988749905 -1.9021130325903 10 1.071653589958 -1.68865585100402 10 1.45793725484283 -1.36909421185737 10 1.75261336008773 -0.96350734820342 10 1.93716632225727 -0.497379774329697 10 0.0078852986855219 3.33066907387547e-16 10 2 0 1.93716632225726 0.49737977432971 1.75261336008773 0.963507348203431 1.45793725484282 1.36909421185738 1.07165358995799 1.68865585100403 0.618033988749894 1.90211303259031 0.125581039058625 1.99605345685654 -0.374762629171451 1.96457450145738 -0.851558583130147 1.80965410493204 -1.27484797949738 1.54102648555158 -1.6180339887499 1.17557050458494 -1.8595529717765 0.736249105369352 -1.98422940262896 0.250666467128604 -1.98422940262896 -0.250666467128614 -1.8595529717765 -0.736249105369362 -1.61803398874989 -1.17557050458495 -1.27484797949737 -1.54102648555158 -0.851558583130138 -1.80965410493204 -0.374762629171441 -1.96457450145738 0.125581039058636 -1.99605345685654 0.618033988749904 -1.9021130325903 1.071653589958 -1.68865585100402 1.45793725484283 -1.36909421185737 1.75261336008773 -0.96350734820342 1.93716632225727 -0.497379774329697 0.00788529868552179 2.22044604925031e-16 26 1 2 26 2 3 26 3 4 26 4 5 26 5 6 26 6 7 26 7 8 26 8 9 26 9 10 26 10 11 26 11 12 26 12 13 26 13 14 26 14 15 26 15 16 26 16 17 26 17 18 26 18 19 26 19 20 26 20 21 26 21 22 26 22 23 26 23 24 26 24 25 26 25 1 +26 25 1 2.22044604925031e-16 +2 -4.89842541528951e-16 0 1.93716632225726 0.49737977432971 0 1.75261336008773 0.963507348203431 0 1.45793725484282 1.36909421185738 0 1.07165358995799 1.68865585100403 0 0.618033988749894 1.90211303259031 0 0.125581039058625 1.99605345685654 0 -0.374762629171451 1.96457450145738 0 -0.851558583130147 1.80965410493204 0 -1.27484797949738 1.54102648555158 0 -1.6180339887499 1.17557050458494 0 -1.8595529717765 0.736249105369352 0 -1.98422940262896 0.250666467128604 0 -1.98422940262896 -0.250666467128614 0 -1.8595529717765 -0.736249105369362 0 -1.61803398874989 -1.17557050458495 0 -1.27484797949737 -1.54102648555158 0 -0.851558583130138 -1.80965410493204 0 -0.374762629171441 -1.96457450145738 0 0.125581039058636 -1.99605345685654 0 0.618033988749905 -1.9021130325903 0 1.071653589958 -1.68865585100402 0 1.45793725484283 -1.36909421185737 0 1.75261336008773 -0.96350734820342 0 1.93716632225727 -0.497379774329697 0 0.0078852986855219 3.33066907387547e-16 0 2 0 1.93716632225726 0.49737977432971 1.75261336008773 0.963507348203431 1.45793725484282 1.36909421185738 1.07165358995799 1.68865585100403 0.618033988749894 1.90211303259031 0.125581039058625 1.99605345685654 -0.374762629171451 1.96457450145738 -0.851558583130147 1.80965410493204 -1.27484797949738 1.54102648555158 -1.6180339887499 1.17557050458494 -1.8595529717765 0.736249105369352 -1.98422940262896 0.250666467128604 -1.98422940262896 -0.250666467128614 -1.8595529717765 -0.736249105369362 -1.61803398874989 -1.17557050458495 -1.27484797949737 -1.54102648555158 -0.851558583130138 -1.80965410493204 -0.374762629171441 -1.96457450145738 0.125581039058636 -1.99605345685654 0.618033988749904 -1.9021130325903 1.071653589958 -1.68865585100402 1.45793725484283 -1.36909421185737 1.75261336008773 -0.96350734820342 1.93716632225727 -0.497379774329697 0.00788529868552179 2.22044604925031e-16 26 1 2 26 2 3 26 3 4 26 4 5 26 5 6 26 6 7 26 7 8 26 8 9 26 9 10 26 10 11 26 11 12 26 12 13 26 13 14 26 14 15 26 15 16 26 16 17 26 17 18 26 18 19 26 19 20 26 20 21 26 21 22 26 22 23 26 23 24 26 24 25 26 25 1 + +TShapes 15 +Ve +1e-07 +2 -4.89842541528951e-16 10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 6.28318530717959 +2 1 1 0 0 6.28318530717959 +2 2 2 0 0 6.28318530717959 +6 1 1 0 +6 2 2 0 +0 + +0101100 ++15 2 -15 2 * +Ve +1e-07 +2 -4.89842541528951e-16 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 2 0 0 10 +3 3 4CN 1 0 0 10 +7 3 4 1 0 +0 + +0101000 +-15 2 +13 2 * +Ed + 1e-07 1 1 0 +1 3 0 0 6.28318530717959 +2 5 1 0 0 6.28318530717959 +2 6 3 0 0 6.28318530717959 +6 5 1 0 +6 6 3 0 +0 + +0101100 ++13 2 -13 2 * +Wi + +0101000 +-14 0 +12 0 +11 0 -12 0 * +Fa +0 1e-07 1 0 +2 1 +0101000 ++10 0 * +Wi + +0101000 ++14 0 * +Fa +0 1e-07 2 0 +2 2 +0101000 ++8 0 * +Wi + +0101000 +-11 0 * +Fa +0 1e-07 3 0 +2 3 +0101000 +-6 0 * +Sh + +0101100 ++9 0 +7 0 -5 0 * +So + +0100100 ++4 0 * +Co + +0100000 ++3 1 * +Co + +1100000 ++2 0 * + ++1 0 diff --git a/tests/src/Mod/Part/App/brepfiles/helix1.brep b/tests/src/Mod/Part/App/brepfiles/helix1.brep new file mode 100644 index 0000000000..d081b7f15b --- /dev/null +++ b/tests/src/Mod/Part/App/brepfiles/helix1.brep @@ -0,0 +1,903 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 1 +1 + 1 0 0 0 + 0 -2.22044604925031e-16 -1 0 + 0 1 -2.22044604925031e-16 0 +Curve2ds 60 +1 0 0 1 0 +1 0 0 1 0 +1 0 0 1 0 +1 0 0 0 1 +8 0 6.2870356770386975 +1 1.1180339887492663 0 0 1 +1 0.99999999999999989 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 0.99999999999999989 +1 0 0 1 0 +1 0 0 0 1 +8 0 6.2870356770386975 +1 1.1180339887492663 0 0 1 +1 0.99999999999999989 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 0.99999999999999989 +1 0 0 1 0 +1 0 0 0 1 +8 0 6.2870356770386975 +1 1.1180339887492663 0 0 1 +1 0.99999999999999989 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 0.99999999999999989 +1 0 0 1 0 +1 0 0 0 1 +8 0 6.2870356770386975 +1 1.1180339887492663 0 0 1 +1 0.99999999999999989 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 0.99999999999999989 +1 0 0 1 0 +1 0 0 0 1 +8 0 3.4292921874756512 +1 1.1180339887492663 0 0 1 +1 0.99999999999999989 0 0 1 +8 0 3.4292921874756512 +1 0 0 0 1 +1 0 3.4292921874756512 1 0 +1 1.1180339887505235 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887505235 +1 0 0 1 0 +1 1.1180339887505235 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887505235 +1 0 0 1 0 +1 1.1180339887505235 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887505235 +1 0 0 1 0 +1 1.1180339887505235 0 0 1 +8 0 6.2870356770386975 +1 0 0 0 1 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887505235 +1 0 0 1 0 +1 1.1180339887505235 0 0 1 +8 0 3.4292921874756512 +1 0 0 0 1 +1 0 3.4292921874756512 1 0 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887492663 +1 0 0 1 0 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887492663 +1 0 0 1 0 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887492663 +1 0 0 1 0 +1 0 6.2870356770386975 1 0 +8 0 1.1180339887492663 +1 0 0 1 0 +1 0 3.4292921874756512 1 0 +Curves 33 +7 0 0 1 2 2 2.0000000000000306 9.0938367947046572e-13 1.6684810553702823e-15 2.0000000000000284 1.0000000000009095 1.8067860570396971e-15 + 0 2 0.99999999999999989 2 +7 0 0 1 2 2 2.0000000000000275 0.99999999999999989 1.2482846049280778e-15 3.0000000000000262 0.49999999999909028 2.64590224776542e-15 + 0 2 1.1180339887505235 2 +7 0 0 1 2 2 3.0000000000000262 0.49999999999909028 2.64590224776542e-15 2.0000000000000266 -1.1102230246251565e-16 1.735593475076781e-15 + 0 2 1.1180339887492663 2 +7 0 0 10 11 2 2.0000000000000306 9.0938367947046572e-13 1.6684810553702823e-15 1.999999959939065 0.11000000199007182 -1.2566338554788934 1.1228905917351018 0.21999999529312889 -2.5142965052784554 -0.63337553221942444 0.33000000849324884 -3.074762622374831 -2.6388940263357452 0.43999999335094497 -2.2895691041051509 -3.7012392763888831 0.5500000002214146 -2.6799449770464936e-08 -2.6388942634676984 0.66000000729935382 2.289569143296684 -0.6333752369905884 0.76999999205562586 3.0747626064836964 1.122890401259464 0.88000000523279343 2.5142965081779178 2.0000000280573076 0.98999999860754562 1.2566338556980587 1.9999999889437008 1.1000000005496986 7.9688529331130179e-11 + 0 11 6.2870356770386975 11 +7 0 0 10 11 2 2.0000000000000284 1.0000000000009095 1.8067860570396971e-15 1.9999999599470493 1.1100000019901159 -1.2566338554796066 1.1228905917164054 1.2199999952962788 -2.5142965052802975 -0.6333755321888157 1.3300000084765569 -3.0747626223748288 -2.6388940263641505 1.4399999933898993 -2.2895691041104191 -3.7012392763868704 1.5500000001715462 -2.6794308105593292e-08 -2.6388942634487753 1.6600000073384424 2.2895691432943206 -0.6333752370187804 1.7699999920387648 3.0747626064869191 1.1228904012785821 1.8800000052360488 2.5142965081790924 2.0000000280516921 1.9899999986075592 1.2566338556987795 1.9999999889459432 2.1000000005496986 7.9688667636131848e-11 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999889437008 1.1000000005496986 7.9688529331130179e-11 1.9999999889459432 2.1000000005496986 7.9688667636131848e-11 + 0 2 0.99999999999999989 2 +7 0 0 10 11 2 1.9999999889438393 1.1000000005506081 7.9573322520480816e-11 1.9999999504327597 1.2100000024638651 -1.2566338485000579 1.1228905841713051 1.3199999958902204 -2.5142964936684566 -0.63337552679389553 1.4300000089461606 -3.0747626022633292 -2.6388940137391041 1.5399999939296962 -2.2895690975066207 -3.7012392571699686 1.6500000007173401 -2.1274036754448425e-08 -2.6388942480372157 1.7600000078276066 2.2895691263877964 -0.63337523498080051 1.8699999925830786 3.0747625936187082 1.1228903958652039 1.9800000057520644 2.514296493179764 2.0000000172065762 2.0899999991450695 1.2566338495544689 1.9999999786182334 2.2000000010621084 1.498650320469746e-10 + 0 11 6.2870356770386975 11 +7 0 0 10 11 2 1.9999999889460875 2.1000000005506076 7.9569716671940351e-11 1.9999999504427557 2.2100000024638762 -1.2566338485020818 1.1228905841539827 2.3199999958947446 -2.5142964936729517 -0.63337552676433961 2.4300000089179838 -3.0747626022660426 -2.6388940137698809 2.5399999939944702 -2.2895690975160075 -3.7012392571715007 2.6500000006299165 -2.1266290062271801e-08 -2.6388942480221624 2.7600000079011782 2.2895691263853917 -0.63337523500900739 2.8699999925487942 3.0747625936265219 1.1228903958853254 2.9800000057580278 2.5142964931831826 2.0000000172031585 3.0899999991450615 1.256633849556545 1.9999999786225262 3.2000000010621079 1.4986675526895234e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999786182334 2.2000000010621084 1.498650320469746e-10 1.9999999786225262 3.2000000010621079 1.4986675526895234e-10 + 0 2 0.99999999999999989 2 +7 0 0 10 11 2 1.9999999786181786 2.2000000010621079 1.4993260157095021e-10 1.9999999400738631 2.3100000029808276 -1.2566338420167411 1.1228905772510862 2.4199999964632046 -2.5142964794265734 -0.63337552098851213 2.5300000094244859 -3.0747625870472812 -2.6388940021707605 2.6399999943919257 -2.2895690849360779 -3.7012392363085422 2.7500000014736909 -2.2093992413374548e-08 -2.638894233520348 2.8600000080243344 2.2895691152357105 -0.63337523368614168 2.9699999933701364 3.0747625761742614 1.1228903911008323 3.0800000061624324 2.5142964805065611 2.0000000063123959 3.1899999996821689 1.2566338429759571 1.9999999678044289 3.300000001599074 2.0309046120301625e-10 + 0 11 6.2870356770386975 11 +7 0 0 10 11 2 1.9999999786224718 3.2000000010621079 1.4993245955643687e-10 1.9999999400858754 3.3100000029809165 -1.2566338420201038 1.1228905772354529 3.4199999964662728 -2.5142964794336784 -0.63337552096141658 3.530000009400982 -3.0747625870539368 -2.6388940022006375 3.6399999944497425 -2.2895690849458434 -3.7012392363187367 3.7500000013920904 -2.2089328588492702e-08 -2.638894233504244 3.8600000080946613 2.2895691152386886 -0.63337523371668869 3.9699999933346248 3.0747625761836828 1.1228903911224484 4.0800000061691435 2.5142964805130732 2.0000000063110868 4.1899999996822723 1.2566338429793282 1.999999967810852 4.3000000015990736 2.0308943101008321e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999678044289 3.300000001599074 2.0309046120301625e-10 1.999999967810852 4.3000000015990736 2.0308943101008321e-10 + 0 2 0.99999999999999989 2 +7 0 0 10 11 2 1.9999999678044258 3.3000000015990736 2.0309866472500391e-10 1.9999999279238478 3.4100000035856528 -1.2566338351063444 1.1228905729919101 3.5199999969246787 -2.5142964646674235 -0.63337551712705942 3.6300000099194438 -3.074762572896566 -2.6388939950858141 3.7399999954130898 -2.2895690671737792 -3.701239199025594 3.8500000010453497 -2.8316819999929571e-08 -2.638894240086211 3.9600000097382408 2.289569107254986 -0.63337521336332525 4.0699999930152293 3.0747625569284258 1.1228903762540163 4.1800000071518646 2.5142964672592112 1.9999999975765625 4.2900000001133263 1.2566338359369953 1.9999999567633309 4.4000000021460446 3.4089193414872246e-10 + 0 11 6.2870356770386975 11 +7 0 0 10 11 2 1.9999999678108487 4.3000000015990727 2.0310001286277759e-10 1.9999999279383043 4.4100000035856688 -1.2566338351111224 1.122890572977371 4.5199999969270834 -2.5142964646772947 -0.63337551710101136 4.6300000099037906 -3.0747625729062196 -2.6388939951173178 4.7399999954404937 -2.2895690671867799 -3.7012391990426692 4.8500000010168538 -2.8311815114534561e-08 -2.6388942400694013 4.9600000097581329 2.28956910726074 -0.63337521339745995 5.0699999930075235 3.0747625569407111 1.1228903762783815 5.1800000071517864 2.5142964672688786 1.999999997577024 5.2900000001133138 1.2566338359416902 1.9999999567719706 5.4000000021460428 3.4087463053968244e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999567633309 4.4000000021460446 3.4089193414872246e-10 1.9999999567719706 5.4000000021460428 3.4087463053968244e-10 + 0 2 0.99999999999999989 2 +7 0 0 7 8 2 1.9999999567634459 4.4000000021451351 3.4084246536281171e-10 2.0000002640696679 4.4857142726286385 -0.97919124939730628 1.4406779014824571 4.5714286200977545 -1.9568429588808502 0.32256706838431459 4.65714278042977 -2.5610970658126595 -1.0310446917849259 4.7428572231265349 -2.3664775333082049 -1.9336277920152993 4.8285713826164374 -1.4716907680536384 -2.1948556793096836 4.914285730957423 -0.37606210629261111 -1.9189859268982161 5.0000000010577432 0.5634651072808482 + 0 8 3.4292921874756512 8 +7 0 0 7 8 2 1.9999999567720863 5.4000000021451333 3.4082825450809651e-10 2.0000002640168799 5.4857142726286572 -0.97919124940054725 1.440677901603262 5.5714286201005256 -1.956842958876841 0.32256706831810533 5.6571427804273915 -2.561097065856611 -1.0310446918474518 5.7428572231258039 -2.3664775332620946 -1.9336277919102527 5.8285713826187129 -1.4716907681020224 -2.1948556793750762 5.9142857309574053 -0.37606210627671594 -1.91898592690228 6.0000000010577423 0.56346510728208499 + 0 8 3.4292921874756512 8 +7 0 0 1 2 2 -1.9189859268982161 5.0000000010577432 0.5634651072808482 -1.91898592690228 6.0000000010577423 0.56346510728208499 + 0 2 0.99999999999999989 2 +7 0 0 10 11 2 3.0000000000000262 0.49999999999909028 2.64590224776542e-15 2.9999999599430494 0.61000000198025983 -1.8849523991101589 1.6843358541807412 0.71999999532856152 -3.7714388372926861 -0.95006329236532527 0.83000000838478272 -4.6121543037994446 -3.9583409408894639 0.9399999935088923 -3.4343447840084473 -5.5518591362037464 1.0500000000726892 -2.6801831864986571e-08 -3.9583411779967386 1.1600000073662897 3.4343448232057008 -0.95006299716576159 1.2699999920433398 4.6121542879044508 1.6843356637246436 1.3800000052181578 3.771438840193881 3.000000028054711 1.4899999986117534 1.8849523993284072 2.9999999889448357 1.6000000005460604 7.9366400412257482e-11 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999889459439 2.1000000005487891 7.9688997313099437e-11 2.9999999889448357 1.6000000005460604 7.9366400412257482e-11 + 0 2 1.1180339887505235 2 +7 0 0 10 11 2 2.999999988944976 1.6000000005460602 7.9250740617934832e-11 2.9999999504375432 1.7100000024516238 -1.8849523921333624 1.6843358466169605 1.8199999959049489 -3.7714388256798435 -0.95006328694068609 1.9300000089020084 -4.6121542837014822 -3.95834092829466 2.0399999939710258 -3.4343447773886919 -5.5518591169866616 2.1500000006882662 -2.1303298680663866e-08 -3.9583411625671245 2.2600000078083955 3.4343448063231747 -0.95006299515631087 2.3699999926109152 4.6121542750259197 1.6843356583319962 2.4800000057243063 3.7714388252032625 3.0000000172052164 2.5899999991464546 1.8849523931834573 2.9999999786203655 2.7000000010557414 1.4926020001166973e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999786225262 3.2000000010611984 1.4986436523883961e-10 2.9999999786203655 2.7000000010557414 1.4926020001166973e-10 + 0 2 1.1180339887505235 2 +7 0 0 10 11 2 2.9999999786203113 2.7000000010557414 1.493250228982142e-10 2.9999999400794013 2.8100000029668268 -1.8849523856500396 1.6843358396979533 2.9199999964709473 -3.7714388114427502 -0.95006328113862848 3.0300000093814292 -4.6121542684796086 -3.9583409167230954 3.1399999944454362 -3.4343447648292291 -5.5518590961329659 3.250000001403254 -2.211391869622052e-08 -3.9583411480468893 3.3600000080552288 3.4343447951676214 -0.95006299386368853 3.469999993355684 4.6121542575846384 1.6843356535689435 3.5800000061467721 3.7714388125311884 3.0000000063121735 3.6899999996808979 1.8849523866053275 2.9999999678076414 3.8000000015899791 2.0226724577899886e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999678108524 4.3000000015981641 2.0308942781058091e-10 2.9999999678076414 3.8000000015899791 2.0226724577899886e-10 + 0 2 1.1180339887505235 2 +7 0 0 10 11 2 2.9999999678076419 3.8000000015899786 2.0228197919908545e-10 2.9999999279305172 3.9100000035685993 -1.8849523787403486 1.6843358354390539 4.0199999969387505 -3.7714387966862271 -0.95006327727783102 4.130000009847369 -4.6121542543265557 -3.9583409096400803 4.2399999955134353 -3.4343447470762434 -5.5518590588514121 4.3500000009162774 -2.8324961931502962e-08 -3.9583411546147409 4.4600000098022869 3.4343447871776691 -0.95006297354057856 4.569999992988012 4.612154238347574 1.6843356387230635 4.6800000071346206 3.7714387992820004 2.9999999975774561 4.7900000001106369 1.8849523795677556 2.9999999567676552 4.9000000021351298 3.3978766941952692e-10 + 0 11 6.2870356770386975 11 +7 0 0 1 2 2 1.9999999567719688 5.4000000021451333 3.4087654078806909e-10 2.9999999567676552 4.9000000021351298 3.3978766941952692e-10 + 0 2 1.1180339887505235 2 +7 0 0 8 9 2 2.9999999567677649 4.9000000021351298 3.397406800331737e-10 3.0000002256333747 4.9749999888619385 -1.2851913641367954 2.3705073010240469 5.0500000328942178 -2.5704115958869975 1.1136055593857705 5.1249999710601237 -3.4960865104568501 -0.53250205740685397 5.2000000008716958 -3.7036172149772306 -2.0534544967400987 5.2750000334473137 -3.0407322012228404 -2.9986555539519255 5.3499999696162943 -1.7984423363377851 -3.2405588854226228 5.4250000146594397 -0.38793449825195131 -2.8784789005144367 5.5000000010522854 0.84519766412397335 + 0 9 3.4292921874756512 9 +7 0 0 1 2 2 -1.9189859269022804 6.000000001056832 0.56346510728208465 -2.8784789005144367 5.5000000010522854 0.84519766412397335 + 0 2 1.1180339887505235 2 +7 0 0 1 2 2 2.9999999889448357 1.6000000005460604 7.9366400412257482e-11 1.9999999889436957 1.1000000005487891 7.9689484621969586e-11 + 0 2 1.1180339887492663 2 +7 0 0 1 2 2 2.9999999786203655 2.7000000010557414 1.4926020001166973e-10 1.9999999786182339 2.2000000010611989 1.4986414387580778e-10 + 0 2 1.1180339887492663 2 +7 0 0 1 2 2 2.9999999678076414 3.8000000015899791 2.0226724577899886e-10 1.9999999678044273 3.3000000015981645 2.030895970084515e-10 + 0 2 1.1180339887492663 2 +7 0 0 1 2 2 2.9999999567676552 4.9000000021351298 3.3978766941952692e-10 1.9999999567633331 4.4000000021451351 3.4089091691064752e-10 + 0 2 1.1180339887492663 2 +7 0 0 1 2 2 -2.8784789005144367 5.5000000010522854 0.84519766412397335 -1.9189859268982157 5.0000000010568328 0.56346510728084809 + 0 2 1.1180339887492663 2 +Polygon3D 0 +PolygonOnTriangulations 0 +Surfaces 17 +1 2.3454915028125551 0.49999999999961142 2.2204460492560777e-16 9.2179164606366873e-45 -4.4408920985006262e-16 -1 -2.0756902568627873e-29 1 -4.4408920985006262e-16 1 -2.0756902568627873e-29 0 +9 0 0 0 0 1 10 2 11 2 2 2.0000000000000306 9.0938367947046572e-13 1.6684810553702823e-15 1.999999959939065 0.11000000199007182 -1.2566338554788934 1.1228905917351018 0.21999999529312889 -2.5142965052784554 -0.63337553221942444 0.33000000849324884 -3.074762622374831 -2.6388940263357452 0.43999999335094497 -2.2895691041051509 -3.7012392763888831 0.5500000002214146 -2.6799449770464936e-08 -2.6388942634676984 0.66000000729935382 2.289569143296684 -0.6333752369905884 0.76999999205562586 3.0747626064836964 1.122890401259464 0.88000000523279343 2.5142965081779178 2.0000000280573076 0.98999999860754562 1.2566338556980587 1.9999999889437008 1.1000000005496986 7.9688529331130179e-11 +2.0000000000000284 1.0000000000009095 1.8067860570396971e-15 1.9999999599470493 1.1100000019901159 -1.2566338554796066 1.1228905917164054 1.2199999952962788 -2.5142965052802975 -0.6333755321888157 1.3300000084765569 -3.0747626223748288 -2.6388940263641505 1.4399999933898993 -2.2895691041104191 -3.7012392763868704 1.5500000001715462 -2.6794308105593292e-08 -2.6388942634487753 1.6600000073384424 2.2895691432943206 -0.6333752370187804 1.7699999920387648 3.0747626064869191 1.1228904012785821 1.8800000052360488 2.5142965081790924 2.0000000280516921 1.9899999986075592 1.2566338556987795 1.9999999889459432 2.1000000005496986 7.9688667636131848e-11 + +0 2 +0.99999999999999989 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 2.0000000000000275 0.99999999999999989 1.2482846049280778e-15 1.9999999599470515 1.1100000019892178 -1.2566338554796033 1.122890591716257 1.2199999952953255 -2.5142965052803392 -0.63337553218827447 1.3300000084757466 -3.0747626223746574 -2.6388940263652154 1.4399999933888332 -2.289569104110813 -3.7012392763855941 1.5500000001708156 -2.6793766316757275e-08 -2.6388942634497043 1.66000000733738 2.2895691432938867 -0.63337523701841136 1.7699999920379506 3.0747626064871429 1.1228904012785161 1.8800000052350989 2.5142965081790125 2.0000000280516912 1.9899999986066599 1.2566338556987984 1.9999999889459439 2.1000000005487891 7.9688997313099437e-11 +3.0000000000000262 0.49999999999909028 2.64590224776542e-15 2.9999999599430494 0.61000000198025983 -1.8849523991101589 1.6843358541807412 0.71999999532856152 -3.7714388372926861 -0.95006329236532527 0.83000000838478272 -4.6121543037994446 -3.9583409408894639 0.9399999935088923 -3.4343447840084473 -5.5518591362037464 1.0500000000726892 -2.6801831864986571e-08 -3.9583411779967386 1.1600000073662897 3.4343448232057008 -0.95006299716576159 1.2699999920433398 4.6121542879044508 1.6843356637246436 1.3800000052181578 3.771438840193881 3.000000028054711 1.4899999986117534 1.8849523993284072 2.9999999889448357 1.6000000005460604 7.9366400412257482e-11 + +0 2 +1.1180339887505235 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 3.0000000000000262 0.49999999999909028 2.64590224776542e-15 2.9999999599430494 0.61000000198025983 -1.8849523991101589 1.6843358541807412 0.71999999532856152 -3.7714388372926861 -0.95006329236532527 0.83000000838478272 -4.6121543037994446 -3.9583409408894639 0.9399999935088923 -3.4343447840084473 -5.5518591362037464 1.0500000000726892 -2.6801831864986571e-08 -3.9583411779967386 1.1600000073662897 3.4343448232057008 -0.95006299716576159 1.2699999920433398 4.6121542879044508 1.6843356637246436 1.3800000052181578 3.771438840193881 3.000000028054711 1.4899999986117534 1.8849523993284072 2.9999999889448357 1.6000000005460604 7.9366400412257482e-11 +2.0000000000000266 -1.1102230246251565e-16 1.735593475076781e-15 1.9999999599390308 0.11000000198916553 -1.2566338554788903 1.122890591735237 0.2199999952922061 -2.5142965052784754 -0.63337553221974396 0.33000000849237049 -3.0747626223747639 -2.6388940263352585 0.43999999334998541 -2.2895691041053015 -3.7012392763894 0.55000000022056506 -2.6799223284967912e-08 -2.6388942634673 0.66000000729838948 2.2895691432964478 -0.63337523699080889 0.76999999205475389 3.074762606483866 1.1228904012595493 0.88000000523186561 2.5142965081778392 2.0000000280572845 0.98999999860664134 1.2566338556980781 1.9999999889436957 1.1000000005487891 7.9689484621969586e-11 + +0 2 +1.1180339887492663 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999889438393 1.1000000005506081 7.9573322520480816e-11 1.9999999504327597 1.2100000024638651 -1.2566338485000579 1.1228905841713051 1.3199999958902204 -2.5142964936684566 -0.63337552679389553 1.4300000089461606 -3.0747626022633292 -2.6388940137391041 1.5399999939296962 -2.2895690975066207 -3.7012392571699686 1.6500000007173401 -2.1274036754448425e-08 -2.6388942480372157 1.7600000078276066 2.2895691263877964 -0.63337523498080051 1.8699999925830786 3.0747625936187082 1.1228903958652039 1.9800000057520644 2.514296493179764 2.0000000172065762 2.0899999991450695 1.2566338495544689 1.9999999786182334 2.2000000010621084 1.498650320469746e-10 +1.9999999889460875 2.1000000005506076 7.9569716671940351e-11 1.9999999504427557 2.2100000024638762 -1.2566338485020818 1.1228905841539827 2.3199999958947446 -2.5142964936729517 -0.63337552676433961 2.4300000089179838 -3.0747626022660426 -2.6388940137698809 2.5399999939944702 -2.2895690975160075 -3.7012392571715007 2.6500000006299165 -2.1266290062271801e-08 -2.6388942480221624 2.7600000079011782 2.2895691263853917 -0.63337523500900739 2.8699999925487942 3.0747625936265219 1.1228903958853254 2.9800000057580278 2.5142964931831826 2.0000000172031585 3.0899999991450615 1.256633849556545 1.9999999786225262 3.2000000010621079 1.4986675526895234e-10 + +0 2 +0.99999999999999989 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 2.999999988944976 1.6000000005460602 7.9250740617934832e-11 2.9999999504375432 1.7100000024516238 -1.8849523921333624 1.6843358466169605 1.8199999959049489 -3.7714388256798435 -0.95006328694068609 1.9300000089020084 -4.6121542837014822 -3.95834092829466 2.0399999939710258 -3.4343447773886919 -5.5518591169866616 2.1500000006882662 -2.1303298680663866e-08 -3.9583411625671245 2.2600000078083955 3.4343448063231747 -0.95006299515631087 2.3699999926109152 4.6121542750259197 1.6843356583319962 2.4800000057243063 3.7714388252032625 3.0000000172052164 2.5899999991464546 1.8849523931834573 2.9999999786203655 2.7000000010557414 1.4926020001166973e-10 +1.9999999889438407 1.1000000005496986 7.957332252773369e-11 1.9999999504327932 1.2100000024629605 -1.2566338485000514 1.1228905841711276 1.319999995889297 -2.5142964936684877 -0.63337552679335152 1.4300000089452689 -3.0747626022632453 -2.6388940137400763 1.5399999939287836 -2.2895690975067469 -3.7012392571688522 1.6500000007164088 -2.1273940831179098e-08 -2.6388942480380755 1.760000007826731 2.2895691263877631 -0.6333752349803482 1.8699999925821442 3.0747625936187144 1.1228903958650478 1.9800000057511637 2.5142964931797618 2.0000000172066046 2.0899999991441587 1.2566338495544667 1.9999999786182339 2.2000000010611989 1.4986414387580778e-10 + +0 2 +1.1180339887492663 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999889460875 2.1000000005496982 7.957176753392612e-11 1.9999999504427557 2.2100000024630013 -1.2566338485020756 1.1228905841539827 2.3199999958936943 -2.5142964936730134 -0.63337552676433961 2.4300000089174172 -3.0747626022659365 -2.6388940137698809 2.5399999939929776 -2.289569097516214 -3.7012392571715007 2.6500000006297264 -2.126587883566348e-08 -2.6388942480221624 2.760000007899631 2.2895691263849041 -0.63337523500900739 2.8699999925482822 3.0747625936267986 1.1228903958853254 2.9800000057569522 2.5142964931831022 2.0000000172031585 3.089999999144192 1.2566338495565548 1.9999999786225262 3.2000000010611984 1.4986436523883961e-10 +2.999999988944976 1.6000000005460602 7.9250740617934832e-11 2.9999999504375432 1.7100000024516238 -1.8849523921333624 1.6843358466169605 1.8199999959049489 -3.7714388256798435 -0.95006328694068609 1.9300000089020084 -4.6121542837014822 -3.95834092829466 2.0399999939710258 -3.4343447773886919 -5.5518591169866616 2.1500000006882662 -2.1303298680663866e-08 -3.9583411625671245 2.2600000078083955 3.4343448063231747 -0.95006299515631087 2.3699999926109152 4.6121542750259197 1.6843356583319962 2.4800000057243063 3.7714388252032625 3.0000000172052164 2.5899999991464546 1.8849523931834573 2.9999999786203655 2.7000000010557414 1.4926020001166973e-10 + +0 2 +1.1180339887505235 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999786181786 2.2000000010621079 1.4993260157095021e-10 1.9999999400738631 2.3100000029808276 -1.2566338420167411 1.1228905772510862 2.4199999964632046 -2.5142964794265734 -0.63337552098851213 2.5300000094244859 -3.0747625870472812 -2.6388940021707605 2.6399999943919257 -2.2895690849360779 -3.7012392363085422 2.7500000014736909 -2.2093992413374548e-08 -2.638894233520348 2.8600000080243344 2.2895691152357105 -0.63337523368614168 2.9699999933701364 3.0747625761742614 1.1228903911008323 3.0800000061624324 2.5142964805065611 2.0000000063123959 3.1899999996821689 1.2566338429759571 1.9999999678044289 3.300000001599074 2.0309046120301625e-10 +1.9999999786224718 3.2000000010621079 1.4993245955643687e-10 1.9999999400858754 3.3100000029809165 -1.2566338420201038 1.1228905772354529 3.4199999964662728 -2.5142964794336784 -0.63337552096141658 3.530000009400982 -3.0747625870539368 -2.6388940022006375 3.6399999944497425 -2.2895690849458434 -3.7012392363187367 3.7500000013920904 -2.2089328588492702e-08 -2.638894233504244 3.8600000080946613 2.2895691152386886 -0.63337523371668869 3.9699999933346248 3.0747625761836828 1.1228903911224484 4.0800000061691435 2.5142964805130732 2.0000000063110868 4.1899999996822723 1.2566338429793282 1.999999967810852 4.3000000015990736 2.0308943101008321e-10 + +0 2 +0.99999999999999989 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 2.9999999786203113 2.7000000010557414 1.493250228982142e-10 2.9999999400794013 2.8100000029668268 -1.8849523856500396 1.6843358396979533 2.9199999964709473 -3.7714388114427502 -0.95006328113862848 3.0300000093814292 -4.6121542684796086 -3.9583409167230954 3.1399999944454362 -3.4343447648292291 -5.5518590961329659 3.250000001403254 -2.211391869622052e-08 -3.9583411480468893 3.3600000080552288 3.4343447951676214 -0.95006299386368853 3.469999993355684 4.6121542575846384 1.6843356535689435 3.5800000061467721 3.7714388125311884 3.0000000063121735 3.6899999996808979 1.8849523866053275 2.9999999678076414 3.8000000015899791 2.0226724577899886e-10 +1.9999999786181779 2.2000000010611984 1.4993262555480516e-10 1.999999940073848 2.3100000029799634 -1.2566338420167473 1.1228905772511177 2.4199999964621095 -2.5142964794265605 -0.63337552098855121 2.5300000094240174 -3.0747625870473176 -2.6388940021707392 2.6399999943902857 -2.28956908493599 -3.70123923630852 2.7500000014736599 -2.2094124751959083e-08 -2.6388942335204049 2.8600000080226584 2.2895691152358406 -0.6333752336860754 2.9699999933697065 3.074762576174181 1.1228903911007879 3.0800000061613169 2.5142964805065904 2.0000000063124097 3.1899999996813118 1.2566338429759545 1.9999999678044273 3.3000000015981645 2.030895970084515e-10 + +0 2 +1.1180339887492663 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999786224714 3.2000000010611984 1.4993156817851488e-10 1.9999999400858832 3.3100000029800039 -1.2566338420200993 1.1228905772354258 3.4199999964653824 -2.5142964794336957 -0.63337552096137206 3.5300000094000121 -3.0747625870538924 -2.6388940022006326 3.6399999944489672 -2.2895690849459234 -3.7012392363188105 3.7500000013909731 -2.2089225559796017e-08 -2.6388942335041543 3.8600000080939694 2.2895691152385909 -0.63337523371675097 3.9699999933335639 3.0747625761837516 1.122890391122479 4.0800000061683024 2.5142964805130394 2.0000000063110819 4.189999999681346 1.2566338429793371 1.9999999678108524 4.3000000015981641 2.0308942781058091e-10 +2.9999999786203113 2.7000000010557414 1.493250228982142e-10 2.9999999400794013 2.8100000029668268 -1.8849523856500396 1.6843358396979533 2.9199999964709473 -3.7714388114427502 -0.95006328113862848 3.0300000093814292 -4.6121542684796086 -3.9583409167230954 3.1399999944454362 -3.4343447648292291 -5.5518590961329659 3.250000001403254 -2.211391869622052e-08 -3.9583411480468893 3.3600000080552288 3.4343447951676214 -0.95006299386368853 3.469999993355684 4.6121542575846384 1.6843356535689435 3.5800000061467721 3.7714388125311884 3.0000000063121735 3.6899999996808979 1.8849523866053275 2.9999999678076414 3.8000000015899791 2.0226724577899886e-10 + +0 2 +1.1180339887505235 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999678044258 3.3000000015990736 2.0309866472500391e-10 1.9999999279238478 3.4100000035856528 -1.2566338351063444 1.1228905729919101 3.5199999969246787 -2.5142964646674235 -0.63337551712705942 3.6300000099194438 -3.074762572896566 -2.6388939950858141 3.7399999954130898 -2.2895690671737792 -3.701239199025594 3.8500000010453497 -2.8316819999929571e-08 -2.638894240086211 3.9600000097382408 2.289569107254986 -0.63337521336332525 4.0699999930152293 3.0747625569284258 1.1228903762540163 4.1800000071518646 2.5142964672592112 1.9999999975765625 4.2900000001133263 1.2566338359369953 1.9999999567633309 4.4000000021460446 3.4089193414872246e-10 +1.9999999678108487 4.3000000015990727 2.0310001286277759e-10 1.9999999279383043 4.4100000035856688 -1.2566338351111224 1.122890572977371 4.5199999969270834 -2.5142964646772947 -0.63337551710101136 4.6300000099037906 -3.0747625729062196 -2.6388939951173178 4.7399999954404937 -2.2895690671867799 -3.7012391990426692 4.8500000010168538 -2.8311815114534561e-08 -2.6388942400694013 4.9600000097581329 2.28956910726074 -0.63337521339745995 5.0699999930075235 3.0747625569407111 1.1228903762783815 5.1800000071517864 2.5142964672688786 1.999999997577024 5.2900000001133138 1.2566338359416902 1.9999999567719706 5.4000000021460428 3.4087463053968244e-10 + +0 2 +0.99999999999999989 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 2.9999999678076419 3.8000000015899786 2.0228197919908545e-10 2.9999999279305172 3.9100000035685993 -1.8849523787403486 1.6843358354390539 4.0199999969387505 -3.7714387966862271 -0.95006327727783102 4.130000009847369 -4.6121542543265557 -3.9583409096400803 4.2399999955134353 -3.4343447470762434 -5.5518590588514121 4.3500000009162774 -2.8324961931502962e-08 -3.9583411546147409 4.4600000098022869 3.4343447871776691 -0.95006297354057856 4.569999992988012 4.612154238347574 1.6843356387230635 4.6800000071346206 3.7714387992820004 2.9999999975774561 4.7900000001106369 1.8849523795677556 2.9999999567676552 4.9000000021351298 3.3978766941952692e-10 +1.999999967804428 3.3000000015981641 2.0309853566534866e-10 1.9999999279238589 3.4100000035847855 -1.2566338351063564 1.122890572991863 3.5199999969235889 -2.514296464667352 -0.63337551712694962 3.6300000099189784 -3.0747625728967702 -2.6388939950860215 3.7399999954114338 -2.289569067173399 -3.7012391990253026 3.8500000010453213 -2.8317314715309344e-08 -2.6388942400864956 3.9600000097365959 2.2895691072554576 -0.63337521336314628 4.0699999930147435 3.074762556928099 1.1228903762539559 4.1800000071507961 2.5142964672593644 1.9999999975765703 4.2900000001124514 1.2566338359369555 1.9999999567633331 4.4000000021451351 3.4089091691064752e-10 + +0 2 +1.1180339887492663 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 10 2 11 2 2 1.9999999678108487 4.3000000015981632 2.0309837039748544e-10 1.9999999279382952 4.4100000035848472 -1.2566338351111233 1.1228905729774059 4.5199999969258062 -2.5142964646773036 -0.6333755171011064 4.6300000099037781 -3.0747625729061858 -2.6388939951171726 4.7399999954380565 -2.2895690671868656 -3.7012391990428237 4.8500000010178805 -2.8311673005987409e-08 -2.6388942400692912 4.9600000097554044 2.2895691072605815 -0.63337521339751135 5.0699999930078441 3.0747625569408297 1.1228903762783933 5.1800000071503085 2.5142964672688248 1.9999999975770228 5.2900000001125544 1.2566338359417017 1.9999999567719688 5.4000000021451333 3.4087654078806909e-10 +2.9999999678076419 3.8000000015899786 2.0228197919908545e-10 2.9999999279305172 3.9100000035685993 -1.8849523787403486 1.6843358354390539 4.0199999969387505 -3.7714387966862271 -0.95006327727783102 4.130000009847369 -4.6121542543265557 -3.9583409096400803 4.2399999955134353 -3.4343447470762434 -5.5518590588514121 4.3500000009162774 -2.8324961931502962e-08 -3.9583411546147409 4.4600000098022869 3.4343447871776691 -0.95006297354057856 4.569999992988012 4.612154238347574 1.6843356387230635 4.6800000071346206 3.7714387992820004 2.9999999975774561 4.7900000001106369 1.8849523795677556 2.9999999567676552 4.9000000021351298 3.3978766941952692e-10 + +0 2 +1.1180339887505235 2 + +0 11 +6.2870356770386975 11 + +9 0 0 0 0 1 7 2 8 2 2 1.9999999567634459 4.4000000021451351 3.4084246536281171e-10 2.0000002640696679 4.4857142726286385 -0.97919124939730628 1.4406779014824571 4.5714286200977545 -1.9568429588808502 0.32256706838431459 4.65714278042977 -2.5610970658126595 -1.0310446917849259 4.7428572231265349 -2.3664775333082049 -1.9336277920152993 4.8285713826164374 -1.4716907680536384 -2.1948556793096836 4.914285730957423 -0.37606210629261111 -1.9189859268982161 5.0000000010577432 0.5634651072808482 +1.9999999567720863 5.4000000021451333 3.4082825450809651e-10 2.0000002640168799 5.4857142726286572 -0.97919124940054725 1.440677901603262 5.5714286201005256 -1.956842958876841 0.32256706831810533 5.6571427804273915 -2.561097065856611 -1.0310446918474518 5.7428572231258039 -2.3664775332620946 -1.9336277919102527 5.8285713826187129 -1.4716907681020224 -2.1948556793750762 5.9142857309574053 -0.37606210627671594 -1.91898592690228 6.0000000010577423 0.56346510728208499 + +0 2 +0.99999999999999989 2 + +0 8 +3.4292921874756512 8 + +9 0 0 0 0 1 8 2 9 2 2 2.9999999567677649 4.9000000021351298 3.397406800331737e-10 3.0000002256333747 4.9749999888619385 -1.2851913641367954 2.3705073010240469 5.0500000328942178 -2.5704115958869975 1.1136055593857705 5.1249999710601237 -3.4960865104568501 -0.53250205740685397 5.2000000008716958 -3.7036172149772306 -2.0534544967400987 5.2750000334473137 -3.0407322012228404 -2.9986555539519255 5.3499999696162943 -1.7984423363377851 -3.2405588854226228 5.4250000146594397 -0.38793449825195131 -2.8784789005144367 5.5000000010522854 0.84519766412397335 +1.9999999567634457 4.4000000021442256 3.4084202127360186e-10 2.0000002256563998 4.4749999888172907 -0.85679234318003406 1.5803375282327812 4.5500000330297086 -1.7136150504501024 0.74240571526481458 4.6249999709439429 -2.330709715104784 -0.35500472995647414 4.7000000008817722 -2.4690961844122525 -1.3689662699026173 4.7750000335740017 -2.0271404357293186 -1.9991057277353734 4.8499999695008489 -1.1989686215534909 -2.1603719602582432 4.9250000147190747 -0.25862120459594551 -1.9189859268982157 5.0000000010568328 0.56346510728084809 + +0 2 +1.1180339887492663 2 + +0 9 +3.4292921874756512 9 + +9 0 0 0 0 1 8 2 9 2 2 1.9999999567720863 5.4000000021442247 3.4082736632967681e-10 2.0000002256112897 5.4749999888172809 -0.856792343182876 1.5803375284244827 5.550000033033113 -1.7136150504645526 0.74240571490299379 5.6249999709394025 -2.3307097150774951 -0.35500472950880069 5.700000000885872 -2.4690961844857102 -1.3689662702680536 5.7750000335703762 -2.0271404356654052 -1.9991057275586339 5.8499999695038181 -1.1989686216024464 -2.1603719603159743 5.9250000147190507 -0.25862120458187643 -1.9189859269022804 6.000000001056832 0.56346510728208465 +2.9999999567677649 4.9000000021351298 3.397406800331737e-10 3.0000002256333747 4.9749999888619385 -1.2851913641367954 2.3705073010240469 5.0500000328942178 -2.5704115958869975 1.1136055593857705 5.1249999710601237 -3.4960865104568501 -0.53250205740685397 5.2000000008716958 -3.7036172149772306 -2.0534544967400987 5.2750000334473137 -3.0407322012228404 -2.9986555539519255 5.3499999696162943 -1.7984423363377851 -3.2405588854226228 5.4250000146594397 -0.38793449825195131 -2.8784789005144367 5.5000000010522854 0.84519766412397335 + +0 2 +1.1180339887505235 2 + +0 9 +3.4292921874756512 9 + +1 -2.2504825962919797 5.5000000010564518 0.66080131173616696 0.28173255684250664 -2.6696418513327818e-14 0.95949297361418118 -4.0819749136223607e-12 1 1.2263993079777387e-12 -0.95949297361418118 -4.2621429146702262e-12 0.2817325568425067 +Triangulations 0 + +TShapes 88 +Ve +4.39810635581078e-05 +2.00000000000003 -1.11022302462516e-16 1.73559347507678e-15 +0 0 + +0101101 +* +Ve +2.94018437871922e-05 +2.00000000000003 1 1.24828460492808e-15 +0 0 + +0101101 +* +Ed + 1.00005e-07 1 1 0 +1 1 0 0 1 +2 1 2 0 0 1 +0 + +0101000 ++88 0 -87 0 * +Ve +4.3981062235277e-05 +3.00000000000003 0.49999999999909 2.64590224776542e-15 +0 0 + +0101101 +* +Ed + 1.00005e-07 1 1 0 +1 2 0 0 1.11803398875052 +2 2 3 0 0 1.11803398875052 +0 + +0101000 ++87 0 -85 0 * +Ed + 1.00005e-07 1 1 0 +1 3 0 0 1.11803398874927 +2 3 4 0 0 1.11803398874927 +0 + +0101000 ++85 0 -88 0 * +Wi + +0101100 ++86 0 +84 0 +83 0 * +Fa +0 1e-07 1 0 + +0101000 ++82 0 * +Ve +2.94018442477067e-05 +1.99999998894377 1.10000000055015 7.95973845452051e-11 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 4 0 0 6.2870356770387 +2 4 2 0 0 6.2870356770387 +2 5 4 0 0 6.2870356770387 +0 + +0101000 ++88 0 -80 0 * +Ve +2.94018442477067e-05 +1.99999998894602 2.10000000054924 7.95969404559953e-11 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 5 0 0 6.2870356770387 +2 6 2 0 0 6.2870356770387 +2 7 3 0 0 6.2870356770387 +0 + +0101000 ++87 0 -78 0 * +Ed + 1e-07 1 1 0 +1 6 0 0 1 +2 8 2 0 0 1 +2 9 5 0 0 1 +4 C1 5 0 2 0 +0 + +0101000 ++80 0 -78 0 * +Wi + +0101100 +-79 0 +86 0 +77 0 -76 0 * +Fa +0 1e-07 2 0 + +0101000 ++75 0 * +Ve +2.94018604988986e-05 +1.99999997861821 2.20000000106211 1.49914425623943e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 7 0 0 6.2870356770387 +2 10 5 0 0 6.2870356770387 +2 11 6 0 0 6.2870356770387 +0 + +0101000 ++80 0 -73 0 * +Ve +2.94018604988986e-05 +1.9999999786225 3.2000000010612 1.49913981534733e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 8 0 0 6.2870356770387 +2 12 5 0 0 6.2870356770387 +2 13 7 0 0 6.2870356770387 +0 + +0101000 ++78 0 -71 0 * +Ed + 1e-07 1 1 0 +1 9 0 0 1 +2 14 5 0 0 1 +2 15 8 0 0 1 +4 C1 8 0 5 0 +0 + +0101000 ++73 0 -71 0 * +Wi + +0101100 +-72 0 +76 0 +70 0 -69 0 * +Fa +0 1e-07 5 0 + +0101000 ++68 0 * +Ve +2.94018662885789e-05 +1.99999996780443 3.30000000159907 2.03096284540616e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 10 0 0 6.2870356770387 +2 16 8 0 0 6.2870356770387 +2 17 9 0 0 6.2870356770387 +0 + +0101000 ++73 0 -66 0 * +Ve +2.94018662885789e-05 +1.99999996781085 4.30000000159816 2.03095840451406e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 11 0 0 6.2870356770387 +2 18 8 0 0 6.2870356770387 +2 19 10 0 0 6.2870356770387 +0 + +0101000 ++71 0 -64 0 * +Ed + 1e-07 1 1 0 +1 12 0 0 1 +2 20 8 0 0 1 +2 21 11 0 0 1 +4 C1 11 0 8 0 +0 + +0101000 ++66 0 -64 0 * +Wi + +0101100 +-65 0 +69 0 +63 0 -62 0 * +Fa +0 1e-07 8 0 + +0101000 ++61 0 * +Ve +2.94018603423369e-05 +1.99999995676339 4.40000000214559 3.4086781206032e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 13 0 0 6.2870356770387 +2 22 11 0 0 6.2870356770387 +2 23 12 0 0 6.2870356770387 +0 + +0101000 ++66 0 -59 0 * +Ve +2.94018603423493e-05 +1.99999995677203 5.40000000214468 3.40853379161e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 14 0 0 6.2870356770387 +2 24 11 0 0 6.2870356770387 +2 25 13 0 0 6.2870356770387 +0 + +0101000 ++64 0 -57 0 * +Ed + 1e-07 1 1 0 +1 15 0 0 1 +2 26 11 0 0 1 +2 27 14 0 0 1 +4 G1 14 0 11 0 +0 + +0101000 ++59 0 -57 0 * +Wi + +0101100 +-58 0 +62 0 +56 0 -55 0 * +Fa +0 1e-07 11 0 + +0101000 ++54 0 * +Ve +7.75115104411493e-05 +-1.91898592689822 5.00000000105683 0.563465107280848 +0 0 + +0101101 +* +Ed + 0.00014709836519379 1 1 0 +1 16 0 0 3.42929218747565 +2 28 14 0 0 3.42929218747565 +2 29 15 0 0 3.42929218747565 +0 + +0101000 ++59 0 -52 0 * +Ve +7.75115113493296e-05 +-1.91898592690228 6.00000000105683 0.563465107282085 +0 0 + +0101101 +* +Ed + 0.000147098365210656 1 1 0 +1 17 0 0 3.42929218747565 +2 30 14 0 0 3.42929218747565 +2 31 16 0 0 3.42929218747565 +0 + +0101000 ++57 0 -50 0 * +Ed + 1.00005e-07 1 1 0 +1 18 0 0 1 +2 32 14 0 0 1 +0 + +0101000 ++52 0 -50 0 * +Wi + +0101100 +-51 0 +55 0 +49 0 -48 0 * +Fa +0 1e-07 14 0 + +0101000 ++47 0 * +Ve +4.39810618145432e-05 +2.99999998894491 1.60000000054606 7.92760860018786e-11 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 19 0 0 6.2870356770387 +2 33 3 0 0 6.2870356770387 +2 34 4 0 0 6.2870356770387 +0 + +0101000 ++85 0 -45 0 * +Ed + 1e-07 1 1 0 +1 20 0 0 1.11803398875052 +2 35 3 0 0 1.11803398875052 +2 36 7 0 0 1.11803398875052 +4 C1 7 0 3 0 +0 + +0101000 ++78 0 -45 0 * +Wi + +0101100 +-77 0 +84 0 +44 0 -43 0 * +Fa +0 1e-07 3 0 + +0101000 ++42 0 * +Ve +4.39810783756164e-05 +2.99999997862034 2.70000000105574 1.49308687941708e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 21 0 0 6.2870356770387 +2 37 7 0 0 6.2870356770387 +2 38 6 0 0 6.2870356770387 +0 + +0101000 ++45 0 -40 0 * +Ed + 1e-07 1 1 0 +1 22 0 0 1.11803398875052 +2 39 7 0 0 1.11803398875052 +2 40 10 0 0 1.11803398875052 +4 C1 10 0 7 0 +0 + +0101000 ++71 0 -40 0 * +Wi + +0101100 +-70 0 +43 0 +39 0 -38 0 * +Fa +0 1e-07 7 0 + +0101000 ++37 0 * +Ve +4.39810841886954e-05 +2.99999996780764 3.80000000158998 2.02276051770023e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 23 0 0 6.2870356770387 +2 41 10 0 0 6.2870356770387 +2 42 9 0 0 6.2870356770387 +0 + +0101000 ++40 0 -35 0 * +Ed + 1e-07 1 1 0 +1 24 0 0 1.11803398875052 +2 43 10 0 0 1.11803398875052 +2 44 13 0 0 1.11803398875052 +4 C1 13 0 10 0 +0 + +0101000 ++64 0 -35 0 * +Wi + +0101100 +-63 0 +38 0 +34 0 -33 0 * +Fa +0 1e-07 10 0 + +0101000 ++32 0 * +Ve +4.39810778551053e-05 +2.99999995676771 4.90000000213513 3.39765582641472e-10 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 25 0 0 6.2870356770387 +2 45 13 0 0 6.2870356770387 +2 46 12 0 0 6.2870356770387 +0 + +0101000 ++35 0 -30 0 * +Ed + 1e-07 1 1 0 +1 26 0 0 1.11803398875052 +2 47 13 0 0 1.11803398875052 +2 48 16 0 0 1.11803398875052 +4 G1 16 0 13 0 +0 + +0101000 ++57 0 -30 0 * +Wi + +0101100 +-56 0 +33 0 +29 0 -28 0 * +Fa +0 1e-07 13 0 + +0101000 ++27 0 * +Ve +1.0602117875223e-05 +-2.87847890051444 5.50000000105229 0.845197664123973 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 27 0 0 3.42929218747565 +2 49 16 0 0 3.42929218747565 +2 50 15 0 0 3.42929218747565 +0 + +0101000 ++30 0 -25 0 * +Ed + 1.00005e-07 1 1 0 +1 28 0 0 1.11803398875052 +2 51 16 0 0 1.11803398875052 +0 + +0101000 ++50 0 -25 0 * +Wi + +0101100 +-49 0 +28 0 +24 0 -23 0 * +Fa +0 1e-07 16 0 + +0101000 ++22 0 * +Ed + 1e-07 1 1 0 +1 29 0 0 1.11803398874927 +2 52 4 0 0 1.11803398874927 +2 53 6 0 0 1.11803398874927 +4 C1 6 0 4 0 +0 + +0101000 ++45 0 -80 0 * +Wi + +0101100 +-44 0 +83 0 +79 0 -20 0 * +Fa +0 1e-07 4 0 + +0101000 ++19 0 * +Ed + 1e-07 1 1 0 +1 30 0 0 1.11803398874927 +2 54 6 0 0 1.11803398874927 +2 55 9 0 0 1.11803398874927 +4 C1 9 0 6 0 +0 + +0101000 ++40 0 -73 0 * +Wi + +0101100 +-39 0 +20 0 +72 0 -17 0 * +Fa +0 1e-07 6 0 + +0101000 ++16 0 * +Ed + 1e-07 1 1 0 +1 31 0 0 1.11803398874927 +2 56 9 0 0 1.11803398874927 +2 57 12 0 0 1.11803398874927 +4 C1 12 0 9 0 +0 + +0101000 ++35 0 -66 0 * +Wi + +0101100 +-34 0 +17 0 +65 0 -14 0 * +Fa +0 1e-07 9 0 + +0101000 ++13 0 * +Ed + 1e-07 1 1 0 +1 32 0 0 1.11803398874927 +2 58 12 0 0 1.11803398874927 +2 59 15 0 0 1.11803398874927 +4 G1 15 0 12 0 +0 + +0101000 ++30 0 -59 0 * +Wi + +0101100 +-29 0 +14 0 +58 0 -11 0 * +Fa +0 1e-07 12 0 + +0101000 ++10 0 * +Ed + 1.00005e-07 1 1 0 +1 33 0 0 1.11803398874927 +2 60 15 0 0 1.11803398874927 +0 + +0101000 ++25 0 -52 0 * +Wi + +0101100 +-24 0 +11 0 +51 0 -8 0 * +Fa +0 1e-07 15 0 + +0101000 ++7 0 * +Wi + +0101100 ++48 0 +23 0 +8 0 * +Fa +0 1e-07 17 0 + +0101000 ++5 0 * +Sh + +0101100 +-81 0 +74 0 +67 0 +60 0 +53 0 +46 0 +41 0 +36 0 +31 0 +26 0 ++21 0 +18 0 +15 0 +12 0 +9 0 +6 0 +4 0 * +So + +0100000 ++3 0 * +Co + +1100000 ++2 1 * + ++1 0