From: Jérôme Date: Tue, 1 Dec 2020 13:54:24 +0000 (+0100) Subject: Add documentation and unit test X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=d5842b1febcdcc567bad1c9b14b679e46ee38325;p=modules%2Fshaper.git Add documentation and unit test --- 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 000000000..71190f148 Binary files /dev/null and b/src/FeaturesPlugin/doc/images/checkSharedFacesPropertyPanel.png differ diff --git a/src/FeaturesPlugin/doc/images/sharedFacesResult.png b/src/FeaturesPlugin/doc/images/sharedFacesResult.png new file mode 100644 index 000000000..114ac3421 Binary files /dev/null and b/src/FeaturesPlugin/doc/images/sharedFacesResult.png differ diff --git a/src/FeaturesPlugin/doc/images/shared_shapes.png b/src/FeaturesPlugin/doc/images/shared_shapes.png new file mode 100644 index 000000000..23f804802 Binary files /dev/null and b/src/FeaturesPlugin/doc/images/shared_shapes.png differ diff --git a/src/FeaturesPlugin/plugin-Features.xml b/src/FeaturesPlugin/plugin-Features.xml index 082ffdd37..0d01b0659 100644 --- a/src/FeaturesPlugin/plugin-Features.xml +++ b/src/FeaturesPlugin/plugin-Features.xml @@ -180,7 +180,7 @@ + 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_