From d5842b1febcdcc567bad1c9b14b679e46ee38325 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me?= Date: Tue, 1 Dec 2020 14:54:24 +0100 Subject: [PATCH] Add documentation and unit test --- src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp | 21 ++--- src/FeaturesPlugin/CMakeLists.txt | 1 + .../FeaturesPlugin_SharedFaces.cpp | 55 ++++++------ .../FeaturesPlugin_SharedFaces.h | 2 + .../Test/TestCheckSharedFaces.py | 83 ++++++++++++++++++ src/FeaturesPlugin/doc/FeaturesPlugin.rst | 1 + .../doc/TUI_SharedFacesFeature.rst | 11 +++ .../doc/checkSharedFaceFeature.rst | 53 +++++++++++ .../doc/examples/checkSharedFaces.py | 21 +++++ .../images/checkSharedFacesPropertyPanel.png | Bin 0 -> 25735 bytes .../doc/images/sharedFacesResult.png | Bin 0 -> 7992 bytes .../doc/images/shared_shapes.png | Bin 0 -> 583 bytes src/FeaturesPlugin/plugin-Features.xml | 2 +- src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.cpp | 26 +++--- src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.h | 16 ++-- 15 files changed, 231 insertions(+), 61 deletions(-) create mode 100644 src/FeaturesPlugin/Test/TestCheckSharedFaces.py create mode 100644 src/FeaturesPlugin/doc/TUI_SharedFacesFeature.rst create mode 100644 src/FeaturesPlugin/doc/checkSharedFaceFeature.rst create mode 100644 src/FeaturesPlugin/doc/examples/checkSharedFaces.py create mode 100644 src/FeaturesPlugin/doc/images/checkSharedFacesPropertyPanel.png create mode 100644 src/FeaturesPlugin/doc/images/sharedFacesResult.png create mode 100644 src/FeaturesPlugin/doc/images/shared_shapes.png diff --git a/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp b/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp index 1b704f7d1..a0ebb84dc 100644 --- a/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp +++ b/src/FeaturesAPI/FeaturesAPI_SharedFaces.cpp @@ -28,7 +28,7 @@ #include #include - +//================================================================================================= FeaturesAPI_SharedFaces:: FeaturesAPI_SharedFaces(const std::shared_ptr& theFeature) : ModelHighAPI_Interface(theFeature) @@ -36,18 +36,17 @@ FeaturesAPI_SharedFaces:: initialize(); } -FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces( - const std::shared_ptr& theFeature, - const ModelHighAPI_Selection& theobject, - const double theTransparency, - const std::string & theNameGroup) +//================================================================================================= +FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces(const std::shared_ptr& theFeature, + const ModelHighAPI_Selection& theobject, + const double theTransparency, + const std::string & theNameGroup) :ModelHighAPI_Interface(theFeature) { if (initialize()) { fillAttribute(theobject, myobjectselected); fillAttribute(theTransparency, mytransparency); - if( theNameGroup != "" ) - { + if (theNameGroup != "") { fillAttribute(true, feature()->boolean(FeaturesPlugin_SharedFaces::CREATE_GROUP_ID())); fillAttribute(theNameGroup, mygroupname); @@ -56,11 +55,12 @@ FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces( } } - +//================================================================================================= FeaturesAPI_SharedFaces::~FeaturesAPI_SharedFaces() { } +//================================================================================================= void FeaturesAPI_SharedFaces::dump(ModelHighAPI_Dumper& theDumper) const { FeaturePtr aBase = feature(); @@ -72,12 +72,13 @@ void FeaturesAPI_SharedFaces::dump(ModelHighAPI_Dumper& theDumper) const theDumper << aBase << " = model.getSharedFaces(" << aDocName << ", " << anAttrObject; theDumper << ", " << aBase->integer(FeaturesPlugin_SharedFaces::TRANSPARENCY_ID()); - if(aBase->boolean(FeaturesPlugin_SharedFaces::CREATE_GROUP_ID())->value() ) + if (aBase->boolean(FeaturesPlugin_SharedFaces::CREATE_GROUP_ID())->value()) theDumper << ", " << aBase->string(FeaturesPlugin_SharedFaces::GROUP_NAME_ID()); theDumper << ")" << std::endl; } +//================================================================================================= SharedFacesPtr getSharedFaces(const std::shared_ptr& thePart, const ModelHighAPI_Selection& theobject, const double theTransparency, diff --git a/src/FeaturesPlugin/CMakeLists.txt b/src/FeaturesPlugin/CMakeLists.txt index 31031d118..3ab09b9b5 100644 --- a/src/FeaturesPlugin/CMakeLists.txt +++ b/src/FeaturesPlugin/CMakeLists.txt @@ -709,4 +709,5 @@ ADD_UNIT_TESTS(TestExtrusion.py TestFillet1D_Wire_3.py TestFillet1D_Wire_4.py TestFillet1D_Wire_5.py + TestCheckSharedFaces.py ) diff --git a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp index 6eb6d6e5b..c5d3afd93 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.cpp @@ -20,7 +20,6 @@ #include "FeaturesPlugin_SharedFaces.h" #include -#include #include #include #include @@ -36,20 +35,19 @@ #include #include -#include #include #include #include #include #include #include -#include - +//================================================================================================= FeaturesPlugin_SharedFaces::FeaturesPlugin_SharedFaces() { } +//================================================================================================= void FeaturesPlugin_SharedFaces::initAttributes() { // attribute for object selected @@ -68,33 +66,37 @@ void FeaturesPlugin_SharedFaces::initAttributes() void explodeCompound(const GeomShapePtr& theCompound, ListOfShape& theSubs) { - if (theCompound->isCompound() || theCompound->isCompSolid() ) { + if (theCompound->isCompound() || theCompound->isCompSolid()) { GeomAPI_ShapeIterator anIt(theCompound); for (; anIt.more(); anIt.next()) explodeCompound(anIt.current(), theSubs); - } - else + } else theSubs.push_back(theCompound); } - - +//================================================================================================= void FeaturesPlugin_SharedFaces::execute() { - if(boolean(CREATE_GROUP_ID())->value() + if (boolean(CREATE_GROUP_ID())->value() && selectionList(LIST_FACES_ID())->isInitialized() - && string(GROUP_NAME_ID())->value() != "" ) - { + && string(GROUP_NAME_ID())->value() != "") { AttributeStringPtr aNameAtt = string( GROUP_NAME_ID() ) ; std::wstring aNameFace = aNameAtt->isUValue() ? Locale::Convert::toWString(aNameAtt->valueU()) : Locale::Convert::toWString(aNameAtt->value()); - + if (myGroup.get()) + eraseResults(); setFacesGroup(aNameFace); + + } else { + if (myGroup.get()) { + eraseResults(); + myGroup.reset(); + } + } - if( selection(OBJECT_ID())->isInitialized() ) - { + if (selection(OBJECT_ID())->isInitialized()) { AttributeSelectionPtr ancompSolidAttr = selection(OBJECT_ID()); ResultPtr aResult = ancompSolidAttr->context(); @@ -106,11 +108,12 @@ void FeaturesPlugin_SharedFaces::execute() ModelAPI_Tools::allSubs(aResultBody, allRes); std::list::iterator aRes; for(aRes = allRes.begin(); aRes != allRes.end(); aRes++) { - ModelAPI_Tools::setTransparency(*aRes, aTranparency); + ModelAPI_Tools::setTransparency(*aRes, aTranparency); } } } +//================================================================================================= void FeaturesPlugin_SharedFaces::attributeChanged(const std::string& theID) { if (theID == OBJECT_ID()) { @@ -120,7 +123,7 @@ void FeaturesPlugin_SharedFaces::attributeChanged(const std::string& theID) if (aShape.get() && ancompSolidAttr->context().get()) { aShape = ancompSolidAttr->context()->shape(); - if(aShape){ + if (aShape) { std::string anError; ListOfShape aFaces; ListOfShape theSubs; @@ -135,8 +138,8 @@ void FeaturesPlugin_SharedFaces::attributeChanged(const std::string& theID) std::dynamic_pointer_cast (attribute(LIST_FACES_ID())); - if ( aFacesListAttr->isInitialized()) - aFacesListAttr->clear(); + if (aFacesListAttr->isInitialized()) + aFacesListAttr->clear(); aFacesListAttr->setSelectionType("face"); @@ -159,13 +162,14 @@ void FeaturesPlugin_SharedFaces::attributeChanged(const std::string& theID) } } +//================================================================================================= void FeaturesPlugin_SharedFaces::setFacesGroup(const std::wstring& theName ) { std::vector aColor; - ResultGroupPtr aGroup = document()->createGroup(data()); + myGroup = document()->createGroup(data()); // clean the result of the operation - aGroup->data()->setName(theName); - aGroup->store(GeomShapePtr()); + myGroup->data()->setName(theName); + myGroup->store(GeomShapePtr()); // shapes containing in group ListOfShape aFaces; @@ -173,15 +177,14 @@ void FeaturesPlugin_SharedFaces::setFacesGroup(const std::wstring& theName ) std::dynamic_pointer_cast (attribute(LIST_FACES_ID())); - for(int anI =0; anI< aFacesListAttr->size(); anI++ ) - { + for (int anI =0; anI< aFacesListAttr->size(); anI++) { AttributeSelectionPtr aAtt = aFacesListAttr->value(anI); aFaces.push_back( aAtt->value() ); } GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aFaces); - aGroup->store(aCompound); + myGroup->store(aCompound); aColor = {255,0,0}; - setResult(aGroup); + setResult(myGroup); ModelAPI_Tools::setColor( lastResult(),aColor); } diff --git a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h index 75dd1e3b3..7c865445e 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h +++ b/src/FeaturesPlugin/FeaturesPlugin_SharedFaces.h @@ -22,6 +22,7 @@ #include "FeaturesPlugin.h" #include +#include #include #include @@ -106,6 +107,7 @@ public: //Set group of faces void setFacesGroup(const std::wstring& theName ); + ResultGroupPtr myGroup; }; #endif diff --git a/src/FeaturesPlugin/Test/TestCheckSharedFaces.py b/src/FeaturesPlugin/Test/TestCheckSharedFaces.py new file mode 100644 index 000000000..4e04c7454 --- /dev/null +++ b/src/FeaturesPlugin/Test/TestCheckSharedFaces.py @@ -0,0 +1,83 @@ +# Copyright (C) 2014-2020 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 +# + +""" + Unit test of Check shared faces +""" +#========================================================================= +# Initialization of the test +#========================================================================= + + +import os +import math + +from ModelAPI import * +from GeomAPI import * +from salome.shaper import model + + +__updated__ = "2020-11-12" + + +if __name__ == '__main__': + + model.begin() + partSet = model.moduleDocument() + Part_1 = model.addPart(partSet) + Part_1_doc = Part_1.document() + ### Create Box + Box_1 = model.addBox(Part_1_doc, 10, 10, 10) + ### Create Point + Point_2 = model.addPoint(Part_1_doc, 20, 10, 10) + ### Create Box + Box_2 = model.addBox(Part_1_doc, model.selection("VERTEX", "[Box_1_1/Front][Box_1_1/Left][Box_1_1/Bottom]"), model.selection("VERTEX", "Point_1")) + ### Create CompSolid + CompSolid_1 = model.addCompSolid(Part_1_doc, [model.selection("SOLID", "Box_1_1"), model.selection("SOLID", "Box_2_1")]) + + ### Create Shared_faces + Shared_faces_1 = model.getSharedFaces(Part_1_doc, model.selection("COMPSOLID", "CompSolid_1_1"), 50, "mygroup") + + model.do() + # Check results + Shared_faces_1_Feature = Shared_faces_1.feature() + assert Shared_faces_1_Feature.error() == '' + assert Shared_faces_1_Feature.name() == "Shared_faces_1" + + aSelectionList = Shared_faces_1_Feature.selectionList("faces") + assert aSelectionList.size() == 1 + + assert(Part_1_doc.size("Groups") == 1) + + #assert Part_1_doc.object("Groups", 0).name() == "mygroup" + resShape = modelAPI_Result(Part_1_doc.object("Groups", 0)).shape() + assert(not resShape.isNull()) + + # the group result is a face, check that this is one face + aShapeExplorer = GeomAPI_ShapeExplorer(resShape, GeomAPI_Shape.FACE) + assert(aShapeExplorer.more()) + assert(aShapeExplorer.current().isFace()) + aShapeExplorer.next() + assert(not aShapeExplorer.more()) + + model.end() + + #========================================================================= + # End of test + #========================================================================= diff --git a/src/FeaturesPlugin/doc/FeaturesPlugin.rst b/src/FeaturesPlugin/doc/FeaturesPlugin.rst index fb8e2a344..154a72f09 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 importResultFeature.rst linearCopyFeature.rst measurementFeature.rst + checkSharedFaceFeature.rst pipeFeature.rst placementFeature.rst recoverFeature.rst diff --git a/src/FeaturesPlugin/doc/TUI_SharedFacesFeature.rst b/src/FeaturesPlugin/doc/TUI_SharedFacesFeature.rst new file mode 100644 index 000000000..f170d48e9 --- /dev/null +++ b/src/FeaturesPlugin/doc/TUI_SharedFacesFeature.rst @@ -0,0 +1,11 @@ + + .. _tui_shared_faces: + +Check shared faces +================== + +.. literalinclude:: examples/checkSharedFaces.py + :linenos: + :language: python + +:download:`Download this script ` diff --git a/src/FeaturesPlugin/doc/checkSharedFaceFeature.rst b/src/FeaturesPlugin/doc/checkSharedFaceFeature.rst new file mode 100644 index 000000000..e7ca9fac1 --- /dev/null +++ b/src/FeaturesPlugin/doc/checkSharedFaceFeature.rst @@ -0,0 +1,53 @@ +.. |shared_shapes.icon| image:: images/shared_shapes.png + +Check shared faces +================== + +The **Check shared faces** feature find the shared faces of a composolid or compound. + +The result is a list of faces and a group can be created with name specified. + +To check shared faces in the active part: + +#. select in the Main Menu *Inspection - > Check shared faces* item or +#. click |shared_shapes.icon| **Check shared faces** button in the toolbar + +The property panel is shown below. + +.. figure:: images/checkSharedFacesPropertyPanel.png + :align: center + + Check shared faces + + +Input fields: + +- **Object** contains composolid or compound selected in 3D OCC viewer or object browser. +- **Number of shared faces** indicate the number of found faces. +- **List of faces** the list of found faces. +- **Transparency** set the transparency of selected object. +- **Create group** check-box allow the creation of the group of found faces. +- **Group name** specified the name of the group created. + + +**TUI Command**: + +.. py:function:: model.getSharedFaces(Part_doc, shape, transparency, nameGroup) + + :param part: The current part object. + :param object: A composolid or compound in format *model.selection("Type", shape)*. + :param number: value for the transparency. + :param string: name of group created. + :return: Created group. + +Result +"""""" + +Result of **Check shared faces** where **Create group** is checked. + +.. figure:: images/sharedFacesResult.png + :align: center + + Shared faces + +**See Also** a sample TUI Script of :ref:`tui_shared_faces` operation. \ No newline at end of file diff --git a/src/FeaturesPlugin/doc/examples/checkSharedFaces.py b/src/FeaturesPlugin/doc/examples/checkSharedFaces.py new file mode 100644 index 000000000..bc541d1de --- /dev/null +++ b/src/FeaturesPlugin/doc/examples/checkSharedFaces.py @@ -0,0 +1,21 @@ +from salome.shaper import model +import os + +model.begin() +partSet = model.moduleDocument() +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() +### Create Box +Box_1 = model.addBox(Part_1_doc, 10, 10, 10) +### Create Point +Point_2 = model.addPoint(Part_1_doc, 20, 10, 10) +### Create Box +Box_2 = model.addBox(Part_1_doc, model.selection("VERTEX", "[Box_1_1/Front][Box_1_1/Left][Box_1_1/Bottom]"), model.selection("VERTEX", "Point_1")) +### Create CompSolid +CompSolid_1 = model.addCompSolid(Part_1_doc, [model.selection("SOLID", "Box_1_1"), model.selection("SOLID", "Box_2_1")]) + +### Create Shared_faces +Shared_faces_1 = model.getSharedFaces(Part_1_doc, model.selection("COMPSOLID", "CompSolid_1_1"), 50, "mygroup") + +model.do() +model.end() diff --git a/src/FeaturesPlugin/doc/images/checkSharedFacesPropertyPanel.png b/src/FeaturesPlugin/doc/images/checkSharedFacesPropertyPanel.png new file mode 100644 index 0000000000000000000000000000000000000000..71190f14823b00ffd20db97d3926e3cf38628e3f GIT binary patch literal 25735 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 literal 0 HcmV?d00001 diff --git a/src/FeaturesPlugin/doc/images/sharedFacesResult.png b/src/FeaturesPlugin/doc/images/sharedFacesResult.png new file mode 100644 index 0000000000000000000000000000000000000000..114ac342149b334af9c2478682effc4d250ff046 GIT binary patch literal 7992 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 literal 0 HcmV?d00001 diff --git a/src/FeaturesPlugin/doc/images/shared_shapes.png b/src/FeaturesPlugin/doc/images/shared_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..23f804802251319855cadf3afb9bdabb5182e900 GIT binary patch literal 583 zcmV-N0=WH&P)bgGWIS@MM7DVsg zT;{Y$DPd*+G)+U(G}Lv?dcEE@O|yle1kO1`q-skICn*>%Fqoz*B@Fc)W9X*W+AKNZWNCW(f&_Xpg5lBUL3vMMO}M17Qe(?qQFJ zKuXk2^K8;nXaPRFT`wFbH-CcQJrV+{Qf4+2UIQP;JLBg2&%e}7LseCzlt^Y+8tSX6 z?C<~Ky(4%}kT4_M1HX<0+-Ovi3dwBv&QxcF!FxmkDuSxa2zS6&=8L|S5QwUXN=YrR zV2p8SV$?E1Q^E(}_o7C5EXK4%LV0LrsK}r=C93N1S)8l= + icon="icons/Features/shared_shapes.png" helpfile="checkSharedFaceFeature.html"> diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.cpp index 69355238f..a2039bbe3 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.cpp @@ -23,15 +23,11 @@ #include #include #include -#include #include -#include -#include #include #include #include - //======================================================================= //function : GetSharedShapes //purpose : @@ -60,12 +56,11 @@ // [4] theShapes = 1 shape, theMultiShare = False // Result: sub-shapes of all possible couples of all top-level sub-objects of // theShapes[0]. -//======================================================================= //================================================================================================= -bool GetSharedredFaces( const ListOfShape& theShapes, - ListOfShape & theFaces, - const bool theMultiShare, - std::string& theError) +bool GetSharedredFaces(const ListOfShape& theShapes, + ListOfShape & theFaces, + const bool theMultiShare, + std::string& theError) { #ifdef _DEBUG @@ -95,11 +90,10 @@ bool GetSharedredFaces( const ListOfShape& theShapes, // if only single shape is specified as input // collect all ites top-level sub-shapes for processing - if ( aShapesSeq.Length() == 1 ) - { + if (aShapesSeq.Length() == 1) { aShape = aShapesSeq.First(); aShapesSeq.Clear(); - for ( TopoDS_Iterator it( aShape ); it.More(); it.Next() ) + for (TopoDS_Iterator it( aShape ); it.More(); it.Next()) aShapesSeq.Append( it.Value() ); } @@ -112,14 +106,14 @@ bool GetSharedredFaces( const ListOfShape& theShapes, // numShares factor to search (i.e. by what nb of shapes each found sub-shape should be shared) int nbShares = theMultiShare ? aShapesSeq.Length()-1 : 1; - for ( int iter = 1; iter <= nbIters; iter++) { - for ( int ind = iter+1; ind <= aShapesSeq.Length(); ind++) { - if ( ind-1+nbShares > aShapesSeq.Length() ) break; + for (int iter = 1; iter <= nbIters; iter++) { + for (int ind = iter+1; ind <= aShapesSeq.Length(); ind++) { + if (ind-1+nbShares > aShapesSeq.Length()) break; TopoDS_Compound aCurrSelection; TopoDS_Shape aShape1 = aShapesSeq.Value( iter ); TopTools_IndexedMapOfShape mapSelected; TopExp::MapShapes(aShape1, aShapeType, mapSelected); - for ( int s = 0; s < nbShares; s++ ) { + for (int s = 0; s < nbShares; s++) { BRep_Builder B; TopoDS_Compound aCompound; B.MakeCompound(aCompound); diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.h b/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.h index c201c9680..6aa21b0b9 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.h +++ b/src/GeomAlgoAPI/GeomAlgoAPI_SharedFaces.h @@ -25,14 +25,14 @@ #include /// get the boundin box of theshape. - /// \param theShape the shape - /// \param theTolerance precise TRUE for precise computation; FALSE for fast one. - /// \param theFaces the faces shared - /// \param theError error +/// \param theShape the shape +/// \param theTolerance precise TRUE for precise computation; FALSE for fast one. +/// \param theFaces the faces shared +/// \param theError error GEOMALGOAPI_EXPORT -bool GetSharedredFaces( const ListOfShape& theShapes, - ListOfShape & theFaces, - const bool theMultiShare, - std::string& theError); +bool GetSharedredFaces(const ListOfShape& theShapes, + ListOfShape & theFaces, + const bool theMultiShare, + std::string& theError); #endif //GEOMALGOAPI_SHAREDFACES_H_ -- 2.39.2