#include <ModelHighAPI_Selection.h>
#include <ModelHighAPI_Tools.h>
-
+//=================================================================================================
FeaturesAPI_DuplicatedFaces::
FeaturesAPI_DuplicatedFaces(const std::shared_ptr<ModelAPI_Feature>& theFeature)
: ModelHighAPI_Interface(theFeature)
initialize();
}
+//=================================================================================================
FeaturesAPI_DuplicatedFaces::~FeaturesAPI_DuplicatedFaces()
{
}
+//=================================================================================================
FeaturesAPI_DuplicatedFaces::FeaturesAPI_DuplicatedFaces(
- const std::shared_ptr<ModelAPI_Feature>& theFeature,
- const ModelHighAPI_Selection& theObject,
- const double theTransparency,
- const std::string & theNameGroup)
+ 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 != "" )
- {
- fillAttribute(true,
- feature()->boolean(FeaturesPlugin_DuplicatedFaces::CREATE_GROUP_ID()));
+ if (theNameGroup != "") {
+ fillAttribute(true,feature()->boolean(FeaturesPlugin_DuplicatedFaces::CREATE_GROUP_ID()));
fillAttribute(theNameGroup, mygroupname);
}
execute();
}
}
+//=================================================================================================
void FeaturesAPI_DuplicatedFaces::dump(ModelHighAPI_Dumper& theDumper) const
{
FeaturePtr aBase = feature();
theDumper << ")" << std::endl;
}
+//=================================================================================================
DuplicatedFacesPtr getDuplicatedFaces(const std::shared_ptr<ModelAPI_Document>& thePart,
const ModelHighAPI_Selection& theObject,
const double theTransparency,
/// \param theobject the object selected
FEATURESAPI_EXPORT
DuplicatedFacesPtr getDuplicatedFaces(const std::shared_ptr<ModelAPI_Document>& thePart,
- const ModelHighAPI_Selection& theObject,
- const double theTransparency = 0.0,
- const std::string & theNameGroup = "");
+ const ModelHighAPI_Selection& theObject,
+ const double theTransparency = 0.0,
+ const std::string & theNameGroup = "");
#endif // FeaturesAPI_DuplicatedFaces_H_
TestFillet1D_Wire_3.py
TestFillet1D_Wire_4.py
TestFillet1D_Wire_5.py
+ TestCheckDuplictedFaces.py
)
#include <sstream>
#include <iostream>
-
+//=================================================================================================
FeaturesPlugin_DuplicatedFaces::FeaturesPlugin_DuplicatedFaces()
{
}
boolean(CREATE_GROUP_ID())->setValue(false);
}
+//=================================================================================================
void explode(const GeomShapePtr& theCompound, ListOfShape& theSubs)
{
- if (theCompound->isCompound() || theCompound->isCompSolid() ) {
+ if (theCompound->isCompound() || theCompound->isCompSolid()) {
GeomAPI_ShapeIterator anIt(theCompound);
for (; anIt.more(); anIt.next())
explode(anIt.current(), theSubs);
theSubs.push_back(theCompound);
}
+//=================================================================================================
void FeaturesPlugin_DuplicatedFaces::execute()
{
if(boolean(CREATE_GROUP_ID())->value()
&& selectionList(LIST_FACES_ID())->isInitialized()
- && string(GROUP_NAME_ID())->value() != "" )
- {
- AttributeStringPtr aNameAtt = string( GROUP_NAME_ID() ) ;
+ && 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);
- }
- if( selection(OBJECT_ID())->isInitialized() )
- {
+ } else {
+ if (myGroup.get()) {
+ eraseResults();
+ myGroup.reset();
+ }
+
+ }
+ if (selection(OBJECT_ID())->isInitialized()) {
AttributeSelectionPtr ancompSolidAttr = selection(OBJECT_ID());
ResultPtr aResult = ancompSolidAttr->context();
std::list<ResultPtr> allRes;
ModelAPI_Tools::allSubs(aResultBody, allRes);
std::list<ResultPtr>::iterator aRes;
- for(aRes = allRes.begin(); aRes != allRes.end(); aRes++) {
+ for (aRes = allRes.begin(); aRes != allRes.end(); aRes++) {
ModelAPI_Tools::setTransparency(*aRes, aTranparency);
}
}
}
+//=================================================================================================
void FeaturesPlugin_DuplicatedFaces::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;
explode(aShape, theSubs);
- if( !GetDuplicatedFaces( theSubs,
+ if (!GetDuplicatedFaces(theSubs,
0.001,
aFaces,
anError))
std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>
(attribute(LIST_FACES_ID()));
- if ( aFacesListAttr->isInitialized())
- aFacesListAttr->clear();
+ if (aFacesListAttr->isInitialized())
+ aFacesListAttr->clear();
aFacesListAttr->setSelectionType("face");
std::stringstream alabel;
alabel << "Number of duplicated faces : " << aFacesListAttr->size();
string(NUMBER_FACES_ID() )->setValue( alabel.str() );
-
}
}
}
}
+//=================================================================================================
void FeaturesPlugin_DuplicatedFaces::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 each 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>
FeaturesPlugin_DuplicatedFaces();
private:
-
//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 Duplicated 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, 100, 50, 100)
+ ### Create Point
+ Point_1 = model.addPoint(Part_1_doc, 100, 0, 0)
+ ### Create Point
+ Point_2 = model.addPoint(Part_1_doc, 250, 50, 100)
+ ### Create Box
+ Box_2 = model.addBox(Part_1_doc, model.selection("VERTEX", "all-in-Point_1"), model.selection("VERTEX", "all-in-Point_2"))
+ ### Create Point
+ Point_3 = model.addPoint(Part_1_doc, 100, 50, 250)
+ ### Create Box
+ Box_3 = model.addBox(Part_1_doc, model.selection("VERTEX", "[Box_1_1/Back][Box_1_1/Left][Box_1_1/Top]"), model.selection("VERTEX", "Point_3"))
+ ### Create Compound
+ Compound_1_objects = [model.selection("SOLID", "Box_1_1"),
+ model.selection("SOLID", "Box_2_1"),
+ model.selection("SOLID", "Box_3_1")]
+ Compound_1 = model.addCompound(Part_1_doc, Compound_1_objects)
+ ### Create Duplicated_faces
+ Duplicated_faces_1 = model.getDuplicatedFaces(Part_1_doc, model.selection("COMPOUND", "Compound_1_1"), 50, "mygroup")
+
+ model.do()
+ # Check results
+ Duplicated_faces_1_Feature = Duplicated_faces_1.feature()
+ assert Duplicated_faces_1_Feature.error() == ''
+ assert Duplicated_faces_1_Feature.name() == "Duplicated_faces_1"
+
+ aSelectionList = Duplicated_faces_1_Feature.selectionList("faces")
+ assert aSelectionList.size() == 2
+
+ 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()
+ aShapeExplorer.next()
+ assert(not aShapeExplorer.more())
+
+ model.end()
+
+ #=========================================================================
+ # End of test
+ #=========================================================================
importResultFeature.rst
linearCopyFeature.rst
measurementFeature.rst
+ checkDuplicatedFaceFeature.rst
pipeFeature.rst
placementFeature.rst
recoverFeature.rst
--- /dev/null
+
+ .. _tui_duplicated_faces:
+
+Check duplicated faces
+======================
+
+.. literalinclude:: examples/checkDuplicatedFaces.py
+ :linenos:
+ :language: python
+
+:download:`Download this script <examples/checkDuplicatedFaces.py>`
--- /dev/null
+.. |duplicated_shapes.icon| image:: images/duplicated_shapes.png
+
+Check duplicated faces
+======================
+
+The **Check duplicated faces** feature find the duplicated faces of a composolid or compound.
+
+The result is a list of faces and a group can be created with name specified.
+
+To check duplicated faces in the active part:
+
+#. select in the Main Menu *Inspection - > Check duplicated faces* item or
+#. click |duplicated_shapes.icon| **Check duplicated faces** button in the toolbar
+
+The property panel is shown below.
+
+.. figure:: images/checkduplicatedFacesPropertyPanel.png
+ :align: center
+
+ Check duplicated faces
+
+
+Input fields:
+
+- **Object** contains composolid or compound selected in 3D OCC viewer or object browser.
+- **Number of duplicated 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.getDuplicatedFaces(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 duplicated faces** where **Create group** is checked.
+
+.. figure:: images/duplicatedFacesResult.png
+ :align: center
+
+ Duplicated faces
+
+**See Also** a sample TUI Script of :ref:`tui_duplicated_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, 100, 50, 100)
+### Create Point
+Point_1 = model.addPoint(Part_1_doc, 100, 0, 0)
+### Create Point
+Point_2 = model.addPoint(Part_1_doc, 250, 50, 100)
+### Create Box
+Box_2 = model.addBox(Part_1_doc, model.selection("VERTEX", "all-in-Point_1"), model.selection("VERTEX", "all-in-Point_2"))
+### Create Point
+Point_3 = model.addPoint(Part_1_doc, 100, 50, 250)
+### Create Box
+Box_3 = model.addBox(Part_1_doc, model.selection("VERTEX", "[Box_1_1/Back][Box_1_1/Left][Box_1_1/Top]"), model.selection("VERTEX", "Point_3"))
+### Create Compound
+Compound_1_objects = [model.selection("SOLID", "Box_1_1"),
+ model.selection("SOLID", "Box_2_1"),
+ model.selection("SOLID", "Box_3_1")]
+Compound_1 = model.addCompound(Part_1_doc, Compound_1_objects)
+### Create Duplicated_faces
+Duplicated_faces_1 = model.getDuplicatedFaces(Part_1_doc, model.selection("COMPOUND", "Compound_1_1"), 50, "mygroup")
+
+model.do()
+model.end()
</group>
<group id="Face">
<feature id="Duplicated_faces" title="Check duplicated faces" tooltip="Check the duplicated faces" auto_preview="true"
- icon="icons/Features/duplicatedFaces.png" helpfile="measurementFeature.html">
+ icon="icons/Features/duplicatedFaces.png" helpfile="checkDuplicatedFaceFeature.html">
<source path="duplicatedFaces_widget.xml"/>
</feature>
</group>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Compound.hxx>
#include <BRep_Builder.hxx>
-#include <TColStd_HSequenceOfTransient.hxx>
#include <GeomAlgoAPI_GlueDetector.h>
#include <TopTools_IndexedMapOfShape.hxx>
#include <GeomAlgoAPI_ShapeBuilder.h>
#include <GeomAlgoAPI_SortListOfShapes.h>
#include <TopExp.hxx>
-
//=================================================================================================
-bool GetDuplicatedFaces( const ListOfShape& theShapes,
+bool GetDuplicatedFaces(const ListOfShape& theShapes,
const Standard_Real& theTolerance,
ListOfShape & theFaces,
std::string& theError)
{
-
#ifdef _DEBUG
std::cout << "GetDuplicatedFaces " << std::endl;
#endif
ListOfShape::const_iterator anIt = theShapes.cbegin();
- for(; anIt != theShapes.cend(); ++anIt) {
+ for (; anIt != theShapes.cend(); ++anIt) {
GeomShapePtr aShapePtr = *anIt;
aShapesSeq.Append( aShape );
}
- if ( aShapesSeq.Length() > 1 )
- {
+ if (aShapesSeq.Length() > 1){
TopoDS_Compound aCompound;
BRep_Builder aBuilder;
aBuilder.MakeCompound( aCompound );
std::vector< TopTools_IndexedMapOfShape* > anIndices( aShapesSeq.Length(), NULL );
Handle(TColStd_HArray1OfInteger) anArray;
- GeomShapePtr anObj;//Handle(GEOM_Object) anObj;
+ GeomShapePtr anObj;
ListOfShape listOnePerSet;
TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItDMSLS (aImages);
for (int index = 1; aItDMSLS.More(); aItDMSLS.Next(), ++index) {
// some key shape
- //const TopoDS_Shape& aSkey = aItDMSLS.Key();
// list of shapes of the argument that can be glued
const TopTools_ListOfShape& aLSD = aItDMSLS.Value();
//TopTools_ListIteratorOfListOfShape aListIt (listOnePerSet);
ListOfShape::const_iterator aListIt = listOnePerSet.cbegin();
- for (; aListIt != listOnePerSet.cend(); ++aListIt)
- {
+ for (; aListIt != listOnePerSet.cend(); ++aListIt) {
TopoDS_Shape aValue = (*aListIt)->impl<TopoDS_Shape>();
// find a shape to add aValue as a sub-shape
anObj.reset();
anIt = theShapes.cbegin();
GeomShapePtr aShapePtr;
- for ( int i = 0; i < theShapes.size(); ++i, ++anIt )
- {
+ for (int i = 0; i < theShapes.size(); ++i, ++anIt) {
aShapePtr = *anIt;
- if ( !anIndices[i] ) {
+ if (!anIndices[i]) {
anIndices[i] = new TopTools_IndexedMapOfShape;
aShape = aShapePtr->impl<TopoDS_Shape>();
TopExp::MapShapes( aShape, *anIndices[i]);
GeomShapePtr aS(new GeomAPI_Shape);
aS->setImpl<TopoDS_Shape>(new TopoDS_Shape(aSelShape));
// GeomAlgoAPI_ShapeBuilder::add(aShapePtr,aS);
- if ( aS.get())
+ if (aS.get())
theFaces.push_back(aS);
break;
}
}
}
- for ( size_t i = 0 ; i < anIndices.size(); ++i )
+ for (size_t i = 0 ; i < anIndices.size(); ++i)
delete anIndices[i];
return true;
#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 duplicated faces
- /// \param theError error
+/// \param theShape the shape
+/// \param theTolerance precise TRUE for precise computation; FALSE for fast one.
+/// \param theFaces the duplicated faces
+/// \param theError error
GEOMALGOAPI_EXPORT
-bool GetDuplicatedFaces( const ListOfShape& theShapes,
- const Standard_Real& theTolerance,
- ListOfShape & theFaces,
- std::string& theError);
+bool GetDuplicatedFaces(const ListOfShape& theShapes,
+ const Standard_Real& theTolerance,
+ ListOfShape & theFaces,
+ std::string& theError);
#endif //GEOMALGOAPI_DUPLICATEDFACES_H_