#include <ModelHighAPI_Selection.h>
#include <ModelHighAPI_Tools.h>
-
+//=================================================================================================
FeaturesAPI_SharedFaces::
FeaturesAPI_SharedFaces(const std::shared_ptr<ModelAPI_Feature>& theFeature)
: ModelHighAPI_Interface(theFeature)
initialize();
}
-FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces(
- const std::shared_ptr<ModelAPI_Feature>& theFeature,
- const ModelHighAPI_Selection& theobject,
- const double theTransparency,
- const std::string & theNameGroup)
+//=================================================================================================
+FeaturesAPI_SharedFaces::FeaturesAPI_SharedFaces(const std::shared_ptr<ModelAPI_Feature>& 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);
}
}
-
+//=================================================================================================
FeaturesAPI_SharedFaces::~FeaturesAPI_SharedFaces()
{
}
+//=================================================================================================
void FeaturesAPI_SharedFaces::dump(ModelHighAPI_Dumper& theDumper) const
{
FeaturePtr aBase = feature();
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<ModelAPI_Document>& thePart,
const ModelHighAPI_Selection& theobject,
const double theTransparency,
TestFillet1D_Wire_3.py
TestFillet1D_Wire_4.py
TestFillet1D_Wire_5.py
+ TestCheckSharedFaces.py
)
#include "FeaturesPlugin_SharedFaces.h"
#include <ModelAPI_AttributeSelection.h>
-#include <ModelAPI_AttributeRefList.h>
#include <ModelAPI_AttributeSelectionList.h>
#include <ModelAPI_AttributeBoolean.h>
#include <ModelAPI_AttributeString.h>
#include <Config_PropManager.h>
#include <ModelAPI_ResultBody.h>
-#include <ModelAPI_ResultGroup.h>
#include <GeomAlgoAPI_ShapeTools.h>
#include <GeomAlgoAPI_SharedFaces.h>
#include <GeomAPI_ShapeIterator.h>
#include <ModelAPI_Tools.h>
#include <iomanip>
#include <sstream>
-#include <iostream>
-
+//=================================================================================================
FeaturesPlugin_SharedFaces::FeaturesPlugin_SharedFaces()
{
}
+//=================================================================================================
void FeaturesPlugin_SharedFaces::initAttributes()
{
// attribute for object selected
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();
ModelAPI_Tools::allSubs(aResultBody, allRes);
std::list<ResultPtr>::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()) {
if (aShape.get() && ancompSolidAttr->context().get()) {
aShape = ancompSolidAttr->context()->shape();
- if(aShape){
+ if (aShape) {
std::string anError;
ListOfShape aFaces;
ListOfShape theSubs;
std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>
(attribute(LIST_FACES_ID()));
- if ( aFacesListAttr->isInitialized())
- aFacesListAttr->clear();
+ if (aFacesListAttr->isInitialized())
+ aFacesListAttr->clear();
aFacesListAttr->setSelectionType("face");
}
}
+//=================================================================================================
void FeaturesPlugin_SharedFaces::setFacesGroup(const std::wstring& theName )
{
std::vector<int> 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;
std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>
(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);
}
#include "FeaturesPlugin.h"
#include <ModelAPI_Feature.h>
+#include <ModelAPI_ResultGroup.h>
#include <GeomAPI_IPresentable.h>
#include <GeomAPI_IScreenParams.h>
//Set group of faces
void setFacesGroup(const std::wstring& theName );
+ ResultGroupPtr myGroup;
};
#endif
--- /dev/null
+# 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
+ #=========================================================================
importResultFeature.rst
linearCopyFeature.rst
measurementFeature.rst
+ checkSharedFaceFeature.rst
pipeFeature.rst
placementFeature.rst
recoverFeature.rst
--- /dev/null
+
+ .. _tui_shared_faces:
+
+Check shared faces
+==================
+
+.. literalinclude:: examples/checkSharedFaces.py
+ :linenos:
+ :language: python
+
+:download:`Download this script <examples/checkSharedFaces.py>`
--- /dev/null
+.. |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
--- /dev/null
+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()
</group>
<group id="Face">
<feature id="Shared_faces" title="Check shared faces" tooltip="Check the shared faces" auto_preview="true"
- icon="icons/Features/shared_shapes.png" helpfile="measurementFeature.html">
+ icon="icons/Features/shared_shapes.png" helpfile="checkSharedFaceFeature.html">
<source path="sharedFaces_widget.xml"/>
</feature>
</group>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <BRep_Builder.hxx>
-#include <TColStd_HSequenceOfTransient.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
-#include <GeomAlgoAPI_ShapeBuilder.h>
-#include <vector>
#include <TopExp.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopExp_Explorer.hxx>
-
//=======================================================================
//function : GetSharedShapes
//purpose :
// [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
// 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() );
}
// 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);
#include <Standard_TypeDef.hxx>
/// 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_