From: mbs Date: Wed, 14 Dec 2022 16:57:33 +0000 (+0000) Subject: added Limit Tolerance feature X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d32e6441ccc57da0cb9a8ddb987df439c33de83c;p=modules%2Fshaper.git added Limit Tolerance feature --- diff --git a/src/FeaturesAPI/CMakeLists.txt b/src/FeaturesAPI/CMakeLists.txt index 554d5ddaa..515559776 100644 --- a/src/FeaturesAPI/CMakeLists.txt +++ b/src/FeaturesAPI/CMakeLists.txt @@ -57,6 +57,7 @@ SET(PROJECT_HEADERS FeaturesAPI_PointCoordinates.h FeaturesAPI_GeometryCalculation.h FeaturesAPI_BoundingBox.h + FeaturesAPI_LimitTolerance.h ) SET(PROJECT_SOURCES @@ -96,6 +97,7 @@ SET(PROJECT_SOURCES FeaturesAPI_PointCoordinates.cpp FeaturesAPI_GeometryCalculation.cpp FeaturesAPI_BoundingBox.cpp + FeaturesAPI_LimitTolerance.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/FeaturesAPI/FeaturesAPI.i b/src/FeaturesAPI/FeaturesAPI.i index 2cc08c164..16292dac3 100644 --- a/src/FeaturesAPI/FeaturesAPI.i +++ b/src/FeaturesAPI/FeaturesAPI.i @@ -44,6 +44,7 @@ %feature("kwargs") addFillet; %feature("kwargs") addFuse; %feature("kwargs") addIntersection; +%feature("kwargs") addLimitTolerance; %feature("kwargs") addMultiRotation; %feature("kwargs") addMultiTranslation; %feature("kwargs") addPartition; @@ -62,8 +63,10 @@ %shared_ptr(FeaturesAPI_BooleanCommon) %shared_ptr(FeaturesAPI_BooleanSmash) %shared_ptr(FeaturesAPI_BooleanFill) +%shared_ptr(FeaturesAPI_BoundingBox) %shared_ptr(FeaturesAPI_Chamfer) -%shared_ptr(FeaturesAPI_NormalToFace) +%shared_ptr(FeaturesAPI_Copy) +%shared_ptr(FeaturesAPI_Defeaturing) %shared_ptr(FeaturesAPI_Extrusion) %shared_ptr(FeaturesAPI_ExtrusionBoolean) %shared_ptr(FeaturesAPI_ExtrusionCut) @@ -71,15 +74,20 @@ %shared_ptr(FeaturesAPI_Fillet) %shared_ptr(FeaturesAPI_Fillet1D) %shared_ptr(FeaturesAPI_Fillet2D) +%shared_ptr(FeaturesAPI_FusionFaces) +%shared_ptr(FeaturesAPI_ImportResult) %shared_ptr(FeaturesAPI_Intersection) +%shared_ptr(FeaturesAPI_LimitTolerance) +%shared_ptr(FeaturesAPI_Loft) %shared_ptr(FeaturesAPI_MultiRotation) %shared_ptr(FeaturesAPI_MultiTranslation) +%shared_ptr(FeaturesAPI_NormalToFace) %shared_ptr(FeaturesAPI_Partition) %shared_ptr(FeaturesAPI_Pipe) -%shared_ptr(FeaturesAPI_Loft) %shared_ptr(FeaturesAPI_Placement) %shared_ptr(FeaturesAPI_PointCloudOnFace) %shared_ptr(FeaturesAPI_Recover) +%shared_ptr(FeaturesAPI_RemoveResults) %shared_ptr(FeaturesAPI_RemoveSubShapes) %shared_ptr(FeaturesAPI_Revolution) %shared_ptr(FeaturesAPI_RevolutionBoolean) @@ -90,12 +98,6 @@ %shared_ptr(FeaturesAPI_Symmetry) %shared_ptr(FeaturesAPI_Translation) %shared_ptr(FeaturesAPI_Union) -%shared_ptr(FeaturesAPI_FusionFaces) -%shared_ptr(FeaturesAPI_RemoveResults) -%shared_ptr(FeaturesAPI_Copy) -%shared_ptr(FeaturesAPI_ImportResult) -%shared_ptr(FeaturesAPI_Defeaturing) -%shared_ptr(FeaturesAPI_BoundingBox) %typecheck(SWIG_TYPECHECK_POINTER) std::pair, bool>, const std::pair, bool> & { @@ -208,22 +210,30 @@ %include "FeaturesAPI_BooleanCommon.h" %include "FeaturesAPI_BooleanSmash.h" %include "FeaturesAPI_BooleanFill.h" +%include "FeaturesAPI_BoundingBox.h" %include "FeaturesAPI_Chamfer.h" +%include "FeaturesAPI_Copy.h" %include "FeaturesAPI_Defeaturing.h" %include "FeaturesAPI_Extrusion.h" %include "FeaturesAPI_ExtrusionBoolean.h" %include "FeaturesAPI_Fillet.h" +%include "FeaturesAPI_FusionFaces.h" +%include "FeaturesAPI_GeometryCalculation.h" +%include "FeaturesAPI_ImportResult.h" %include "FeaturesAPI_Intersection.h" +%include "FeaturesAPI_LimitTolerance.h" +%include "FeaturesAPI_Loft.h" %include "FeaturesAPI_Measurement.h" %include "FeaturesAPI_NormalToFace.h" %include "FeaturesAPI_MultiRotation.h" %include "FeaturesAPI_MultiTranslation.h" %include "FeaturesAPI_Partition.h" %include "FeaturesAPI_Pipe.h" -%include "FeaturesAPI_Loft.h" %include "FeaturesAPI_Placement.h" %include "FeaturesAPI_PointCloudOnFace.h" +%include "FeaturesAPI_PointCoordinates.h" %include "FeaturesAPI_Recover.h" +%include "FeaturesAPI_RemoveResults.h" %include "FeaturesAPI_RemoveSubShapes.h" %include "FeaturesAPI_Revolution.h" %include "FeaturesAPI_RevolutionBoolean.h" @@ -232,10 +242,3 @@ %include "FeaturesAPI_Symmetry.h" %include "FeaturesAPI_Translation.h" %include "FeaturesAPI_Union.h" -%include "FeaturesAPI_FusionFaces.h" -%include "FeaturesAPI_RemoveResults.h" -%include "FeaturesAPI_Copy.h" -%include "FeaturesAPI_ImportResult.h" -%include "FeaturesAPI_PointCoordinates.h" -%include "FeaturesAPI_GeometryCalculation.h" -%include "FeaturesAPI_BoundingBox.h" diff --git a/src/FeaturesAPI/FeaturesAPI_LimitTolerance.cpp b/src/FeaturesAPI/FeaturesAPI_LimitTolerance.cpp new file mode 100644 index 000000000..d026fa886 --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_LimitTolerance.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "FeaturesAPI_LimitTolerance.h" + +#include +#include +#include + +//================================================================================================== +FeaturesAPI_LimitTolerance::FeaturesAPI_LimitTolerance(const std::shared_ptr& theFeature) +: ModelHighAPI_Interface(theFeature) +{ + initialize(); +} + +//================================================================================================== +FeaturesAPI_LimitTolerance::FeaturesAPI_LimitTolerance(const std::shared_ptr& theFeature, + const ModelHighAPI_Selection& theMainObject, + const ModelHighAPI_Double& theTolerance) +: ModelHighAPI_Interface(theFeature) +{ + if (initialize()) + { + setMainObject(theMainObject); + setTolerance(theTolerance); + } +} + +//================================================================================================== +FeaturesAPI_LimitTolerance::~FeaturesAPI_LimitTolerance() +{ +} + +//================================================================================================== +void FeaturesAPI_LimitTolerance::setMainObject(const ModelHighAPI_Selection& theMainObject) +{ + fillAttribute(theMainObject, mainObject()); + execute(); +} + +//================================================================================================== +void FeaturesAPI_LimitTolerance::setTolerance(const ModelHighAPI_Double& theTolerance) +{ + fillAttribute(theTolerance, tolerance()); + execute(); +} + +//================================================================================================== +void FeaturesAPI_LimitTolerance::dump(ModelHighAPI_Dumper& theDumper) const +{ + FeaturePtr aBase = feature(); + const std::string& aDocName = theDumper.name(aBase->document()); + + AttributeSelectionPtr anAttrObject = aBase->selection(FeaturesPlugin_LimitTolerance::OBJECT_ID()); + theDumper << aBase << " = model.addLimitTolerance(" << aDocName << ", " << anAttrObject; + + AttributeDoublePtr anAttrTolerance = aBase->real(FeaturesPlugin_LimitTolerance::TOLERANCE_ID()); + theDumper << ", " << anAttrTolerance; + + theDumper << ")" << std::endl; +} + +//================================================================================================== +LimitTolerancePtr addLimitTolerance(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theMainObject, + const ModelHighAPI_Double& theTolerance) +{ + std::shared_ptr aFeature = thePart->addFeature(FeaturesAPI_LimitTolerance::ID()); + LimitTolerancePtr aLimitTolerance; + aLimitTolerance.reset(new FeaturesAPI_LimitTolerance(aFeature, theMainObject, theTolerance)); + return aLimitTolerance; +} diff --git a/src/FeaturesAPI/FeaturesAPI_LimitTolerance.h b/src/FeaturesAPI/FeaturesAPI_LimitTolerance.h new file mode 100644 index 000000000..c7eb5fcb0 --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_LimitTolerance.h @@ -0,0 +1,83 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef FEATURESAPI_LIMITTOLERANCE_H_ +#define FEATURESAPI_LIMITTOLERANCE_H_ + +#include "FeaturesAPI.h" + +#include + +#include +#include + +class ModelHighAPI_Double; +class ModelHighAPI_Dumper; +class ModelHighAPI_Selection; + +/// \class FeaturesAPI_LimitTolerance +/// \ingroup CPPHighAPI +/// \brief Interface for LimitTolerance feature. +class FeaturesAPI_LimitTolerance: public ModelHighAPI_Interface +{ +public: + /// Constructor without values. + FEATURESAPI_EXPORT + explicit FeaturesAPI_LimitTolerance(const std::shared_ptr& theFeature); + + /// Constructor with values. + FEATURESAPI_EXPORT + explicit FeaturesAPI_LimitTolerance(const std::shared_ptr& theFeature, + const ModelHighAPI_Selection& theShape, + const ModelHighAPI_Double& theTolerance); + + /// Destructor. + FEATURESAPI_EXPORT + virtual ~FeaturesAPI_LimitTolerance(); + + INTERFACE_2(FeaturesPlugin_LimitTolerance::ID(), + mainObject, FeaturesPlugin_LimitTolerance::OBJECT_ID(), + ModelAPI_AttributeSelection, /** Main object */, + tolerance, FeaturesPlugin_LimitTolerance::TOLERANCE_ID(), + ModelAPI_AttributeDouble, /** Tolerance */) + + /// Set main object. + FEATURESAPI_EXPORT + void setMainObject(const ModelHighAPI_Selection& theMainObject); + + /// Set the tolerance. + FEATURESAPI_EXPORT + void setTolerance(const ModelHighAPI_Double& theTolerance); + + /// Dump wrapped feature + FEATURESAPI_EXPORT + virtual void dump(ModelHighAPI_Dumper& theDumper) const; +}; + +/// Pointer on LimitTolerance object. +typedef std::shared_ptr LimitTolerancePtr; + +/// \ingroup CPPHighAPI +/// \brief Create LimitTolerance feature. +FEATURESAPI_EXPORT +LimitTolerancePtr addLimitTolerance(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theMainObject, + const ModelHighAPI_Double& theTolerance); + +#endif // FEATURESAPI_LIMITTOLERANCE_H_ diff --git a/src/FeaturesAPI/FeaturesAPI_swig.h b/src/FeaturesAPI/FeaturesAPI_swig.h index f03aad755..7facfb155 100644 --- a/src/FeaturesAPI/FeaturesAPI_swig.h +++ b/src/FeaturesAPI/FeaturesAPI_swig.h @@ -59,5 +59,6 @@ #include "FeaturesAPI_PointCoordinates.h" #include "FeaturesAPI_GeometryCalculation.h" #include "FeaturesAPI_BoundingBox.h" + #include "FeaturesAPI_LimitTolerance.h" #endif // FeaturesAPI_swig_H_ diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index 9cc750314..82a5a7d6b 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -76,6 +76,7 @@ SET(PROJECT_HEADERS FeaturesPlugin_InspectBoundingBox.h FeaturesPlugin_NormalToFace.h FeaturesPlugin_InspectNormalToFace.h + FeaturesPlugin_LimitTolerance.h ) SET(PROJECT_SOURCES @@ -132,6 +133,7 @@ SET(PROJECT_SOURCES FeaturesPlugin_InspectBoundingBox.cpp FeaturesPlugin_NormalToFace.cpp FeaturesPlugin_InspectNormalToFace.cpp + FeaturesPlugin_LimitTolerance.cpp ) SET(XML_RESOURCES @@ -175,6 +177,7 @@ SET(XML_RESOURCES create_bounding_box_widget.xml normal_to_face_widget.xml create_normal_to_face_widget.xml + limit_tolerance_widget.xml ) SET(TEXT_RESOURCES @@ -238,4 +241,5 @@ IF(${HAVE_SALOME}) endforeach(tfile ${TEST_NAMES}) install(FILES ${TMP_TESTS_NAMES} DESTINATION ${TEST_INSTALL_DIRECTORY}) + install(DIRECTORY data DESTINATION ${TEST_INSTALL_DIRECTORY}) ENDIF(${HAVE_SALOME}) diff --git a/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.cpp b/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.cpp new file mode 100644 index 000000000..67b92aea4 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.cpp @@ -0,0 +1,69 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include + +#include +#include + +#include + +#include +#include +#include + + + +//================================================================================================= +FeaturesPlugin_LimitTolerance::FeaturesPlugin_LimitTolerance() +{ +} + +//================================================================================================= +void FeaturesPlugin_LimitTolerance::initAttributes() +{ + data()->addAttribute(OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(TOLERANCE_ID(), ModelAPI_AttributeDouble::typeId()); +} + +//================================================================================================= +void FeaturesPlugin_LimitTolerance::execute() +{ + // Get all feature arguments + GeomShapePtr aShape = selection(FeaturesPlugin_LimitTolerance::OBJECT_ID())->value(); + double aTolerance = real(FeaturesPlugin_LimitTolerance::TOLERANCE_ID())->value(); + + std::shared_ptr aLimitToleranceAlgo(new GeomAlgoAPI_LimitTolerance(aShape, aTolerance)); + + std::string anError; + if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aLimitToleranceAlgo, getKind(), anError)) + { + setError(anError); + return; + } + + // Store result. + GeomShapePtr aResult = aLimitToleranceAlgo->shape(); + + int anIndex = 0; + ResultBodyPtr aResultBody = document()->createBody(data(), anIndex); + aResultBody->storeModified(aShape, aResult); + + setResult(aResultBody, anIndex); +} diff --git a/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.h b/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.h new file mode 100644 index 000000000..35c3a85e8 --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_LimitTolerance.h @@ -0,0 +1,75 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef FEATURESPLUGIN_LIMITTOLERANCE_H_ +#define FEATURESPLUGIN_LIMITTOLERANCE_H_ + +#include + +#include +#include + + +/** \class FeaturesPlugin_LimitTolerance + * \ingroup Plugins + * \brief Feature to limit the tolerance on selected shapes. + */ +class FeaturesPlugin_LimitTolerance : public ModelAPI_Feature +{ + public: + /// LimitTolerance kind. + inline static const std::string& ID() + { + static const std::string MY_LIMIT_TOLERANCE_ID("LimitTolerance"); + return MY_LIMIT_TOLERANCE_ID; + } + + /// \return the kind of a feature. + FEATURESPLUGIN_EXPORT virtual const std::string& getKind() + { + static std::string MY_KIND = FeaturesPlugin_LimitTolerance::ID(); + return MY_KIND; + } + + /// Attribute name of referenced object. + inline static const std::string& OBJECT_ID() + { + static const std::string MY_OBJECT_ID("object"); + return MY_OBJECT_ID; + } + + /// Attribute name for tolerance. + inline static const std::string& TOLERANCE_ID() + { + static const std::string MY_TOLERANCE_ID("tolerance"); + return MY_TOLERANCE_ID; + } + + /// Request for initialization of data model of the feature: adding all attributes. + FEATURESPLUGIN_EXPORT virtual void initAttributes(); + + /// Performs the algorithm and stores results in the data structure. + FEATURESPLUGIN_EXPORT virtual void execute(); + +public: + /// Use plugin manager for features creation. + FeaturesPlugin_LimitTolerance(); +}; + +#endif // FEATURESPLUGIN_LIMITTOLERANCE_H_ diff --git a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp index ca33e7adc..71b5c6e3d 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -223,6 +224,8 @@ FeaturePtr FeaturesPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new FeaturesPlugin_NormalToFace); } else if (theFeatureID == FeaturesPlugin_PointCloudOnFace::ID()) { return FeaturePtr(new FeaturesPlugin_PointCloudOnFace); + } else if (theFeatureID == FeaturesPlugin_LimitTolerance::ID()) { + return FeaturePtr(new FeaturesPlugin_LimitTolerance); } diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts index e2e2f20bb..5b47c6dff 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts +++ b/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts @@ -89,6 +89,10 @@ Remove Sub-Shapes Supprimer les sous-formes + + Limit Tolerance + Limiter Tolérance + Revolution Révolution @@ -2260,6 +2264,44 @@ + + + LimitTolerance + + Limit the tolerance on a shape + Limiter la tolérance sur une forme + + + Limit Tolerance + Limiter la tolérance + + + + LimitTolerance:object + + Shape: + Forme: + + + Select a shape to modify. + Sélectionnez la forme à modifier. + + + + LimitTolerance:tolerance + + Tolerance + Tolérance + + + + LimitTolerance:object:GeomValidators_BodyShapes + + Error: Context is empty. + Erreur : le contexte est vide. + + + Smash diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts index e27770699..aaf9d4d64 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts +++ b/src/FeaturesPlugin/FeaturesPlugin_msg_ru.ts @@ -293,4 +293,42 @@ + + + LimitTolerance + + Limit the tolerance on a shape + Ограничить допуск формы + + + Limit Tolerance + Предельный допуск + + + + LimitTolerance:object + + Shape: + Форма: + + + Select a shape to modify. + Выберите форму для изменения. + + + + LimitTolerance:tolerance + + Tolerance + Толерантность + + + + LimitTolerance:object:GeomValidators_BodyShapes + + Error: Context is empty. + Ошибка: Контекст пуст. + + + diff --git a/src/FeaturesPlugin/Test/TestLimitTolerance.py b/src/FeaturesPlugin/Test/TestLimitTolerance.py new file mode 100644 index 000000000..168d6bb46 --- /dev/null +++ b/src/FeaturesPlugin/Test/TestLimitTolerance.py @@ -0,0 +1,74 @@ +# Copyright (C) 2021-2022 CEA/DEN, EDF R&D +# +# This library 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. +# +# This library 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 this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from salome.shaper import model +from GeomAPI import GeomAPI_Shape + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +Point_1 = model.addPoint(Part_1_doc, 0, 0, 0) +Vertex_1 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_1")]) +Point_2 = model.addPoint(Part_1_doc, 1, 0, 0) +Vertex_2 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_2")]) +model.do() + +Partition_1_objects = [model.selection("VERTEX", "Vertex_1_1"), model.selection("VERTEX", "Vertex_2_1")] +Partition_1 = model.addPartition(Part_1_doc, Partition_1_objects, keepSubResults = True) +model.end() + +model.testNbResults(Partition_1, 1) +model.testNbSubResults(Partition_1, [2]) +model.testNbSubShapes(Partition_1, GeomAPI_Shape.VERTEX, [2]) + +model.undo() +model.begin() +Fuse_1_objects = [model.selection("VERTEX", "Vertex_1_1"), model.selection("VERTEX", "Vertex_2_1")] +Fuse_1 = model.addFuse(Part_1_doc, Fuse_1_objects, True, keepSubResults = True) +model.end() + +model.testNbResults(Fuse_1, 1) +model.testNbSubResults(Fuse_1, [2]) +model.testNbSubShapes(Fuse_1, GeomAPI_Shape.VERTEX, [2]) + +model.undo() +model.begin() +LimitTolerance_1 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_1_1"), 0.6) +LimitTolerance_2 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_2_1"), 0.6) +model.do() + +Partition_2_objects = [model.selection("VERTEX", "LimitTolerance_1_1"), model.selection("VERTEX", "LimitTolerance_2_1")] +Partition_2 = model.addPartition(Part_1_doc, Partition_2_objects, keepSubResults = True) +model.end() + +model.testNbResults(Partition_2, 1) +model.testNbSubResults(Partition_2, [0]) +model.testNbSubShapes(Partition_2, GeomAPI_Shape.VERTEX, [1]) + +model.undo() +model.begin() +Fuse_2_objects = [model.selection("VERTEX", "LimitTolerance_1_1"), model.selection("VERTEX", "LimitTolerance_2_1")] +Fuse_2 = model.addFuse(Part_1_doc, Fuse_2_objects, True, keepSubResults = True) +model.end() + +model.testNbResults(Fuse_2, 1) +model.testNbSubResults(Fuse_2, [0]) +model.testNbSubShapes(Fuse_2, GeomAPI_Shape.VERTEX, [1]) diff --git a/src/FeaturesPlugin/Test/TestLimitTolerance_Face.py b/src/FeaturesPlugin/Test/TestLimitTolerance_Face.py new file mode 100644 index 000000000..7f586d6a1 --- /dev/null +++ b/src/FeaturesPlugin/Test/TestLimitTolerance_Face.py @@ -0,0 +1,56 @@ +# Copyright (C) 2021-2022 CEA/DEN, EDF R&D +# +# This library 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. +# +# This library 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 this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import salome +from salome.shaper import model +from GeomAPI import GeomAPI_Shape + +salome.salome_init() + +# Use the 'data' subfolder to search for the BREP files +data_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") + +# Create part +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +# Import first shape (part of torus) +Import_1 = model.addImport(Part_1_doc, os.path.join(data_dir, "face_peau_bug1868.brep")) +model.do() +Import_1.setName("Torus_1") +Import_1.result().setName("Torus_1_1") + +# Import second shape (planar face) +Import_2 = model.addImport(Part_1_doc, os.path.join(data_dir, "PLANFISS_bug1868.brep")) +model.do() +Import_2.setName("Face_1") +Import_2.result().setName("Face_1_1") + +# Limit the tolerance of the planar face (in order to get a good intersection result) +LimitTolerance_1 = model.addLimitTolerance(Part_1_doc, model.selection("FACE", "Face_1_1"), 0.0001) + +# Create intersection +Intersection_1 = model.addIntersection(Part_1_doc, [model.selection("FACE", "LimitTolerance_1_1"), model.selection("FACE", "Torus_1_1")], keepSubResults = True) +model.end() + +# Result should be single edge with 2 vertices +model.checkResult(Intersection_1, model, 1, [0], [0], [0], [1], [2]) diff --git a/src/FeaturesPlugin/data/PLANFISS_bug1868.brep b/src/FeaturesPlugin/data/PLANFISS_bug1868.brep new file mode 100644 index 000000000..994569e00 --- /dev/null +++ b/src/FeaturesPlugin/data/PLANFISS_bug1868.brep @@ -0,0 +1,119 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 6 +1 + 1 0 0 3.5 + 0 1.11022302462516e-16 -1 -1.66533453693773e-16 + 0 1 1.11022302462516e-16 -1.5 +1 +-0.707106781186547 0.707106781186548 -1.0837636805769e-16 940.133154714881 +-0.707106781186548 -0.707106781186547 3.46370982828774e-16 1349.86684528512 +1.68287605990514e-16 3.21554935538437e-16 1 9.33150041612651e-14 +2 1 1 2 1 0 +2 2 -1 1 -1 0 +1 + 1 0 0 -7 + 0 1 0 0 + 0 0 1 3 +1 + 1 0 0 -3 + 0 1 0 0 + 0 0 1 3 +Curve2ds 2 +7 0 0 3 7 5 -3.0066938551374576 -3.0554024673217413 -3.0060947189734581 -2.8291599606297599 -3.0004890039187662 -0.41579128122162023 -2.9997116981051439 1.9999999999359943 -3.000489003919113 4.4157912811311686 -3.0060947189735359 6.8291599606195419 -3.0066938551375624 7.0554024673219349 + 0 4 0.2052151489021832 1 0.49999999999378325 1 0.79478485108541164 1 1 4 +7 0 0 3 7 5 0.78804636055627808 4.7123889803846897 0.78792784651751024 4.7123889803846897 0.78666363761634184 4.7123889803846897 0.78539816339748192 4.7123889803846897 0.78413268917860202 4.7123889803846897 0.78286848027739186 4.7123889803846897 0.78274996623861859 4.7123889803846897 + 0 4 0.2052151489021832 1 0.49999999999378325 1 0.79478485108541164 1 1 4 +Curves 4 +2 -5.5 1.5 0 -0 -1 -0 0 0 1 -1 0 0 3 +1 -1.5 1.5 3 -1 0 0 +7 0 0 3 7 5 943.71259735151102 1353.4368213810296 9.2489376456425218e-14 943.55219608759205 1353.2772674235996 9.2527324128535532e-14 941.84172288975083 1351.5747219040154 9.2932283980014878e-14 940.13295085470099 1349.8670491453893 9.3338668063054002e-14 938.42527809604871 1348.1582771103128 9.3745379442578809e-14 936.72273257640768 1346.4478039124149 9.4152699665973083e-14 936.56317861897014 1346.2874026484888 9.4190899613513505e-14 + 0 4 0.2052151489021832 1 0.49999999999378325 1 0.79478485108541164 1 1 4 +2 -1.5 1.5 0 0 1 0 0 -0 1 1 0 -0 3 +Polygon3D 0 +PolygonOnTriangulations 4 +24 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 +p 0.00335068426093912 1 0 0.0683903907094314 0.136780781418863 0.205171172128294 0.273561562837726 0.341951953547157 0.410342344256589 0.47873273496602 0.547123125675451 0.615513516384883 0.683903907094314 0.752294297803746 0.820684688513177 0.889075079222609 0.95746546993204 1.02585586064147 1.0942462513509 1.16263664206033 1.23102703276977 1.2994174234792 1.36780781418863 1.43619820489806 1.50458859560749 1.57297898631692 +2 25 1 +p 0.00335068426093912 1 0 4 +4 2 27 28 26 +p 0.00335068426093912 1 0.0137320228697731 0.445970224763194 0.716119100946582 0.98626797712997 +24 25 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 26 +p 0.00335068426093912 1 0 0.0683903907094341 0.136780781418868 0.205171172128302 0.273561562837737 0.341951953547171 0.410342344256605 0.478732734966039 0.547123125675473 0.615513516384907 0.683903907094341 0.752294297803775 0.820684688513209 0.889075079222644 0.957465469932078 1.02585586064151 1.09424625135095 1.16263664206038 1.23102703276981 1.29941742347925 1.36780781418868 1.43619820489812 1.50458859560755 1.57297898631698 +Surfaces 2 +1 -5.5 1.5 3 0 1 0 0 -0 1 1 0 -0 +7 2290 0 0 0 0 -1 +8 3.1415926535897931 6.2831853071795862 +2 0 0 0 0 1 0 3.3306690738754696e-16 0 -1 -1 0 -3.3306690738754696e-16 381 +Triangulations 1 +51 50 1 2.94982503200078e-16 +939.426047933694 1353.40237919105 9.2370555648813e-14 943.673313684198 1353.3977440217 9.25332064102743e-14 939.575971827796 1353.54238501571 9.2370555648813e-14 939.735112833754 1353.6718181845 9.2370555648813e-14 939.902726900083 1353.79007354265 9.2148511043888e-14 940.078030360161 1353.89659819634 9.2148511043888e-14 940.260203596199 1353.99089409781 9.2148511043888e-14 940.4483948713 1354.07252037383 9.2148511043888e-14 940.64172431169 1354.14109538706 9.2148511043888e-14 940.839288020501 1354.19629852031 9.2370555648813e-14 941.040162303871 1354.23787167562 9.2370555648813e-14 941.243407989599 1354.26562048089 9.2148511043888e-14 941.448074818178 1354.27941519873 9.2148511043888e-14 941.653205885657 1354.279191333 9.2148511043888e-14 941.857842117571 1354.26494993037 9.2148511043888e-14 942.061026753022 1354.23675757542 9.2148511043888e-14 942.261809817938 1354.19474607933 9.2370555648813e-14 942.459252566603 1354.13911186359 9.2370555648813e-14 942.652431870696 1354.0701150417 9.2370555648813e-14 942.840444535298 1353.98807820296 9.2370555648813e-14 943.022411521715 1353.89338490428 9.2370555648813e-14 943.197482057355 1353.78647787686 9.2370555648813e-14 943.364837613449 1353.66785695625 9.25926002537381e-14 943.523695732019 1353.53807674541 9.25926002537381e-14 936.597620808948 1350.57395206631 9.30366894635881e-14 936.602255978305 1346.3266863158 9.42090634558256e-14 940.48291088197 1350.21654738554 9.32555031584132e-14 938.653843128418 1348.38604576829 9.36911955176587e-14 936.45761498429 1350.4240281722 9.30366894635881e-14 936.328181815497 1350.26488716625 9.30366894635881e-14 936.209926457354 1350.09727309992 9.30366894635881e-14 936.103401803655 1349.92196963984 9.30366894635881e-14 936.009105902193 1349.7397964038 9.32587340685131e-14 935.927479626173 1349.5516051287 9.32587340685131e-14 935.858904612944 1349.35827568831 9.32587340685131e-14 935.803701479685 1349.1607119795 9.34807786734382e-14 935.762128324383 1348.95983769613 9.34807786734382e-14 935.734379519113 1348.7565920104 9.34807786734382e-14 935.720584801274 1348.55192518182 9.34807786734382e-14 935.720808667001 1348.34679411434 9.37028232783632e-14 935.73505006963 1348.14215788243 9.37028232783632e-14 935.76324242458 1347.93897324698 9.37028232783632e-14 935.805253920675 1347.73819018206 9.39248678832882e-14 935.860888136408 1347.5407474334 9.39248678832882e-14 935.9298849583 1347.3475681293 9.39248678832882e-14 936.011921797039 1347.1595554647 9.39248678832882e-14 936.106615095721 1346.97758847828 9.39248678832882e-14 936.21352212314 1346.80251794264 9.39248678832882e-14 936.332143043746 1346.63516238655 9.41469124882133e-14 936.461923254585 1346.47630426798 9.41469124882133e-14 939.074810848235 1350.92518915802 9.30366894635881e-14 0 0 -3.00654797336688 -2.99999285399872 -0.0070131341603199 -0.205011270202809 -0.0280197472736301 -0.409064026044181 -0.0629216245427489 -0.611204234622391 -0.111555584935858 -0.810486805002824 -0.17369424412697 -1.00598000691758 -0.249047077613794 -1.19676982699836 -0.337261779042602 -1.38196424217543 -0.437925907389382 -1.56069739026255 -0.550568815295992 -1.7321336182288 -0.674663849545539 -1.89547138922973 -0.809630813388824 -2.04994703013106 -0.954838679209431 -2.19483830200337 -1.10960853884462 -2.32946777689448 -1.27321677776801 -2.4532060050915 -1.44489845829341 -2.56547445806438 -1.62385089598193 -2.66574823333135 -1.80923741253101 -2.75355850859994 -2.00019124759931 -2.82849473370943 -2.19581961127767 -2.89020655012638 -2.39520785825941 -2.93840542901892 -2.59742376419385 -2.97286602025104 -2.80152188422921 -2.99342720598968 0 4 -3.00655149142941 6.99999284515707 -3.00003823090744 1.50540831588663 -3.00105212564983 4.09311463420153 -0.00701313416031946 4.20501127020301 -0.0280197472736314 4.40906402604439 -0.0629216245427533 4.61120423462261 -0.111555584935865 4.81048680500305 -0.173694244126982 5.00598000691781 -0.249047077613813 5.1967698269986 -0.337261779042627 5.38196424217568 -0.437925907389414 5.5606973902628 -0.550568815296033 5.73213361822905 -0.67466384954559 5.89547138922999 -0.809630813388885 6.04994703013132 -0.954838679209501 6.19483830200364 -1.1096085388447 6.32946777689474 -1.2732167777681 6.45320600509176 -1.44489845829352 6.56547445806464 -1.62385089598204 6.6657482333316 -1.80923741253114 6.75355850860019 -2.00019124759945 6.82849473370967 -2.19581961127781 6.89020655012661 -2.39520785825957 6.93840542901915 -2.59742376419401 6.97286602025125 -2.80152188422939 6.99342720598989 -1.50327574571471 1.99999999557918 5 27 6 37 28 36 4 27 5 41 42 28 3 27 4 38 28 37 1 27 3 40 41 28 39 28 38 39 40 28 51 27 1 51 25 28 51 1 25 51 28 27 50 26 28 29 28 25 49 50 28 30 28 29 48 49 28 31 28 30 47 48 28 32 28 31 46 47 28 27 10 9 33 28 32 27 11 10 27 12 11 27 13 12 27 14 13 27 15 14 45 46 28 27 16 15 27 17 16 27 18 17 27 19 18 27 20 19 34 28 33 27 21 20 27 22 21 27 23 22 27 24 23 44 45 28 27 2 24 35 28 34 8 27 9 43 44 28 7 27 8 36 28 35 6 27 7 42 43 28 + +TShapes 9 +Ve +1e-07 +1.5 1.5 0 +0 0 + +0101101 +* +Ve +5.10325296841329e-05 +943.673313684198 1353.3977440217 9.25332064102743e-14 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 1.57297898631692 +6 1 1 4 +0 + +0101000 ++9 5 -8 4 * +Ed + 1e-07 1 1 0 +1 2 0 0 4 +6 2 1 4 +0 + +0101000 ++9 6 -9 5 * +Ve +5.10325296734524e-05 +936.602255978305 1346.3266863158 9.42090634558256e-14 +0 0 + +0101101 +* +Ed + 5e-06 1 1 0 +1 3 0 0.0137320228697731 0.98626797712997 +2 1 1 3 0.0137320228697731 0.98626797712997 +2 2 2 0 0.0137320228697731 0.98626797712997 +6 3 1 0 +0 + +0101000 ++8 0 -5 0 * +Ed + 1e-07 1 1 0 +1 4 0 0 1.57297898631698 +6 4 1 4 +0 + +0101000 ++9 6 -5 4 * +Wi + +0101000 +-7 3 -6 3 -4 0 +3 3 * +Fa +0 1e-07 1 3 +2 1 +0111000 ++2 0 * + ++1 0 \ No newline at end of file diff --git a/src/FeaturesPlugin/data/face_peau_bug1868.brep b/src/FeaturesPlugin/data/face_peau_bug1868.brep new file mode 100644 index 000000000..c71c17a90 --- /dev/null +++ b/src/FeaturesPlugin/data/face_peau_bug1868.brep @@ -0,0 +1,112 @@ +DBRep_DrawableShape + +CASCADE Topology V1, (c) Matra-Datavision +Locations 8 +1 + -1 0 1.22460635382238e-16 0 + 0 1 0 0 +-1.22460635382238e-16 0 -1 0 +1 +3.33066907387547e-16 0 1 0 + 0 1 0 0 + -1 0 3.33066907387547e-16 0 +2 1 1 2 1 0 +1 +1.11022302462516e-16 1 0 2290 + -1 1.11022302462516e-16 0 2290 + 0 0 1 0 +2 1 1 2 1 4 1 0 +2 2 1 4 1 0 +2 2 -1 0 +2 4 -1 2 -1 0 +Curve2ds 9 +1 0 3.1415926535897931 1 0 +1 0 30.5 1 0 +1 0 3.1415926535897931 1 0 +1 0 30.5 1 0 +1 0 0 1 0 +1 0 6.2831853071795862 1 0 +2 0 0 -1 0 0 1 381 +1 0 0 0 1 +1 1.5707963267948966 0 0 1 +Curves 3 +2 2290 0 381 0 0 -1 -1 0 0 0 1 0 2290 +2 2290 0 -381 0 0 -1 -1 0 0 0 1 0 2290 +2 0 0 0 0 1 0 1 0 0 0 0 -1 381 +Polygon3D 0 +PolygonOnTriangulations 4 +40 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 2 +p 0.91600000008 1 0 0.0402768288921768 0.0805536577843537 0.12083048667653 0.161107315568707 0.201384144460884 0.241660973353061 0.281937802245238 0.322214631137415 0.362491460029591 0.402768288921768 0.443045117813945 0.483321946706122 0.523598775598299 0.563875604490476 0.604152433382652 0.644429262274829 0.684706091167006 0.724982920059183 0.76525974895136 0.805536577843537 0.845813406735714 0.886090235627891 0.926367064520067 0.966643893412244 1.00692072230442 1.0471975511966 1.08747438008877 1.12775120898095 1.16802803787313 1.20830486676531 1.24858169565748 1.28885852454966 1.32913535344184 1.36941218233401 1.40968901122619 1.44996584011837 1.49024266901054 1.53051949790272 1.5707963267949 +40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 42 +p 0.91600000008 1 0 0.0402768288921768 0.0805536577843537 0.12083048667653 0.161107315568707 0.201384144460884 0.241660973353061 0.281937802245238 0.322214631137415 0.362491460029591 0.402768288921768 0.443045117813945 0.483321946706122 0.523598775598299 0.563875604490476 0.604152433382652 0.644429262274829 0.684706091167006 0.724982920059183 0.76525974895136 0.805536577843537 0.845813406735714 0.886090235627891 0.926367064520067 0.966643893412244 1.00692072230442 1.0471975511966 1.08747438008877 1.12775120898095 1.16802803787313 1.20830486676531 1.24858169565748 1.28885852454966 1.32913535344184 1.36941218233401 1.40968901122619 1.44996584011837 1.49024266901054 1.53051949790272 1.5707963267949 +33 2 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 42 +p 0.91600000008 1 3.14159265358979 3.23976742401447 3.33794219443916 3.43611696486384 3.53429173528852 3.6324665057132 3.73064127613788 3.82881604656256 3.92699081698724 4.02516558741192 4.1233403578366 4.22151512826128 4.31968989868597 4.41786466911065 4.51603943953533 4.61421420996001 4.71238898038469 4.81056375080937 4.90873852123405 5.00691329165873 5.10508806208341 5.20326283250809 5.30143760293277 5.39961237335745 5.49778714378213 5.59596191420681 5.69413668463149 5.79231145505618 5.89048622548086 5.98866099590554 6.08683576633022 6.1850105367549 6.28318530717959 +33 1 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 41 +p 0.91600000008 1 3.14159265358979 3.23976742401447 3.33794219443916 3.43611696486384 3.53429173528852 3.6324665057132 3.73064127613788 3.82881604656256 3.92699081698724 4.02516558741192 4.1233403578366 4.22151512826128 4.31968989868597 4.41786466911065 4.51603943953533 4.61421420996001 4.71238898038469 4.81056375080937 4.90873852123405 5.00691329165873 5.10508806208341 5.20326283250809 5.30143760293277 5.39961237335745 5.49778714378213 5.59596191420681 5.69413668463149 5.79231145505618 5.89048622548086 5.98866099590554 6.08683576633022 6.1850105367549 6.28318530717959 +Surfaces 5 +7 2290 0 0 0 0 -1 +8 3.1415926535897931 6.2831853071795862 +2 0 0 0 0 1 0 3.3306690738754696e-16 0 -1 -1 0 -3.3306690738754696e-16 381 +7 2290 0 0 0 0 -1 +8 0 3.1415926535897931 +2 0 0 0 0 1 0 3.3306690738754696e-16 0 -1 -1 0 -3.3306690738754696e-16 381 +2 2290 0 350.5 -0 -0 1 -1 0 0 0 1 0 2290 +2 2290 0 -350.5 0 0 -1 -1 0 0 0 1 0 2290 +1 0 0 0 0 1 0 -1 -0 -0 0 0 -1 +Triangulations 1 +948 1752 1 0.644585842074808 +-1.73555993795288e-13 0 381 2290 2290 381 1.85719418710551 92.2090028505607 381 7.42576437265916 184.268442361302 381 16.6966783154562 276.02899778469 381 29.6548985591794 367.341833164271 381 46.279406823207 458.058838747142 381 66.5432380943407 548.032871218507 381 90.4135243641572 637.117992368676 381 117.851547941037 725.169705805372 381 148.8128042504 812.045191327406 381 183.247074021293 897.603536579572 381 221.098504742225 981.705965612994 381 262.305701254149 1064.21606398023 381 306.801825333635 1145 381 354.51470410471 1223.92674183266 381 405.366947103527 1300.86827001435 381 459.276071805982 1375.69978510497 381 516.154637414671 1448.29991011341 381 575.910386688179 1518.55088737142 381 638.446395582665 1586.33876953698 381 703.661230463018 1651.55360441734 381 771.449112628579 1714.08961331182 381 841.700089886587 1773.84536258533 381 914.300214895029 1830.72392819402 381 989.131729985654 1884.63305289647 381 1066.07325816734 1935.48529589529 381 1145 1983.19817466636 381 1225.78393601977 2027.69429874585 381 1308.29403438701 2068.90149525778 381 1392.39646342043 2106.75292597871 381 1477.95480867259 2141.1871957496 381 1564.83029419463 2172.14845205896 381 1652.88200763132 2199.58647563584 381 1741.96712878149 2223.45676190566 381 1831.94116125286 2243.72059317679 381 1922.65816683573 2260.34510144082 381 2013.97100221531 2273.30332168454 381 2105.7315576387 2282.57423562734 381 2197.79099714944 2288.14280581289 381 1.26898491714655e-13 0 -381 2290 2290 -381 1.85719418710551 92.2090028505607 -381 7.42576437265916 184.268442361302 -381 16.6966783154562 276.02899778469 -381 29.6548985591794 367.341833164271 -381 46.279406823207 458.058838747142 -381 66.5432380943407 548.032871218507 -381 90.4135243641572 637.117992368676 -381 117.851547941037 725.169705805372 -381 148.8128042504 812.045191327406 -381 183.247074021293 897.603536579572 -381 221.098504742225 981.705965612994 -381 262.305701254149 1064.21606398023 -381 306.801825333635 1145 -381 354.51470410471 1223.92674183266 -381 405.366947103527 1300.86827001435 -381 459.276071805982 1375.69978510497 -381 516.154637414671 1448.29991011341 -381 575.910386688179 1518.55088737142 -381 638.446395582665 1586.33876953698 -381 703.661230463018 1651.55360441734 -381 771.449112628579 1714.08961331182 -381 841.700089886587 1773.84536258533 -381 914.300214895029 1830.72392819402 -381 989.131729985654 1884.63305289647 -381 1066.07325816734 1935.48529589529 -381 1145 1983.19817466636 -381 1225.78393601977 2027.69429874585 -381 1308.29403438701 2068.90149525778 -381 1392.39646342043 2106.75292597871 -381 1477.95480867259 2141.1871957496 -381 1564.83029419463 2172.14845205896 -381 1652.88200763132 2199.58647563584 -381 1741.96712878149 2223.45676190566 -381 1831.94116125286 2243.72059317679 -381 1922.65816683573 2260.34510144082 -381 2013.97100221531 2273.30332168454 -381 2105.7315576387 2282.57423562734 -381 2197.79099714944 2288.14280581289 -381 37.3445304655625 0 379.165380862107 74.3294126881448 0 373.679191833631 110.59846203395 0 364.594267913972 145.802387731099 0 351.9981018868 179.602156730705 0 336.012001716723 211.672258780468 0 316.78992228727 241.703841266349 0 294.516982731203 269.407683632075 0 269.407683632075 294.516982731203 0 241.703841266349 316.78992228727 0 211.672258780469 336.012001716723 0 179.602156730705 351.9981018868 0 145.8023877311 364.594267913971 0 110.598462033951 373.679191833631 0 74.3294126881455 379.165380862107 0 37.3445304655633 381 0 8.736767006471e-13 379.165380862107 0 -37.3445304655616 373.679191833631 0 -74.3294126881438 364.594267913972 0 -110.598462033949 351.998101886801 0 -145.802387731098 336.012001716724 0 -179.602156730704 316.789922287271 0 -211.672258780467 294.516982731204 0 -241.703841266348 269.407683632076 0 -269.407683632073 241.703841266351 0 -294.516982731201 211.67225878047 0 -316.789922287269 179.602156730707 0 -336.012001716722 145.802387731101 0 -351.998101886799 110.598462033953 0 -364.594267913971 74.3294126881475 0 -373.67919183363 37.3445304655654 0 -379.165380862107 2290 2252.65546953444 379.165380862107 2290 2215.67058731186 373.679191833631 2290 2179.40153796605 364.594267913972 2290 2144.1976122689 351.9981018868 2290 2110.39784326929 336.012001716723 2290 2078.32774121953 316.78992228727 2290 2048.29615873365 294.516982731203 2290 2020.59231636793 269.407683632075 2290 1995.4830172688 241.703841266349 2290 1973.21007771273 211.672258780469 2290 1953.98799828328 179.602156730705 2290 1938.0018981132 145.8023877311 2290 1925.40573208603 110.598462033951 2290 1916.32080816637 74.3294126881455 2290 1910.83461913789 37.3445304655633 2290 1909 8.736767006471e-13 2290 1910.83461913789 -37.3445304655616 2290 1916.32080816637 -74.3294126881438 2290 1925.40573208603 -110.598462033949 2290 1938.0018981132 -145.802387731098 2290 1953.98799828328 -179.602156730704 2290 1973.21007771273 -211.672258780467 2290 1995.4830172688 -241.703841266348 2290 2020.59231636792 -269.407683632073 2290 2048.29615873365 -294.516982731201 2290 2078.32774121953 -316.789922287269 2290 2110.39784326929 -336.012001716722 2290 2144.1976122689 -351.998101886799 2290 2179.40153796605 -364.594267913971 2290 2215.67058731185 -373.67919183363 2290 2252.65546953443 -379.165380862107 1800.91232914861 1952.54743192163 -261.458064027986 1713.96168056775 1898.94385058741 -227.51742343876 1807.83230237768 1924.92135021348 -227.51742343876 1387.37506907458 1688.69247096195 66.1599556911012 1305.60210812986 1642.36866077423 66.1599556911012 1300.34913496681 1651.13271702641 109.272031662926 1382.55845520572 1697.70372170098 109.272031662926 247.365489300779 100.34819874105 -291.862932828329 374.439896793223 905.992454919547 -340.474035963219 367.741987799834 796.225339033655 -318.320856148327 409.126357387429 889.586980858145 -318.320856148327 294.706311806842 826.477706567039 -358.02288851943 332.29233010807 810.909068031068 -340.474035963219 1308.24647497398 1637.95680123222 22.1531798148923 839.640622285915 1600.2249770181 -358.02288851943 762.868325651687 1527.13167434831 -358.02288851943 791.635418636589 1498.36458136341 -340.474035963219 2102.82209807589 1900.44913103066 22.1531798148922 2009.79694301894 1888.97557248959 22.1531798148923 2102.31793178039 1905.5680173325 66.1599556911012 279.55394828162 98.7668811523874 -261.458064027986 299.293218655982 941.534186703704 370.730095690913 255.492219315464 842.720715513121 370.730095690913 259.84923102184 960.189803475346 378.42381429968 732.855158628323 1557.14484137168 -370.730095690912 866.961529697537 1570.08100090662 -340.474035963219 1589.05447937367 1959.01149386646 318.320856148329 1479.09093196893 1957.70766989193 340.47403596322 1576.12786982955 1995.13894732538 340.47403596322 1493.77466096635 1922.25801220017 318.320856148329 866.961529697536 1570.08100090662 340.47403596322 791.635418636587 1498.36458136341 340.47403596322 839.640622285914 1600.2249770181 358.022888519431 1548.12294369475 2073.40747257955 -370.730095690912 1447.27928448688 2034.50778068453 -370.730095690912 1562.42224290579 2033.44360850689 -358.02288851943 417.04869366033 372.553178330847 -22.1531798148902 401.024427510413 280.203056981058 -22.1531798148902 417.04869366033 372.553178330847 22.1531798148923 1907.61432221938 1922.38261912983 -190.499999999998 1813.74807822663 1901.30424916987 -190.499999999998 1818.57965597551 1882.01550956766 -150.906390860917 689.416010985615 1069.47602965507 -109.272031662924 638.867282973588 989.650865033194 -109.272031662924 697.91175937181 1063.79935207028 -66.1599556910992 394.793592515869 678.115695669767 261.458064027988 363.802891522487 584.305504830706 261.458064027988 332.963309151077 593.660589866908 291.862932828331 1911.49362652827 1902.88003937575 -150.906390860917 1212.10504377707 1613.18380303131 -150.906390860917 1143.27526715353 1546.17931397822 -109.272031662924 1220.52397034493 1600.58398901439 -109.272031662924 391.056149412585 576.038319432249 227.517423438762 837.702954492288 1316.28531577079 190.5 774.865250690497 1243.43895400581 190.5 756.044964308267 1258.88436387703 227.517423438762 2195.54443271938 1922.68724178054 109.272031662926 1134.24823798066 1558.35085382034 -150.906390860917 364.450190037901 688.972738680533 291.862932828331 790.236299092902 1230.82426058915 150.906390860919 2194.80087749905 1937.82265599524 150.906390860919 1460.47485389725 1753.88356255385 150.906390860919 1375.41506580904 1711.06806327636 150.906390860919 819.663208310651 1332.63558865234 227.517423438762 1451.97306713974 1771.85908037436 190.5 315.164321799966 194.504337345719 -227.51742343876 307.999222381796 97.3694544450168 -227.51742343876 339.393827982857 192.117939279115 -190.499999999998 2101.31641717366 1915.73656578032 109.272031662926 1674.88458817955 2027.76376028118 -340.474035963219 1576.12786982955 1995.13894732537 -340.474035963219 1589.05447937367 1959.01149386645 -318.320856148327 486.38465605175 964.052486312057 -291.862932828329 441.253376289662 874.392032562995 -291.862932828329 1686.02293693576 1991.04554525488 -318.320856148327 432.595558031156 465.255592514604 66.1599556911012 412.003873133698 373.556655524805 66.1599556911012 401.982454623748 375.550039605121 109.272031662926 970.057810075313 1608.35421199555 -318.320856148327 892.72953757239 1541.65038540336 -318.320856148327 992.603613644904 1580.88207085879 -291.862932828329 470.386490682652 860.613095643098 -261.458064027986 514.806577943211 948.860652555947 -261.458064027986 422.68402147955 467.738303176241 109.272031662926 367.741987799832 796.225339033656 318.320856148329 330.988506133544 700.945520626331 318.320856148329 294.861052674624 713.872130170456 340.47403596322 892.980121080684 1702.27364777968 370.730095690913 781.833986344935 1664.0047712481 378.42381429968 865.299482553125 1736.00260341603 378.42381429968 811.136283741688 1631.6746681724 370.730095690913 1663.07499092373 2066.69478505911 358.022888519431 1548.12294369475 2073.40747257955 370.730095690913 1650.75384971202 2107.31214426408 370.730095690913 1562.42224290578 2033.44360850689 358.022888519431 2007.54295690571 1904.17071259444 -109.272031662924 1914.44996039488 1888.01754537625 -109.272031662924 2009.04221216785 1894.06355460111 -66.1599556910992 756.159081496366 1137.57395510262 -22.1531798148902 702.188551704674 1060.94169079464 22.1531798148923 756.159081496366 1137.57395510262 22.1531798148922 1793.08173930623 1983.80889893132 -291.862932828329 1696.33941013309 1957.03669084892 -291.862932828329 1705.6944951693 1926.19710847751 -261.458064027986 332.292330108068 810.909068031068 340.47403596322 370.839635503615 284.680547912026 -150.906390860917 359.18273579965 190.168901977333 -150.906390860917 374.263434219676 188.683582826338 -109.272031662924 385.829287405564 282.457043094294 -109.272031662924 702.188551704674 1060.94169079464 -22.1531798148902 1305.60210812986 1642.36866077423 -66.1599556910992 1226.20064792972 1592.08824062819 -66.1599556910992 215.180355963744 859.418436037934 -378.42381429968 175.509903160867 756.576654311944 -378.42381429968 255.492219315466 842.72071551312 -370.730095690912 1229.05830920536 1587.81144829533 -22.1531798148902 1308.24647497398 1637.95680123222 -22.1531798148902 866.685518994028 1423.31448100597 261.458064027988 798.561232200713 1351.76130496029 261.458064027988 774.682394189262 1373.40382219143 291.862932828331 843.897392075855 1446.10260792415 291.862932828331 433.382960448072 563.198621676959 150.906390860919 407.98449043234 471.420344024494 150.906390860919 414.354529260931 568.970833171829 190.5 2102.82209807589 1900.44913103066 -22.1531798148902 2009.79694301894 1888.97557248959 -22.1531798148902 1530.60641664212 1833.33828812169 227.517423438762 1441.56349341725 1793.86827482838 227.517423438762 1519.70775359796 1859.64998825464 261.458064027988 1533.42334568806 2114.49009683913 -378.42381429968 1430.58156396207 2074.81964403626 -378.42381429968 211.869139128205 102.092022603342 -318.320856148327 587.931011355439 1020.18089132887 -227.51742343876 539.923324263299 935.435471949009 -227.51742343876 608.813908874112 1007.66416424773 -190.499999999998 1902.86450840409 1946.26154570368 -227.51742343876 809.848669786784 1214.72880392282 66.1599556911012 743.820686021777 1146.72473284647 109.272031662926 801.950242454627 1221.21087571522 109.272031662926 752.027659539979 1140.63802645346 66.1599556911012 337.663069382515 923.386598853846 358.022888519431 294.70631180684 826.47770656704 358.022888519431 1090.93435819337 1616.75286000101 -261.458064027986 1013.04838246935 1555.97004796637 -261.458064027986 1031.11563612298 1533.95503569173 -227.51742343876 1107.89962359611 1593.87784765454 -227.51742343876 1744.32274161935 2178.46572916969 378.42381429968 2196.04579393428 1912.4817998021 66.1599556911012 1638.08778684257 2149.06655779127 378.42381429968 412.003873133698 373.556655524805 -66.1599556910992 395.936445398895 280.957787832148 -66.1599556910992 1663.07499092373 2066.6947850591 -358.02288851943 1389.79977097584 1684.15617276687 22.1531798148922 337.663069382517 923.386598853845 -358.02288851943 892.729537572388 1541.65038540336 318.320856148329 818.767411999891 1471.23258800011 318.320856148329 2005.31945208798 1919.16036449639 -150.906390860917 421.60837110255 668.521214475671 227.517423438762 811.13628374169 1631.6746681724 -370.730095690912 286.821879756773 197.295824237122 -261.458064027986 676.816196968693 1077.89495622293 -150.906390860917 625.869548837438 997.441407064533 -150.906390860917 852.436514125411 1302.93159570773 150.906390860919 1601.02726131947 1925.5498099621 291.862932828331 1784.44642814492 2018.28299352979 -318.320856148327 1507.37490818021 1889.42411092483 291.862932828331 309.408917102613 1058.64798957349 378.42381429968 2102.31793178039 1905.5680173325 -66.1599556910992 1201.05771976543 1629.71729180915 -190.499999999998 1122.40296111176 1574.32236079008 -190.499999999998 455.041916325151 980.805529727131 -318.320856148327 437.585063558378 464.005786442232 22.1531798148923 919.906961697533 1669.4631975551 358.022888519431 400.575889075169 782.625091819792 291.862932828331 1466.95388160854 1740.18480940868 109.272031662926 945.715865076894 1638.01495779579 -340.474035963219 1897.30841816603 1974.19389757929 -261.458064027986 752.027659539979 1140.63802645346 -66.1599556910992 351.170199020514 287.59823319707 -190.499999999998 2196.29818109342 1907.34434115539 22.1531798148923 1674.88458817955 2027.76376028118 340.47403596322 447.88411608517 558.799744205972 109.272031662926 1650.75384971202 2107.31214426407 -370.730095690912 2002.40176680293 1938.82980097949 -190.499999999998 886.823622430507 1403.17637756949 227.517423438762 173.544925006565 103.974770513029 -340.474035963219 563.503261646085 1034.82232104641 -261.458064027986 1300.34913496681 1651.13271702641 -109.272031662924 374.439896793221 905.992454919548 340.47403596322 952.197207096871 1803.81825325647 378.42381429968 1775.12317343438 2055.50351272734 -340.474035963219 1539.92351159151 1810.84483113298 190.5 813.824768409331 1211.46570411305 22.1531798148923 401.982454623749 375.550039605121 -109.272031662924 1071.73659101447 1642.63805252922 -291.862932828329 299.293218655985 941.534186703703 -370.730095690912 2101.31641717366 1915.73656578032 -109.272031662924 444.531901917881 660.319043997216 190.5 1891.02118809429 2005.80193761506 -291.862932828329 916.596177808566 1515.31760581074 291.862932828331 1754.92475569668 2136.14011641432 370.730095690913 2196.29818109342 1907.34434115539 -22.1531798148902 660.282708190846 1088.94228023457 -190.499999999998 1389.79977097584 1684.15617276687 -22.1531798148902 254.749784760911 200.454649881868 -291.862932828329 1638.08778684257 2149.06655779127 -378.42381429968 347.890004998079 1038.07941956986 370.730095690913 781.833986344937 1664.00477124809 -378.42381429968 702.001794163384 1587.99820583662 -378.42381429968 863.664641091168 1292.75501461893 109.272031662926 1998.82935773881 1962.9130266579 -227.51742343876 421.20221555025 998.893226628558 -340.474035963219 437.585063558378 464.005786442232 -22.1531798148902 1611.88430433023 1895.20640748413 261.458064027988 430.350011745356 770.29224640204 261.458064027988 1765.23805620069 2094.96711285302 -358.02288851943 1187.53139441577 1649.96086827514 -227.51742343876 2099.83109802267 1930.81726420035 -150.906390860917 945.715865076892 1638.01495779579 340.47403596322 1471.32253253851 1730.94807307514 66.1599556911012 327.086973342096 291.170642261187 -227.51742343876 457.661892918731 555.833688030458 66.1599556911012 743.820686021778 1146.72473284647 -109.272031662924 1884.08784218993 2040.65822129257 -318.320856148327 919.906961697535 1669.4631975551 -358.02288851943 2196.04579393428 1912.4817998021 -66.1599556910992 132.911116187283 105.970981534455 -358.02288851943 904.039369082904 1385.9606309171 190.5 1994.65053559981 1991.08435721873 -261.458064027986 535.861003155457 1051.39045318057 -291.862932828329 409.126357387427 889.586980858146 318.320856148329 1686.02293693576 1991.04554525488 318.320856148329 978.189501672486 1768.77170106789 370.730095690913 1292.55859293547 1664.13045116256 -150.906390860917 387.119960624246 378.506373471728 -150.906390860917 1754.92475569668 2136.14011641432 -370.730095690912 1547.53304072024 1792.4738027071 150.906390860919 813.824768409331 1211.46570411305 -22.1531798148902 463.254183532531 653.620104519432 150.906390860919 259.849231021843 960.189803475345 -378.42381429968 2097.88206072089 1950.60617201714 -190.499999999998 219.381756878036 203.938096582028 -318.320856148327 938.238695039712 1491.43876779929 261.458064027988 1876.60214206229 2078.29137717049 -340.474035963219 1050.56593892705 1671.18337241585 -318.320856148327 385.323177628565 1018.0709719449 358.022888519431 640.039131724859 1102.46860558423 -227.51742343876 2195.54443271938 1922.68724178054 -109.272031662924 1765.23805620069 2094.96711285303 358.022888519431 1989.92181178663 2022.96282374358 -291.862932828329 432.595558031156 465.255592514604 -66.1599556910992 871.235494234017 1285.89319330585 66.1599556911012 1387.37506907458 1688.69247096195 -66.1599556910992 385.323177628568 1018.0709719449 -358.02288851943 456.661711878309 759.393583357877 227.517423438762 1744.32274161935 2178.46572916968 -378.42381429968 970.057810075312 1608.35421199555 318.320856148329 2095.49566265428 1974.83567820003 -227.51742343876 298.915642781273 295.349464400196 -261.458064027986 1621.47878552433 1868.39162889745 227.517423438762 363.740020581376 1154.55579993814 378.42381429968 1868.66531896398 2118.19248137464 -358.02288851943 1171.70898807425 1673.64077278509 -261.458064027986 731.649146179664 1155.75176201934 -150.906390860917 462.5840632907 554.340563971971 22.1531798148923 2194.80087749905 1937.82265599524 -150.906390860917 1851.87228070725 2202.61678579547 378.42381429968 90.5172152279965 108.053660338024 -370.730095690912 1473.52172817765 1726.29826456667 22.1531798148922 918.099945511082 1371.90005448892 150.906390860919 505.378050009792 1069.66123216659 -318.320856148327 1984.70713417682 2058.11732465971 -318.320856148327 441.25337628966 874.392032562995 291.862932828331 892.980121080686 1702.27364777967 -370.730095690912 1696.33941013309 1957.03669084892 291.862932828331 2092.70417576288 2003.17812024323 -261.458064027986 1003.4739752444 1734.67953502148 358.022888519431 367.617380870166 382.385677780623 -190.499999999998 809.848669786784 1214.72880392282 -66.1599556910992 1860.38470481192 2159.82193992035 -370.730095690912 2193.82518358211 1957.68336193349 -190.499999999998 1282.33583575227 1681.18609112589 -190.499999999998 477.522029205436 648.514987706834 109.272031662926 957.364411347663 1470.33679168935 227.517423438762 1979.07702233935 2096.07245564922 -340.474035963219 181.196088011981 207.699056696778 -340.474035963219 1553.33209820089 1778.47363948833 109.272031662926 616.359227214907 1118.29101192575 -261.458064027986 2089.54535011813 2035.25021523909 -291.862932828329 1042.31781574641 1867.28834692899 378.42381429968 1027.70869868266 1702.00279317846 -340.474035963219 421.202215550248 998.893226628559 340.47403596322 1851.87228070725 2202.61678579547 -378.42381429968 422.68402147955 467.73830317624 -109.272031662924 2192.63054555499 1982.0007776182 -227.51742343876 875.046690752876 1282.4389261304 22.1531798148923 347.890004998082 1038.07941956986 -370.730095690912 479.155168867025 750.076488408495 190.5 1775.12317343438 2055.50351272734 340.47403596322 1973.10761387844 2136.31493867687 -358.02288851943 267.037176256419 300.078188213368 -291.862932828329 992.603613644903 1580.88207085879 291.862932828331 1382.55845520572 1697.70372170098 -109.272031662924 1629.68095600279 1845.46809808212 190.5 715.677639209924 1167.59703888824 -190.499999999998 2086.06190341797 2070.61824312196 -318.320856148327 401.165504426881 1132.12382818926 370.730095690913 2191.23311884761 2010.44605171838 -261.458064027986 928.815206539543 1361.18479346046 109.272031662926 1153.80447164356 1700.43677525301 -291.862932828329 462.5840632907 554.340563971971 -22.1531798148902 46.9365269131249 110.194642265718 -378.42381429968 472.466631857371 1089.38757706191 -340.474035963219 1966.87963480313 2178.30056319505 -370.730095690912 2082.30094330322 2108.80391198802 -340.474035963219 1860.38470481192 2159.82193992035 370.730095690913 470.38649068265 860.613095643099 261.458064027988 1027.70869868266 1702.00279317847 340.47403596322 1473.52172817765 1726.29826456667 -22.1531798148902 2189.65180125895 2042.63451069922 -291.862932828329 801.950242454627 1221.21087571522 -109.272031662924 343.73845429632 387.135491595911 -227.51742343876 487.142490800128 645.072731506566 66.1599556911012 865.299482553127 1736.00260341603 -378.42381429968 1960.47730784638 2221.46154565783 -378.42381429968 973.714684229213 1452.29704550771 190.5 140.709173827261 211.686669692432 -358.02288851943 2078.31333030757 2149.29082617274 -358.02288851943 1705.6944951693 1926.19710847751 261.458064027988 589.563224746992 1136.19552835644 -291.862932828329 455.041916325149 980.805529727132 318.320856148329 2187.90797739666 2078.1308608718 -318.320856148327 1269.81910867113 1702.06898864456 -227.51742343876 1066.55914865579 1831.00862840212 370.730095690913 1557.24226172922 1769.03366966714 66.1599556911012 2074.15299005609 2191.53146961642 -370.730095690912 407.984490432341 471.420344024494 -150.906390860917 2186.02522948697 2116.45507499344 -340.474035963219 1003.4739752444 1734.67953502148 -358.02288851943 875.046690752876 1282.4389261304 -22.1531798148902 309.408917102616 1058.64798957349 -378.42381429968 2069.87618401369 2234.95461007964 -378.42381429968 497.526197292897 742.466959279758 150.906390860919 1784.44642814492 2018.28299352979 318.320856148329 1013.04838246935 1555.97004796637 261.458064027988 2184.02901846555 2157.08888381272 -358.02288851943 231.882675340285 305.29286582318 -318.320856148327 437.571819169695 1110.30272289205 358.022888519431 1375.41506580904 1711.06806327636 -150.906390860917 2181.94633966198 2199.482784772 -370.730095690912 696.122152345458 1182.10037640389 -227.51742343876 2179.80535773428 2243.06347308688 -378.42381429968 1636.37989548057 1826.74581646747 150.906390860919 457.661892918731 555.833688030458 -66.1599556910992 936.040246644734 1353.95975335527 66.1599556911012 437.571819169697 1110.30272289205 -358.02288851943 1134.05997299351 1729.98650571362 -318.320856148327 496.131725171621 848.436506582753 227.517423438762 315.806102420706 392.691581833971 -261.458064027986 1050.56593892705 1671.18337241585 318.320856148329 1868.66531896398 2118.19248137464 358.022888519431 422.711653071005 1247.68218425359 378.42381429968 1471.32253253851 1730.94807307514 -66.1599556910992 491.985468077286 643.339886528603 22.1531798148923 790.236299092903 1230.82426058915 -150.906390860917 98.4685303835754 215.84700994391 -370.730095690912 987.06840429227 1437.56348587459 150.906390860919 1713.96168056775 1898.94385058742 227.517423438762 560.013494286381 1155.94002700649 -318.320856148327 486.384656051749 964.052486312057 291.862932828331 1255.17767895359 1726.49673835392 -261.458064027986 1090.14034267128 1795.71687754801 358.022888519431 388.695750830132 476.251921773373 -190.499999999998 1960.47730784638 2221.46154565783 378.42381429968 871.235494234017 1285.89319330585 -66.1599556910992 511.526360511667 736.667901799106 109.272031662926 1031.11563612297 1533.95503569173 227.517423438762 1559.21065305133 1764.28155264125 22.1531798148923 193.927544350784 310.922977660655 -340.474035963219 673.247139998987 1199.06564180663 -261.458064027986 978.189501672488 1768.77170106788 -370.730095690912 1793.08173930623 1983.80889893132 291.862932828331 472.466631857369 1089.38757706191 340.47403596322 1135.44420006186 1926.25997941862 378.42381429968 1366.04150297173 1728.60476589459 -190.499999999998 447.884116085171 558.799744205972 -109.272031662924 518.140919625643 838.026932860258 190.5 939.677359553672 1350.32264044633 22.1531798148923 401.165504426883 1132.12382818926 -370.730095690912 1641.48501229317 1812.47797079456 109.272031662926 284.198062384941 398.978811905716 -291.862932828329 1071.73659101447 1642.63805252922 291.862932828331 1112.74250259697 1761.89035475453 -340.474035963219 458.99137159788 1223.44085134421 370.730095690913 774.865250690498 1243.43895400581 -190.499999999998 491.985468077286 643.339886528603 -22.1531798148902 997.244985381071 1426.33535890883 109.272031662926 1876.60214206229 2078.29137717049 340.47403596322 55.0453899203567 220.123815986308 -378.42381429968 1466.95388160854 1740.18480940868 -109.272031662924 514.806577943209 948.860652555948 261.458064027988 528.109645245468 1177.25749740303 -340.474035963219 1721.02916682817 1875.64547073907 190.5 365.078649786522 482.167697622317 -227.51742343876 1112.74250259697 1761.89035475453 340.47403596322 1238.60954681943 1754.13899684454 -291.862932828329 520.966330332855 732.757738270777 66.1599556911012 863.664641091169 1292.75501461893 -109.272031662924 153.685061323131 316.892386121557 -358.02288851943 1966.87963480312 2178.30056319506 370.730095690913 1046.56104599419 1515.1347493095 190.5 1559.21065305133 1764.28155264125 -22.1531798148902 505.37805000979 1069.66123216659 318.320856148329 647.361947470782 1218.26340898553 -291.862932828329 433.382960448073 563.198621676959 -150.906390860917 952.197207096873 1803.81825325647 -378.42381429968 1157.87617181074 1888.83449557312 370.730095690913 1800.91232914861 1952.54743192163 261.458064027988 939.677359553672 1350.32264044633 -22.1531798148902 536.116437446146 829.525146102753 150.906390860919 249.341778707427 405.912157810068 -318.320856148327 1354.56452805099 1750.0766757367 -227.51742343876 363.740020581379 1154.55579993814 -378.42381429968 1090.93435819337 1616.75286000101 261.458064027988 1644.92726849343 1802.85750919987 66.1599556911012 494.283122451991 1199.85965732873 358.022888519431 487.142490800128 645.072731506566 -66.1599556910992 756.044964308268 1258.88436387703 -227.51742343876 1090.14034267128 1795.71687754801 -358.02288851943 1004.10680669415 1418.76450576598 66.1599556911012 539.923324263298 935.43547194901 227.517423438762 1884.08784218993 2040.65822129258 318.320856148329 494.283122451993 1199.85965732872 -358.02288851943 337.452568078369 489.087670851389 -261.458064027986 1460.47485389725 1753.88356255385 -150.906390860917 486.18174674353 1337.80279290313 378.42381429968 1134.05997299351 1729.98650571362 318.320856148329 1726.80137832304 1856.61703955193 150.906390860919 852.436514125412 1302.93159570773 -150.906390860917 525.718447358747 730.789346948669 22.1531798148923 111.699436804946 323.120365196877 -370.730095690912 1059.17573941085 1499.7637009071 150.906390860919 1220.33876783341 1784.62194999021 -318.320856148327 535.861003155455 1051.39045318057 291.862932828331 618.816627584155 1239.43406107295 -318.320856148327 1973.10761387844 2136.31493867687 358.022888519431 1179.69727710795 1852.42818083031 358.022888519431 1557.24226172922 1769.03366966714 -66.1599556910992 414.354529260932 568.970833171829 -190.499999999998 549.815190591318 823.046118391457 109.272031662926 936.040246644734 1353.95975335527 -66.1599556910992 211.708622829509 413.397857937712 -340.474035963219 1807.83230237768 1924.92135021348 227.517423438762 1107.89962359611 1593.87784765454 227.517423438762 1341.13934744405 1775.19342205679 -261.458064027986 734.029952033635 1276.95161753065 -261.458064027986 528.109645245466 1177.25749740303 340.47403596322 2069.87618401369 2234.95461007965 378.42381429968 1231.35201042651 1980.59108289739 378.42381429968 477.522029205437 648.514987706834 -109.272031662924 561.395234105409 923.95849702827 190.5 1646.6601134714 1798.01453192271 22.1531798148923 1007.5610738696 1414.95330924712 22.1531798148923 1066.55914865579 1831.00862840212 -370.730095690912 306.191101068679 496.918260693767 -291.862932828329 458.991371597882 1223.44085134421 -370.730095690912 1891.02118809428 2005.80193761506 291.862932828331 521.228298932115 1311.81049832751 370.730095690913 1153.80447164356 1700.43677525301 291.862932828331 525.718447358747 730.789346948669 -22.1531798148902 1451.97306713974 1771.85908037436 -190.499999999998 68.5384543421742 329.522692153617 -378.42381429968 837.702954492288 1316.28531577079 -190.499999999998 563.503261646083 1034.82232104641 261.458064027988 1068.78912428478 1488.04975754537 109.272031662926 1731.20025579403 1842.11588391483 109.272031662926 1200.61242293809 1817.53336814263 -340.474035963219 587.997206821537 1262.29130131734 -340.474035963219 391.056149412585 576.038319432249 -227.51742343876 559.05192692486 818.677467461496 66.1599556911012 1979.07702233935 2096.07245564922 340.47403596322 1200.61242293809 1817.53336814263 340.47403596322 171.807518625363 421.334681036021 -358.02288851943 928.815206539544 1361.18479346046 -109.272031662924 560.013494286379 1155.94002700649 318.320856148329 1553.3320982009 1778.47363948833 -109.272031662924 1122.40296111176 1574.32236079008 190.5 1813.74807822663 1901.30424916987 190.5 709.117929141215 1297.3963863551 -291.862932828329 463.254183532532 653.620104519432 -150.906390860917 1325.94751368794 1803.61534394825 -291.862932828329 578.931936723644 914.584934190966 150.906390860919 1251.92058043014 1942.10999500192 370.730095690913 1007.5610738696 1414.95330924712 -22.1531798148902 271.717006470213 505.553571855084 -318.320856148327 2074.15299005609 2191.53146961643 370.730095690913 46.9365269131217 110.194642265719 378.42381429968 555.320464978522 1286.5260247556 358.022888519431 422.711653071008 1247.68218425359 -378.42381429968 1646.6601134714 1798.01453192271 -22.1531798148902 1171.70898807425 1673.64077278509 261.458064027988 520.966330332856 732.757738270777 -66.1599556910992 1042.31781574641 1867.28834692899 -378.42381429968 90.5172152279938 108.053660338024 370.730095690913 819.663208310651 1332.63558865234 -227.51742343876 1897.30841816603 1974.1938975793 261.458064027988 587.931011355438 1020.18089132887 227.517423438762 1075.27119607718 1480.15133021322 66.1599556911012 132.911116187281 105.970981534455 358.022888519431 1441.56349341725 1793.86827482838 -227.51742343876 363.802891522488 584.305504830705 -261.458064027986 555.320464978524 1286.5260247556 -358.02288851943 55.0453899203535 220.123815986308 378.42381429968 1734.16631196954 1832.33810708127 66.1599556911012 553.997396583968 1424.70051744688 378.42381429968 173.544925006563 103.974770513029 340.47403596322 1220.33876783341 1784.62194999021 318.320856148329 563.701735433334 816.478271822348 22.1531798148923 1179.69727710795 1852.4281808303 -358.02288851943 918.099945511083 1371.90005448892 -150.906390860917 130.178060079649 429.615295188082 -370.730095690912 98.4685303835727 215.84700994391 370.730095690913 1134.24823798066 1558.35085382034 150.906390860919 589.56322474699 1136.19552835644 291.862932828331 1984.70713417682 2058.11732465972 318.320856148329 211.869139128202 102.092022603342 318.320856148329 1547.53304072024 1792.4738027071 -150.906390860917 444.531901917882 660.319043997215 -190.499999999998 681.645788004455 1319.94218992469 -318.320856148327 1271.9290280551 1904.67682237144 358.022888519431 592.296278299022 907.441544794277 109.272031662926 140.709173827258 211.686669692432 358.022888519431 1818.57965597551 1882.01550956766 150.906390860919 234.496487272664 514.876826565621 -340.474035963219 1004.10680669415 1418.76450576598 -66.1599556910992 68.538454342171 329.522692153618 378.42381429968 587.997206821535 1262.29130131734 340.47403596322 1309.19447027287 1834.95808367485 -318.320856148327 2078.31333030757 2149.29082617274 358.022888519431 247.365489300777 100.34819874105 291.862932828331 1187.53139441577 1649.96086827514 227.517423438762 798.561232200714 1351.76130496029 -261.458064027986 1644.92726849343 1802.85750919987 -66.1599556910992 511.526360511667 736.667901799106 -109.272031662924 181.196088011979 207.699056696778 340.47403596322 608.813908874111 1007.66416424773 190.5 1329.81019652465 2030.15076897816 378.42381429968 1078.53429588695 1476.17523159067 22.1531798148923 332.963309151079 593.660589866908 -291.862932828329 1902.86450840409 1946.26154570368 227.517423438762 111.699436804944 323.120365196877 370.730095690913 279.553948281618 98.7668811523875 261.458064027988 1429.3869043569 1819.61350931735 -261.458064027986 587.726352220325 1397.01987891932 370.730095690913 521.228298932117 1311.81049832751 -370.730095690912 1238.60954681943 1754.13899684455 291.862932828331 2179.80535773428 2243.06347308688 378.42381429968 563.701735433334 816.478271822348 -22.1531798148902 87.3832142045321 438.12771929275 -378.42381429968 904.039369082905 1385.9606309171 -190.499999999998 616.359227214906 1118.29101192575 261.458064027988 219.381756878033 203.938096582028 318.320856148329 1735.65943602803 1827.4159367093 22.1531798148923 1143.27526715353 1546.17931397822 109.272031662926 153.685061323129 316.892386121558 358.022888519431 1157.87617181074 1888.83449557312 -370.730095690912 1989.92181178663 2022.96282374358 291.862932828331 307.999222381795 97.3694544450169 227.517423438762 421.608371102551 668.52121447567 -227.51742343876 601.307529038048 902.624930925423 66.1599556911012 651.985042204212 1344.28413492311 -340.474035963219 1539.92351159151 1810.84483113297 -190.499999999998 87.3832142045294 438.12771929275 378.42381429968 195.032887146976 524.76194379931 -358.02288851943 1291.10677337144 1868.79778444975 340.47403596322 1822.26169682376 1867.31597852045 109.272031662926 997.244985381072 1426.33535890883 -109.272031662924 254.749784760909 200.454649881869 291.862932828331 618.816627584153 1239.43406107296 318.320856148329 1201.05771976543 1629.71729180916 190.5 1291.10677337144 1868.79778444975 -340.474035963219 497.526197292898 742.466959279757 -150.906390860917 625.869548837437 997.441407064533 150.906390860919 774.682394189264 1373.40382219143 -291.862932828329 193.927544350781 310.922977660656 340.47403596322 332.316638066509 96.1748164178922 190.5 1348.4658132963 1990.70678134402 370.730095690913 2082.30094330322 2108.80391198802 340.47403596322 1078.53429588695 1476.17523159067 -22.1531798148902 298.954454745124 603.977063064239 -318.320856148327 620.536802444902 1370.09303830247 358.022888519431 1641.48501229317 1812.47797079456 -109.272031662924 1907.61432221938 1922.38261912984 190.5 130.178060079646 429.615295188083 370.730095690913 486.181746743532 1337.80279290313 -378.42381429968 286.821879756772 197.295824237122 261.458064027988 559.05192692486 818.677467461496 -66.1599556910992 1415.60796743701 1848.74662371034 -291.862932828329 1255.17767895359 1726.49673835392 261.458064027988 640.039131724858 1102.46860558423 227.517423438762 2181.94633966198 2199.48278477201 370.730095690913 886.823622430508 1403.17637756949 -227.51742343876 231.882675340283 305.292865823181 318.320856148329 394.79359251587 678.115695669767 -261.458064027986 352.177344004761 95.1991225009481 150.906390860919 1149.36197354655 1537.97234046002 66.1599556911012 1735.65943602803 1827.4159367093 -22.1531798148902 625.995228751905 1508.16601365507 378.42381429968 620.536802444904 1370.09303830247 -358.02288851943 605.843827233131 900.200229024157 22.1531798148923 1135.44420006186 1926.25997941862 -378.42381429968 171.80751862536 421.334681036022 358.022888519431 1309.19447027287 1834.95808367485 318.320856148329 1994.65053559981 1991.08435721873 261.458064027988 153.859883585679 535.075244303325 -370.730095690912 647.36194747078 1218.26340898553 291.862932828331 1530.60641664212 1833.33828812169 -227.51742343876 987.068404292271 1437.56348587459 -150.906390860917 315.164321799964 194.504337345719 227.517423438762 111.534270830313 545.677258380651 378.42381429968 479.155168867026 750.076488408495 -190.499999999998 1212.10504377707 1613.18380303131 150.906390860919 267.037176256417 300.078188213368 291.862932828331 1824.7444074854 1857.40444196884 66.1599556911012 748.349614596642 1397.27046242761 -318.320856148327 638.867282973587 989.650865033195 109.272031662926 1271.9290280551 1904.67682237143 -358.02288851943 1366.61340114615 1952.33693061749 358.022888519431 367.312758219457 94.4555672806241 109.272031662926 262.236239718822 615.115411820449 -340.474035963219 2086.06190341797 2070.61824312197 318.320856148329 1075.27119607718 1480.15133021322 -66.1599556910992 651.98504220421 1344.28413492311 340.47403596322 211.708622829507 413.397857937712 340.47403596322 1636.37989548057 1826.74581646747 -150.906390860917 549.815190591318 823.046118391456 -109.272031662924 339.393827982856 192.117939279115 190.5 1269.81910867113 1702.06898864456 227.517423438762 660.282708190845 1088.94228023457 190.5 866.68551899403 1423.31448100597 -261.458064027986 1911.49362652827 1902.88003937575 150.906390860919 153.859883585676 535.075244303325 370.730095690913 1400.41301914186 1880.87364261257 -318.320856148327 1430.58156396207 2074.81964403626 378.42381429968 298.915642781272 295.349464400196 261.458064027988 364.450190037903 688.972738680533 -291.862932828329 2184.02901846555 2157.08888381272 358.022888519431 1152.42604489738 1533.84091850363 22.1531798148923 377.518200197903 93.954206065718 66.1599556911012 658.325331827599 1478.86371625831 370.730095690913 587.726352220327 1397.01987891932 -370.730095690912 1734.16631196954 1832.33810708127 -66.1599556910992 605.843827233131 900.200229024157 -22.1531798148902 1325.94751368794 1803.61534394825 291.862932828331 249.341778707425 405.912157810068 318.320856148329 111.534270830316 545.67725838065 -378.42381429968 1998.82935773881 1962.91302665791 227.517423438762 673.247139998986 1199.06564180663 261.458064027988 973.714684229214 1452.29704550771 -190.499999999998 359.182735799649 190.168901977333 150.906390860919 1519.70775359796 1859.64998825464 -261.458064027986 1220.52397034493 1600.58398901439 109.272031662926 195.032887146973 524.76194379931 358.022888519431 456.66171187831 759.393583357877 -227.51742343876 719.918999093381 1423.03847030246 -340.474035963219 647.631339225773 984.397891870143 66.1599556911012 1825.99421355777 1852.41493644162 22.1531798148923 327.086973342095 291.170642261187 227.517423438762 223.305214940898 626.925009076268 -358.02288851943 140.93344220873 651.912213157429 378.42381429968 1384.00754508045 1915.56010320678 340.47403596322 1251.92058043014 1942.10999500192 -370.730095690912 382.65565884461 93.7018189065844 22.1531798148923 681.645788004453 1319.94218992469 318.320856148329 2089.54535011813 2035.25021523909 291.862932828331 1068.78912428478 1488.04975754537 -109.272031662924 1629.68095600279 1845.46809808212 -190.499999999998 284.19806238494 398.978811905717 291.862932828331 1282.33583575227 1681.18609112589 190.5 536.116437446147 829.525146102753 -150.906390860917 676.816196968693 1077.89495622293 150.906390860919 843.897392075856 1446.10260792414 -291.862932828329 374.263434219675 188.683582826339 109.272031662926 1914.44996039488 1888.01754537625 109.272031662926 1384.00754508045 1915.56010320678 -340.474035963219 1447.27928448688 2034.50778068454 370.730095690913 330.988506133546 700.94552062633 -318.320856148327 2186.02522948697 2116.45507499344 340.47403596322 689.775022981898 1450.35937771409 358.022888519431 234.496487272661 514.876826565621 340.47403596322 1152.42604489738 1533.84091850363 -22.1531798148902 601.307529038048 902.624930925422 -66.1599556910992 351.170199020513 287.59823319707 190.5 1731.20025579403 1842.11588391483 -109.272031662924 553.99739658397 1424.70051744687 -378.42381429968 1341.13934744405 1775.19342205679 261.458064027988 182.687855735925 639.246150287985 370.730095690913 696.122152345457 1182.10037640389 227.517423438762 2002.40176680293 1938.82980097949 190.5 382.65565884461 93.7018189065844 -22.1531798148902 430.350011745358 770.29224640204 -261.458064027986 1507.37490818021 1889.42411092483 -291.862932828329 702.001794163382 1587.99820583662 378.42381429968 315.806102420704 392.691581833972 261.458064027988 957.364411347664 1470.33679168935 -227.51742343876 1226.20064792972 1592.08824062819 66.1599556911012 1825.99421355777 1852.41493644162 -22.1531798148902 652.043198767783 981.753525026019 22.1531798148923 384.431982667499 187.682068219607 66.1599556911012 689.7750229819 1450.35937771409 -358.02288851943 182.687855735927 639.246150287984 -370.730095690912 1231.35201042651 1980.59108289738 -378.42381429968 271.717006470211 505.553571855085 318.320856148329 2092.70417576288 2003.17812024323 261.458064027988 709.117929141214 1297.3963863551 291.862932828331 1400.41301914185 1880.87364261257 318.320856148329 1621.47878552433 1868.39162889745 -227.51742343876 518.140919625645 838.026932860257 -190.499999999998 1059.17573941085 1499.7637009071 -150.906390860917 370.839635503614 284.680547912026 150.906390860919 1916.4433444752 1877.9961268663 66.1599556911012 223.305214940895 626.925009076269 358.022888519431 689.416010985614 1069.47602965507 109.272031662926 1292.55859293547 1664.13045116256 150.906390860919 294.861052674626 713.872130170456 -340.474035963219 377.518200197903 93.954206065718 -66.1599556910992 1366.61340114616 1952.33693061748 -358.02288851943 818.767411999892 1471.23258800011 -318.320856148327 1463.52229343296 1995.29368819316 358.022888519431 2187.90797739666 2078.1308608718 318.320856148329 719.91899909338 1423.03847030246 340.47403596322 343.738454296319 387.135491595912 227.517423438762 175.509903160863 756.576654311945 378.42381429968 1726.80137832304 1856.61703955193 -150.906390860917 1149.36197354655 1537.97234046002 -66.1599556910992 592.296278299022 907.441544794276 -109.272031662924 715.677639209923 1167.59703888824 190.5 1354.56452805099 1750.0766757367 227.517423438762 389.550868969343 187.177901924113 22.1531798148923 2005.31945208798 1919.16036449639 150.906390860919 400.57588907517 782.625091819792 -291.862932828329 306.191101068677 496.918260693768 291.862932828331 938.238695039712 1491.43876779929 -261.458064027986 1493.77466096635 1922.25801220017 -318.320856148327 1533.42334568806 2114.49009683914 378.42381429968 385.829287405563 282.457043094294 109.272031662926 732.855158628321 1557.14484137168 370.730095690913 1824.7444074854 1857.40444196884 -66.1599556910992 652.043198767783 981.753525026019 -22.1531798148902 262.23623971882 615.11541182045 340.47403596322 1229.05830920536 1587.81144829533 22.1531798148923 140.933442208733 651.912213157428 -378.42381429968 658.325331827601 1478.86371625831 -370.730095690912 734.029952033634 1276.95161753065 261.458064027988 2095.49566265428 1974.83567820004 227.517423438762 1611.88430433023 1895.20640748413 -261.458064027986 367.312758219458 94.4555672806241 -109.272031662924 496.131725171622 848.436506582752 -227.51742343876 1415.60796743701 1848.74662371034 291.862932828331 367.617380870165 382.385677780623 190.5 1046.56104599419 1515.1347493095 -190.499999999998 697.911759371809 1063.79935207028 66.1599556911012 1917.44682166915 1872.95130633967 22.1531798148923 1348.4658132963 1990.70678134402 -370.730095690912 216.592527420449 741.87705630525 370.730095690913 389.550868969343 187.177901924113 -22.1531798148902 256.556391493111 727.577757094216 -358.02288851943 2189.65180125895 2042.63451069922 291.862932828331 748.349614596641 1397.27046242761 318.320856148329 1721.02916682817 1875.64547073907 -190.499999999998 337.452568078368 489.08767085139 261.458064027988 395.936445398894 280.957787832148 66.1599556911012 578.931936723645 914.584934190965 -150.906390860917 2007.54295690571 1904.17071259444 109.272031662926 1479.09093196893 1957.70766989193 -340.474035963219 731.649146179664 1155.75176201935 150.906390860919 298.954454745122 603.97706306424 318.320856148329 1366.04150297173 1728.60476589459 190.5 762.868325651685 1527.13167434832 358.022888519431 1822.26169682376 1867.31597852045 -109.272031662924 916.596177808567 1515.31760581074 -291.862932828329 352.177344004762 95.1991225009481 -150.906390860917 647.631339225774 984.397891870143 -66.1599556910992 387.119960624246 378.506373471728 150.906390860919 2097.88206072089 1950.60617201714 190.5 1601.02726131947 1925.5498099621 -291.862932828329 256.556391493109 727.577757094217 358.022888519431 1917.44682166915 1872.95130633967 -22.1531798148902 625.995228751907 1508.16601365506 -378.42381429968 384.431982667499 187.682068219607 -66.1599556910992 1429.3869043569 1819.61350931735 261.458064027988 1329.81019652466 2030.15076897816 -378.42381429968 365.078649786521 482.167697622318 227.517423438762 2191.23311884761 2010.44605171838 261.458064027988 215.180355963741 859.418436037936 378.42381429968 216.592527420452 741.87705630525 -370.730095690912 401.024427510413 280.203056981058 22.1531798148923 2009.04221216785 1894.06355460111 66.1599556911012 561.395234105411 923.958497028269 -190.499999999998 1463.52229343296 1995.29368819316 -358.02288851943 332.31663806651 96.1748164178921 -190.499999999998 2099.83109802267 1930.81726420035 150.906390860919 1916.4433444752 1877.9961268663 -66.1599556910992 388.695750830131 476.251921773373 190.5 2192.63054555499 1982.00077761821 227.517423438762 2193.82518358211 1957.68336193349 190.5 0 3.14159265358979 1.5707963267949 3.14159265358979 0.0402768288921768 3.14159265358979 0.0805536577843537 3.14159265358979 0.120830486676531 3.14159265358979 0.161107315568707 3.14159265358979 0.201384144460884 3.14159265358979 0.241660973353061 3.14159265358979 0.281937802245238 3.14159265358979 0.322214631137415 3.14159265358979 0.362491460029591 3.14159265358979 0.402768288921768 3.14159265358979 0.443045117813945 3.14159265358979 0.483321946706122 3.14159265358979 0.523598775598299 3.14159265358979 0.563875604490476 3.14159265358979 0.604152433382652 3.14159265358979 0.644429262274829 3.14159265358979 0.684706091167006 3.14159265358979 0.724982920059183 3.14159265358979 0.76525974895136 3.14159265358979 0.805536577843537 3.14159265358979 0.845813406735714 3.14159265358979 0.886090235627891 3.14159265358979 0.926367064520067 3.14159265358979 0.966643893412244 3.14159265358979 1.00692072230442 3.14159265358979 1.0471975511966 3.14159265358979 1.08747438008877 3.14159265358979 1.12775120898095 3.14159265358979 1.16802803787313 3.14159265358979 1.20830486676531 3.14159265358979 1.24858169565748 3.14159265358979 1.28885852454966 3.14159265358979 1.32913535344184 3.14159265358979 1.36941218233401 3.14159265358979 1.40968901122619 3.14159265358979 1.44996584011837 3.14159265358979 1.49024266901054 3.14159265358979 1.53051949790272 3.14159265358979 0 6.28318530717959 1.5707963267949 6.28318530717959 0.0402768288921768 6.28318530717959 0.0805536577843537 6.28318530717959 0.120830486676531 6.28318530717959 0.161107315568707 6.28318530717959 0.201384144460884 6.28318530717959 0.241660973353061 6.28318530717959 0.281937802245238 6.28318530717959 0.322214631137415 6.28318530717959 0.362491460029591 6.28318530717959 0.402768288921768 6.28318530717959 0.443045117813945 6.28318530717959 0.483321946706122 6.28318530717959 0.523598775598299 6.28318530717959 0.563875604490476 6.28318530717959 0.604152433382652 6.28318530717959 0.644429262274829 6.28318530717959 0.684706091167006 6.28318530717959 0.724982920059183 6.28318530717959 0.76525974895136 6.28318530717959 0.805536577843537 6.28318530717959 0.845813406735714 6.28318530717959 0.886090235627891 6.28318530717959 0.926367064520067 6.28318530717959 0.966643893412244 6.28318530717959 1.00692072230442 6.28318530717959 1.0471975511966 6.28318530717959 1.08747438008877 6.28318530717959 1.12775120898095 6.28318530717959 1.16802803787313 6.28318530717959 1.20830486676531 6.28318530717959 1.24858169565748 6.28318530717959 1.28885852454966 6.28318530717959 1.32913535344184 6.28318530717959 1.36941218233401 6.28318530717959 1.40968901122619 6.28318530717959 1.44996584011837 6.28318530717959 1.49024266901054 6.28318530717959 1.53051949790272 6.28318530717959 0 3.23976742401447 0 3.33794219443916 0 3.43611696486384 0 3.53429173528852 0 3.6324665057132 0 3.73064127613788 0 3.82881604656256 0 3.92699081698724 0 4.02516558741192 0 4.1233403578366 0 4.22151512826128 0 4.31968989868597 0 4.41786466911065 0 4.51603943953533 0 4.61421420996001 0 4.71238898038469 0 4.81056375080937 0 4.90873852123405 0 5.00691329165873 0 5.10508806208341 0 5.20326283250809 0 5.30143760293277 0 5.39961237335745 0 5.49778714378213 0 5.59596191420681 0 5.69413668463149 0 5.79231145505618 0 5.89048622548086 0 5.98866099590554 0 6.08683576633022 0 6.1850105367549 1.5707963267949 3.23976742401447 1.5707963267949 3.33794219443916 1.5707963267949 3.43611696486384 1.5707963267949 3.53429173528852 1.5707963267949 3.6324665057132 1.5707963267949 3.73064127613788 1.5707963267949 3.82881604656256 1.5707963267949 3.92699081698724 1.5707963267949 4.02516558741192 1.5707963267949 4.1233403578366 1.5707963267949 4.22151512826128 1.5707963267949 4.31968989868597 1.5707963267949 4.41786466911065 1.5707963267949 4.51603943953533 1.5707963267949 4.61421420996001 1.5707963267949 4.71238898038469 1.5707963267949 4.81056375080937 1.5707963267949 4.90873852123405 1.5707963267949 5.00691329165873 1.5707963267949 5.10508806208341 1.5707963267949 5.20326283250809 1.5707963267949 5.30143760293277 1.5707963267949 5.39961237335745 1.5707963267949 5.49778714378213 1.5707963267949 5.59596191420681 1.5707963267949 5.69413668463149 1.5707963267949 5.79231145505618 1.5707963267949 5.89048622548086 1.5707963267949 5.98866099590554 1.5707963267949 6.08683576633022 1.5707963267949 6.1850105367549 1.32535940073319 5.46869832291556 1.27627201552085 5.35234303944927 1.32535940073319 5.35234303944927 1.07992247467149 4.53785605518526 1.03083508945915 4.53785605518526 1.03083508945915 4.42150077171897 1.07992247467149 4.42150077171897 0.0490873852123405 5.58505360638185 0.441786466911065 5.81776417331443 0.392699081698724 5.70140888984814 0.441786466911065 5.70140888984814 0.392699081698724 5.93411945678071 0.392699081698724 5.81776417331443 1.03083508945915 4.65421133865154 0.834485548609789 5.93411945678071 0.785398163397449 5.93411945678071 0.785398163397449 5.81776417331443 1.47262155637022 4.65421133865154 1.42353417115788 4.65421133865154 1.47262155637022 4.53785605518526 0.0490873852123405 5.46869832291556 0.441786466911065 3.37430322052237 0.392699081698724 3.37430322052237 0.441786466911065 3.25794793705608 0.785398163397449 6.050474740247 0.834485548609789 5.81776417331443 1.22718463030851 3.72336907092124 1.17809724509617 3.60701378745495 1.22718463030851 3.60701378745495 1.17809724509617 3.72336907092124 0.834485548609789 3.60701378745495 0.785398163397449 3.60701378745495 0.834485548609789 3.49065850398866 1.22718463030851 6.050474740247 1.17809724509617 6.050474740247 1.22718463030851 5.93411945678071 0.196349540849362 4.77056662211783 0.147262155637022 4.77056662211783 0.196349540849362 4.65421133865154 1.37444678594554 5.23598775598298 1.32535940073319 5.23598775598298 1.32535940073319 5.1196324725167 0.589048622548086 5.00327718905041 0.539961237335746 5.00327718905041 0.589048622548086 4.88692190558412 0.343611696486384 3.95607963785381 0.294524311274043 3.95607963785381 0.294524311274043 3.83972435438753 1.37444678594554 5.1196324725167 0.981747704246811 5.1196324725167 0.93266031903447 5.00327718905041 0.981747704246811 5.00327718905041 0.294524311274043 4.0724349213201 0.736310778185108 4.18879020478639 0.687223392972767 4.18879020478639 0.687223392972767 4.0724349213201 1.52170894158256 4.42150077171897 0.93266031903447 5.1196324725167 0.343611696486384 3.83972435438753 0.687223392972767 4.30514548825268 1.52170894158256 4.30514548825268 1.12900985988383 4.30514548825268 1.07992247467149 4.30514548825268 0.736310778185108 4.0724349213201 1.12900985988383 4.18879020478639 0.098174770424681 5.35234303944927 0.0490873852123405 5.35234303944927 0.098174770424681 5.23598775598298 1.47262155637022 4.42150077171897 1.27627201552085 5.81776417331443 1.22718463030851 5.81776417331443 1.22718463030851 5.70140888984814 0.490873852123405 5.58505360638185 0.441786466911065 5.58505360638185 1.27627201552085 5.70140888984814 0.245436926061703 4.53785605518526 0.196349540849362 4.53785605518526 0.196349540849362 4.42150077171897 0.88357293382213 5.70140888984814 0.834485548609789 5.70140888984814 0.88357293382213 5.58505360638185 0.441786466911065 5.46869832291556 0.490873852123405 5.46869832291556 0.245436926061703 4.42150077171897 0.392699081698724 3.72336907092124 0.343611696486384 3.72336907092124 0.343611696486384 3.60701378745495 0.88357293382213 3.37430322052237 0.834485548609789 3.25794793705608 0.88357293382213 3.25794793705608 0.834485548609789 3.37430322052237 1.27627201552085 3.49065850398866 1.22718463030851 3.37430322052237 1.27627201552085 3.37430322052237 1.22718463030851 3.49065850398866 1.42353417115788 5.00327718905041 1.37444678594554 5.00327718905041 1.42353417115788 4.88692190558412 0.638136007760427 4.77056662211783 0.589048622548086 4.65421133865154 0.638136007760427 4.65421133865154 1.32535940073319 5.58505360638185 1.27627201552085 5.58505360638185 1.27627201552085 5.46869832291556 0.392699081698724 3.60701378745495 0.147262155637022 5.1196324725167 0.098174770424681 5.1196324725167 0.098174770424681 5.00327718905041 0.147262155637022 5.00327718905041 0.589048622548086 4.77056662211783 1.03083508945915 4.88692190558412 0.981747704246811 4.88692190558412 0.392699081698724 6.16683002371329 0.343611696486384 6.16683002371329 0.392699081698724 6.050474740247 0.981747704246811 4.77056662211783 1.03083508945915 4.77056662211783 0.785398163397449 3.95607963785381 0.736310778185108 3.95607963785381 0.736310778185108 3.83972435438753 0.785398163397449 3.83972435438753 0.294524311274043 4.30514548825268 0.245436926061703 4.30514548825268 0.294524311274043 4.18879020478639 1.47262155637022 4.77056662211783 1.42353417115788 4.77056662211783 1.17809724509617 4.0724349213201 1.12900985988383 4.0724349213201 1.17809724509617 3.95607963785381 1.22718463030851 6.16683002371329 1.17809724509617 6.16683002371329 0.0490873852123405 5.70140888984814 0.539961237335746 5.35234303944927 0.490873852123405 5.35234303944927 0.539961237335746 5.23598775598298 1.37444678594554 5.35234303944927 0.687223392972767 4.53785605518526 0.638136007760427 4.42150077171897 0.687223392972767 4.42150077171897 0.638136007760427 4.53785605518526 0.441786466911065 3.49065850398866 0.392699081698724 3.49065850398866 0.93266031903447 5.46869832291556 0.88357293382213 5.46869832291556 0.88357293382213 5.35234303944927 0.93266031903447 5.35234303944927 1.32535940073319 3.25794793705608 1.52170894158256 4.53785605518526 1.27627201552085 3.25794793705608 0.196349540849362 4.88692190558412 0.147262155637022 4.88692190558412 1.27627201552085 5.93411945678071 1.07992247467149 4.65421133865154 0.441786466911065 5.93411945678071 0.834485548609789 3.72336907092124 0.785398163397449 3.72336907092124 1.42353417115788 5.1196324725167 0.343611696486384 4.0724349213201 0.834485548609789 6.050474740247 0.098174770424681 5.46869832291556 0.589048622548086 5.1196324725167 0.539961237335746 5.1196324725167 0.736310778185108 4.30514548825268 1.22718463030851 3.83972435438753 1.32535940073319 5.70140888984814 1.17809724509617 3.83972435438753 0.490873852123405 3.25794793705608 1.47262155637022 4.88692190558412 0.981747704246811 5.23598775598298 0.93266031903447 5.23598775598298 0.490873852123405 5.70140888984814 0.245436926061703 4.65421133865154 0.88357293382213 3.49065850398866 0.392699081698724 3.83972435438753 1.12900985988383 4.42150077171897 0.88357293382213 5.81776417331443 1.37444678594554 5.46869832291556 0.638136007760427 4.88692190558412 0.147262155637022 5.23598775598298 1.52170894158256 4.65421133865154 1.27627201552085 3.60701378745495 0.294524311274043 4.42150077171897 1.27627201552085 6.050474740247 1.42353417115788 5.23598775598298 0.785398163397449 4.0724349213201 0.0490873852123405 5.81776417331443 0.539961237335746 5.46869832291556 1.03083508945915 5.00327718905041 0.441786466911065 3.60701378745495 0.93266031903447 3.25794793705608 1.32535940073319 5.81776417331443 1.17809724509617 4.18879020478639 0.687223392972767 4.65421133865154 0.196349540849362 5.00327718905041 0.93266031903447 5.58505360638185 0.441786466911065 6.050474740247 1.47262155637022 5.00327718905041 0.343611696486384 4.18879020478639 1.37444678594554 5.58505360638185 0.834485548609789 3.83972435438753 1.32535940073319 3.37430322052237 1.52170894158256 4.77056662211783 0.589048622548086 5.23598775598298 1.07992247467149 4.77056662211783 0.098174770424681 5.58505360638185 1.27627201552085 6.16683002371329 0.490873852123405 3.37430322052237 0.834485548609789 6.16683002371329 0.785398163397449 6.16683002371329 0.736310778185108 4.42150077171897 1.42353417115788 5.35234303944927 0.490873852123405 5.81776417331443 0.245436926061703 4.77056662211783 1.22718463030851 3.95607963785381 0.392699081698724 3.95607963785381 1.32535940073319 5.93411945678071 0.981747704246811 5.35234303944927 1.47262155637022 5.1196324725167 0.88357293382213 3.60701378745495 1.12900985988383 4.53785605518526 0.147262155637022 5.35234303944927 0.294524311274043 4.53785605518526 0.638136007760427 5.00327718905041 1.37444678594554 5.70140888984814 0.88357293382213 5.93411945678071 1.52170894158256 4.88692190558412 0.0490873852123405 5.93411945678071 0.785398163397449 4.18879020478639 1.42353417115788 5.46869832291556 0.539961237335746 5.58505360638185 0.441786466911065 3.72336907092124 1.27627201552085 3.72336907092124 0.93266031903447 3.37430322052237 1.03083508945915 5.1196324725167 0.196349540849362 5.1196324725167 1.32535940073319 6.050474740247 1.17809724509617 4.30514548825268 0.687223392972767 4.77056662211783 0.343611696486384 4.30514548825268 0.441786466911065 6.16683002371329 1.47262155637022 5.23598775598298 0.098174770424681 5.70140888984814 0.834485548609789 3.95607963785381 1.37444678594554 5.81776417331443 0.93266031903447 5.70140888984814 0.490873852123405 3.49065850398866 0.589048622548086 5.35234303944927 1.52170894158256 5.00327718905041 1.32535940073319 3.49065850398866 1.42353417115788 5.58505360638185 0.245436926061703 4.88692190558412 0.736310778185108 4.53785605518526 1.07992247467149 4.88692190558412 0.490873852123405 5.93411945678071 0.392699081698724 4.0724349213201 1.32535940073319 6.16683002371329 0.88357293382213 3.72336907092124 1.47262155637022 5.35234303944927 0.147262155637022 5.46869832291556 1.22718463030851 4.0724349213201 0.539961237335746 3.25794793705608 1.37444678594554 5.93411945678071 0.981747704246811 5.46869832291556 0.638136007760427 5.1196324725167 0.294524311274043 4.65421133865154 1.52170894158256 5.1196324725167 1.37444678594554 3.25794793705608 0.0490873852123405 6.050474740247 1.12900985988383 4.65421133865154 0.785398163397449 4.30514548825268 0.539961237335746 5.70140888984814 1.42353417115788 5.70140888984814 0.441786466911065 3.83972435438753 0.88357293382213 6.050474740247 1.27627201552085 3.83972435438753 1.47262155637022 5.46869832291556 0.93266031903447 3.49065850398866 0.196349540849362 5.23598775598298 0.687223392972767 4.88692190558412 1.37444678594554 6.050474740247 1.52170894158256 5.23598775598298 1.03083508945915 5.23598775598298 0.343611696486384 4.42150077171897 0.834485548609789 4.0724349213201 1.42353417115788 5.81776417331443 0.098174770424681 5.81776417331443 1.17809724509617 4.42150077171897 0.589048622548086 5.46869832291556 1.47262155637022 5.58505360638185 0.981747704246811 3.25794793705608 0.93266031903447 5.81776417331443 0.490873852123405 3.60701378745495 1.37444678594554 6.16683002371329 0.245436926061703 5.00327718905041 1.52170894158256 5.35234303944927 0.736310778185108 4.65421133865154 0.490873852123405 6.050474740247 0.392699081698724 4.18879020478639 1.32535940073319 3.60701378745495 1.42353417115788 5.93411945678071 0.147262155637022 5.58505360638185 0.88357293382213 3.83972435438753 1.07992247467149 5.00327718905041 1.22718463030851 4.18879020478639 0.638136007760427 5.23598775598298 1.47262155637022 5.70140888984814 0.539961237335746 3.37430322052237 1.52170894158256 5.46869832291556 0.785398163397449 4.42150077171897 0.981747704246811 5.58505360638185 0.294524311274043 4.77056662211783 0.0490873852123405 6.16683002371329 0.539961237335746 5.81776417331443 1.42353417115788 6.050474740247 1.47262155637022 5.81776417331443 1.37444678594554 3.37430322052237 0.441786466911065 3.95607963785381 0.93266031903447 3.60701378745495 1.12900985988383 4.77056662211783 1.52170894158256 5.58505360638185 0.687223392972767 5.00327718905041 0.196349540849362 5.35234303944927 0.343611696486384 4.53785605518526 0.88357293382213 6.16683002371329 1.42353417115788 6.16683002371329 0.834485548609789 4.18879020478639 0.098174770424681 5.93411945678071 1.47262155637022 5.93411945678071 1.27627201552085 3.95607963785381 0.589048622548086 5.58505360638185 0.490873852123405 3.72336907092124 1.52170894158256 5.70140888984814 1.03083508945915 5.35234303944927 0.981747704246811 3.37430322052237 1.17809724509617 4.53785605518526 1.47262155637022 6.050474740247 0.245436926061703 5.1196324725167 1.52170894158256 5.81776417331443 0.93266031903447 5.93411945678071 0.736310778185108 4.77056662211783 0.490873852123405 6.16683002371329 1.47262155637022 6.16683002371329 0.392699081698724 4.30514548825268 1.32535940073319 3.72336907092124 0.88357293382213 3.95607963785381 1.52170894158256 5.93411945678071 0.147262155637022 5.70140888984814 0.539961237335746 3.49065850398866 1.07992247467149 5.1196324725167 1.52170894158256 6.050474740247 0.638136007760427 5.35234303944927 1.52170894158256 6.16683002371329 1.22718463030851 4.30514548825268 0.294524311274043 4.88692190558412 0.785398163397449 4.53785605518526 0.539961237335746 5.93411945678071 0.981747704246811 5.70140888984814 0.441786466911065 4.0724349213201 0.196349540849362 5.46869832291556 0.93266031903447 3.72336907092124 1.37444678594554 3.49065850398866 0.589048622548086 3.25794793705608 1.12900985988383 4.88692190558412 0.343611696486384 4.65421133865154 0.687223392972767 5.1196324725167 0.098174770424681 6.050474740247 0.834485548609789 4.30514548825268 1.27627201552085 4.0724349213201 0.589048622548086 5.70140888984814 0.490873852123405 3.83972435438753 1.03083508945915 5.46869832291556 0.981747704246811 3.49065850398866 0.245436926061703 5.23598775598298 1.42353417115788 3.25794793705608 0.736310778185108 4.88692190558412 0.392699081698724 4.42150077171897 0.88357293382213 4.0724349213201 1.17809724509617 4.65421133865154 0.147262155637022 5.81776417331443 0.638136007760427 5.46869832291556 0.93266031903447 6.050474740247 1.32535940073319 3.83972435438753 0.539961237335746 3.60701378745495 1.03083508945915 3.25794793705608 1.07992247467149 5.23598775598298 0.294524311274043 5.00327718905041 0.441786466911065 4.18879020478639 0.785398163397449 4.65421133865154 0.539961237335746 6.050474740247 1.22718463030851 4.42150077171897 0.196349540849362 5.58505360638185 0.93266031903447 3.83972435438753 0.981747704246811 5.81776417331443 0.589048622548086 3.37430322052237 0.687223392972767 5.23598775598298 0.343611696486384 4.77056662211783 0.834485548609789 4.42150077171897 1.37444678594554 3.60701378745495 0.098174770424681 6.16683002371329 1.12900985988383 5.00327718905041 0.490873852123405 3.95607963785381 0.589048622548086 5.81776417331443 1.27627201552085 4.18879020478639 0.245436926061703 5.35234303944927 0.981747704246811 3.60701378745495 1.03083508945915 5.58505360638185 0.392699081698724 4.53785605518526 0.736310778185108 5.00327718905041 0.147262155637022 5.93411945678071 1.42353417115788 3.37430322052237 0.88357293382213 4.18879020478639 1.17809724509617 4.77056662211783 0.539961237335746 3.72336907092124 0.638136007760427 5.58505360638185 0.294524311274043 5.1196324725167 0.93266031903447 6.16683002371329 1.03083508945915 3.37430322052237 1.32535940073319 3.95607963785381 0.785398163397449 4.77056662211783 0.441786466911065 4.30514548825268 0.196349540849362 5.70140888984814 1.07992247467149 5.35234303944927 0.539961237335746 6.16683002371329 0.93266031903447 3.95607963785381 1.22718463030851 4.53785605518526 0.589048622548086 3.49065850398866 0.343611696486384 4.88692190558412 0.687223392972767 5.35234303944927 0.981747704246811 5.93411945678071 0.834485548609789 4.53785605518526 0.490873852123405 4.0724349213201 1.37444678594554 3.72336907092124 0.589048622548086 5.93411945678071 0.245436926061703 5.46869832291556 1.12900985988383 5.1196324725167 0.638136007760427 3.25794793705608 0.981747704246811 3.72336907092124 1.27627201552085 4.30514548825268 0.736310778185108 5.1196324725167 0.392699081698724 4.65421133865154 0.147262155637022 6.050474740247 0.88357293382213 4.30514548825268 1.03083508945915 5.70140888984814 0.539961237335746 3.83972435438753 0.638136007760427 5.70140888984814 1.42353417115788 3.49065850398866 1.03083508945915 3.49065850398866 1.17809724509617 4.88692190558412 0.294524311274043 5.23598775598298 0.441786466911065 4.42150077171897 0.785398163397449 4.88692190558412 0.196349540849362 5.81776417331443 1.32535940073319 4.0724349213201 0.93266031903447 4.0724349213201 1.07992247467149 5.46869832291556 0.687223392972767 5.46869832291556 0.589048622548086 3.60701378745495 1.47262155637022 3.25794793705608 1.07992247467149 3.25794793705608 0.343611696486384 5.00327718905041 0.490873852123405 4.18879020478639 1.22718463030851 4.65421133865154 0.834485548609789 4.65421133865154 0.981747704246811 6.050474740247 0.245436926061703 5.58505360638185 0.589048622548086 6.050474740247 1.37444678594554 3.83972435438753 0.638136007760427 3.37430322052237 0.981747704246811 3.83972435438753 0.392699081698724 4.77056662211783 1.12900985988383 5.23598775598298 0.147262155637022 6.16683002371329 0.736310778185108 5.23598775598298 0.539961237335746 3.95607963785381 0.88357293382213 4.42150077171897 1.27627201552085 4.42150077171897 1.03083508945915 5.81776417331443 0.638136007760427 5.81776417331443 0.294524311274043 5.35234303944927 0.441786466911065 4.53785605518526 1.42353417115788 3.60701378745495 1.03083508945915 3.60701378745495 0.196349540849362 5.93411945678071 0.785398163397449 5.00327718905041 0.589048622548086 3.72336907092124 1.17809724509617 5.00327718905041 0.93266031903447 4.18879020478639 1.32535940073319 4.18879020478639 0.687223392972767 5.58505360638185 0.343611696486384 5.1196324725167 1.07992247467149 5.58505360638185 0.490873852123405 4.30514548825268 1.07992247467149 3.37430322052237 0.834485548609789 4.77056662211783 0.245436926061703 5.70140888984814 1.47262155637022 3.37430322052237 0.0490873852123405 3.25794793705608 0.638136007760427 3.49065850398866 0.589048622548086 6.16683002371329 1.22718463030851 4.77056662211783 0.981747704246811 3.95607963785381 0.392699081698724 4.88692190558412 0.981747704246811 6.16683002371329 0.0490873852123405 3.37430322052237 0.736310778185108 5.35234303944927 1.37444678594554 3.95607963785381 0.539961237335746 4.0724349213201 0.88357293382213 4.53785605518526 0.0490873852123405 3.49065850398866 1.12900985988383 5.35234303944927 0.294524311274043 5.46869832291556 0.638136007760427 5.93411945678071 0.098174770424681 3.25794793705608 1.27627201552085 4.53785605518526 0.687223392972767 3.25794793705608 0.0490873852123405 3.60701378745495 1.03083508945915 3.72336907092124 0.441786466911065 4.65421133865154 1.03083508945915 5.93411945678071 0.785398163397449 5.1196324725167 0.196349540849362 6.050474740247 0.098174770424681 3.37430322052237 0.93266031903447 4.30514548825268 0.589048622548086 3.83972435438753 1.42353417115788 3.72336907092124 0.0490873852123405 3.72336907092124 1.17809724509617 5.1196324725167 0.343611696486384 5.23598775598298 0.687223392972767 5.70140888984814 1.07992247467149 3.49065850398866 0.490873852123405 4.42150077171897 0.098174770424681 3.49065850398866 1.32535940073319 4.30514548825268 0.245436926061703 5.81776417331443 0.834485548609789 4.88692190558412 0.147262155637022 3.25794793705608 0.638136007760427 3.60701378745495 1.07992247467149 5.70140888984814 1.47262155637022 3.49065850398866 0.0490873852123405 3.83972435438753 0.981747704246811 4.0724349213201 0.736310778185108 5.46869832291556 1.22718463030851 4.88692190558412 0.392699081698724 5.00327718905041 0.098174770424681 3.60701378745495 0.539961237335746 4.18879020478639 1.12900985988383 3.25794793705608 0.88357293382213 4.65421133865154 0.294524311274043 5.58505360638185 1.37444678594554 4.0724349213201 0.147262155637022 3.37430322052237 0.0490873852123405 3.95607963785381 1.12900985988383 5.46869832291556 0.687223392972767 3.37430322052237 0.638136007760427 6.050474740247 1.03083508945915 3.83972435438753 1.52170894158256 3.25794793705608 0.441786466911065 4.77056662211783 0.196349540849362 6.16683002371329 0.785398163397449 5.23598775598298 0.589048622548086 3.95607963785381 0.098174770424681 3.72336907092124 1.27627201552085 4.65421133865154 0.93266031903447 4.42150077171897 0.147262155637022 3.49065850398866 1.03083508945915 6.050474740247 1.42353417115788 3.83972435438753 0.0490873852123405 4.0724349213201 0.343611696486384 5.35234303944927 0.490873852123405 4.53785605518526 0.687223392972767 5.81776417331443 1.17809724509617 5.23598775598298 0.196349540849362 3.25794793705608 0.245436926061703 5.93411945678071 1.07992247467149 3.60701378745495 1.32535940073319 4.42150077171897 0.834485548609789 5.00327718905041 0.098174770424681 3.83972435438753 0.638136007760427 3.72336907092124 0.981747704246811 4.18879020478639 1.07992247467149 5.81776417331443 0.392699081698724 5.1196324725167 0.539961237335746 4.30514548825268 0.736310778185108 5.58505360638185 0.147262155637022 3.60701378745495 0.0490873852123405 4.18879020478639 1.12900985988383 3.37430322052237 1.47262155637022 3.60701378745495 0.88357293382213 4.77056662211783 0.294524311274043 5.70140888984814 0.687223392972767 3.49065850398866 1.22718463030851 5.00327718905041 1.37444678594554 4.18879020478639 0.196349540849362 3.37430322052237 0.638136007760427 6.16683002371329 0.098174770424681 3.95607963785381 0.441786466911065 4.88692190558412 1.12900985988383 5.58505360638185 1.03083508945915 3.95607963785381 0.589048622548086 4.0724349213201 1.52170894158256 3.37430322052237 0.785398163397449 5.35234303944927 0.147262155637022 3.72336907092124 0.343611696486384 5.46869832291556 0.0490873852123405 4.30514548825268 0.93266031903447 4.53785605518526 1.27627201552085 4.77056662211783 0.736310778185108 3.25794793705608 0.687223392972767 5.93411945678071 0.490873852123405 4.65421133865154 1.03083508945915 6.16683002371329 0.196349540849362 3.49065850398866 1.07992247467149 3.72336907092124 1.42353417115788 3.95607963785381 0.245436926061703 6.050474740247 0.638136007760427 3.83972435438753 1.17809724509617 5.35234303944927 0.834485548609789 5.1196324725167 0.098174770424681 4.0724349213201 0.245436926061703 3.25794793705608 0.392699081698724 5.23598775598298 0.981747704246811 4.30514548825268 0.147262155637022 3.83972435438753 1.32535940073319 4.53785605518526 0.736310778185108 5.70140888984814 0.539961237335746 4.42150077171897 1.07992247467149 5.93411945678071 1.12900985988383 3.49065850398866 0.0490873852123405 4.42150077171897 0.294524311274043 5.81776417331443 1.47262155637022 3.72336907092124 0.88357293382213 4.88692190558412 0.687223392972767 3.60701378745495 0.196349540849362 3.60701378745495 1.22718463030851 5.1196324725167 0.441786466911065 5.00327718905041 0.098174770424681 4.18879020478639 1.03083508945915 4.0724349213201 0.589048622548086 4.18879020478639 0.785398163397449 5.46869832291556 1.37444678594554 4.30514548825268 0.245436926061703 3.37430322052237 1.12900985988383 5.70140888984814 1.17809724509617 3.25794793705608 0.147262155637022 3.95607963785381 0.343611696486384 5.58505360638185 1.52170894158256 3.49065850398866 0.93266031903447 4.65421133865154 0.0490873852123405 4.53785605518526 0.736310778185108 3.37430322052237 0.687223392972767 6.050474740247 1.27627201552085 4.88692190558412 0.490873852123405 4.77056662211783 1.07992247467149 3.83972435438753 0.196349540849362 3.72336907092124 0.245436926061703 6.16683002371329 1.42353417115788 4.0724349213201 0.638136007760427 3.95607963785381 0.834485548609789 5.23598775598298 0.098174770424681 4.30514548825268 1.17809724509617 5.46869832291556 0.981747704246811 4.42150077171897 0.245436926061703 3.49065850398866 0.392699081698724 5.35234303944927 0.736310778185108 5.81776417331443 0.539961237335746 4.53785605518526 1.32535940073319 4.65421133865154 0.147262155637022 4.0724349213201 0.294524311274043 5.93411945678071 0.294524311274043 3.25794793705608 1.12900985988383 3.60701378745495 1.07992247467149 6.050474740247 0.0490873852123405 4.65421133865154 0.687223392972767 3.72336907092124 1.47262155637022 3.83972435438753 0.88357293382213 5.00327718905041 1.22718463030851 5.23598775598298 0.196349540849362 3.83972435438753 1.03083508945915 4.18879020478639 0.441786466911065 5.1196324725167 0.589048622548086 4.30514548825268 0.785398163397449 5.58505360638185 0.098174770424681 4.42150077171897 1.37444678594554 4.42150077171897 1.12900985988383 5.81776417331443 1.17809724509617 3.37430322052237 0.343611696486384 5.70140888984814 1.52170894158256 3.60701378745495 0.736310778185108 3.49065850398866 0.245436926061703 3.60701378745495 0.93266031903447 4.77056662211783 0.490873852123405 4.88692190558412 0.147262155637022 4.18879020478639 1.27627201552085 5.00327718905041 0.687223392972767 6.16683002371329 1.07992247467149 3.95607963785381 0.294524311274043 3.37430322052237 0.638136007760427 4.0724349213201 1.42353417115788 4.18879020478639 0.0490873852123405 4.77056662211783 0.392699081698724 5.46869832291556 1.17809724509617 5.58505360638185 0.785398163397449 3.25794793705608 0.196349540849362 3.95607963785381 0.834485548609789 5.35234303944927 0.981747704246811 4.53785605518526 1.32535940073319 4.77056662211783 0.539961237335746 4.65421133865154 0.098174770424681 4.53785605518526 0.736310778185108 5.93411945678071 0.294524311274043 6.050474740247 1.07992247467149 6.16683002371329 0.245436926061703 3.72336907092124 1.47262155637022 3.95607963785381 0.687223392972767 3.83972435438753 1.12900985988383 3.72336907092124 1.22718463030851 5.35234303944927 0.441786466911065 5.23598775598298 0.88357293382213 5.1196324725167 0.147262155637022 4.30514548825268 1.37444678594554 4.53785605518526 0.294524311274043 3.49065850398866 0.589048622548086 4.42150077171897 1.03083508945915 4.30514548825268 0.343611696486384 5.81776417331443 0.0490873852123405 4.88692190558412 1.12900985988383 5.93411945678071 0.785398163397449 5.70140888984814 1.17809724509617 3.49065850398866 1.52170894158256 3.72336907092124 0.736310778185108 3.60701378745495 0.196349540849362 4.0724349213201 0.343611696486384 3.25794793705608 1.27627201552085 5.1196324725167 0.93266031903447 4.88692190558412 0.490873852123405 5.00327718905041 0.638136007760427 4.18879020478639 1.07992247467149 4.0724349213201 0.098174770424681 4.65421133865154 1.42353417115788 4.30514548825268 0.392699081698724 5.58505360638185 0.245436926061703 3.83972435438753 0.834485548609789 5.46869832291556 1.17809724509617 5.70140888984814 1.22718463030851 3.25794793705608 0.147262155637022 4.42150077171897 0.785398163397449 3.37430322052237 1.32535940073319 4.88692190558412 0.539961237335746 4.77056662211783 0.294524311274043 3.60701378745495 0.981747704246811 4.65421133865154 0.294524311274043 6.16683002371329 0.736310778185108 6.050474740247 0.687223392972767 3.95607963785381 1.47262155637022 4.0724349213201 1.22718463030851 5.46869832291556 0.0490873852123405 5.00327718905041 0.441786466911065 5.35234303944927 1.12900985988383 3.83972435438753 0.196349540849362 4.18879020478639 0.88357293382213 5.23598775598298 0.589048622548086 4.53785605518526 1.37444678594554 4.65421133865154 1.12900985988383 6.050474740247 0.343611696486384 3.37430322052237 0.098174770424681 4.77056662211783 0.343611696486384 5.93411945678071 1.52170894158256 3.83972435438753 0.736310778185108 3.72336907092124 1.27627201552085 5.23598775598298 0.245436926061703 3.95607963785381 0.147262155637022 4.53785605518526 0.490873852123405 5.1196324725167 1.42353417115788 4.42150077171897 1.17809724509617 5.81776417331443 0.638136007760427 4.30514548825268 0.294524311274043 3.72336907092124 1.07992247467149 4.18879020478639 0.785398163397449 3.49065850398866 1.32535940073319 5.00327718905041 0.834485548609789 5.58505360638185 0.0490873852123405 5.1196324725167 0.539961237335746 4.88692190558412 0.196349540849362 4.30514548825268 1.47262155637022 4.18879020478639 1.22718463030851 5.58505360638185 0.343611696486384 3.49065850398866 1.37444678594554 4.77056662211783 0.736310778185108 6.16683002371329 0.098174770424681 4.88692190558412 1.12900985988383 3.95607963785381 1.12900985988383 6.16683002371329 0.245436926061703 4.0724349213201 1.52170894158256 3.95607963785381 0.392699081698724 3.25794793705608 0.343611696486384 6.050474740247 0.147262155637022 4.65421133865154 1.42353417115788 4.53785605518526 0.490873852123405 5.23598775598298 1.17809724509617 5.93411945678071 0.0490873852123405 5.23598775598298 1.47262155637022 4.30514548825268 1.37444678594554 4.88692190558412 0.245436926061703 4.18879020478639 1.52170894158256 4.0724349213201 1.52170894158256 4.18879020478639 143 144 145 146 147 148 146 148 149 150 105 104 151 152 153 151 154 155 146 156 147 157 158 159 151 155 152 160 161 162 150 104 163 3 81 1 164 165 166 157 167 158 157 159 168 169 170 171 169 172 170 173 174 175 176 177 178 179 180 181 182 183 184 182 145 183 185 186 187 188 189 190 182 184 191 192 193 194 188 195 189 196 197 198 199 123 124 199 124 125 192 200 193 188 190 201 196 202 197 199 203 123 204 149 205 196 198 206 204 205 207 208 209 210 199 211 203 212 213 214 215 153 216 212 214 217 218 219 220 221 222 223 215 224 225 215 216 224 218 181 219 218 220 226 227 228 229 230 231 232 230 233 231 234 235 236 234 237 235 238 239 240 241 242 243 244 245 246 227 229 247 244 217 245 234 171 237 248 249 250 248 250 251 241 252 242 253 194 254 255 256 257 244 246 143 253 254 258 248 210 249 255 52 51 253 258 259 255 51 256 260 206 261 260 262 263 264 265 266 267 268 161 269 270 271 267 161 160 260 261 262 272 273 177 274 106 105 272 72 273 274 107 106 272 73 72 272 177 176 274 105 150 275 276 277 278 145 182 279 280 281 279 243 282 283 284 165 285 286 287 285 287 288 289 34 35 290 211 199 289 35 36 279 282 280 283 165 164 290 125 126 283 247 284 289 291 34 290 199 125 292 293 180 290 162 211 290 160 162 294 213 212 295 156 146 292 180 179 296 154 151 294 178 213 296 257 154 292 251 293 297 298 174 294 176 178 297 174 173 299 239 238 300 195 188 301 167 157 302 163 209 303 186 185 299 191 239 302 209 208 303 304 186 305 202 196 306 172 169 307 217 244 306 308 172 309 14 15 309 166 14 309 164 166 310 238 240 310 268 267 311 288 312 311 312 200 313 153 215 314 179 181 311 200 192 314 181 218 310 240 268 315 175 233 316 201 228 315 173 175 317 149 204 316 228 227 318 168 222 319 143 145 315 233 230 319 145 278 320 185 187 321 208 210 320 187 252 322 126 127 318 222 221 321 210 248 322 290 126 323 171 234 320 252 241 322 160 290 324 226 265 325 176 294 324 265 264 326 191 299 326 182 191 327 206 260 328 108 107 329 225 276 329 276 275 326 278 182 330 194 253 328 107 274 331 247 283 332 232 25 332 25 26 333 217 307 332 230 232 333 212 217 334 270 269 334 204 207 335 243 279 334 207 270 336 251 292 337 286 285 337 221 223 338 255 257 339 238 310 337 223 286 340 195 300 341 244 143 338 257 296 341 307 244 340 264 266 342 298 297 342 263 298 343 291 289 340 266 195 341 143 319 344 267 160 343 236 291 344 160 322 344 127 128 345 304 303 346 259 156 346 156 295 43 41 111 345 277 304 344 322 127 347 150 163 347 274 150 347 163 302 348 73 272 349 164 309 348 272 176 348 176 325 345 275 277 348 74 73 350 167 301 350 63 62 350 351 167 350 62 351 352 202 305 352 281 202 353 278 326 354 151 153 355 179 314 356 308 306 357 300 188 354 153 313 356 271 308 358 294 212 357 201 316 356 269 271 358 212 333 358 325 294 357 188 201 359 288 311 360 299 238 360 238 339 361 173 315 362 149 317 363 208 321 362 295 146 364 226 324 364 314 218 362 146 149 365 185 320 366 307 341 367 168 318 364 218 226 368 267 344 368 128 129 367 301 157 369 109 108 367 157 168 370 196 206 368 339 310 369 108 328 370 305 196 368 344 128 370 206 327 368 310 267 371 278 353 372 215 225 373 247 331 372 313 215 372 225 329 371 319 278 374 169 171 375 230 332 374 171 323 373 227 247 376 194 330 377 321 248 377 251 336 376 192 194 378 325 358 377 248 251 379 204 334 380 243 335 379 317 204 381 264 340 380 241 243 382 53 52 382 54 53 383 299 360 383 353 326 382 52 255 382 255 338 384 274 347 385 260 263 383 326 299 386 333 307 387 221 337 385 263 342 388 164 349 385 327 260 386 307 366 389 275 345 390 368 129 390 129 130 390 130 131 388 331 283 388 283 164 390 339 368 391 236 343 392 341 319 391 234 236 393 179 355 394 335 279 391 323 234 392 319 371 395 330 253 393 292 179 394 279 281 395 253 259 394 281 352 395 259 346 393 336 292 396 338 296 392 366 341 397 300 357 398 348 325 398 74 348 396 151 354 398 75 74 396 296 151 398 76 75 398 325 378 399 173 361 400 353 383 401 208 363 402 269 356 401 302 208 399 297 173 401 347 302 403 15 16 404 333 386 405 285 288 404 378 358 404 358 333 405 288 359 406 303 185 403 309 15 406 185 365 407 355 314 408 131 132 409 289 36 407 314 364 408 390 131 409 36 37 408 360 339 410 110 109 408 339 390 411 295 362 410 109 369 412 305 370 413 313 372 414 366 392 415 316 227 415 227 373 416 301 367 417 306 169 418 371 353 419 230 375 420 321 377 419 315 230 419 361 315 418 353 400 421 365 320 421 241 380 420 363 321 417 169 374 422 378 404 423 360 408 424 311 192 423 132 133 425 324 264 421 320 241 425 264 381 423 400 383 426 327 385 423 408 132 424 359 311 423 383 360 424 192 376 427 366 414 428 328 274 428 274 384 429 317 379 430 275 389 427 386 366 431 414 392 430 329 275 431 371 418 432 332 26 432 26 27 433 318 221 433 221 387 434 331 388 431 392 371 435 378 422 435 77 76 436 336 393 435 76 398 435 398 378 437 400 423 438 335 394 439 338 396 440 340 300 437 133 134 440 300 397 437 423 133 441 323 391 442 422 404 442 386 427 440 381 340 442 404 386 443 384 347 444 297 399 445 330 395 443 347 401 446 379 334 444 342 297 447 389 345 447 345 303 448 414 431 446 334 269 447 303 406 449 309 403 449 349 309 450 418 400 446 269 402 451 305 412 450 437 134 451 352 305 450 134 135 452 337 285 453 355 407 452 387 337 450 400 437 452 285 405 454 111 110 454 43 111 454 44 43 455 313 413 456 422 442 454 110 410 455 354 313 457 414 448 458 343 289 459 397 357 460 361 419 458 289 409 459 316 415 459 357 316 461 346 295 457 427 414 462 431 418 462 418 450 462 448 431 461 295 411 463 365 421 464 363 420 462 135 136 465 364 324 462 450 135 466 350 301 466 63 350 466 64 63 466 65 64 467 435 422 466 301 416 465 324 425 467 77 435 467 422 456 465 407 364 468 412 370 467 78 77 469 410 369 468 327 426 469 369 328 470 442 427 468 370 327 470 456 442 469 328 428 471 306 417 471 402 356 472 372 329 470 427 457 472 329 430 471 356 306 473 331 434 472 413 372 474 136 137 475 359 424 474 137 138 474 448 462 474 462 136 476 375 332 476 332 432 473 373 331 477 362 317 477 411 362 478 456 470 479 377 336 480 474 138 477 317 429 479 336 436 480 138 139 481 367 318 479 420 377 482 335 438 481 318 433 482 380 335 480 448 474 481 416 367 483 338 439 480 457 448 483 54 382 484 467 456 483 382 338 484 78 467 485 381 440 483 55 54 484 456 478 486 323 441 487 342 444 484 79 78 487 385 342 488 139 140 487 426 385 489 384 443 488 478 470 488 480 139 488 470 457 486 374 323 488 457 480 490 434 388 491 376 330 492 478 488 490 349 449 492 140 141 491 330 445 492 488 140 490 388 349 493 389 447 494 478 492 495 429 379 496 436 393 494 142 80 496 355 453 494 141 142 497 394 352 494 484 478 497 352 451 494 79 484 494 492 141 494 80 79 496 393 355 497 438 394 495 379 446 498 396 354 499 387 452 498 439 396 500 397 459 498 354 455 501 443 401 502 399 361 501 363 464 502 361 460 503 441 391 501 401 363 504 403 16 503 343 458 504 16 17 503 391 343 505 346 461 504 449 403 505 445 395 506 407 465 507 406 365 506 453 407 507 365 463 505 395 346 508 410 469 509 412 468 510 402 471 511 413 472 512 373 473 513 359 475 514 375 476 512 415 373 513 405 359 514 419 375 515 464 420 515 420 479 514 460 419 516 37 38 517 421 380 518 425 381 516 409 37 517 463 421 518 381 485 517 380 482 519 426 487 520 411 477 521 469 428 521 384 489 522 389 493 523 416 481 524 417 374 521 428 384 524 374 486 522 430 389 525 434 490 526 27 28 526 432 27 527 376 491 528 436 496 527 424 376 529 440 397 530 438 497 527 475 424 529 397 500 531 439 498 532 429 495 529 485 440 533 489 443 534 444 399 533 443 501 535 387 499 535 433 387 536 449 504 534 399 502 537 493 447 537 406 507 538 453 506 537 447 406 539 451 412 540 441 503 541 44 454 542 445 505 541 454 410 541 45 44 541 410 508 543 500 459 539 412 509 544 413 511 545 446 402 543 415 512 543 459 415 544 455 413 545 495 446 546 464 515 545 402 510 547 460 514 548 452 405 549 465 425 548 405 513 549 506 465 548 499 452 549 425 518 550 463 517 551 469 521 552 458 409 553 426 519 552 409 516 551 508 469 553 509 468 554 461 411 555 434 525 553 468 426 555 473 434 112 40 2 556 511 472 554 411 520 556 430 522 557 479 436 558 466 416 557 515 479 558 416 523 558 65 466 556 472 430 558 66 65 557 436 528 559 476 432 560 471 417 559 432 526 561 482 438 561 438 530 560 510 471 562 485 529 560 417 524 563 489 533 564 475 527 565 55 483 565 56 55 565 439 531 565 483 439 566 444 534 567 429 532 566 519 487 568 490 449 567 520 477 567 477 429 568 525 490 568 449 536 566 487 444 569 528 496 570 493 537 569 496 453 569 453 538 571 481 433 571 523 481 572 497 451 571 433 535 572 451 539 573 500 543 572 530 497 574 486 441 575 531 498 574 441 540 576 501 464 576 464 546 575 455 544 575 498 455 576 533 501 577 491 445 578 17 18 577 445 542 579 502 460 578 504 17 579 460 547 578 536 504 580 495 545 581 507 463 582 538 506 582 506 549 583 541 508 580 532 495 583 508 551 581 463 550 584 509 553 585 499 548 586 512 473 584 539 509 586 473 555 587 511 556 588 503 458 588 458 552 588 540 503 589 514 476 590 505 461 591 546 515 591 515 557 590 542 505 590 461 554 592 485 562 589 547 514 589 476 559 593 482 561 592 518 485 593 517 482 594 521 489 593 550 517 595 510 560 594 489 563 594 551 521 596 519 566 597 513 475 597 475 564 598 522 493 599 525 568 598 493 570 600 38 39 600 516 38 601 28 29 602 528 569 603 562 529 603 500 573 601 526 28 604 520 567 603 529 500 605 530 572 606 523 571 607 563 533 608 531 575 607 533 576 609 486 574 610 536 578 609 524 486 611 534 502 612 538 582 613 564 527 611 502 579 613 491 577 614 45 541 615 537 507 613 527 491 614 541 583 615 570 537 614 46 45 615 507 581 616 543 512 617 539 584 616 512 586 616 573 543 618 532 580 619 499 585 620 511 587 619 535 499 620 544 511 621 546 591 622 549 518 622 582 549 623 540 588 624 547 589 622 518 592 625 551 594 626 550 593 625 583 551 627 555 525 628 542 590 627 525 599 629 584 553 630 545 510 629 553 519 629 519 596 631 522 598 632 557 528 631 556 522 630 580 545 630 510 595 632 591 557 633 548 513 631 587 556 632 528 602 633 513 597 634 562 603 633 585 548 635 526 601 635 559 526 636 530 605 636 561 530 637 563 607 42 80 142 638 516 600 638 552 516 639 3 4 640 599 568 641 531 608 642 554 520 639 81 3 641 57 56 642 520 604 639 82 81 641 56 565 640 568 536 641 565 531 643 534 611 643 596 566 640 536 610 643 566 534 644 569 538 645 558 523 644 602 569 646 82 639 645 66 558 646 83 82 645 67 66 645 523 606 647 570 615 648 524 609 644 538 612 648 560 524 649 573 616 650 605 572 651 83 646 648 595 560 650 539 617 651 84 83 652 564 613 653 576 546 650 572 539 654 608 575 655 4 5 653 607 576 653 546 621 655 639 4 656 567 532 654 544 620 655 646 639 657 18 19 658 84 651 657 19 20 654 575 544 656 532 618 659 579 547 657 578 18 659 547 624 656 604 567 658 85 84 660 612 582 660 582 622 661 571 535 662 581 550 661 535 619 661 606 571 663 614 583 663 583 625 664 646 655 662 550 626 665 584 629 666 586 555 667 540 623 668 85 658 667 574 540 666 555 627 668 86 85 668 87 86 669 577 542 670 621 591 671 587 631 669 542 628 670 591 632 672 559 635 672 624 589 673 592 562 672 589 559 674 658 651 674 646 664 673 562 634 675 618 580 676 563 637 675 580 630 677 561 636 674 651 646 676 594 563 676 625 594 678 5 6 677 626 593 677 593 561 678 655 5 679 599 640 680 585 633 678 664 655 681 552 638 682 88 87 682 87 668 681 588 552 683 596 643 684 598 570 681 623 588 684 570 647 685 590 554 685 554 642 686 602 644 687 658 674 685 628 590 688 603 573 689 29 30 689 30 31 688 634 603 689 601 29 688 573 649 690 605 650 691 637 607 691 607 653 692 595 648 693 664 678 694 88 682 695 564 652 694 89 88 696 578 657 697 608 654 695 597 564 698 579 659 699 112 113 698 611 579 696 610 578 699 39 40 699 40 112 700 612 660 699 600 39 701 614 663 702 615 581 701 47 46 701 46 614 702 647 615 703 586 666 702 581 662 704 658 687 704 668 658 705 604 656 706 617 584 707 674 664 703 616 586 703 649 616 708 606 661 706 584 665 707 687 674 709 574 667 707 664 693 710 89 694 711 621 670 712 660 622 712 592 673 710 90 89 713 620 587 713 587 671 712 622 592 709 609 574 714 652 613 714 613 577 715 693 678 715 6 7 714 577 669 716 625 676 717 624 672 715 678 6 716 663 625 718 618 675 719 626 677 720 668 704 720 682 668 721 627 599 722 629 596 721 599 679 722 596 683 723 585 680 724 670 632 724 602 686 723 619 585 722 665 629 724 632 602 725 673 634 726 631 598 727 687 707 726 671 631 726 598 684 728 90 710 725 634 688 729 601 689 730 623 681 728 91 90 729 635 601 731 636 605 732 637 691 733 640 610 734 628 685 733 679 640 735 675 630 733 610 696 735 595 692 731 605 690 736 693 715 737 608 697 738 694 682 737 57 641 739 644 612 737 641 608 737 58 57 739 686 644 735 630 595 738 682 720 739 612 700 738 710 694 740 633 597 741 643 611 740 680 633 741 683 643 742 649 703 740 597 695 741 611 698 743 699 113 743 113 114 744 647 702 745 704 687 743 600 699 745 687 727 746 653 621 743 638 600 746 621 711 747 91 728 748 690 650 746 691 653 747 92 91 749 604 705 750 657 20 750 20 21 748 650 617 749 642 604 748 617 706 750 696 657 751 697 654 751 620 713 752 660 712 753 606 708 751 654 620 753 68 67 753 645 606 754 693 736 753 67 645 754 707 693 754 727 707 755 624 717 756 692 648 756 648 609 755 659 624 757 663 716 756 609 709 757 701 663 758 627 721 758 666 627 759 652 714 760 626 719 761 710 738 762 7 8 762 8 9 760 662 626 762 715 7 762 736 715 763 711 670 764 665 722 763 670 724 764 706 665 765 704 745 766 705 656 766 618 718 767 671 726 766 656 618 765 720 704 768 673 725 769 708 661 769 619 723 770 672 635 771 92 747 771 93 92 772 716 676 770 717 672 771 94 93 772 676 637 769 661 619 772 637 732 773 667 623 770 635 729 774 719 677 775 679 733 773 623 730 776 727 754 777 669 628 774 636 731 774 677 636 778 686 739 777 628 734 779 710 761 780 683 741 779 747 728 779 728 710 781 688 649 782 647 744 781 649 742 783 718 675 784 736 762 781 725 688 783 675 735 782 684 647 785 680 740 786 689 31 787 720 765 786 31 32 787 761 738 787 738 720 788 732 691 788 691 746 789 114 115 790 690 748 789 743 114 791 94 771 789 730 681 789 638 743 789 681 638 791 95 94 792 696 750 793 697 751 794 685 642 795 660 752 794 734 685 796 698 659 795 700 660 794 642 749 797 745 727 798 48 47 798 49 48 799 692 756 797 727 776 798 47 701 798 701 757 796 659 755 800 703 666 801 702 662 801 744 702 802 747 779 800 666 758 803 695 652 801 662 760 800 742 703 803 652 759 804 706 764 805 754 736 806 711 763 805 736 784 805 776 754 807 713 671 808 673 768 809 705 766 807 671 767 808 712 673 808 752 712 810 761 787 811 757 716 812 9 10 813 717 770 812 784 762 812 762 9 811 716 772 814 708 769 815 95 791 816 721 679 816 679 775 815 96 95 817 667 773 818 719 774 817 709 667 819 714 669 820 745 797 821 722 683 822 724 686 822 763 724 819 669 777 821 683 780 822 686 778 819 759 714 823 725 781 820 765 745 821 764 722 824 726 684 824 767 726 825 771 747 824 684 782 826 718 783 825 747 802 827 680 785 828 729 689 828 689 786 827 723 680 829 732 788 830 115 116 831 696 792 832 776 805 831 733 696 830 789 115 833 731 690 831 775 733 830 730 789 833 690 790 834 739 700 834 700 795 834 778 739 835 802 779 836 734 794 837 737 697 835 761 810 837 58 737 835 779 761 837 697 793 837 59 58 837 60 59 838 741 698 839 784 812 838 780 741 840 742 800 841 735 692 841 692 799 838 698 796 842 96 815 843 788 746 841 783 735 842 97 96 843 711 806 843 746 711 844 785 740 845 21 22 844 740 695 846 765 820 845 792 750 847 744 801 844 695 803 848 706 804 849 705 809 848 748 706 846 810 787 845 750 21 849 749 705 850 752 808 848 790 748 846 787 765 851 791 771 852 793 751 852 751 713 851 771 825 853 798 757 854 708 814 851 815 791 854 68 753 852 713 807 855 776 832 853 757 811 854 753 708 854 69 68 856 709 817 855 797 776 857 721 816 858 717 813 858 755 717 856 756 709 857 758 721 856 799 756 859 759 819 860 763 822 861 760 719 862 802 835 861 719 818 860 806 763 863 809 766 864 784 839 865 725 823 863 718 826 866 764 821 864 832 805 864 805 784 865 768 725 867 732 829 867 772 732 863 766 718 866 804 764 868 97 842 867 811 772 869 814 769 870 767 824 869 723 827 868 98 97 869 769 723 871 729 828 872 116 117 871 770 729 872 117 118 873 775 831 874 810 846 872 730 830 872 830 116 871 813 770 872 773 730 875 812 10 876 734 836 875 10 11 875 839 812 876 777 734 877 731 833 878 778 834 879 823 781 879 781 742 877 774 731 877 818 774 879 742 840 880 780 838 881 815 851 882 783 841 883 829 788 883 788 843 884 797 855 882 826 783 885 782 744 886 785 844 885 744 847 884 820 797 887 32 33 888 825 802 889 792 845 890 836 794 887 786 32 888 802 862 890 794 749 891 795 752 892 832 864 890 749 849 891 752 850 893 790 848 894 49 798 895 793 852 894 798 853 894 50 49 896 840 800 897 799 856 896 800 758 898 759 859 896 758 857 899 98 868 899 99 98 899 100 99 900 806 860 898 803 759 901 755 858 902 862 835 902 810 874 901 796 755 903 801 760 904 808 768 903 760 861 902 835 810 905 809 863 904 850 808 903 847 801 904 768 865 906 814 869 907 839 875 908 842 815 909 811 867 910 817 773 148 804 866 908 815 881 909 853 811 910 118 119 910 773 872 910 872 118 159 807 767 911 816 775 912 859 819 159 767 870 913 846 820 913 874 846 912 777 876 911 775 873 912 819 777 170 813 871 913 820 884 914 851 825 915 822 778 914 881 851 915 778 878 914 825 888 916 826 882 917 827 785 193 818 877 917 785 886 918 823 879 919 832 892 920 866 821 919 855 832 152 829 883 920 780 880 920 821 780 921 792 889 922 836 890 923 824 782 923 782 885 923 870 824 921 831 792 924 100 899 924 101 100 921 873 831 925 795 891 926 862 902 925 834 795 927 841 799 925 878 834 927 882 841 927 799 897 235 786 887 928 886 844 235 828 786 929 892 864 258 833 790 928 803 898 928 844 803 929 839 907 198 840 896 930 809 905 929 864 839 224 843 806 930 849 809 258 790 893 931 837 793 931 60 837 932 842 908 931 793 895 931 61 60 224 806 900 933 880 838 224 883 843 932 868 842 932 899 868 231 889 845 934 69 854 231 845 22 934 814 906 934 70 69 935 874 913 231 22 23 934 71 70 933 796 901 934 854 814 933 838 796 936 856 817 936 817 910 936 119 120 287 847 903 242 850 904 937 11 12 936 897 856 937 907 875 936 910 119 937 875 11 938 894 853 939 908 881 938 853 909 147 848 804 147 893 848 147 804 148 144 859 912 262 816 911 939 881 914 262 857 816 158 895 852 940 863 826 158 852 807 158 807 159 940 905 863 190 855 919 940 826 916 941 822 915 190 884 855 942 869 827 942 827 917 941 900 860 941 860 822 942 906 869 172 858 813 943 101 924 280 865 823 943 102 101 184 876 836 172 813 170 280 823 918 200 818 193 200 861 818 220 862 926 155 829 152 184 836 922 220 888 862 155 867 829 155 909 867 229 892 929 944 916 882 944 882 927 205 148 866 174 873 921 205 866 920 214 886 928 250 899 932 945 922 890 186 878 925 946 902 874 222 870 923 237 871 828 197 840 198 946 874 935 197 879 840 946 926 902 197 918 879 945 849 930 945 890 849 947 897 936 237 828 235 216 883 224 947 120 121 216 152 883 237 170 871 165 907 937 254 193 877 254 877 833 947 936 120 180 908 939 254 833 258 246 859 144 246 898 859 233 889 231 189 913 884 252 891 850 161 905 940 189 935 913 189 884 190 270 880 933 286 885 847 209 103 102 252 850 242 256 50 894 256 894 938 256 51 50 261 857 262 177 906 942 209 102 943 286 847 287 261 198 896 291 33 34 219 888 220 183 144 912 291 887 33 261 896 857 219 914 888 183 912 876 183 876 184 219 939 914 276 900 941 156 893 147 282 865 280 228 892 229 282 904 865 228 919 892 167 895 158 282 242 904 249 899 250 211 916 944 213 886 214 308 858 172 213 917 886 154 938 909 249 924 899 154 909 155 239 922 945 308 901 858 298 873 174 265 926 946 298 911 873 284 229 929 312 903 861 304 915 878 312 287 903 284 907 165 304 878 186 948 947 121 948 121 122 312 861 200 948 944 927 149 148 205 284 929 907 293 908 180 948 897 947 202 918 197 948 927 897 245 928 898 168 870 222 202 280 918 245 898 246 293 932 908 293 250 932 245 214 928 168 159 870 153 152 216 195 935 189 175 921 889 268 905 161 163 104 103 268 930 905 273 934 906 175 889 233 273 71 934 171 170 237 175 174 921 273 72 71 194 193 254 273 906 177 163 103 209 187 925 891 187 186 925 166 12 13 187 891 252 166 165 937 166 13 14 166 937 12 145 144 183 207 880 270 162 940 916 181 180 939 207 205 920 206 198 261 162 161 940 181 939 219 207 920 880 201 919 228 162 916 211 223 885 286 225 224 900 225 900 276 178 917 213 223 923 885 223 222 923 201 190 919 178 177 942 178 942 917 210 209 943 232 23 24 210 924 249 232 24 25 191 922 239 236 887 291 232 231 23 236 235 887 210 943 924 226 220 926 191 184 922 259 893 156 259 258 893 203 122 123 226 926 265 243 242 282 203 948 122 257 256 938 203 944 948 203 211 944 351 931 895 247 229 284 257 938 154 351 61 931 351 62 61 351 895 167 263 911 298 217 214 245 271 270 933 263 262 911 240 239 945 271 933 901 271 901 308 240 945 930 277 915 304 240 930 268 251 250 293 277 276 941 266 946 935 277 941 915 288 287 312 266 935 195 281 280 202 143 246 144 266 265 946 + +TShapes 6 +Ve +1e-07 +381 0 0 +0 0 + +0101101 +* +Ed + 1e-07 1 1 0 +1 1 0 0 1.5707963267949 +2 1 2 0 0 1.5707963267949 +2 2 3 0 0 1.5707963267949 +2 3 1 0 0 1.5707963267949 +6 1 1 0 +0 + +0101000 ++6 3 -6 5 * +Ed + 1e-07 1 1 0 +1 2 0 0 1.5707963267949 +2 4 4 0 0 1.5707963267949 +2 5 2 0 0 1.5707963267949 +2 6 1 0 0 1.5707963267949 +6 2 1 0 +0 + +0101000 ++6 2 -6 6 * +Ed + 1e-07 1 1 0 +1 3 0 3.14159265358979 6.28318530717959 +2 7 5 0 3.14159265358979 6.28318530717959 +2 8 1 7 3.14159265358979 6.28318530717959 +2 9 1 8 3.14159265358979 6.28318530717959 +6 3 1 8 +6 4 1 7 +0 + +0101000 ++6 1 -6 0 * +Wi + +0101000 ++5 0 -4 0 -3 2 +3 6 * +Fa +0 1e-07 1 0 +2 1 +0111000 ++2 0 * + +-1 0 \ No newline at end of file diff --git a/src/FeaturesPlugin/doc/FeaturesPlugin.rst b/src/FeaturesPlugin/doc/FeaturesPlugin.rst index ac4a0fd5b..dc4e70df4 100644 --- a/src/FeaturesPlugin/doc/FeaturesPlugin.rst +++ b/src/FeaturesPlugin/doc/FeaturesPlugin.rst @@ -24,6 +24,7 @@ Features plug-in provides a set of common topological operations. It implements fuseFeatureFaces.rst geometryCalculationFeature.rst importResultFeature.rst + limitToleranceFeature.rst linearCopyFeature.rst loftFeature.rst measurementFeature.rst diff --git a/src/FeaturesPlugin/doc/TUI_limitToleranceFeature.rst b/src/FeaturesPlugin/doc/TUI_limitToleranceFeature.rst new file mode 100644 index 000000000..25638c02e --- /dev/null +++ b/src/FeaturesPlugin/doc/TUI_limitToleranceFeature.rst @@ -0,0 +1,12 @@ + + .. _tui_limit_tolerance: + +Limit Tolerance +=============== + +.. literalinclude:: examples/limit_tolerance.py + :linenos: + :language: python + +:download:`Download this script ` + diff --git a/src/FeaturesPlugin/doc/examples/limit_tolerance.py b/src/FeaturesPlugin/doc/examples/limit_tolerance.py new file mode 100644 index 000000000..c0fd60584 --- /dev/null +++ b/src/FeaturesPlugin/doc/examples/limit_tolerance.py @@ -0,0 +1,47 @@ +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +# Create two points +Point_1 = model.addPoint(Part_1_doc, 0, 0, 0) +Point_2 = model.addPoint(Part_1_doc, 1, 0, 0) +model.do() + +# Create a partition between two vertices with default tolerance: +# => partition results in a compound with 2 vertices +Vertex_1 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_1")]) +Vertex_2 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_2")]) +Partition_1_objects = [model.selection("VERTEX", "Vertex_1_1"), model.selection("VERTEX", "Vertex_2_1")] +Partition_1 = model.addPartition(Part_1_doc, Partition_1_objects, keepSubResults = True) +model.do() + +# Create a boolean fusion between two vertices with default tolerance: +# => fusion results in a compound with 2 vertices +Vertex_3 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_1")]) +Vertex_4 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_2")]) +Fuse_1_objects = [model.selection("VERTEX", "Vertex_3_1"), model.selection("VERTEX", "Vertex_4_1")] +Fuse_1 = model.addFuse(Part_1_doc, Fuse_1_objects, True, keepSubResults = True) +model.do() + +# Create a partition between two vertices with higher tolerance: +# => partition results in a single vertex +Vertex_5 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_1")]) +Vertex_6 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_2")]) +LimitTolerance_1 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_5_1"), 0.6) +LimitTolerance_2 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_6_1"), 0.6) +Partition_2_objects = [model.selection("VERTEX", "LimitTolerance_1_1"), model.selection("VERTEX", "LimitTolerance_2_1")] +Partition_2 = model.addPartition(Part_1_doc, Partition_2_objects, keepSubResults = True) +model.do() + +# Create a boolean fusion between two vertices with higher tolerance: +# => fusion results in a single vertex +Vertex_7 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_1")]) +Vertex_8 = model.addVertex(Part_1_doc, [model.selection("VERTEX", "Point_2")]) +LimitTolerance_3 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_7_1"), 0.6) +LimitTolerance_4 = model.addLimitTolerance(Part_1_doc, model.selection("VERTEX", "Vertex_8_1"), 0.6) +Fuse_2_objects = [model.selection("VERTEX", "LimitTolerance_3_1"), model.selection("VERTEX", "LimitTolerance_4_1")] +Fuse_2 = model.addFuse(Part_1_doc, Fuse_2_objects, True, keepSubResults = True) +model.end() diff --git a/src/FeaturesPlugin/doc/images/LimitTolerance.png b/src/FeaturesPlugin/doc/images/LimitTolerance.png new file mode 100644 index 000000000..af6f93a04 Binary files /dev/null and b/src/FeaturesPlugin/doc/images/LimitTolerance.png differ diff --git a/src/FeaturesPlugin/doc/images/limit_tol_btn.png b/src/FeaturesPlugin/doc/images/limit_tol_btn.png new file mode 100644 index 000000000..35f20804e Binary files /dev/null and b/src/FeaturesPlugin/doc/images/limit_tol_btn.png differ diff --git a/src/FeaturesPlugin/doc/limitToleranceFeature.rst b/src/FeaturesPlugin/doc/limitToleranceFeature.rst new file mode 100644 index 000000000..4c70bc12b --- /dev/null +++ b/src/FeaturesPlugin/doc/limitToleranceFeature.rst @@ -0,0 +1,47 @@ +.. |limit_tol_btn.icon| image:: images/limit_tol_btn.png + +Limit Tolerance +=============== + +Limit Tolerance feature tries to set a new value of tolerance for the given shape. However, the final tolerance value also +depends on the initial shape topology (takes into consideration the existing gaps) to obtain a valid resulting shape. + +To limit the tolerance in the active part: + +#. select in the Main Menu *Features - > Limit Tolerance* item or +#. click |limit_tol_btn.icon| **Limit Tolerance** button in the toolbar + +The following property panel will be opened: + +.. figure:: images/LimitTolerance.png + :align: center + + **Limit Tolerance operation** + +Here it is necessary to select a shape and give a value for the desired tolerance value. + +- **Shape** sets the shape to be modified. +- **Tolerance** sets the desired tolerance value for the selected shape. + +Example of usage: + +#. Partition objects obj1 and obj2. +#. Partition fails. +#. Perform Limit Tolerance on objects obj1 and obj2. +#. Try to partition them again. + +**TUI Command**: + +.. py:function:: model.addLimitTolerance(Part_doc, shape, tolerance) + + :param part: The current part object. + :param shape: A shape. + :param tolerance: A tolerance value. + :return: Result shape with the modified tolerance. + +Result +"""""" + +The Result of the operation will be the selected shape with an updated tolerance, where possible. + +**See Also** a sample TUI Script of :ref:`tui_limit_tolerance` operation. diff --git a/src/FeaturesPlugin/icons/limit_tolerance.png b/src/FeaturesPlugin/icons/limit_tolerance.png new file mode 100644 index 000000000..35f20804e Binary files /dev/null and b/src/FeaturesPlugin/icons/limit_tolerance.png differ diff --git a/src/FeaturesPlugin/limit_tolerance_widget.xml b/src/FeaturesPlugin/limit_tolerance_widget.xml new file mode 100644 index 000000000..b67c29f14 --- /dev/null +++ b/src/FeaturesPlugin/limit_tolerance_widget.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/src/FeaturesPlugin/plugin-Features.xml b/src/FeaturesPlugin/plugin-Features.xml index fd27a2ef2..ab82d3fff 100644 --- a/src/FeaturesPlugin/plugin-Features.xml +++ b/src/FeaturesPlugin/plugin-Features.xml @@ -146,6 +146,13 @@ + + + + + diff --git a/src/FeaturesPlugin/tests.set b/src/FeaturesPlugin/tests.set index 302daa49b..1619613ea 100644 --- a/src/FeaturesPlugin/tests.set +++ b/src/FeaturesPlugin/tests.set @@ -529,6 +529,8 @@ SET(TEST_NAMES_PARA Test23885.py TestNormalToFace.py TestLoft.py + TestLimitTolerance.py + TestLimitTolerance_Face.py ) SET(TEST_NAMES_SEQ diff --git a/src/GeomAlgoAPI/CMakeLists.txt b/src/GeomAlgoAPI/CMakeLists.txt index 640ae3a1f..747bfa508 100644 --- a/src/GeomAlgoAPI/CMakeLists.txt +++ b/src/GeomAlgoAPI/CMakeLists.txt @@ -97,7 +97,9 @@ SET(PROJECT_HEADERS GeomAlgoAPI_NormalToFace.h GeomAlgoAPI_Tube.h GeomAlgoAPI_ShapeInfo.h - GeomAlgoAPI_CanonicalRecognition.h + GeomAlgoAPI_CanonicalRecognition.h + GeomAlgoAPI_LimitTolerance.h + GeomAlgoAPI_Utils.h ) SET(PROJECT_SOURCES @@ -174,7 +176,9 @@ SET(PROJECT_SOURCES GeomAlgoAPI_NormalToFace.cpp GeomAlgoAPI_Tube.cpp GeomAlgoAPI_ShapeInfo.cpp - GeomAlgoAPI_CanonicalRecognition.cpp + GeomAlgoAPI_CanonicalRecognition.cpp + GeomAlgoAPI_LimitTolerance.cpp + GeomAlgoAPI_Utils.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.cpp new file mode 100644 index 000000000..971f11498 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.cpp @@ -0,0 +1,75 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "GeomAlgoAPI_LimitTolerance.h" + +#include "GeomAlgoAPI_Utils.h" + +#include +#include +#include + + +//================================================================================================== +GeomAlgoAPI_LimitTolerance::GeomAlgoAPI_LimitTolerance(const GeomShapePtr theShape, const double theTolerance, const bool theCheckGeometry) +{ + build(theShape, theTolerance, theCheckGeometry); +} + +//================================================================================================== +void GeomAlgoAPI_LimitTolerance::build(const GeomShapePtr theShape, const double theTolerance, const bool theCheckGeometry) +{ + if (!theShape.get()) { + return; + } + + const TopoDS_Shape& aOriginalShape = theShape->impl(); + Standard_Real aTol = theTolerance; + TopAbs_ShapeEnum aType = TopAbs_SHAPE; + + if (aTol < Precision::Confusion()) + aTol = Precision::Confusion(); + + // 1. Make a copy to prevent the original shape changes. + TopoDS_Shape aShapeCopy; + { + BRepBuilderAPI_Copy aMC (aOriginalShape); + if (aMC.IsDone()) { + aShapeCopy = aMC.Shape(); + } + else { + TColStd_IndexedDataMapOfTransientTransient aMapTShapes; + TNaming_CopyShape::CopyTool(aOriginalShape, aMapTShapes, aShapeCopy); + } + } + + // 2. Limit tolerance. + if (!GeomAlgoAPI_Utils::FixShapeTolerance(aShapeCopy, aType, aTol, theCheckGeometry)) + { + return; + } + + // 3. Set the result + TopoDS_Shape aResult = aShapeCopy; + + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aShape); + this->setDone(true); +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.h b/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.h new file mode 100644 index 000000000..b8031f8c3 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_LimitTolerance.h @@ -0,0 +1,45 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef GeomAlgoAPI_LimitTolerance_H_ +#define GeomAlgoAPI_LimitTolerance_H_ + +#include "GeomAlgoAPI.h" +#include "GeomAlgoAPI_MakeShape.h" + +#include + +/// \class GeomAlgoAPI_LimitTolerance +/// \ingroup DataAlgo +/// \brief Allows changing the tolerance in the shape and all of its sub shapes. +class GeomAlgoAPI_LimitTolerance : public GeomAlgoAPI_MakeShape +{ +public: + /// @brief Constructor. + /// @param[in] theShape for which tolerance should be changed + /// @param[in] theTolerance the new tolerance + /// @param[in] theCheckGeometry if True, also check geometry + GEOMALGOAPI_EXPORT GeomAlgoAPI_LimitTolerance(const GeomShapePtr theShape, const double theTolerance, const bool theCheckGeometry = false); + +private: + /// Builds resulting shape. + void build(const GeomShapePtr theShape, const double theTolerance, const bool theCheckGeometry); +}; + +#endif diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Utils.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Utils.cpp new file mode 100644 index 000000000..df122326b --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Utils.cpp @@ -0,0 +1,63 @@ +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "GeomAlgoAPI_Utils.h" + +#include +#include +#include +#include + + +//================================================================================================== +bool GeomAlgoAPI_Utils::FixShapeTolerance(TopoDS_Shape& theShape, + TopAbs_ShapeEnum theType, + const double theTolerance, + const bool theCheckGeometry) +{ + ShapeFix_ShapeTolerance aSft; + aSft.LimitTolerance(theShape, theTolerance, theTolerance, theType); + Handle(ShapeFix_Shape) aSfs = new ShapeFix_Shape(theShape); + aSfs->Perform(); + theShape = aSfs->Shape(); + return CheckShape(theShape, theCheckGeometry); +} + +//================================================================================================== +bool GeomAlgoAPI_Utils::FixShapeTolerance(TopoDS_Shape& theShape, + const double theTolerance, + const bool theCheckGeometry) +{ + return FixShapeTolerance(theShape, TopAbs_SHAPE, theTolerance, theCheckGeometry); +} + +//================================================================================================== +bool GeomAlgoAPI_Utils::FixShapeTolerance(TopoDS_Shape& theShape, + const bool theCheckGeometry) +{ + return FixShapeTolerance(theShape, Precision::Confusion(), theCheckGeometry); +} + +//================================================================================================== +bool GeomAlgoAPI_Utils::CheckShape(TopoDS_Shape& theShape, + const bool theCheckGeometry) +{ + BRepCheck_Analyzer analyzer(theShape, theCheckGeometry); + return analyzer.IsValid(); +} diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Utils.h b/src/GeomAlgoAPI/GeomAlgoAPI_Utils.h new file mode 100644 index 000000000..1f3e02691 --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Utils.h @@ -0,0 +1,81 @@ +// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library 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. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef GeomAlgoAPI_Utils_H_ +#define GeomAlgoAPI_Utils_H_ + +#include "GeomAlgoAPI.h" + +#include +#include + + +namespace GeomAlgoAPI_Utils +{ + /// + /// \brief Limit shape tolerance to the given value + /// + /// \param theShape shape being fixed + /// \param theType topology type which tolerance is to be limited; TopAbs_SHAPE means + /// all types of topology + /// \param theTolerance expected tolerance value (1e-7 by default) + /// \param theCheckGeometry check geometry validity of result + /// \return \c true if resulting shape is valid + /// + /// \note Resulting tolerance of the shape is not mandatory equal to requested value + /// as it might be changed by fixshape operation in order to get valid shape where possible + /// \note By default, the result is only checked for topology validity; check of geometry can be done by + /// passing \c true to \a theCheckGeometry parameter + /// + GEOMALGOAPI_EXPORT bool FixShapeTolerance(TopoDS_Shape& theShape, + const TopAbs_ShapeEnum theType, + const double theTolerance = Precision::Confusion(), + const bool theCheckGeometry = false); + + /// + /// \brief Limit shape tolerance to the given value + /// This is overloaded function, it behaves exactly as previous one + /// + GEOMALGOAPI_EXPORT bool FixShapeTolerance(TopoDS_Shape& theShape, + const double theTolerance = Precision::Confusion(), + const bool theCheckGeometry = false); + + /// + /// \brief Limit shape tolerance to the given value + /// This is overloaded function, it behaves exactly as previous one + /// + GEOMALGOAPI_EXPORT bool FixShapeTolerance(TopoDS_Shape& theShape, + const bool theCheckGeometry); + + /// + /// \brief Check shape + /// + /// \param theShape input shape object + /// \param theCheckGeometry when set to \c true, causes check of underlying geometry + /// in addition to the topology + /// \return \c true if shape is valid or \c false otherwise + /// + GEOMALGOAPI_EXPORT bool CheckShape(TopoDS_Shape& theShape, + const bool theCheckGeometry = false); +} + +#endif diff --git a/src/PythonAPI/model/features/__init__.py b/src/PythonAPI/model/features/__init__.py index 043f9c726..1c041a63c 100644 --- a/src/PythonAPI/model/features/__init__.py +++ b/src/PythonAPI/model/features/__init__.py @@ -36,3 +36,4 @@ from FeaturesAPI import makeVertexInsideFace from FeaturesAPI import addRemoveResults from FeaturesAPI import addCopy, addImportResult from FeaturesAPI import addDefeaturing +from FeaturesAPI import addLimitTolerance