--- /dev/null
+
+Fusion faces
+============
+
+.. centered::
+ Fusion faces
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()
FeaturesAPI_Symmetry.h
FeaturesAPI_Translation.h
FeaturesAPI_Union.h
+ FeaturesAPI_FusionFaces.h
)
SET(PROJECT_SOURCES
FeaturesAPI_Symmetry.cpp
FeaturesAPI_Translation.cpp
FeaturesAPI_Union.cpp
+ FeaturesAPI_FusionFaces.cpp
)
SET(PROJECT_LIBRARIES
%shared_ptr(FeaturesAPI_Symmetry)
%shared_ptr(FeaturesAPI_Translation)
%shared_ptr(FeaturesAPI_Union)
+%shared_ptr(FeaturesAPI_FusionFaces)
// all supported interfaces
%include "FeaturesAPI_BooleanCut.h"
%include "FeaturesAPI_Symmetry.h"
%include "FeaturesAPI_Translation.h"
%include "FeaturesAPI_Union.h"
+%include "FeaturesAPI_FusionFaces.h"
--- /dev/null
+// 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<mailto:webmaster.salome@opencascade.com>
+//
+
+#include "FeaturesAPI_FusionFaces.h"
+
+#include <ModelHighAPI_Dumper.h>
+#include <ModelHighAPI_Tools.h>
+
+//==================================================================================================
+FeaturesAPI_FusionFaces::FeaturesAPI_FusionFaces(
+ const std::shared_ptr<ModelAPI_Feature>& theFeature)
+: ModelHighAPI_Interface(theFeature)
+{
+ initialize();
+}
+
+//==================================================================================================
+FeaturesAPI_FusionFaces::FeaturesAPI_FusionFaces(
+ const std::shared_ptr<ModelAPI_Feature>& 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<ModelAPI_Document>& thePart,
+ const ModelHighAPI_Selection& theBase)
+{
+ std::shared_ptr<ModelAPI_Feature> aFeature =
+ thePart->addFeature(FeaturesAPI_FusionFaces::ID());
+ return FusionFacesPtr(new FeaturesAPI_FusionFaces(aFeature, theBase));
+}
--- /dev/null
+// 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<mailto:webmaster.salome@opencascade.com>
+//
+
+#ifndef FeaturesAPI_FusionFaces_H_
+#define FeaturesAPI_FusionFaces_H_
+
+#include "FeaturesAPI.h"
+
+#include <FeaturesPlugin_FusionFaces.h>
+
+#include <ModelHighAPI_Interface.h>
+#include <ModelHighAPI_Macro.h>
+
+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<ModelAPI_Feature>& theFeature);
+
+ /// Constructor with values.
+ FEATURESAPI_EXPORT
+ explicit FeaturesAPI_FusionFaces(const std::shared_ptr<ModelAPI_Feature>& 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<FeaturesAPI_FusionFaces> FusionFacesPtr;
+
+/// \ingroup CPPHighAPI
+/// \brief Create FusionFaces feature.
+FEATURESAPI_EXPORT
+FusionFacesPtr addFusionFaces(const std::shared_ptr<ModelAPI_Document>& thePart,
+ const ModelHighAPI_Selection& theBase);
+
+#endif // FeaturesAPI_FusionFaces_H_
#include "FeaturesAPI_Symmetry.h"
#include "FeaturesAPI_Translation.h"
#include "FeaturesAPI_Union.h"
+ #include "FeaturesAPI_FusionFaces.h"
#endif // FeaturesAPI_swig_H_
FeaturesPlugin_MultiRotation.h
FeaturesPlugin_Fillet.h
FeaturesPlugin_Measurement.h
+ FeaturesPlugin_FusionFaces.h
)
SET(PROJECT_SOURCES
FeaturesPlugin_MultiRotation.cpp
FeaturesPlugin_Fillet.cpp
FeaturesPlugin_Measurement.cpp
+ FeaturesPlugin_FusionFaces.cpp
)
SET(XML_RESOURCES
multirotation_widget.xml
fillet_widget.xml
measurement_widget.xml
+ fusion_faces_widget.xml
)
SET(TEXT_RESOURCES
TestMeasurementDistance.py
TestMeasurementRadius.py
TestMeasurementAngle.py
+ TestFusionFaces.py
Test1379.py
Test1922.py
Test1942.py
--- /dev/null
+// 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<mailto:webmaster.salome@opencascade.com>
+//
+
+#include "FeaturesPlugin_FusionFaces.h"
+
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_ResultBody.h>
+#include <ModelAPI_ResultConstruction.h>
+#include <ModelAPI_Session.h>
+#include <ModelAPI_Validator.h>
+
+#include <GeomAPI_ShapeIterator.h>
+#include <GeomAPI_ShapeExplorer.h>
+
+#include <GeomAlgoAPI_UnifySameDomain.h>
+
+
+//==================================================================================================
+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<GeomAlgoAPI_UnifySameDomain> 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<GeomAPI_DataMapOfShapeShape> 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);
+}
--- /dev/null
+// 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<mailto:webmaster.salome@opencascade.com>
+//
+
+#ifndef FeaturesPlugin_FusionFaces_H_
+#define FeaturesPlugin_FusionFaces_H_
+
+#include "FeaturesPlugin.h"
+
+#include <ModelAPI_Feature.h>
+
+/// \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
#include <FeaturesPlugin_Symmetry.h>
#include <FeaturesPlugin_Translation.h>
#include <FeaturesPlugin_Union.h>
+#include <FeaturesPlugin_FusionFaces.h>
#include <FeaturesPlugin_ValidatorTransform.h>
#include <FeaturesPlugin_Validators.h>
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()) {
<translation>"Base objects" should contain at least 2 items.</translation>
</message>
</context>
+ <context>
+ <name>FusionFaces:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "base_shape" is not initialized.</source >
+ <translation>Base shape is not selected.</translation >
+ </message>
+ </context>
</TS>
--- /dev/null
+## 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<mailto: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. Fusion faces for compsolid
+# =============================================================================
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(25, 40, -50, 40)
+SketchLine_2 = Sketch_1.addLine(-50, 40, -50, 0)
+SketchLine_3 = Sketch_1.addLine(-50, 0, 25, 0)
+SketchLine_4 = Sketch_1.addLine(25, 0, 25, 40)
+SketchLine_5 = Sketch_1.addLine(-20, 40, -20, 0)
+model.do()
+
+Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection(), 10, 0)
+Box_3 = model.addBox(Part_1_doc, 10, 10, 10)
+
+Fuse_2 = model.addFuse(Part_1_doc, [model.selection("COMPSOLID", "Extrusion_1_1"), model.selection("SOLID", "Box_3_1")])
+model.do()
+
+model.checkResult(Fuse_2, model, 1, [1], [1], [14], [64], [128])
+
+FusionFaces_4 = model.addFusionFaces(Part_1_doc, model.selection("COMPSOLID", "Fuse_2_1"))
+model.do()
+
+model.checkResult(FusionFaces_4, model, 1, [1], [1], [6], [24], [48])
+
+# =============================================================================
+# Test 5. Fusion faces for compound
+# =============================================================================
+Box_4 = model.addBox(Part_1_doc, 10, 10, 10)
+Box_5 = model.addBox(Part_1_doc, 10, 10, 10)
+Translation_2 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_5_1")], 0, 0, 5)
+Box_6 = model.addBox(Part_1_doc, 10, 10, 10)
+Translation_3 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_6_1")], 20, 0, 0)
+Box_7 = model.addBox(Part_1_doc, 10, 10, 10)
+Translation_4 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_7_1")], 20, 0, 5)
+Fuse_3 = model.addFuse(Part_1_doc, [model.selection("SOLID", "Box_4_1"), model.selection("SOLID", "Translation_2_1")], [])
+Fuse_4 = model.addFuse(Part_1_doc, [model.selection("SOLID", "Translation_3_1"), model.selection("SOLID", "Translation_4_1")], [])
+
+Compound_1 = model.addCompound(Part_1_doc, [model.selection("SOLID", "Fuse_3_1"), model.selection("SOLID", "Fuse_4_1")])
+model.do()
+
+model.checkResult(Compound_1, model, 1, [2], [2], [28], [112], [224])
+
+FusionFaces_5 = model.addFusionFaces(Part_1_doc, model.selection("COMPOUND", "Compound_1_1"))
+model.do()
+
+model.checkResult(FusionFaces_5, model, 1, [2], [2], [12], [48], [96])
+
+# =============================================================================
+# Test 6. 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.testHaveNamingSubshapes(FusionFaces_4, model, Part_1_doc)
+model.testHaveNamingSubshapes(FusionFaces_5, model, Part_1_doc)
+model.end()
+
+# =============================================================================
+# Test 7. Check Python dump
+# =============================================================================
+assert(model.checkPythonDump())
--- /dev/null
+<!--
+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<mailto:webmaster.salome@opencascade.com>
+-->
+
+<source>
+ <shape_selector id="base_shape"
+ label="Shape:"
+ tooltip="Select a shape to modify."
+ shape_types="objects"
+ concealment="true"
+ greed="true">
+ <validator id="GeomValidators_ShapeType" parameters="shell,solid,compsolid,compound"/>
+ <validator id="GeomValidators_BodyShapes" parameters="toplevel"/>
+ </shape_selector>
+</source>
<source path="fillet_widget.xml"/>
</feature>
</group>
+ <group id="Fusion">
+ <feature id="FusionFaces" title="Fusion of faces" tooltip="Performs fusion of connected faces"
+ icon="icons/Features/fusion_faces.png" auto_preview="true" helpfile="FeaturesPlugin/fusionFacesFeature.html">
+ <source path="fusion_faces_widget.xml"/>
+ </feature>
+ </group>
</workbench>
<workbench id="Part">
<group id="Movement">
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