From 7cde98370190b98c6a3ee45ee74aace0df903ddf Mon Sep 17 00:00:00 2001 From: mzn Date: Mon, 13 Aug 2018 16:12:40 +0300 Subject: [PATCH] Issue #2577: EDF 2018-2 Fusion of connected faces. --- doc/gui/FeaturesPlugin/fusionFacesFeature.rst | 6 ++ src/BuildPlugin/Test/TestInterpolation.py | 12 +-- src/FeaturesAPI/CMakeLists.txt | 2 + src/FeaturesAPI/FeaturesAPI.i | 2 + src/FeaturesAPI/FeaturesAPI_FusionFaces.cpp | 79 ++++++++++++++ src/FeaturesAPI/FeaturesAPI_FusionFaces.h | 75 ++++++++++++++ src/FeaturesAPI/FeaturesAPI_swig.h | 1 + src/FeaturesPlugin/CMakeLists.txt | 4 + .../FeaturesPlugin_FusionFaces.cpp | 96 ++++++++++++++++++ .../FeaturesPlugin_FusionFaces.h | 65 ++++++++++++ src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp | 3 + src/FeaturesPlugin/FeaturesPlugin_msg_en.ts | 7 ++ src/FeaturesPlugin/Test/TestFusionFaces.py | 88 ++++++++++++++++ src/FeaturesPlugin/fusion_faces_widget.xml | 32 ++++++ src/FeaturesPlugin/icons/fusion_faces.png | Bin 0 -> 215 bytes src/FeaturesPlugin/plugin-Features.xml | 6 ++ .../GeomAlgoAPI_UnifySameDomain.cpp | 27 ++++- src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.h | 8 +- src/PythonAPI/model/features/__init__.py | 1 + 19 files changed, 502 insertions(+), 12 deletions(-) create mode 100644 doc/gui/FeaturesPlugin/fusionFacesFeature.rst create mode 100644 src/FeaturesAPI/FeaturesAPI_FusionFaces.cpp create mode 100644 src/FeaturesAPI/FeaturesAPI_FusionFaces.h create mode 100644 src/FeaturesPlugin/FeaturesPlugin_FusionFaces.cpp create mode 100644 src/FeaturesPlugin/FeaturesPlugin_FusionFaces.h create mode 100644 src/FeaturesPlugin/Test/TestFusionFaces.py create mode 100644 src/FeaturesPlugin/fusion_faces_widget.xml create mode 100644 src/FeaturesPlugin/icons/fusion_faces.png diff --git a/doc/gui/FeaturesPlugin/fusionFacesFeature.rst b/doc/gui/FeaturesPlugin/fusionFacesFeature.rst new file mode 100644 index 000000000..1fd7f2f99 --- /dev/null +++ b/doc/gui/FeaturesPlugin/fusionFacesFeature.rst @@ -0,0 +1,6 @@ + +Fusion faces +============ + +.. centered:: + Fusion faces diff --git a/src/BuildPlugin/Test/TestInterpolation.py b/src/BuildPlugin/Test/TestInterpolation.py index abeda2393..656351a48 100644 --- a/src/BuildPlugin/Test/TestInterpolation.py +++ b/src/BuildPlugin/Test/TestInterpolation.py @@ -60,17 +60,17 @@ model.do() model.checkResult(Interpolation_1, model, 1, [0], [0], [0], [1], [2]) -# # ============================================================================= -# # Test 2. Create curve 1-2-3-4-5-1, closed on, reorder off, without tangents -# # ============================================================================= +# ============================================================================= +# Test 2. Create curve 1-2-3-4-5-1, closed on, reorder off, without tangents +# ============================================================================= Interpolation_2 = model.addInterpolation(Part_1_doc, [p_1, p_2, p_3, p_4, p_5], True, False) model.do() model.checkResult(Interpolation_2, model, 1, [0], [0], [0], [1], [2]) -# # ============================================================================= -# # Test 3. Create curve 1-2-3-4, closed off, reorder on, without tangents -# # ============================================================================= +# ============================================================================= +# Test 3. Create curve 1-2-3-4, closed off, reorder on, without tangents +# ============================================================================= Interpolation_3 = model.addInterpolation(Part_1_doc, [p_1, p_2, p_3, p_4], False, True) model.do() diff --git a/src/FeaturesAPI/CMakeLists.txt b/src/FeaturesAPI/CMakeLists.txt index b511fc640..76c17d1eb 100644 --- a/src/FeaturesAPI/CMakeLists.txt +++ b/src/FeaturesAPI/CMakeLists.txt @@ -46,6 +46,7 @@ SET(PROJECT_HEADERS FeaturesAPI_Symmetry.h FeaturesAPI_Translation.h FeaturesAPI_Union.h + FeaturesAPI_FusionFaces.h ) SET(PROJECT_SOURCES @@ -73,6 +74,7 @@ SET(PROJECT_SOURCES FeaturesAPI_Symmetry.cpp FeaturesAPI_Translation.cpp FeaturesAPI_Union.cpp + FeaturesAPI_FusionFaces.cpp ) SET(PROJECT_LIBRARIES diff --git a/src/FeaturesAPI/FeaturesAPI.i b/src/FeaturesAPI/FeaturesAPI.i index dd6b5897f..e9668c42c 100644 --- a/src/FeaturesAPI/FeaturesAPI.i +++ b/src/FeaturesAPI/FeaturesAPI.i @@ -66,6 +66,7 @@ %shared_ptr(FeaturesAPI_Symmetry) %shared_ptr(FeaturesAPI_Translation) %shared_ptr(FeaturesAPI_Union) +%shared_ptr(FeaturesAPI_FusionFaces) // all supported interfaces %include "FeaturesAPI_BooleanCut.h" @@ -92,3 +93,4 @@ %include "FeaturesAPI_Symmetry.h" %include "FeaturesAPI_Translation.h" %include "FeaturesAPI_Union.h" +%include "FeaturesAPI_FusionFaces.h" diff --git a/src/FeaturesAPI/FeaturesAPI_FusionFaces.cpp b/src/FeaturesAPI/FeaturesAPI_FusionFaces.cpp new file mode 100644 index 000000000..0a2efc8b2 --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_FusionFaces.cpp @@ -0,0 +1,79 @@ +// Copyright (C) 2014-2017 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_FusionFaces.h" + +#include +#include + +//================================================================================================== +FeaturesAPI_FusionFaces::FeaturesAPI_FusionFaces( + const std::shared_ptr& theFeature) +: ModelHighAPI_Interface(theFeature) +{ + initialize(); +} + +//================================================================================================== +FeaturesAPI_FusionFaces::FeaturesAPI_FusionFaces( + const std::shared_ptr& theFeature, + const ModelHighAPI_Selection& theBase) +: ModelHighAPI_Interface(theFeature) +{ + if(initialize()) { + setBase(theBase); + } +} + +//================================================================================================== +FeaturesAPI_FusionFaces::~FeaturesAPI_FusionFaces() +{ + +} + +//================================================================================================== +void FeaturesAPI_FusionFaces::setBase(const ModelHighAPI_Selection& theBase) +{ + fillAttribute(theBase, mybase); + + execute(); +} + +//================================================================================================== +void FeaturesAPI_FusionFaces::dump(ModelHighAPI_Dumper& theDumper) const +{ + FeaturePtr aBase = feature(); + const std::string& aPartName = theDumper.name(aBase->document()); + + AttributeSelectionPtr anAttrBaseShape = + aBase->selection(FeaturesPlugin_FusionFaces::BASE_SHAPE_ID()); + + theDumper << aBase << " = model.addFusionFaces(" + << aPartName << ", " << anAttrBaseShape << ")" << std::endl; +} + +//================================================================================================== +FusionFacesPtr addFusionFaces(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theBase) +{ + std::shared_ptr aFeature = + thePart->addFeature(FeaturesAPI_FusionFaces::ID()); + return FusionFacesPtr(new FeaturesAPI_FusionFaces(aFeature, theBase)); +} diff --git a/src/FeaturesAPI/FeaturesAPI_FusionFaces.h b/src/FeaturesAPI/FeaturesAPI_FusionFaces.h new file mode 100644 index 000000000..054f7ac2f --- /dev/null +++ b/src/FeaturesAPI/FeaturesAPI_FusionFaces.h @@ -0,0 +1,75 @@ +// Copyright (C) 2014-2017 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_FusionFaces_H_ +#define FeaturesAPI_FusionFaces_H_ + +#include "FeaturesAPI.h" + +#include + +#include +#include + +class ModelHighAPI_Dumper; +class ModelHighAPI_Selection; + +/// \class FeaturesAPI_FusionFaces +/// \ingroup CPPHighAPI +/// \brief Interface for FusionFaces feature. +class FeaturesAPI_FusionFaces: public ModelHighAPI_Interface +{ +public: + /// Constructor without values. + FEATURESAPI_EXPORT + explicit FeaturesAPI_FusionFaces(const std::shared_ptr& theFeature); + + /// Constructor with values. + FEATURESAPI_EXPORT + explicit FeaturesAPI_FusionFaces(const std::shared_ptr& theFeature, + const ModelHighAPI_Selection& theBase); + + /// Destructor. + FEATURESAPI_EXPORT + virtual ~FeaturesAPI_FusionFaces(); + + INTERFACE_1(FeaturesPlugin_FusionFaces::ID(), + base, FeaturesPlugin_FusionFaces::BASE_SHAPE_ID(), + ModelAPI_AttributeSelection, /** Base */) + + /// Modify base object attribute of the feature. + FEATURESAPI_EXPORT + void setBase(const ModelHighAPI_Selection& theBase); + + /// Dump wrapped feature + FEATURESAPI_EXPORT + virtual void dump(ModelHighAPI_Dumper& theDumper) const; +}; + +/// Pointer on FusionFaces object. +typedef std::shared_ptr FusionFacesPtr; + +/// \ingroup CPPHighAPI +/// \brief Create FusionFaces feature. +FEATURESAPI_EXPORT +FusionFacesPtr addFusionFaces(const std::shared_ptr& thePart, + const ModelHighAPI_Selection& theBase); + +#endif // FeaturesAPI_FusionFaces_H_ diff --git a/src/FeaturesAPI/FeaturesAPI_swig.h b/src/FeaturesAPI/FeaturesAPI_swig.h index 1c7d2d40b..e6e4435a1 100644 --- a/src/FeaturesAPI/FeaturesAPI_swig.h +++ b/src/FeaturesAPI/FeaturesAPI_swig.h @@ -48,5 +48,6 @@ #include "FeaturesAPI_Symmetry.h" #include "FeaturesAPI_Translation.h" #include "FeaturesAPI_Union.h" + #include "FeaturesAPI_FusionFaces.h" #endif // FeaturesAPI_swig_H_ diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index f2667acbe..3a60a545c 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -58,6 +58,7 @@ SET(PROJECT_HEADERS FeaturesPlugin_MultiRotation.h FeaturesPlugin_Fillet.h FeaturesPlugin_Measurement.h + FeaturesPlugin_FusionFaces.h ) SET(PROJECT_SOURCES @@ -93,6 +94,7 @@ SET(PROJECT_SOURCES FeaturesPlugin_MultiRotation.cpp FeaturesPlugin_Fillet.cpp FeaturesPlugin_Measurement.cpp + FeaturesPlugin_FusionFaces.cpp ) SET(XML_RESOURCES @@ -120,6 +122,7 @@ SET(XML_RESOURCES multirotation_widget.xml fillet_widget.xml measurement_widget.xml + fusion_faces_widget.xml ) SET(TEXT_RESOURCES @@ -239,6 +242,7 @@ ADD_UNIT_TESTS(TestExtrusion.py TestMeasurementDistance.py TestMeasurementRadius.py TestMeasurementAngle.py + TestFusionFaces.py Test1379.py Test1922.py Test1942.py diff --git a/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.cpp b/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.cpp new file mode 100644 index 000000000..a57403e1a --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.cpp @@ -0,0 +1,96 @@ +// Copyright (C) 2014-2017 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 "FeaturesPlugin_FusionFaces.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + + +//================================================================================================== +FeaturesPlugin_FusionFaces::FeaturesPlugin_FusionFaces() +{ +} + +//================================================================================================== +void FeaturesPlugin_FusionFaces::initAttributes() +{ + data()->addAttribute(BASE_SHAPE_ID(), ModelAPI_AttributeSelection::typeId()); +} + +//================================================================================================== +void FeaturesPlugin_FusionFaces::execute() +{ + // Get selection. + AttributeSelectionPtr aShapeAttrSelection = selection(BASE_SHAPE_ID()); + if (!aShapeAttrSelection.get()) { + return; + } + + // Get shape. + GeomShapePtr aBaseShape = aShapeAttrSelection->value(); + + // Make fusion + std::shared_ptr anAlgo(new GeomAlgoAPI_UnifySameDomain(aBaseShape)); + + // Check algo status + if (!anAlgo->isDone()) { + setError("Error: Fusion algorithm failed."); + return; + } + if (anAlgo->shape()->isNull()) { + setError("Error: Resulting shape is Null."); + return; + } + if (!anAlgo->isValid()) { + setError("Error: Resulting shape is not valid."); + return; + } + + // Store result + GeomShapePtr aResultShape = anAlgo->shape(); + ResultBodyPtr aResultBody = document()->createBody(data()); + if (aResultShape->isEqual(aBaseShape)) { + aResultBody->store(aResultShape); + } else { + aResultBody->storeModified(aBaseShape, aResultShape); + + const int aModifyEdgeTag = 1; + const int aModifyFaceTag = 2; + const std::string aModEName = "Modified_Edge"; + const std::string aModFName = "Modified_Face"; + std::shared_ptr aMapOfShapes = anAlgo->mapOfSubShapes(); + aResultBody->loadAndOrientModifiedShapes(anAlgo.get(), aBaseShape, GeomAPI_Shape::EDGE, + aModifyEdgeTag, aModEName, *aMapOfShapes.get(), true); + aResultBody->loadAndOrientModifiedShapes(anAlgo.get(), aBaseShape, GeomAPI_Shape::FACE, + aModifyFaceTag, aModFName, *aMapOfShapes.get(), true); + } + setResult(aResultBody); +} diff --git a/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.h b/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.h new file mode 100644 index 000000000..3b919257c --- /dev/null +++ b/src/FeaturesPlugin/FeaturesPlugin_FusionFaces.h @@ -0,0 +1,65 @@ +// Copyright (C) 2014-2017 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_FusionFaces_H_ +#define FeaturesPlugin_FusionFaces_H_ + +#include "FeaturesPlugin.h" + +#include + +/// \class FeaturesPlugin_FusionFaces +/// \ingroup Plugins +/// \brief Feature for fusion of connected faces. +class FeaturesPlugin_FusionFaces : public ModelAPI_Feature +{ +public: + /// Use plugin manager for features creation + FeaturesPlugin_FusionFaces(); + + /// Feature kind. + inline static const std::string& ID() + { + static const std::string MY_ID("FusionFaces"); + return MY_ID; + } + + /// Attribute name of base shape. + inline static const std::string& BASE_SHAPE_ID() + { + static const std::string MY_BASE_SHAPE_ID("base_shape"); + return MY_BASE_SHAPE_ID; + } + + /// \return the kind of a feature. + FEATURESPLUGIN_EXPORT virtual const std::string& getKind() + { + static std::string MY_KIND = FeaturesPlugin_FusionFaces::ID(); + return MY_KIND; + } + + /// Request for initialization of data model of the feature: adding all attributes. + FEATURESPLUGIN_EXPORT virtual void initAttributes(); + + /// Executes the faces fusion and stores the modififed shape. + FEATURESPLUGIN_EXPORT virtual void execute(); +}; + +#endif diff --git a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp index 8105f04b7..cb75e5700 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Plugin.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -147,6 +148,8 @@ FeaturePtr FeaturesPlugin_Plugin::createFeature(std::string theFeatureID) return FeaturePtr(new FeaturesPlugin_RemoveSubShapes); } else if (theFeatureID == FeaturesPlugin_Union::ID()) { return FeaturePtr(new FeaturesPlugin_Union); + } else if (theFeatureID == FeaturesPlugin_FusionFaces::ID()) { + return FeaturePtr(new FeaturesPlugin_FusionFaces); } else if (theFeatureID == FeaturesPlugin_Symmetry::ID()) { return FeaturePtr(new FeaturesPlugin_Symmetry); } else if (theFeatureID == FeaturesPlugin_Scale::ID()) { diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_en.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_en.ts index 5a46be254..aa489e343 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_msg_en.ts +++ b/src/FeaturesPlugin/FeaturesPlugin_msg_en.ts @@ -3692,4 +3692,11 @@ "Base objects" should contain at least 2 items. + + FusionFaces:Model_FeatureValidator + + Attribute "base_shape" is not initialized. + Base shape is not selected. + + diff --git a/src/FeaturesPlugin/Test/TestFusionFaces.py b/src/FeaturesPlugin/Test/TestFusionFaces.py new file mode 100644 index 000000000..22f81a176 --- /dev/null +++ b/src/FeaturesPlugin/Test/TestFusionFaces.py @@ -0,0 +1,88 @@ +## Copyright (C) 2014-2017 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 + +# Create document +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +# ============================================================================= +# Test 1. Fusion faces for shell of 2 adjacent faces lying on plane +# ============================================================================= +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +Box_2 = model.addBox(Part_1_doc, 10, 10, 10) +Translation_1 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_2_1")], model.selection("EDGE", "PartSet/OX"), 10) + +Shell_1 = model.addShell(Part_1_doc, [model.selection("FACE", "Box_1_1/Top"), model.selection("FACE", "Translation_1_1/Translated_Face_1")]) +model.do() + +model.checkResult(Shell_1, model, 1, [0], [0], [2], [8], [16]) + +FusionFaces_1 = model.addFusionFaces(Part_1_doc, model.selection("SHELL", "Shell_1_1")) +model.do() + +model.checkResult(FusionFaces_1, model, 1, [0], [0], [1], [4], [8]) + +# ============================================================================= +# Test 2. Fusion faces for solid of 2 adjacent boxes +# ============================================================================= +Fuse_1 = model.addFuse(Part_1_doc, [model.selection("SOLID", "Box_1_1"), model.selection("SOLID", "Translation_1_1")], []) +model.do() + +model.checkResult(Fuse_1, model, 1, [0], [1], [10], [40], [80]) + +FusionFaces_2 = model.addFusionFaces(Part_1_doc, model.selection("SOLID", "Fuse_1_1")) +model.do() + +model.checkResult(FusionFaces_2, model, 1, [0], [1], [6], [24], [48]) + +# ============================================================================= +# Test 3. Fusion faces for shell of adjacent faces lying on cylindrical surface +# ============================================================================= +Cylinder_1 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "PartSet/Origin"), model.selection("EDGE", "PartSet/OZ"), 5, 10) +Shell_2 = model.addShell(Part_1_doc, [model.selection("FACE", "Cylinder_1_1/Face_1")]) +Point_1 = model.addPoint(Part_1_doc, 0, 0, 5) +Plane_1 = model.addPlane(Part_1_doc, model.selection("EDGE", "PartSet/OZ"), model.selection("VERTEX", "Point_1"), True) + +Partition_1 = model.addPartition(Part_1_doc, [model.selection("SHELL", "Shell_2_1"), model.selection("FACE", "Plane_1")]) +model.do() + +model.checkResult(Partition_1, model, 1, [0], [0], [2], [8], [16]) + +FusionFaces_3 = model.addFusionFaces(Part_1_doc, model.selection("SHELL", "Partition_1_1")) +model.do() + +model.checkResult(FusionFaces_3, model, 1, [0], [0], [1], [4], [8]) + +# ============================================================================= +# Test 4. Check subshapes naming +# ============================================================================= +#model.testHaveNamingSubshapes(FusionFaces_1, model, Part_1_doc) +#model.testHaveNamingSubshapes(FusionFaces_2, model, Part_1_doc) +#model.testHaveNamingSubshapes(FusionFaces_3, model, Part_1_doc) +model.end() + +# ============================================================================= +# Test 5. Check Python dump +# ============================================================================= +assert(model.checkPythonDump()) diff --git a/src/FeaturesPlugin/fusion_faces_widget.xml b/src/FeaturesPlugin/fusion_faces_widget.xml new file mode 100644 index 000000000..eb123bf15 --- /dev/null +++ b/src/FeaturesPlugin/fusion_faces_widget.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/src/FeaturesPlugin/icons/fusion_faces.png b/src/FeaturesPlugin/icons/fusion_faces.png new file mode 100644 index 0000000000000000000000000000000000000000..2020164b438e5ed9ed079d3781d427e0521d44f7 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf&U>cv7h@-A}f&3S>O>_%)r2R1cVubP0l+XkKaPB#I literal 0 HcmV?d00001 diff --git a/src/FeaturesPlugin/plugin-Features.xml b/src/FeaturesPlugin/plugin-Features.xml index e5b261cbc..72b4b181c 100644 --- a/src/FeaturesPlugin/plugin-Features.xml +++ b/src/FeaturesPlugin/plugin-Features.xml @@ -120,6 +120,12 @@ email : webmaster.salome@opencascade.com + + + + + diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp index a2a27ba5d..ee9c6feca 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.cpp @@ -33,6 +33,13 @@ GeomAlgoAPI_UnifySameDomain::GeomAlgoAPI_UnifySameDomain(const ListOfShape& theS build(theShapes); } +//================================================================================================== +GeomAlgoAPI_UnifySameDomain::GeomAlgoAPI_UnifySameDomain(const GeomShapePtr& theShape) +{ + build(theShape, false); +} + +//================================================================================================== void GeomAlgoAPI_UnifySameDomain::build(const ListOfShape& theShapes) { if(theShapes.empty()) { @@ -54,10 +61,20 @@ void GeomAlgoAPI_UnifySameDomain::build(const ListOfShape& theShapes) const TopoDS_Shape& aShell = aCombined.front()->impl(); + std::shared_ptr aShape(new GeomAPI_Shape()); + aShape->setImpl(new TopoDS_Shape(aShell)); + build(aShape, true); +} + +//================================================================================================== +void GeomAlgoAPI_UnifySameDomain::build(const GeomShapePtr& theShape, + const bool theIsToSimplifyShell) +{ ShapeUpgrade_UnifySameDomain* aUnifyAlgo = new ShapeUpgrade_UnifySameDomain(); this->setImpl(aUnifyAlgo); - aUnifyAlgo->Initialize(aShell); + const TopoDS_Shape& aShape = theShape->impl(); + aUnifyAlgo->Initialize(aShape); aUnifyAlgo->Build(); TopoDS_Shape aResult = aUnifyAlgo->Shape(); @@ -65,7 +82,7 @@ void GeomAlgoAPI_UnifySameDomain::build(const ListOfShape& theShapes) return; } - if (aResult.ShapeType() == TopAbs_SHELL) { + if (theIsToSimplifyShell && aResult.ShapeType() == TopAbs_SHELL) { int aNb = 0; TopoDS_Iterator anIt(aResult); for (; anIt.More(); anIt.Next()) { @@ -78,9 +95,9 @@ void GeomAlgoAPI_UnifySameDomain::build(const ListOfShape& theShapes) } } - std::shared_ptr aShape(new GeomAPI_Shape()); - aShape->setImpl(new TopoDS_Shape(aResult)); - this->setShape(aShape); + std::shared_ptr aResShape(new GeomAPI_Shape()); + aResShape->setImpl(new TopoDS_Shape(aResult)); + this->setShape(aResShape); this->setDone(true); } diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.h b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.h index a18366672..101484737 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_UnifySameDomain.h @@ -35,6 +35,9 @@ public: /// Constructor. GEOMALGOAPI_EXPORT GeomAlgoAPI_UnifySameDomain(const ListOfShape& theShapes); + /// Constructor. + GEOMALGOAPI_EXPORT GeomAlgoAPI_UnifySameDomain(const GeomShapePtr& theShape); + /// \return the list of shapes modified from the shape \a theShape. /// \param[in] theShape base shape. /// \param[out] theHistory modified shapes. @@ -42,8 +45,11 @@ public: ListOfShape& theHistory); private: - /// Builds resulting shape. + /// Builds resulting shape from lisy of shapes. void build(const ListOfShape& theShapes); + + /// Builds resulting shape from the shape. + void build(const GeomShapePtr& theShape, const bool theIsToSimplifyShell); }; #endif diff --git a/src/PythonAPI/model/features/__init__.py b/src/PythonAPI/model/features/__init__.py index b74ad9b4e..273a282d2 100644 --- a/src/PythonAPI/model/features/__init__.py +++ b/src/PythonAPI/model/features/__init__.py @@ -10,4 +10,5 @@ from FeaturesAPI import addCut, addFuse, addCommon, addSmash, addFill from FeaturesAPI import addIntersection, addPartition, addUnion, addRemoveSubShapes from FeaturesAPI import addRecover from FeaturesAPI import addFillet +from FeaturesAPI import addFusionFaces from FeaturesAPI import measureLength, measureDistance, measureRadius, measureAngle -- 2.39.2